LINUX.ORG.RU

[основы]нотификатор в cron


0

0

задача — сделать автоматическую напоминалку об апдейтах для себя и Gentoo

первая часть задачи решается так

запуск eix-sync && eix-update && eix-remote update

(для собственно обновления нужно лишь первое, остальное — «по вкусу» для чисто нужд eix)

на второй части надо накалякать скрипт, запускающий emerge -pavuDN world и грепающий выхлоп на предмет новых пакетов

на третьей — отправка уведомления в трей о новых пакетах, ежели такие есть

Вопрос: как из-под рута выслать «уведомлялку» обычному пользователю fat-troll, сидящему в KDE, средствами этого самого KDE?

И как выслать копию текста уведомлялки в syslog-ng (чтобы она появилась в vt12)?

И не рисую ли я велосипед, и для таких действий уже есть тулза?

eix-sync && eix-update

eix-sync уже включает в себя eix-update.

Вопрос: как из-под рута выслать «уведомлялку» обычному пользователю fat-troll, сидящему в KDE, средствами этого самого KDE?

KDialog

sudo -H -u edigaryev kdialog --msgbox 'portage synced, ready to update!'

edigaryev ★★★★★
()

выслать «уведомлялку» обычному пользователю fat-troll, сидящему в KDE

https://launchpad.net/notify-osd

И как выслать копию текста уведомлялки в syslog...

man logger

sdio ★★★★★
()
Ответ на: комментарий от edigaryev

valdos-desk fat-troll # su fat-troll -c 'kdialog --msgbox 'test"
No protocol specified
kdialog: cannot connect to X server :0.0

я туплю...вроде бы это делается просто...пните меня, а?

DoctorSinus ★★★★★
() автор топика
Ответ на: комментарий от DoctorSinus

env DISPLAY=:0 kdialog --msgbox 'test'
Но сессий может быть несколько и дисплей может быть разным, так что лучше запускать его не по крону, а вместе с сессией лузера.
И вообще

Deleted
()
Ответ на: комментарий от Deleted

спасибо

у меня лузер перелогинивается после обновлений ядра

так что....

DoctorSinus ★★★★★
() автор топика
Ответ на: комментарий от isden

а что, в этой вашей генте нет банального update-manager && update-notifier ? O_o

«Рождённые в СССРUbuntu»? %)

нету там такого, неееету =)

DoctorSinus ★★★★★
() автор топика

Ну я для себя решил эту задачу вот так А вообще если есть познания в python то layman -a sabayon и курить в сторону entropy-notification-applet + spritz правда там все привязано не к портежам а к поделию сабайона... но для джедая переделать не составит особого труда.

init_6 ★★★★★
()
Ответ на: комментарий от isden

но работает через ноги, блокируя zypper

DoctorSinus ★★★★★
() автор топика
Ответ на: комментарий от DoctorSinus

Основной скрипт notify.sh зависимости: прямые руки, трезвая голова и notify-send

#!/bin/sh
# notify.sh
# (c) init_6

user=`ps -C gnome-session -o user=` #find UID user who start gnome-session
pids=`pgrep -u $user gnome-session` #find PID
#Если не работает с gnome-session попробуйте к примеру с gnome-panel

title=$1
text=$2
timeout=$3
urgency=$4
icon=$5
category=$6

if [ -z "$urgency" ]; then
#	low, normal, critical
	urgency=normal
fi
if [ -z "$timeout" ]; then
        timeout=60000
fi
if [ -z "$icon" ]; then
        icon=/usr/share/icons/gnome/scalable/status/dialog-information.svg
#dialog-error.svg dialog-warning.svg
fi
if [ -z "$category" ]; then
#"device"		A generic device-related notification that doesn't fit into any other category.
#"device.added"	A device, such as a USB device, was added to the system.
#"device.error"	A device had some kind of error.
#"device.removed"	A device, such as a USB device, was removed from the system.
#"email"		A generic e-mail-related notification that doesn't fit into any other category.
#"email.arrived"	A new e-mail notification.
#"email.bounced"	A notification stating that an e-mail has bounced.
#"im"			A generic instant message-related notification that doesn't fit into any other category.
#"im.error"		An instant message error notification.
#"im.received"		A received instant message notification.
#"network"		A generic network notification that doesn't fit into any other category.
#"network.connected"	A network connection notification, such as successful sign-on to a network service. This should not be confused with device.added for new network devices.
#"network.disconnected"	A network disconnected notification. This should not be confused with device.removed for disconnected network devices.
#"network.error"	A network-related or connection-related error.
#"presence"		A generic presence change notification that doesn't fit into any other category, such as going away or idle.
#"presence.offline"	An offline presence change notification.
#"presence.online"	An online presence change notification.
#"transfer"		A generic file transfer or download notification that doesn't fit into any other category.
#"transfer.complete"	A file transfer or download complete notification.
#"transfer.error"	A file transfer or download error.
	category=transfer
fi
if [ -z "$title" ]; then
        echo You need to give me a title >&2
        exit 1
fi
if [ -z "$text" ]; then
        text=$title
fi

for pid in $pids; do
        # find DBUS session bus for this session
        DBUS_SESSION_BUS_ADDRESS=`grep -z DBUS_SESSION_BUS_ADDRESS \
                /proc/$pid/environ | sed -e 's/DBUS_SESSION_BUS_ADDRESS=//'`
        # use it
        DBUS_SESSION_BUS_ADDRESS=$DBUS_SESSION_BUS_ADDRESS \
        su $user -c "notify-send -u $urgency -t $timeout -i $icon -c $category '$title' '$text' "
