Comments 9
На Хабре был перевод на близкую тему:
Создание уведомлений и напоминаний на рабочем столе из Linux терминала
согласен, если запустить на хабре поиск по ключевому слову 'notify-send', то получим целый ворох довольно одинаковых статей, в которых просто выводится уведомление. Основная идея моей статьи - не только отправить уведомление в более богатом обрамлении, но и обработать последующие события: нажатия кнопок, закрытие.
О, напомнили о dbus. Теперь я знаю как переключать звук на гарнитуру автоматически или даже по хоткею при ее подключении по BT.
Второй вариант — утилита notify-send. Тут опций побогаче, но также нет важного функционала — обработки реакции пользователя. Даже когда вы начнёте разбираться с параметрами опции --hint, то также ничего полезного там не обнаружите.
В достаточно новый версиях notify-send
есть параметр --action
, который позволяет обработать реакцию пользователя. Возможно, в вашей версии его еще просто не добавили? Мне кажется, с этим код будет немного чище
$ notify-send --version
notify-send 0.8.2
$ notify-send --help | grep action
-A, --action=[NAME=]Text... Specifies the actions to display to the user. Implies --wait to wait for user input. May be set multiple times. The name of the action is output to stdout. If NAME is not specified, the numerical index of the option is used (starting with 0).
Немного изменил, чтобы скрипт сам искал домен и контроллеры к которым можно обратиться за информацией.
#!/usr/bin/env bash
FQDN=$(hostname -f)
DOMAIN=$(echo "$FQDN" | awk -F '.' '{ print $(NF-1)"."$NF }')
ADSRV_LIST=()
ALARMDAYS=7
while read line; do
ADSRV=$(echo "$line" | awk '{ print $8 }' | sed 's/\.$//')
ADSRV_LIST+=("$ADSRV")
done <<< "$(host -t SRV _ldap._tcp.$DOMAIN)"
for ADSRV in "${ADSRV_LIST[@]}"; do
EXPDATE=($(LC_TIME=C rpcclient -N -c "queryuser $USER" $ADSRV | grep 'Password must change Time'))
[ ${#EXPDATE[@]} -eq 0 ] && exit
ALARMTTL=$(($(date -d "${EXPDATE[*]:5:5}" +%s) - $EPOCHSECONDS - $ALARMDAYS*86400))
if [ $ALARMTTL -le 0 ]; then
break
fi
done
MSGID=$(busctl --user --json=short call org.freedesktop.Notifications \
/org/freedesktop/Notifications org.freedesktop.Notifications Notify \
susssasa{sv}i "" 0 password "Ваш пароль истекает" "$(date -d "${EXPDATE[*]:5:5}" +%c)" \
2 "chpw" "изменить пароль" 0 10000 | jq -r .data[0])
busctl --user --json=short --match="type='signal',interface='org.freedesktop.Notifications'" monitor | while read
do
[ "x$(echo $REPLY | jq -r .payload.data[0])" != "x$MSGID" ] && continue
case $(echo $REPLY | jq -r .member) in
'ActionInvoked')
[ "x$(echo $REPLY | jq -r .payload.data[1])" == "xchpw" ] && userpasswd
;;
'NotificationClosed')
pkill -P $$
;;
esac
done
Как отправлять и обрабатывать графические уведомления на bash