edit

Dbuscron

event Sun 12 Dec '10
label dbus, cron, python, программинг, maemo, n900
language ru
code code

Upd: Выпустил версию 1.3. Здесь же можно скачать deb-пакет для Maemo 5. Билд включает в себя одну новую фичу и некоторые улучшения в выводе логов и обработке ошибок:

Самая главная фишка новой версии — два новых параметра --userid и --groupid, которые заставляют демон менять юзера и группу, от которых он запущен. Это нужно как для соблюдения безопасности, так и для возможности запуска на сессионной шине другого юзера. Ясное дело, что работают эти опции только если демон запущен из-под рута. В качестве значений этим параметрам можно передавать как числовой идентификатор юзера или группы, так и строковое имя. Если задан только параметр --userid, то группа процесса будет установлена в основную группу этого юзера.


Upd: Вышла версия 1.2. Можно скачать deb-пакет для Maemo 5. Она включает в себя несколько фиксов и просто улучшений кода:

Кроме того в прошлый раз я забыл рассказать об утилитке dbuscrontab, которая предназнаяена для корректного редактирования конфига dbuscron-а. Работает она аналогично соответствующей утилитке crontab из обычного крона. Принимает один из параметров:

Особенно примечателен параметр -e. Именно dbuscrontab -e рекомендуется использовать для правки конфига, и на то есть несколько причин:

  1. он редактирует не сам /etc/dbuscrontab напрямую, а его копию, так что меньше шансов потерять рабочий оригинал в результате какого-то краха системы,
  2. после редактирования он заменяет оригинал на отредактированную копию только если редактор завершился корректно и копия действительно поменялась,
  3. кроме того он проверяет копию на синтаксис перед её копированием поверх оригинала, так что если вы напортачили в конфиге, то ничего страшного не произойдёт: оригинал останется старым.

Ну и напоследок опции самого dbuscron-а:


После некоторых доработок решил отдать на откуп сообществу свой cron-подобный шедулер DBUS-событий. Писал я его для своей N900, так что deb-пакет расчитан именно на Maemo 5, но использовать его можно в любом Linux-е с DBUS-ом. Писано на питоне.

Работает очень просто: запускаем dbuscron и радуемся жизни =)

Хотя для начала лучше настроить. Формат dbuscrontab-а (который лежит в /etc/dbuscrontab) похож на crontab-овский. Каждая строчка — фильтр для DBUS события. Эти фильтры состоят из 9 полей: шина («S» — системная, «s» — сессионная), тип события (signal, method_call, method_return или error), имя назначения на шине, имя интерфейса, «путь» к объекту, имя метода, имя получателя, аргументы и команда для запуска.

Каждое поле может иметь несколько значений через запятую, либо звёздочку (*), если фильтровать по этому полю не надо. Поле с аргументами может содержать несколько аргументов, разделённых точкой с запятой: событие пройдёт если эти значения совпадут со значениями аргументов, с которыми вызвано это DBUS-событие.

Также можно указывать переменные среды в произвольном месте конфига в виде «ИМЯ=ЗНАЧЕНИЕ».

Кроме того следующие переменные среды всегда устанавливаются самим демоном при вызове команды:

Пустые строки и строки, начинающиеся на «#» как всегда игнорируются =)

Можно долго распинаться по поводу возможностей, но я лучше приведу в пример свой рабочий конфиг с комментами:

# Остановить плеер при вынимани наушников
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 можно скачать отсюда.