Add JOURNALD_NOTIFY[] and fix 41-x11vnc

master v2.109
Dmitry Razumov 6 months ago
parent 3d44d6760e
commit 7acc3d97ad
Signed by: asmeron
GPG Key ID: 50BC1DB583B79706

@ -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 <support@ublinux.com>, 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 <support@ublinux.com>\n"
"Language-Team: UBLinux Team <support@ublinux.com>\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 ""

@ -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 <support@ublinux.com>, 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 <support@ublinux.com>\n"
"Language-Team: Russian - UBLinux Team <support@ublinux.com>\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"

@ -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
;;

@ -1,4 +1,8 @@
#!/usr/bin/env bash
#
# Author: Dmitry Razumov <asmeron@ublinux.com>
# Copyright (c) 2021-2025 UBLinux <support@ublinux.com>
#
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]=<hash_password>
## <hash_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]="<options> <options> <options>"
## <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 $@

@ -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[<type>|<type_value>|<priority>|<options>]=<regexp_message>
## JOURNALD_NOTIFY[<type>:<type_value>:<priority>:<options>]=<filter>;<filter>;<filter>
## <type> # Тип фильтра
## u # Фильтр по юнитам системным, применимо на юнимами regexp
## uu # Фильтр (user-unit) по юнитам пользователя, применимо на юнимами regexp
## t # Фильтр (identifier) по идентификатору SYSLOG_IDENTIFIER, применимо regexp
## f # Фильтр (facility) по типу объекта SYSLOG, строгое значение
## u # Фильтр по юнитам системным или pattern
## uu # Фильтр (user-unit) по юнитам пользователя или pattern
## t # Фильтр (identifier) по идентификатору <SYSLOG_IDENTIFIER> или pattern
## f # Фильтр (facility) по типу объекта <SYSLOG>, строгое значение
## <type_value> # Значения для типа фильтра
## # Если <type>=u то применимо REGEXP выражение
## # Если <type>=uu то применимо REGEXP выражение
## # Если <type>=t то применимо REGEXP выражение
## # Если <type>=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))
## <unit> # Если type=u то имя юнита системы или pattern
## <user-unit> # Если type=uu то имя юнита пользователя или pattern
## <SYSLOG_IDENTIFIER> # Если 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))
## <priority> # Фильтр по приоритету 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 (отладочные сообщения)
## <options> # Произвольные дополнительные опции фильтра пользователя для journald
## <regexp_message> # Шаблон обработки сообщения
## ip@conflict # Вырезать сообщение о конфликте IP адреса
## <regexp> # Произвольное выражение вырезки для команды 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 (отладочные сообщения)
## <options> # Произвольные дополнительные опции фильтра пользователя для journald
## <filter> # Фильтр сообщения
## @ # Фильтр отключен, выводить все сообщения
## ip@conflict # Фильтровать сообщения о конфликте IP адреса
## ip@manager-connecting # Фильтровать сообщения NetworkManager о соединении
## ip@manager-disconnecting # Фильтровать сообщения NetworkManager об отсоединении
## ip # Фильтровать сообщения NetworkManager
## <regexp_message> # Шаблон обработки сообщения, произвольное выражение вырезки для команды 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]: <warn> [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]: <warn> [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}")" "<b>${NOTIFY_TIMESTAMP}</b>\n\n${NOTIFY_MESSAGE_SHOW}" &
#[[ -n ${NOTIFY_MESSAGE_SHOW} ]] && notify-send --app-name "UBConfig notify from Journald" ${NOTIFY_ICON} "New notify from UBConfig" "<b>${NOTIFY_TIMESTAMP} ${NOTIFY_SYSTEMD_UNIT}</b>\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#*; }

@ -649,7 +649,68 @@ VERSION=
#JOURNALD[SystemMaxUse]=8M
#JOURNALD[RuntimeMaxUse]=8M
## JOURNALD_NOTIFY[<unit>]=<value>
## Вывод уведомления на рабочий стол полученных от лога journald
## JOURNALD_NOTIFY[<type>:<type_value>:<priority>:<options>]=<filter>;<filter>;<filter>
## <type><---><------># Тип фильтра
## u<------><------># Фильтр по юнитам системным или pattern
## uu<-----><------># Фильтр (user-unit) по юнитам пользователя или pattern
## t<------><------># Фильтр (identifier) по идентификатору <SYSLOG_IDENTIFIER> или pattern
## f<------><------># Фильтр (facility) по типу объекта <SYSLOG>, строгое значение
## <type_value><-----># Значения для типа фильтра
## <unit><-><------># Если type=u то имя юнита системы или pattern
## <user-unit><----><------># Если type=uu то имя юнита пользователя или pattern
## <SYSLOG_IDENTIFIER> # Если 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))
## <priority>><------># Фильтр по приоритету 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 (отладочные сообщения)
## <options><><------># Произвольные дополнительные опции фильтра пользователя для journald
## <filter><-><------># Фильтр сообщения
## @<------><------># Фильтр отключен, выводить все сообщения
## ip@conflict<----># Фильтровать сообщения о конфликте IP адреса
## ip@manager-connecting # Фильтровать сообщения NetworkManager о соединении
## ip@manager-disconnecting # Фильтровать сообщения NetworkManager об отсоединении
## ip<-----><------># Фильтровать сообщения NetworkManager
## <regexp_message>># Шаблон обработки сообщения, произвольное выражение вырезки для команды 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,12 +1631,12 @@ VERSION=
## Поддерживает Multiseat по номеру порта display:0=port:5900 display:1=port:5901 display:2=port:5902
## X11VNC[password]=<hash_password>
## <hash_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]=<options>
## X11VNC[options]="<options> <options> <options>"
## <options> # Дополнительные опции перечисленные через пробел
## -noipv6 #
## -ultrafilexfer # Включите расширение передачи файлов UltraVNC

Loading…
Cancel
Save