Permalink
Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
104 lines (79 sloc) 10.8 KB

title: "Dbuscron" lang: ru date: 12 Dec 2010 00:00:00 +0200 extends: default.liquid tags: dbus, cron, python, программинг, maemo, n900

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 рекомендуется использовать для правки конфига, и на то есть несколько причин:

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

Ну и напоследок опции самого 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 можно скачать отсюда.