Dbuscron
Upd: Выпустил версию 1.3. Здесь же можно скачать deb-пакет для Maemo 5. Билд включает в себя одну новую фичу и некоторые улучшения в выводе логов и обработке ошибок:
- new cli args: userid and groupid to set user and group to change too
- moved user & group id setting code into separate function
- main module code cleanup: more comments & logging, better error handling etc.
- Makefile: debclean & deb targets
- auto version setting
- Makefile: build target
- changelog updated
Самая главная фишка новой версии — два новых параметра --userid
и --groupid
, которые заставляют демон менять юзера и группу, от которых он запущен. Это нужно как для соблюдения безопасности, так и для возможности запуска на сессионной шине другого юзера. Ясное дело, что работают эти опции только если демон запущен из-под рута. В качестве значений этим параметрам можно передавать как числовой идентификатор юзера или группы, так и строковое имя. Если задан только параметр --userid
, то группа процесса будет установлена в основную группу этого юзера.
Upd: Вышла версия 1.2. Можно скачать deb-пакет для Maemo 5. Она включает в себя несколько фиксов и просто улучшений кода:
- dbuscron uses optparse instead of getopt
- Makefile: ignore error on existing config
- more robust and unicode safe dbus string handling
- fixed unset session bus address issue
- more robust loggin of unicode messages
- better log messages
- dbuscrontab: refactored error handling
- moved shell part into modules
- Makefile updated
- changelog updated
Кроме того в прошлый раз я забыл рассказать об утилитке dbuscrontab, которая предназнаяена для корректного редактирования конфига dbuscron-а. Работает она аналогично соответствующей утилитке crontab из обычного крона. Принимает один из параметров:
- -l — показать содержимое конфига на стандартный вывод,
- -k — проверить конфиг на корректность синтаксиса,
- -e — отредактировать конфиг стандартным системным редактором (берёт из переменной среды
EDITOR
или/usr/bin/vim
, если эта переменная не установлена).
Особенно примечателен параметр -e. Именно dbuscrontab -e
рекомендуется использовать для правки конфига, и на то есть несколько причин:
- он редактирует не сам /etc/dbuscrontab напрямую, а его копию, так что меньше шансов потерять рабочий оригинал в результате какого-то краха системы,
- после редактирования он заменяет оригинал на отредактированную копию только если редактор завершился корректно и копия действительно поменялась,
- кроме того он проверяет копию на синтаксис перед её копированием поверх оригинала, так что если вы напортачили в конфиге, то ничего страшного не произойдёт: оригинал останется старым.
Ну и напоследок опции самого dbuscron-а:
- -f, --nodaemon — запустить демон без демонизации, например для тестов;
- -l, --log, --logfile — указать файл для логов, куда будет писаться весь стандартный вывод и вывод ошибок как запущенных программ, так и самого демона, не работает с -f;
- -c, --conf, --config — указать файл с конфигом вместо умолчального
/etc/dbuscrontab
; - -q, --quiet — сделать демон «тише», можно повторить несколько раз, чтобы скрыть более критические сообщения в логах;
- -v, --verbose — сделать демон «громче», можно повторить несколько раз, чтобы показать больше отладочных сообщений (более низкой важности);
После некоторых доработок решил отдать на откуп сообществу свой cron-подобный шедулер DBUS-событий. Писал я его для своей N900, так что deb-пакет расчитан именно на Maemo 5, но использовать его можно в любом Linux-е с DBUS-ом. Писано на питоне.
Работает очень просто: запускаем dbuscron и радуемся жизни =)
Хотя для начала лучше настроить. Формат dbuscrontab-а (который лежит в /etc/dbuscrontab) похож на crontab-овский. Каждая строчка — фильтр для DBUS события. Эти фильтры состоят из 9 полей: шина («S» — системная, «s» — сессионная), тип события (signal, method_call, method_return или error), имя назначения на шине, имя интерфейса, «путь» к объекту, имя метода, имя получателя, аргументы и команда для запуска.
Каждое поле может иметь несколько значений через запятую, либо звёздочку (*), если фильтровать по этому полю не надо. Поле с аргументами может содержать несколько аргументов, разделённых точкой с запятой: событие пройдёт если эти значения совпадут со значениями аргументов, с которыми вызвано это DBUS-событие.
Также можно указывать переменные среды в произвольном месте конфига в виде «ИМЯ=ЗНАЧЕНИЕ».
Кроме того следующие переменные среды всегда устанавливаются самим демоном при вызове команды:
- DBUS_ARG# (где # это номер от 0 до DBUS_ARGN) — аргументы события,
- DBUS_ARGN — число аргументов,
- DBUS_SENDER — имя отправителя события,
- DBUS_DEST — имя получателя события,
- DBUS_IFACE — интерфейс,
- DBUS_PATH — путь к объекту,
- DBUS_MEMBER — вызванный метод,
- DBUS_BUS — шина, по которой пришло событие («session» или «system»),
- DBUS_TYPE — тип событие (signal, method_call, method_return или error).
Пустые строки и строки, начинающиеся на «#» как всегда игнорируются =)
Можно долго распинаться по поводу возможностей, но я лучше приведу в пример свой рабочий конфиг с комментами:
# Остановить плеер при вынимани наушников
S signal * org.freedesktop.Hal.Device /org/freedesktop/Hal/devices/platform_headphone Condition * ButtonPressed;connection grep -q disconnected /sys/devices/platform/gpio-switch/headphone/state && run-standalone.sh /opt/userscripts/mpcontrol.sh stop
# Произнести номер звонящего с помощью espeak
S signal * com.nokia.csd.Call /com/nokia/csd/call Coming * * run-standalone.sh /opt/userscripts/tasks/speak-caller.sh
# Подключить интернет по PPTP при включении домашнего wifi-я
S signal * com.nokia.wlancond.signal /com/nokia/wlancond/signal connected * wlan0 run-standalone.sh /opt/userscripts/tasks/connect-pptp.sh
# Отключить этот инет
S signal * com.nokia.wlancond.signal /com/nokia/wlancond/signal disconnected * wlan0 run-standalone.sh /opt/userscripts/tasks/disconnect-pptp.sh
# Переключиться на 3G при включении сотового коннекта, чтобы быстрее было =)
S signal * com.nokia.csd.GPRS.Context /com/nokia/csd/gprs/0 Connected * * /opt/userscripts/radiomode.sh both
# При отключении сотового инета, переключиться на GSM, чтобы батарейку сохранить
S signal * com.nokia.csd.GPRS.Context /com/nokia/csd/gprs/0 Disconnected * * /opt/userscripts/radiomode.sh gsm
# Вот такое событие приходит при смене соты:
#S signal * Phone.Net /com/nokia/phone/net cell_info_change * status;lac;cid;mnc;mcc;services;userdata command
# Вот такое при смене имени оператора:
#S signal * Phone.Net /com/nokia/phone/net operator_name_change * status;opname;unk;mnc;mcc command
# При смене имени оператора, вывести попап-сообщение об этом:
S signal * Phone.Net /com/nokia/phone/net operator_name_change * * run-standalone.sh /opt/userscripts/tasks/show-opname.sh
В общем возможностей множество =) Пользуйтесь на здоровье.
Лежит это чудо на гитхабе вот тут: http://github.com/kstep/dbuscron. Готовый пакет для Maemo 5 можно скачать отсюда.