From 7acc3d97ad31b7a2ee4bf5e009a2cb6f19203c14 Mon Sep 17 00:00:00 2001 From: asmeron Date: Tue, 10 Jun 2025 13:01:33 +0600 Subject: [PATCH] Add JOURNALD_NOTIFY[] and fix 41-x11vnc --- locale/ublinux-init-02-journald-notify.pot | 33 ++ locale/ublinux-init-02-journald-notify_ru.po | 33 ++ ublinux/functions | 1 + ublinux/rc.local.d/41-x11vnc | 80 ++++- ublinux/rc.pamsession.d/02-journald-notify | 351 +++++++++++-------- ublinux/templates/ublinux-data.ini | 69 +++- 6 files changed, 415 insertions(+), 152 deletions(-) create mode 100644 locale/ublinux-init-02-journald-notify.pot create mode 100644 locale/ublinux-init-02-journald-notify_ru.po diff --git a/locale/ublinux-init-02-journald-notify.pot b/locale/ublinux-init-02-journald-notify.pot new file mode 100644 index 0000000..40a11fc --- /dev/null +++ b/locale/ublinux-init-02-journald-notify.pot @@ -0,0 +1,33 @@ +# Language translations for ublinux-init package and 02-journald-notify script. +# Copyright (C) 2025, UBTech LLC +# This file is distributed under the same license as the ublinux-init package. +# UBLinux Team , 2025 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: ublinux-init-02-journald-notify 1.0\n" +"Report-Msgid-Bugs-To: support@ublinux.com\n" +"POT-Creation-Date: 2025-01-01 00:00+0600\n" +"PO-Revision-Date: 2025-01-01 00:00+0600\n" +"Last-Translator: UBLinux Team \n" +"Language-Team: UBLinux Team \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +msgid "device (%s): IP address %s cannot be configured because it is already in use in the network by host %s" +msgstr "" + +msgid "manager: NetworkManager state is now CONNECTING" +msgstr "" + +msgid "manager: NetworkManager state is now DISCONNECTING" +msgstr "" + +msgid "UBLinux notify from Journald" +msgstr "" + +msgid "New notify from %s" +msgstr "" diff --git a/locale/ublinux-init-02-journald-notify_ru.po b/locale/ublinux-init-02-journald-notify_ru.po new file mode 100644 index 0000000..4e1f9bf --- /dev/null +++ b/locale/ublinux-init-02-journald-notify_ru.po @@ -0,0 +1,33 @@ +# Russian translations for ublinux-init package and 02-journald-notify script. +# Copyright (C) 2025, UBTech LLC +# This file is distributed under the same license as the ubl-settings-bootloader package. +# UBLinux Team , 2025 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: ublinux-init-02-journald-notify 1.0\n" +"Report-Msgid-Bugs-To: support@ublinux.com\n" +"POT-Creation-Date: 2025-04-25 15:27+0600\n" +"PO-Revision-Date: 2025-02-22 23:28+0600\n" +"Last-Translator: ublinux \n" +"Language-Team: Russian - UBLinux Team \n" +"Language: Russian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +msgid "device (%s): IP address %s cannot be configured because it is already in use in the network by host %s" +msgstr "Устройство ( %s): IP-адрес %s не может быть настроен, потому что оно уже используется в сети на хосте %s" + +msgid "manager: NetworkManager state is now CONNECTING" +msgstr "Диспетчер: состояние NetworkManager теперь ПОДКЛЮЧАЕТСЯ" + +msgid "manager: NetworkManager state is now DISCONNECTING" +msgstr "Диспетчер: состояние NetworkManager теперь ОТКЛЮЧАЕТСЯ" + +msgid "UBLinux notify from Journald" +msgstr "UBLinux уведомления из Journald" + +msgid "New notify from %s" +msgstr "Новое уведомление от %s" diff --git a/ublinux/functions b/ublinux/functions index 2e3beac..f819ed8 100755 --- a/ublinux/functions +++ b/ublinux/functions @@ -1559,6 +1559,7 @@ ubconfig_exec_system(){ LOGROTATE\[*\]) ${ROOTFS}/usr/lib/ublinux/rc.preinit.d/24-logging exec_logrotate "${COMMAND_MODE_VAR}" "${NAME_VAR}=${VALUE_VAR}" setsid ${ROOTFS}/usr/lib/ublinux/rc.preinit.d/24-logging exec_logrotate_live "${NAME_VAR}" & ;; SYSTEMD_COREDUMP\[*\]) ${ROOTFS}/usr/lib/ublinux/rc.preinit.d/24-logging exec_systemd_coredump "${COMMAND_MODE_VAR}" "${NAME_VAR}=${VALUE_VAR}" ;; + JOURNALD_NOTIFY\[*\]) ${ROOTFS}/usr/lib/ublinux/rc.pamsession.d/02-journald-notify exec_01_journald_notify "${COMMAND_MODE_VAR}" "${NAME_VAR}=${VALUE_VAR}" ;; *) NO_FIND_EXCUTE=1 ;; esac ;; diff --git a/ublinux/rc.local.d/41-x11vnc b/ublinux/rc.local.d/41-x11vnc index 80af2b8..75cd51b 100755 --- a/ublinux/rc.local.d/41-x11vnc +++ b/ublinux/rc.local.d/41-x11vnc @@ -1,4 +1,8 @@ #!/usr/bin/env bash +# +# Author: Dmitry Razumov +# Copyright (c) 2021-2025 UBLinux +# ENABLED=yes [[ ${ENABLED} == yes ]] || exit 0 @@ -6,23 +10,66 @@ DEBUGMODE=no SOURCE=/usr/lib/ublinux/functions; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null || exit 0 SOURCE=/usr/lib/ublinux/default; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null || exit 0 +debug_mode "$0" "$@" + SOURCE=${SYSCONF}/config; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null SOURCE=${SYSCONF}/desktop; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null -debug_mode "$0" "$@" +FILE_ROOT_USERS="${SYSCONF}/.users_credential" +SOURCE=${FILE_ROOT_USERS}; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null + +## Сервис удалённого управления рабочим столом X11 и TTY +## Поддерживает Multiseat по номеру порта display:0=port:5900 display:1=port:5901 display:2=port:5902 +## X11VNC[password]= +## <--># Пароль кодировать в base64: echo 'ublinux' | base64 +## # Пароль для VNC сервиса x11vnc-ublinux:*.service. Настроен на работу только по паролю для всех рабочих мест. +## # Создаёт шифрованный пароль в файле /root/.vnc/.passwd +## X11VNC[password]=dWJsaW51eAo= + +## Дополнительные опции к автоматическому соединению https://manpages.ubuntu.com/manpages/lunar/en/man1/x11vnc.1.html +## X11VNC[options]=" " +## # Дополнительные опции перечисленные через пробел +## -noipv6 # +## -ultrafilexfer # Включите расширение передачи файлов UltraVNC +## -tightfilexfer # Включите расширение передачи файлов TightVNC +## -xkb # Если копирование и вставка не работают должным образом с буфером обмена +## -ssl [pem] +## [pem]=file_pem +## [pem]=SAVE +## [pem]=ANON # Аноним Диффи-Хеллмана используется метод обмена ключами, без SSL +## [pem]=TMP +## -unixpw # Чтобы работало, должна быть установлена переменная UNIXPW_DISABLE_SSL=1 +## -users unixpw= +## -xdummy +## -avahi # Используйте протокол Avahi/mDNS ZeroConf для объявления этого VNC-сервера на локальном компьютере в сеть + +## VNC для управления TTY +## X11VNC[tty1]="-noipv6" +## Пользовательская настройка запуска, new_1..new_2..new_n +## X11VNC[new1]="-no6 -rfbauth /root/.vnc/.passwd -rawfb vt2" + +## Отключить автоматическое создание X11VNC для всех дисплеев +## X11VNC[display]=disable || X11VNC[nodisplay]=1 || X11VNC[disable]=1 +exec_x11vnc(){ systemctl --quiet --wait is-system-running if [[ -n ${X11VNC[@]} ]]; then OPTION_GLOBAL="-many -shared -no6" # OPTION_GLOBAL="-many -shared -no6 -forever -dontdisconnect -noxdamage -xkb -rfbport 590%i " if [[ -n ${X11VNC[password]} ]]; then - [[ -d /root/.vnc ]] || mkdir -p /root/.vnc - /usr/bin/x11vnc -quiet -storepasswd "$(base64 -d <<< "${X11VNC[password]}")" /root/.vnc/.passwd &>/dev/null - chmod 600 /root/.vnc/.passwd - ## Show obscured password - #/usr/bin/x11vnc -showrfbauth /root/.vnc/passwd - fi - [[ -f /root/.vnc/.passwd ]] && OPTION_RFBAUTH_PASSWD="-rfbauth /root/.vnc/.passwd" + # Добавить параметр в ${FILE_ROOT_USERS}=".users_credential" и удалить параметр X11VNC[password] из '/etc/ublinux/desktop + if [[ -f ${FILE_ROOT_USERS} ]]; then + sed "/X11VNC\[password\]=/d" -i "${FILE_ROOT_USERS}" + [[ -n ${X11VNC[password]} ]] && echo "X11VNC[password]='${X11VNC[password]}'" >> ${FILE_ROOT_USERS} + fi + [[ -f "${SYSCONF}/desktop" ]] && sed -E "s/(X11VNC\[password\])=.*/\1=secret/g" -i "${SYSCONF}/desktop" + [[ -d /root/.vnc ]] || mkdir -p /root/.vnc + /usr/bin/x11vnc -quiet -storepasswd "$(base64 -d <<< "${X11VNC[password]}")" /root/.vnc/.passwd &>/dev/null + chmod 600 /root/.vnc/.passwd + ## Show obscured password + #/usr/bin/x11vnc -showrfbauth /root/.vnc/passwd + fi + [[ -f /root/.vnc/.passwd ]] && OPTION_RFBAUTH_PASSWD="-rfbauth /root/.vnc/.passwd" if systemctl --quiet is-enabled lightdm.service &>/dev/null || systemctl --quiet is-enabled lightdm-plymouth.service &>/dev/null; then #$(cd /tmp/.X11-unix && for x in X*; do echo ":${x#X}"; done) for ID_DISPLAY in /var/run/lightdm/root/:*; do @@ -106,11 +153,26 @@ EOF done else ## Если в режиме полного сохранения настройку убрали, то отключаем + local DAEMON_RELOAD= + [[ -f ${FILE_ROOT_USERS} ]] && sed "/X11VNC\[password\]=/d" -i "${FILE_ROOT_USERS}" + [[ -f "${SYSCONF}/desktop" ]] && sed "/X11VNC\[password\]=/d" -i "${SYSCONF}/desktop" + rm -f /root/.vnc/.passwd for FILE_X11VNC_SERVICE in /usr/lib/systemd/system/x11vnc-ublinux*.service; do if [[ -e ${FILE_X11VNC_SERVICE} ]]; then systemctl --quiet disable --now ${FILE_X11VNC_SERVICE##*/} &>/dev/null rm -f ${FILE_X11VNC_SERVICE} + DAEMON_RELOAD=yes fi done - systemctl daemon-reload &>/dev/null + [[ -z ${DAEMON_RELOAD} ]] || systemctl daemon-reload &>/dev/null fi +} + +################ +##### MAIN ##### +################ + + # Если файл подключен как ресурс с функциями, то выйти + return 0 2>/dev/null && return 0 + + exec_x11vnc $@ diff --git a/ublinux/rc.pamsession.d/02-journald-notify b/ublinux/rc.pamsession.d/02-journald-notify index f95b5de..2a49700 100755 --- a/ublinux/rc.pamsession.d/02-journald-notify +++ b/ublinux/rc.pamsession.d/02-journald-notify @@ -6,7 +6,7 @@ # Extended pattern matching: https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html#Pattern-Matching shopt -s extglob -ENABLED= +ENABLED=yes [[ ${ENABLED} == yes ]] || exit 0 SOURCE=/usr/lib/ublinux/functions; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null @@ -14,81 +14,91 @@ SOURCE=/usr/lib/ublinux/default; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null SOURCE=${SYSCONF}/config; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null SOURCE=${SYSCONF}/logging; [ -f ${SOURCE} ] && . ${SOURCE} 2>/dev/null +SOURCE=${SYSCONF}/network; [ -f ${SOURCE} ] && . ${SOURCE} 2>/dev/null +## Назначение модулей: +## account подтвердить личность, проверив учетные данные, такие как пароль, ключ, токен и другие +## auth проверить авторизацию для таких действий, как разрешения, ограничения и т. д. +## password обновить учетные данные +## session распределять ресурсы во время входа в систему, такие как личные данные, лимиты и другие. +## +## Выполнение из /etc/pam.d/system-login +## Тип модуля: session +## Глобальные переменные: +## PAM_RHOST Удалённый хост +## PAM_RUSER Удалённый пользователь +## PAM_SERVICE Сервис выполняющий вход /etc/pam.d/service_name +## PAM_TTY Консоль, может быть как "/dev/tty2" так и ":0" +## PAM_USER Текущий пользователь +## PAM_TYPE Тип сессии, возможные значения: account, auth, password, open_session, close_session +## +## PAM_RHOST= PAM_RUSER= PAM_SERVICE=login PAM_TTY=/dev/tty2 PAM_USER=superadmin PAM_TYPE=open_session +## PAM_RHOST= PAM_RUSER= PAM_SERVICE=login PAM_TTY=/dev/tty2 PAM_USER=superadmin PAM_TYPE=close_session +## PAM_RHOST= PAM_RUSER= PAM_SERVICE=lightdm-autologin PAM_TTY=:0 PAM_USER=superadmin PAM_TYPE=open_session +## PAM_RHOST= PAM_RUSER= PAM_SERVICE=systemd-user PAM_TTY= PAM_USER=lightdm PAM_TYPE=open_session +## PAM_RHOST= PAM_RUSER= PAM_SERVICE=systemd-user PAM_TTY= PAM_USER=user-2 PAM_TYPE=open_session +## PAM_RHOST= PAM_RUSER= PAM_SERVICE=lightdm PAM_TTY=:0 PAM_USER=user-2 PAM_TYPE=open_session +## PAM_RHOST=1.2.3.4 PAM_RUSER= PAM_SERVICE=sshd PAM_TTY=ssh PAM_USER=user-2 PAM_TYPE=open_session -################################################################################ -## JOURNALD_NOTIFY[u:NetworkManager:warning]=@ -## JOURNALD_NOTIFY[u:NetworkManager:warning]=ip@conflict -## JOURNALD_NOTIFY[u:*Network*:warning]=@ -## -u --unit -## echo "$(printf 'journalctl'; printf ' -u %s' $(journalctl -q -F UNIT | grep -E '^Network'))" -## journalctl -u NetworkManager -p warning -b -o export -n1 -f - -################################################################################ -## JOURNALD_NOTIFY[uu:NetworkManager:warning]=@ -## --user-unit - -################################################################################ -## JOURNALD_NOTIFY[t:*Network*:warning]=@ -## -t, --identifier=SYSLOG_IDENTIFIER -## echo "$(printf 'journalctl'; printf ' -t %s' $(journalctl -q -F SYSLOG_IDENTIFIER | grep -E '^gnome'))" -## journalctl -t gnome-system-monitor.desktop -t gnome-shell -t gnome-keyring-daemon -t gnome-session-binary -t gnome-session -################################################################################ -## JOURNALD_NOTIFY[f:daemon:warning]=@ -## --facility - -declare -A JOURNALD_NOTIFY +if [[ ${PAM_TYPE} == "open_session" && -n ${PAM_USER} ]]; then +# Выполнение функции вызвано используя PAM, получаем имя пользователя вызвавшего PAM, будем пременять только для пользователя + SELECT_USER="${PAM_USER}" +fi ## Вывод уведомления на рабочий стол полученных от лога journald -## JOURNALD_NOTIFY[|||]= +## JOURNALD_NOTIFY[:::]=;; ## # Тип фильтра -## u # Фильтр по юнитам системным, применимо на юнимами regexp -## uu # Фильтр (user-unit) по юнитам пользователя, применимо на юнимами regexp -## t # Фильтр (identifier) по идентификатору SYSLOG_IDENTIFIER, применимо regexp -## f # Фильтр (facility) по типу объекта SYSLOG, строгое значение +## u # Фильтр по юнитам системным или pattern +## uu # Фильтр (user-unit) по юнитам пользователя или pattern +## t # Фильтр (identifier) по идентификатору или pattern +## f # Фильтр (facility) по типу объекта , строгое значение ## # Значения для типа фильтра -## # Если =u то применимо REGEXP выражение -## # Если =uu то применимо REGEXP выражение -## # Если =t то применимо REGEXP выражение -## # Если =f то применимы варианты : -## # 0: kern (Kernel messages) -## # 1: user (User-level messages) -## # 2: mail (Mail system) -## # 3: daemon (System daemons) -## # 4: auth (Security/authorization messages) -## # 5: syslog (Messages generated internally by syslogd) -## # 6: lpr (Line printer subsystem (archaic subsystem)) -## # 7: news (Network news subsystem (archaic subsystem)) -## # 8: uucp (UUCP subsystem (archaic subsystem)) -## # 9: - (Clock daemon systemd-timesyncd) -## # 10: authpriv (Security/authorization messages) -## # 11: ftp (FTP daemon) -## # 12: - (NTP subsystem) -## # 13: - (Log audit) -## # 14: - (Log alert) -## # 15: cron (Scheduling daemon) -## # 16: local0 (Local use 0 (local0)) -## # 17: local1 (Local use 1 (local1)) -## # 18: local2 (Local use 2 (local2)) -## # 19: local3 (Local use 3 (local3)) -## # 20: local4 (Local use 4 (local4)) -## # 21: local5 (Local use 5 (local5)) -## # 22: local6 (Local use 6 (local6)) -## # 23: local7 (Local use 7 (local7)) +## # Если type=u то имя юнита системы или pattern +## # Если type=uu то имя юнита пользователя или pattern +## # Если type=t то имя идентификатора или pattern. Вывести доступные: journalctl -F SYSLOG_IDENTIFIER +## # Если type=f то применимы варианты facility: +## 0 | kern # 0: kern (Kernel messages) +## 1 | user # 1: user (User-level messages) +## 2 | mail # 2: mail (Mail system) +## 3 | daemon # 3: daemon (System daemons) +## 4 | auth # 4: auth (Security/authorization messages) +## 5 | syslog # 5: syslog (Messages generated internally by syslogd) +## 6 | lpr # 6: lpr (Line printer subsystem (archaic subsystem)) +## 7 | news # 7: news (Network news subsystem (archaic subsystem)) +## 8 | uucp # 8: uucp (UUCP subsystem (archaic subsystem)) +## 9 # 9: - (Clock daemon systemd-timesyncd) +## 10| authpriv # 10: authpriv (Security/authorization messages) +## 11| ftp # 11: ftp (FTP daemon) +## 12 # 12: - (NTP subsystem) +## 13 # 13: - (Log audit) +## 14 # 14: - (Log alert) +## 15| cron # 15: cron (Scheduling daemon) +## 16| local0 # 16: local0 (Local use 0 (local0)) +## 17| local1 # 17: local1 (Local use 1 (local1)) +## 18| local2 # 18: local2 (Local use 2 (local2)) +## 19| local3 # 19: local3 (Local use 3 (local3)) +## 20| local4 # 20: local4 (Local use 4 (local4)) +## 21| local5 # 21: local5 (Local use 5 (local5)) +## 22| local6 # 22: local6 (Local use 6 (local6)) +## 23| local7 # 23: local7 (Local use 7 (local7)) ## # Фильтр по приоритету 0:emerg 1:alert 2:crit 3:err 4:warning 5:notice 6:info 7:debug -## # 0: emergency (неработоспособность системы) -## # 1: alerts (предупреждения, требующие немедленного вмешательства) -## # 2: critical (критическое состояние) -## # 3: errors (ошибки) -## # 4: warning (предупреждения) -## # 5: notice (уведомления) -## # 6: info (информационные сообщения) -## # 7: debug (отладочные сообщения) -## # Произвольные дополнительные опции фильтра пользователя для journald -## # Шаблон обработки сообщения -## ip@conflict # Вырезать сообщение о конфликте IP адреса -## # Произвольное выражение вырезки для команды sed +## 0 | emerg # 0: emergency (неработоспособность системы) +## 1 | alert # 1: alerts (предупреждения, требующие немедленного вмешательства) +## 2 | crit # 2: critical (критическое состояние) +## 3 | err # 3: errors (ошибки) +## 4 | warning # 4: warning (предупреждения) +## 5 | notice # 5: notice (уведомления) +## 6 | info # 6: info (информационные сообщения) +## 7 | debug # 7: debug (отладочные сообщения) +## # Произвольные дополнительные опции фильтра пользователя для journald +## # Фильтр сообщения +## @ # Фильтр отключен, выводить все сообщения +## ip@conflict # Фильтровать сообщения о конфликте IP адреса +## ip@manager-connecting # Фильтровать сообщения NetworkManager о соединении +## ip@manager-disconnecting # Фильтровать сообщения NetworkManager об отсоединении +## ip # Фильтровать сообщения NetworkManager +## # Шаблон обработки сообщения, произвольное выражение вырезки для команды sed ## JOURNALD_NOTIFY[u:NetworkManager:warning]=@ ## JOURNALD_NOTIFY[u:NetworkManager:warning]=ip@conflict @@ -96,8 +106,20 @@ declare -A JOURNALD_NOTIFY ## JOURNALD_NOTIFY[uu:NetworkManager:warning]=@ ## JOURNALD_NOTIFY[t:*Network*:warning]=@ ## JOURNALD_NOTIFY[f:daemon:warning]=@ +## JOURNALD_NOTIFY[u:NetworkManager:warning]=@ +## JOURNALD_NOTIFY[u:NetworkManager]=ip@manager-disconnecting,ip@manager-connecting + +#1749316860.013993 NetworkManager[34283]: [1749316860.0139] device (ens192): IP address 192.168.7.121 cannot be configured because it is already in use in the network by host 00:0C:29:80:F2:5E +#1749316861.486311 NetworkManager[34283]: [1749316861.4862] device (ens192): Activation: failed for connection 'Проводное подключение 1' + +## echo "$(printf 'journalctl'; printf ' -u %s' $(journalctl -q -F UNIT | grep -E '^Network'))" +## echo "$(printf 'journalctl'; printf ' -t %s' $(journalctl -q -F SYSLOG_IDENTIFIER | grep -E '^gnome'))" +## journalctl -t gnome-system-monitor.desktop -t gnome-shell -t gnome-keyring-daemon -t gnome-session-binary -t gnome-session -#JOURNALD_NOTIFY[u:NetworkManager:warning]=@ +## TODO +## 1. type=uu требует доработки, т.к. запуск от рута и будут видны юниты только рута, а нужно от вошедшего пользователя. Поможет PAM pamsession расположение от которого запускается утилита +## Пользователь запустивший: ${SELECT_USER} +## 2. Рассмотреть запуск не через setsid, а через создание сервиса. Возможно и не нужно. exec_01_journald_notify(){ [[ $1 == @("set="|"set+="|"set++="|"set-="|"set--="|"remove") ]] && local COMMAND=$1 && shift @@ -105,86 +127,135 @@ exec_01_journald_notify(){ [[ $(declare -p JOURNALD_NOTIFY 2>/dev/null) =~ ^"declare -A" ]] || declare -gA JOURNALD_NOTIFY local PARAM="$@" if [[ -n ${PARAM} ]]; then - local APPDESKTOP_PLACEONDESKTOP_INIT= - declare -A APPDESKTOP_PLACEONDESKTOP_INIT=() + local JOURNALD_NOTIFY= + declare -A JOURNALD_NOTIFY=() [[ ${PARAM} =~ ^[[:alnum:]_]+("="|"[".*"]=") ]] && eval "${PARAM%%=*}=\${PARAM#*=}" fi - if [[ ${COMMAND} == @("set="|"set+="|"set++=") ]] && [[ ${#APPDESKTOP_PLACEONDESKTOP_INIT[@]} -ne 0 ]]; then - local ID_GROUPS= SELECT_USER_HOME= - for SELECT_USERS_GROUPS in "${!APPDESKTOP_PLACEONDESKTOP_INIT[@]}"; do - while IFS= read -r READ_USER_GROUP; do - if [[ -n ${SELECT_USER} ]]; then - # Применить для PAM пользователя - [[ -z ${ID_GROUPS} ]] && ID_GROUPS=$(id --name --groups ${SELECT_USER}) - if [[ ${READ_USER_GROUP} == "0" ]] || [[ ${READ_USER_GROUP} == ${SELECT_USER} ]] || [[ ${READ_USER_GROUP} =~ ^'@' && ${ID_GROUPS} =~ (^| )${READ_USER_GROUP//@/}( |$) ]]; then - SELECT_USER_HOME_INIT=$(getent passwd ${SELECT_USER} | cut -d: -f6) - [[ -f ${SELECT_USER_HOME_INIT}/.config/.place_on_desktop_init ]] && continue - copy_desktop "${SELECT_USER}" "${APPDESKTOP_PLACEONDESKTOP_INIT[${SELECT_USERS_GROUPS}]}" && touch ${SELECT_USER_HOME_INIT}/.config/.place_on_desktop_init - fi - elif [[ ${READ_USER_GROUP} == "0" ]]; then - # Применить для всех пользователей - for SELECT_USER in $(getent passwd | cut -d: -f1 | xargs); do - SELECT_USER_HOME_INIT=$(getent passwd ${SELECT_USER} | cut -d: -f6) - [[ -f ${SELECT_USER_HOME_INIT}/.config/.place_on_desktop_init ]] && continue - copy_desktop "${SELECT_USER}" "${APPDESKTOP_PLACEONDESKTOP_INIT[${SELECT_USERS_GROUPS}]}" && touch ${SELECT_USER_HOME_INIT}/.config/.place_on_desktop_init - SELECT_USER_HOME= - done - SELECT_USER= - elif [[ ! ${READ_USER_GROUP} =~ ^'@' ]] && getent passwd "${READ_USER_GROUP}" &>/dev/null; then - # Применить для выбанного пользователь - SELECT_USER=${READ_USER_GROUP} - SELECT_USER_HOME_INIT=$(getent passwd ${SELECT_USER} | cut -d: -f6) - [[ -f ${SELECT_USER_HOME_INIT}/.config/.place_on_desktop_init ]] && continue - copy_desktop "${SELECT_USER}" "${APPDESKTOP_PLACEONDESKTOP_INIT[${SELECT_USERS_GROUPS}]}" && touch ${SELECT_USER_HOME_INIT}/.config/.place_on_desktop_init - SELECT_USER=; SELECT_USER_HOME= - elif [[ ${READ_USER_GROUP} =~ ^'@' ]] && getent group "${READ_USER_GROUP//@/}" &>/dev/null; then - # Применить для выбраной группа - for SELECT_USER in $(getent group "${READ_USER_GROUP//@/}" | cut -d: -f4 | tr , ' '); do - SELECT_USER_HOME_INIT=$(getent passwd ${SELECT_USER} | cut -d: -f6) - [[ -f ${SELECT_USER_HOME_INIT}/.config/.place_on_desktop_init ]] && continue - copy_desktop "${SELECT_USER}" "${APPDESKTOP_PLACEONDESKTOP_INIT[${SELECT_USERS_GROUPS}]}" && touch ${SELECT_USER_HOME_INIT}/.config/.place_on_desktop_init - SELECT_USER_HOME= - done - SELECT_USER= - fi - done <<< ${SELECT_USERS_GROUPS//@(,|;)/$'\n'} + if [[ ${COMMAND} == @("set="|"set+="|"set++=") ]] && [[ ${#JOURNALD_NOTIFY[@]} -ne 0 ]]; then + local TYPE= TYPE_VOLUE= PRIORITY= OPTIONS= FILTER= + for SELECT_JOURNALD_NOTIFY in "${!JOURNALD_NOTIFY[@]}"; do + IFS=: read -r TYPE TYPE_VOLUE PRIORITY OPTIONS NULL <<< ${SELECT_JOURNALD_NOTIFY} + [[ -n ${TYPE} && -n ${TYPE_VOLUE} ]] || continue + case "${TYPE,,}" in + "u") TYPE="--unit" ;; + "uu") TYPE="--user-unit" ;; + "t") TYPE="--identifier" ;; + "f") TYPE="--facility" ;; + *) continue ;; + esac + [[ ${TYPE} == "--facility" ]] && { [[ ${TYPE_VOLUE,,} == @(0|kern|1|user|2|mail|3|daemon|4|auth|5|syslog|6|lpr|7|news|8|uucp|9|10|authpriv|11|ftp|12|13|14|15|cron|16|local0|17|local1|18|local2|19|local3|20|local4|21|local5|22|local6|23|local7) ]] || continue; } + [[ -n ${PRIORITY} && ${PRIORITY} == @(0|emerg|1|alert|2|crit|3|err|4|warning|5|notice|6|info|7|debug) ]] && PRIORITY="--priority ${PRIORITY}" + FILTER=${JOURNALD_NOTIFY[${SELECT_JOURNALD_NOTIFY}]} + pkill -f "/usr/lib/ublinux/rc.pamsession.d/02-journald-notify ubconfig_journald_notify_live ${TYPE} ${TYPE_VOLUE} ${PRIORITY} ${OPTIONS} ${FILTER}" + setsid -f /usr/lib/ublinux/rc.pamsession.d/02-journald-notify ubconfig_journald_notify_live "${TYPE}" "${TYPE_VOLUE}" "${PRIORITY}" "${OPTIONS}" "${FILTER}" + if [[ ${FILTER} =~ (^|,)"ip@conflict"(,|$) ]]; then + # Включить таймаут обнаружения конфликтов IP на всех сетевых интерфейсах + [[ ${NETWORK[all@connmod]} =~ "ipv4.dad-timeout -1" ]] || ubconfig --quiet --target system set [network] NETWORK[all@connmod]+=" ipv4.dad-timeout -1" + fi done elif [[ ${COMMAND} == @("set-="|"set--="|"remove") ]]; then if [[ ${PARAM%%=*} =~ ^.*'['(.*)']' && ${BASH_REMATCH[1]} == @("*"|"**"|"/"|"//") ]]; then PARAM_VALUE="${PARAM#*=}" - APPDESKTOP_PLACEONDESKTOP_INIT+="${PARAM_VALUE// /,}" + JOURNALD_NOTIFY+="${PARAM_VALUE// /,}" fi - local ID_GROUPS= SELECT_USER_HOME= - for SELECT_USERS_GROUPS in "${!APPDESKTOP_PLACEONDESKTOP_INIT[@]}"; do - while IFS= read -r READ_USER_GROUP; do - if [[ ${READ_USER_GROUP} == "0" ]]; then - # Применить для всех пользователей - for SELECT_USER in $(getent passwd | cut -d: -f1 | xargs); do - SELECT_USER_HOME_INIT=$(getent passwd ${SELECT_USER} | cut -d: -f6) - remove_desktop "${SELECT_USER}" "${APPDESKTOP_PLACEONDESKTOP_INIT[${SELECT_USERS_GROUPS}]}" && rm -f ${SELECT_USER_HOME_INIT}/.config/.place_on_desktop_init - SELECT_USER_HOME= - done - SELECT_USER= - elif [[ ! ${READ_USER_GROUP} =~ ^'@' ]] && getent passwd "${READ_USER_GROUP}" &>/dev/null; then - # Применить для выбанного пользователь - SELECT_USER=${READ_USER_GROUP} - SELECT_USER_HOME_INIT=$(getent passwd ${SELECT_USER} | cut -d: -f6) - remove_desktop "${SELECT_USER}" "${APPDESKTOP_PLACEONDESKTOP_INIT[${SELECT_USERS_GROUPS}]}" && rm -f ${SELECT_USER_HOME_INIT}/.config/.place_on_desktop_init - SELECT_USER=; SELECT_USER_HOME= - elif [[ ${READ_USER_GROUP} =~ ^'@' ]] && getent group "${READ_USER_GROUP//@/}" &>/dev/null; then - # Применить для выбраной группа - for SELECT_USER in $(getent group "${READ_USER_GROUP//@/}" | cut -d: -f4 | tr , ' '); do - SELECT_USER_HOME_INIT=$(getent passwd ${SELECT_USER} | cut -d: -f6) - remove_desktop "${SELECT_USER}" "${APPDESKTOP_PLACEONDESKTOP_INIT[${SELECT_USERS_GROUPS}]}" && rm -f ${SELECT_USER_HOME_INIT}/.config/.place_on_desktop_init - SELECT_USER_HOME= - done - SELECT_USER= - fi - done <<< ${SELECT_USERS_GROUPS//@(,|;)/$'\n'} + local TYPE= TYPE_VOLUE= PRIORITY= OPTIONS= FILTER= + for SELECT_JOURNALD_NOTIFY in "${!JOURNALD_NOTIFY[@]}"; do + IFS=: read -r TYPE TYPE_VOLUE PRIORITY OPTIONS NULL <<< ${SELECT_JOURNALD_NOTIFY} + [[ -n ${TYPE} && -n ${TYPE_VOLUE} ]] || continue + case "${TYPE,,}" in + "u") TYPE="--unit" ;; + "uu") TYPE="--user-unit" ;; + "t") TYPE="--identifier" ;; + "f") TYPE="--facility" ;; + *) continue ;; + esac + [[ ${TYPE} == "--facility" ]] && { [[ ${TYPE_VOLUE,,} == @(0|kern|1|user|2|mail|3|daemon|4|auth|5|syslog|6|lpr|7|news|8|uucp|9|10|authpriv|11|ftp|12|13|14|15|cron|16|local0|17|local1|18|local2|19|local3|20|local4|21|local5|22|local6|23|local7) ]] || continue; } + [[ -n ${PRIORITY} && ${PRIORITY} == @(0|emerg|1|alert|2|crit|3|err|4|warning|5|notice|6|info|7|debug) ]] && PRIORITY="--priority ${PRIORITY}" + FILTER=${JOURNALD_NOTIFY[${SELECT_JOURNALD_NOTIFY}]} + pkill -f "/usr/lib/ublinux/rc.pamsession.d/02-journald-notify ubconfig_journald_notify_live ${TYPE} ${TYPE_VOLUE} ${PRIORITY} ${OPTIONS} ${FILTER}" + if [[ ${FILTER} =~ (^|,)"ip@conflict"(,|$) ]]; then + # Выключить таймаут обнаружения конфликтов IP на всех сетевых интерфейсах + [[ ${NETWORK[all@connmod]} =~ "ipv4.dad-timeout -1" ]] && ubconfig --quiet --target system set [network] NETWORK[all@connmod]-="ipv4.dad-timeout -1" + fi done fi } +ubconfig_journald_notify_live(){ + local TYPE=$1 TYPE_VOLUE=$2 PRIORITY=$3 OPTIONS=$4 FILTER=$5 + NOTIFY_ICON="--icon dialog-information --urgency=normal" + init(){ + export TEXTDOMAIN="ublinux-init-${0##*/}" + export TEXTDOMAINDIR="${PATH_ROOT}/usr/share/locale" + } + i18n(){ + local KEY="$1" + shift + printf "$(gettext -s "${KEY}")" "$@" + } + show_notify(){ + local NO_NOTIFY= + while IFS= read -ru3 SELECT_FILTER; do + local NOTIFY_MESSAGE_SHOW= + case "${SELECT_FILTER}" in + "@") # Без фильтра + true + ;; + "ip@conflict") # Фильтр NetworkManager.service с переводом + # Убираем первых два блока тип сообщеия и дату, оставляем только: + #device (ens192): IP address 192.168.7.121 cannot be configured because it is already in use in the network by host 00:0C:29:80:F2:5E + FILTER_SED="s/^[^[:blank:]]+[[:blank:]]+[^[:blank:]]*[[:blank:]]+(.*)/\1/p" + NOTIFY_MESSAGE_TRIM=$(sed -En "${FILTER_SED}" <<< ${NOTIFY_MESSAGE}) + [[ ${NOTIFY_MESSAGE_TRIM} =~ ^"device ("([[:alnum:]]+)"): IP address "([[:digit:].]+)" cannot be configured because it is already in use in the network by host "([[:alnum:]:]+)$ ]] \ + && NOTIFY_MESSAGE_SHOW=$(i18n "device (%s): IP address %s cannot be configured because it is already in use in the network by host %s" "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "${BASH_REMATCH[3]}") #" + ;; + "ip@manager-connecting") # Фильтр NetworkManager.service с переводом + # Убираем первых два блока тип сообщеия и дату + FILTER_SED="s/^[^[:blank:]]+[[:blank:]]+[^[:blank:]]*[[:blank:]]+(.*)/\1/p" + NOTIFY_MESSAGE_TRIM=$(sed -En "${FILTER_SED}" <<< ${NOTIFY_MESSAGE}) + [[ ${NOTIFY_MESSAGE_TRIM} =~ ^"manager: NetworkManager state is now CONNECTING"$ ]] \ + && NOTIFY_MESSAGE_SHOW=$(i18n "manager: NetworkManager state is now CONNECTING") + ;; + "ip@manager-disconnecting") # Фильтр NetworkManager.service с переводом + # Убираем первых два блока тип сообщеия и дату + FILTER_SED="s/^[^[:blank:]]+[[:blank:]]+[^[:blank:]]*[[:blank:]]+(.*)/\1/p" + NOTIFY_MESSAGE_TRIM=$(sed -En "${FILTER_SED}" <<< ${NOTIFY_MESSAGE}) + [[ ${NOTIFY_MESSAGE_TRIM} =~ ^"manager: NetworkManager state is now DISCONNECTING"$ ]] \ + && NOTIFY_MESSAGE_SHOW=$(i18n "manager: NetworkManager state is now DISCONNECTING") + ;; + "ip") # Фильтр NetworkManager.service + # Убираем первых два блока тип сообщеия и дату, оставляем только: + FILTER_SED="s/^[^[:blank:]]+[[:blank:]]+[^[:blank:]]*[[:blank:]]+(.*)/\1/p" + NOTIFY_MESSAGE_SHOW=$(sed -En "${FILTER_SED}" <<< ${NOTIFY_MESSAGE}) + ;; + *) # Фильтр пользователя + FILTER_SED="${SELECT_FILTER}" + NOTIFY_MESSAGE_SHOW=$(sed -En "${FILTER_SED}" <<< ${NOTIFY_MESSAGE}) + ;; + esac + #[[ -n ${NOTIFY_MESSAGE_SHOW} ]] && echo "::${NOTIFY_ICON}::${NOTIFY_TIMESTAMP}::${NOTIFY_MESSAGE_SHOW}::" + [[ -n ${NOTIFY_MESSAGE_SHOW} ]] && notify_send --app-name "$(i18n "UBLinux notify from Journald")" ${NOTIFY_ICON} "$(i18n "New notify from %s" "${NOTIFY_SYSTEMD_UNIT}")" "${NOTIFY_TIMESTAMP}\n\n${NOTIFY_MESSAGE_SHOW}" & + #[[ -n ${NOTIFY_MESSAGE_SHOW} ]] && notify-send --app-name "UBConfig notify from Journald" ${NOTIFY_ICON} "New notify from UBConfig" "${NOTIFY_TIMESTAMP} ${NOTIFY_SYSTEMD_UNIT}\n\ndevice (ens192): IP address 192.168.7.121 cannot be configured because it is already in use in the network by host 00:0C:29:80:F2:5E" + done 3<<< ${FILTER//,/$'\n'} + } + init + journalctl ${TYPE} "${TYPE_VOLUE}" ${PRIORITY} --no-hostname --lines 1 --output export --follow ${OPTIONS} | while IFS= read SELECT_JOURNAL_ITEM; do + [[ ${SELECT_JOURNAL_ITEM} =~ ($'\n'|^)+"PRIORITY="([^$'\n']*)($'\n'|$)+ ]] && case ${BASH_REMATCH[2]} in + 0|emerg) NOTIFY_ICON="--icon dialog-error --urgency=critical" ;; + 1|alert) NOTIFY_ICON="--icon dialog-error --urgency=critical" ;; + 2|crit) NOTIFY_ICON="--icon dialog-error --urgency=critical" ;; + 3|err) NOTIFY_ICON="--icon dialog-error --urgency=normal" ;; + 4|warning) NOTIFY_ICON="--icon dialog-warning --urgency=normal" ;; + 5|notice) NOTIFY_ICON="--icon dialog-information --urgency=low" ;; + 6|info) NOTIFY_ICON="--icon dialog-information --urgency=low" ;; + 7|debug) NOTIFY_ICON="--icon dialog-information --urgency=low" ;; + esac + [[ ${SELECT_JOURNAL_ITEM} =~ ($'\n'|^)+"__REALTIME_TIMESTAMP="([^$'\n']*)($'\n'|$)+ ]] && NOTIFY_TIMESTAMP=$(date '+%d.%m.%Y %H:%M:%S' -d @${BASH_REMATCH[2]:0:10}) + [[ ${SELECT_JOURNAL_ITEM} =~ ($'\n'|^)+"_SYSTEMD_UNIT="([^$'\n']*)($'\n'|$)+ ]] && NOTIFY_SYSTEMD_UNIT="${BASH_REMATCH[2]}" + [[ ${SELECT_JOURNAL_ITEM} =~ ($'\n'|^)+"MESSAGE="([^$'\n']*)($'\n'|$)+ ]] && NOTIFY_MESSAGE="${BASH_REMATCH[2]}" && show_notify + done +} + ################ ##### MAIN ##### ################ @@ -198,7 +269,9 @@ exec_01_journald_notify(){ else FUNCTION= while [[ $# -gt 0 ]]; do - [[ -z ${1} ]] || { declare -f "${1}" &>/dev/null && FUNCTION+="; ${1}" || FUNCTION+=" '${1}'"; } + #[[ -z ${1} ]] || { declare -f "${1}" &>/dev/null && FUNCTION+="; ${1}" || FUNCTION+=" '${1}'"; } + # Что-бы передавать пустые параметры как аргументы, нужно для соблюдения очередности и кол-ва, отключил [[ -z ${1} ]] || + declare -f "${1}" &>/dev/null && FUNCTION+="; ${1}" || FUNCTION+=" '${1}'" shift done eval ${FUNCTION#*; } diff --git a/ublinux/templates/ublinux-data.ini b/ublinux/templates/ublinux-data.ini index 087c2da..5bae448 100644 --- a/ublinux/templates/ublinux-data.ini +++ b/ublinux/templates/ublinux-data.ini @@ -649,7 +649,68 @@ VERSION= #JOURNALD[SystemMaxUse]=8M #JOURNALD[RuntimeMaxUse]=8M -## JOURNALD_NOTIFY[]= +## Вывод уведомления на рабочий стол полученных от лога journald +## JOURNALD_NOTIFY[:::]=;; +## <---><------># Тип фильтра +## u<------><------># Фильтр по юнитам системным или pattern +## uu<-----><------># Фильтр (user-unit) по юнитам пользователя или pattern +## t<------><------># Фильтр (identifier) по идентификатору или pattern +## f<------><------># Фильтр (facility) по типу объекта , строгое значение +## <-----># Значения для типа фильтра +## <-><------># Если type=u то имя юнита системы или pattern +## <----><------># Если type=uu то имя юнита пользователя или pattern +## # Если type=t то имя идентификатора или pattern. Вывести доступные: journalctl -F SYSLOG_IDENTIFIER +##<----><------><------># Если type=f то применимы варианты facility: +## 0 | kern><------># 0: kern<--->(Kernel messages) +## 1 | user><------># 1: user<--->(User-level messages) +## 2 | mail><------># 2: mail<--->(Mail system) +## 3 | daemon<-----># 3: daemon<->(System daemons) +## 4 | auth><------># 4: auth<--->(Security/authorization messages) +## 5 | syslog<-----># 5: syslog<->(Messages generated internally by syslogd) +## 6 | lpr<><------># 6: lpr<---->(Line printer subsystem (archaic subsystem)) +## 7 | news><------># 7: news<--->(Network news subsystem (archaic subsystem)) +## 8 | uucp><------># 8: uucp<--->(UUCP subsystem (archaic subsystem)) +## 9<------><------># 9: -<------>(Clock daemon systemd-timesyncd) +## 10| authpriv<---># 10: authpriv (Security/authorization messages) +## 11| ftp<><------># 11: ftp<--->(FTP daemon) +## 12<-----><------># 12: -<----->(NTP subsystem) +## 13<-----><------># 13: -<----->(Log audit) +## 14<-----><------># 14: -<----->(Log alert) +## 15| cron><------># 15: cron<-->(Scheduling daemon) +## 16| local0<-----># 16: local0<>(Local use 0 (local0)) +## 17| local1<-----># 17: local1<>(Local use 1 (local1)) +## 18| local2<-----># 18: local2<>(Local use 2 (local2)) +## 19| local3<-----># 19: local3<>(Local use 3 (local3)) +## 20| local4<-----># 20: local4<>(Local use 4 (local4)) +## 21| local5<-----># 21: local5<>(Local use 5 (local5)) +## 22| local6<-----># 22: local6<>(Local use 6 (local6)) +## 23| local7<-----># 23: local7<>(Local use 7 (local7)) +## ><------># Фильтр по приоритету 0:emerg 1:alert 2:crit 3:err 4:warning 5:notice 6:info 7:debug +## 0 | emerg<------># 0: emergency (неработоспособность системы) +## 1 | alert<------># 1: alerts (предупреждения, требующие немедленного вмешательства) +## 2 | crit><------># 2: critical (критическое состояние) +## 3 | err<><------># 3: errors (ошибки) +## 4 | warning<----># 4: warning (предупреждения) +## 5 | notice<-----># 5: notice (уведомления) +## 6 | info><------># 6: info (информационные сообщения) +## 7 | debug<------># 7: debug (отладочные сообщения) +## <><------># Произвольные дополнительные опции фильтра пользователя для journald +## <-><------># Фильтр сообщения +## @<------><------># Фильтр отключен, выводить все сообщения +## ip@conflict<----># Фильтровать сообщения о конфликте IP адреса +## ip@manager-connecting # Фильтровать сообщения NetworkManager о соединении +## ip@manager-disconnecting # Фильтровать сообщения NetworkManager об отсоединении +## ip<-----><------># Фильтровать сообщения NetworkManager +## ># Шаблон обработки сообщения, произвольное выражение вырезки для команды sed + +## JOURNALD_NOTIFY[u:NetworkManager:warning]=@ +## JOURNALD_NOTIFY[u:*Network*:warning]=@ +## JOURNALD_NOTIFY[uu:NetworkManager:warning]=@ +## JOURNALD_NOTIFY[t:*Network*:warning]=@ +## JOURNALD_NOTIFY[f:daemon:warning]=@ +## JOURNALD_NOTIFY[u:NetworkManager:warning]=@ +## JOURNALD_NOTIFY[u:NetworkManager]=ip@manager-disconnecting,ip@manager-connecting +## JOURNALD_NOTIFY[u:NetworkManager:warning]=ip@conflict ## Настройка дампа ядра ## https://www.freedesktop.org/software/systemd/man/latest/systemd-coredump.html @@ -1570,14 +1631,14 @@ VERSION= ## Поддерживает Multiseat по номеру порта display:0=port:5900 display:1=port:5901 display:2=port:5902 ## X11VNC[password]= ## # Пароль кодировать в base64: echo 'ublinux' | base64 -## # Пароль для VNC сервиса x11vnc-ublinux:*.service. Настроен на работу только по паролю для всех рабочих мест. +## # Пароль для VNC сервиса x11vnc-ublinux:*.service. Настроен на работу только по паролю для всех рабочих мест. ## # Создаёт шифрованный пароль в файле /root/.vnc/.passwd ## X11VNC[password]=dWJsaW51eAo= ## Дополнительные опции к автоматическому соединению https://manpages.ubuntu.com/manpages/lunar/en/man1/x11vnc.1.html -## X11VNC[options]= +## X11VNC[options]=" " ## # Дополнительные опции перечисленные через пробел -## -noipv6 # +## -noipv6 # ## -ultrafilexfer # Включите расширение передачи файлов UltraVNC ## -tightfilexfer # Включите расширение передачи файлов TightVNC ## -xkb # Если копирование и вставка не работают должным образом с буфером обмена