|
|
#!/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
|