#!/usr/bin/env bash # # Author: Dmitry Razumov # Copyright (c) 2021-2025 UBLinux # # 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[|||]= ## # Тип фильтра ## u # Фильтр по юнитам системным, применимо на юнимами regexp ## uu # Фильтр (user-unit) по юнитам пользователя, применимо на юнимами regexp ## t # Фильтр (identifier) по идентификатору SYSLOG_IDENTIFIER, применимо regexp ## f # Фильтр (facility) по типу объекта SYSLOG, строгое значение ## # Значения для типа фильтра ## # Если =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)) ## # Фильтр по приоритету 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 ## 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