You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ublinux-init/ublinux/rc.pamsession.d/02-journald-notify

207 lines
11 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#!/usr/bin/env bash
#
# Author: Dmitry Razumov <asmeron@ublinux.com>
# Copyright (c) 2021-2025 UBLinux <support@ublinux.com>
#
# Extended pattern matching: https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html#Pattern-Matching
shopt -s extglob
ENABLED=
[[ ${ENABLED} == yes ]] || exit 0
SOURCE=/usr/lib/ublinux/functions; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null
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
################################################################################
## 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
## Вывод уведомления на рабочий стол полученных от лога journald
## JOURNALD_NOTIFY[<type>|<type_value>|<priority>|<options>]=<regexp_message>
## <type> # Тип фильтра
## u # Фильтр по юнитам системным, применимо на юнимами regexp
## uu # Фильтр (user-unit) по юнитам пользователя, применимо на юнимами regexp
## t # Фильтр (identifier) по идентификатору SYSLOG_IDENTIFIER, применимо regexp
## 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))
## <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
## JOURNALD_NOTIFY[u:NetworkManager:warning]=@
## JOURNALD_NOTIFY[u:NetworkManager:warning]=ip@conflict
## 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]=@
exec_01_journald_notify(){
[[ $1 == @("set="|"set+="|"set++="|"set-="|"set--="|"remove") ]] && local COMMAND=$1 && shift
[[ -n ${COMMAND} ]] || local COMMAND="set="
[[ $(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=()
[[ ${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'}
done
elif [[ ${COMMAND} == @("set-="|"set--="|"remove") ]]; then
if [[ ${PARAM%%=*} =~ ^.*'['(.*)']' && ${BASH_REMATCH[1]} == @("*"|"**"|"/"|"//") ]]; then
PARAM_VALUE="${PARAM#*=}"
APPDESKTOP_PLACEONDESKTOP_INIT+="${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'}
done
fi
}
################
##### MAIN #####
################
# Если файл подключен как ресурс с функциями, то выйти
return 0 2>/dev/null && return 0
if [[ -z $@ ]]; then
while read -r FUNCTION; do
$"${FUNCTION##* }"
done < <(declare -F | grep "declare -f exec_")
else
FUNCTION=
while [[ $# -gt 0 ]]; do
[[ -z ${1} ]] || { declare -f "${1}" &>/dev/null && FUNCTION+="; ${1}" || FUNCTION+=" '${1}'"; }
shift
done
eval ${FUNCTION#*; }
fi
true