done

Пример самой тупой автообновлялки с использованием notify.sh у меня он /usr/local/bin/update

#!/bin/sh
#update for gentoo
#emerge --sync
/usr/bin/emerge --sync && /usr/local/bin/notify.sh "Обновление" "Portage обновлены до "$(date +%D) 60000 normal /usr/share/icons/gnome/scalable/status/dialog-information.svg  transfer.complete || /usr/local/bin/notify.sh "Обновление" "Обновление portage завершилось неудачей" 60000 critical /usr/share/icons/gnome/scalable/status/dialog-error.svg  transfer.error;
#layman -S
/usr/bin/layman -S && /usr/local/bin/notify.sh "Обновление" "Оверлеи обновлены до "$(date +%D) 60000 normal /usr/share/icons/gnome/scalable/status/dialog-information.svg  transfer.complete || /usr/local/bin/notify.sh "Обновление" "Обновление оверлеев завершилось неудачей" 60000 critical /usr/share/icons/gnome/scalable/status/dialog-error.svg  transfer.error;
#emerge -uDNv @world
#/usr/bin/emerge -uDNv @world && /usr/local/bin/notify.sh "Обновление" "Мир обновлен" 60000 normal /usr/share/icons/gnome/scalable/status/dialog-information.svg  transfer.complete || /usr/local/bin/notify.sh "Обновление" "Обновление мира завершилось неудачей" 60000 critical /usr/share/icons/gnome/scalable/status/dialog-error.svg  transfer.error;
#emerge @preserved-rebuild
#/usr/bin/emerge @preserved-rebuild && /usr/local/bin/notify.sh "Обновление" "<strong>emerge @preserved-rebuild</strong> завершился успешно" 60000 normal /usr/share/icons/gnome/scalable/status/dialog-information.svg  transfer.complete || /usr/local/bin/notify.sh "Обновление" "<strong>emerge @preserved-rebuild</strong> завершилось неудачей" 60000 critical /usr/share/icons/gnome/scalable/status/dialog-error.svg  transfer.error;
#revdep-rebuild
#/usr/bin/revdep-rebuild && /usr/local/bin/notify.sh "Обновление" "<strong>revdep-rebuild</strong> завершился успешно" 60000 normal /usr/share/icons/gnome/scalable/status/dialog-information.svg  transfer.complete || /usr/local/bin/notify.sh "Обновление" "<strong>revdep-rebuild</strong> завершилось неудачей" 60000 critical /usr/share/icons/gnome/scalable/status/dialog-error.svg  transfer.error;

Чтоб все заработало

echo "#! /bin/sh

/usr/local/bin/update
" >> /etc/cron.daily/update;
chmod +x /etc/cron.daily/update;

А можно просто руками запустить /etc/cron.daily/update и проверить ;)

init_6 ★★★★★
()
Ответ на: комментарий от DoctorSinus

а то у вас там что-то с амперсандами...

1) С амперсандами у меня все прекрасно.

2) Учись: «дебажить» скрипты, и если надо исправлять ошибки.

3) Нехер мне больше делать как по сто пятьдесят раз копипастом заниматься.

init_6 ★★★★★
()
Ответ на: комментарий от init_6

два фикса

один — кедоспецифичный

user=`ps -C plasma-desktop -o user=` #find UID user who start gnome-session
pids=`pgrep -u $user plasma-desktop` #find PID

и второй

for pid in $pids; do
        su $user -c "notify-send -u $urgency -t $timeout -i $icon -c $category '$title' '$text' "
done
DoctorSinus ★★★★★
() автор топика
Ответ на: комментарий от DoctorSinus

Спасибо за фиксы ;) Правда стоит сказать, что кеды меня по крайней мере в данный момент особо не волнуют... и по сути там можно что угодно ловить главное чтобы оно было от нужного юзера запущенно

А второй... странно но факт раньше так не работало... В общем спасибо.

init_6 ★★★★★
()
Ответ на: комментарий от init_6

кстати о втором — нужен ещё такой фикс

в скрипт обновления

export XAUTHORITY="/home/лузер/.Xauthority"
export DISPLAY=":0"

минусы метода — если запущены два X-сервера, попадет сообщение только на первый

и только тому юзеру, который прописан выше..хотя, если сделать проверку на plasma-desktop, как в notify.sh — должно сработать на любом слогиненном юзере (не проверял) . Два X-сервера как лечить — не знаю (сообщение уйдет на первый).

Ваше DBUS_SESSION_BUS_ADDRESS по-видимому что-то гномоспецифичное — в кедах этот номер абсолютно точно не прокатывает

DoctorSinus ★★★★★
() автор топика
Ответ на: комментарий от DoctorSinus

Ваше DBUS_SESSION_BUS_ADDRESS по-видимому что-то гномоспецифичное — в кедах этот номер абсолютно точно не прокатывает

Смешно то что без него раньше не работало вообще. Теперь работает...

в скрипт обновления

Не ну вообще не помешает... Но сообщение то посылать будет все равно notify.sh

init_6 ★★★★★
()
Ответ на: комментарий от init_6

просится-то просится, да ничего, более bash, я не знаю =(

DoctorSinus ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.