2008-01-07

libnotify - работа из под рута

Заметил одну особенность Ubuntu support скрипты для Eee PC не выводят OSD сообщение на включение/выключение WiFi и Overclock-а. Хотя по описанию должны. Поковырялся внутрях и нашол скрипт на перле который выводил сообщения через libnotify. Но этот скрипт нигде не вызывался. И даже если он как-то вызывается, всё равно он ничего не выведет ибо запуск из под рута выдаёт ошибку связанную с доступом к DBus.

Погуглив, нашол в чём грабли. Первое: надо найти корректный DBus Session ID. И второе: надо запускать send-notify от того польозователя что и ранает иксы.

Вот решение:

#!/bin/bash
# 2008-01-07
# (c) Aleksei Antonovich google mail: aleksei.antonovich.
# Licensed under GPL.

# Ensure that the script is run as root
if [ `id -u` != 0 ]
then
echo "ERROR: this script is intended to be run as root."
exit 1
fi

# Ugly way to find an running X programs for all users
pids=`pgrep gnome-panel`

for pid in $pids; do
#Search for DBus for that process
DBUS=`grep -z DBUS_SESSION_BUS_ADDRESS \
/proc/$pid/environ | sed -e "s/DBUS_SESSION_BUS_ADDRESS=//"`

#Grab user of Gnome process
UNAME=`grep -z USERNAME \
/proc/$pid/environ | sed -e "s/USERNAME=//"`
# echo "user is: "$UNAME
# echo "DBUS is: "$DBUS
DBUS_SESSION_BUS_ADDRESS=$DBUS \
sudo -u $UNAME notify-send "$@"
done


Несколько кривовато определение программ запущенных под иксами, но работает. Если потом руки дойдут - сделаю более универсально.

Комментариев нет:

Отправить комментарий