Pull to refresh

Comments 9

согласен, если запустить на хабре поиск по ключевому слову 'notify-send', то получим целый ворох довольно одинаковых статей, в которых просто выводится уведомление. Основная идея моей статьи - не только отправить уведомление в более богатом обрамлении, но и обработать последующие события: нажатия кнопок, закрытие.

О, напомнили о dbus. Теперь я знаю как переключать звук на гарнитуру автоматически или даже по хоткею при ее подключении по BT.

Зачем для этого dbus? Можно просто сказать pulseaudio, чтобы переключал автоматически.

Спасибо, даже не подозревал о консольном управлении pulseaudio

Для этого не надо им управлять, достаточно строчки в конфиге, чтобы была полная автоматика:
load-module module-switch-on-connect

Второй вариант — утилита 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
Sign up to leave a comment.