4588f61f20008ea04570207361ad7d3588c7a2ac
[dbuscron] / dbuscron.py
1 #!/usr/bin/python
2 #
3 # bus type sender interface path member destination args command
4 #
5 # Examples for N900:
6 #
7 # Headphones unplugged:
8 # S signal * org.freedesktop.Hal.Manager /org/freedesktop/Hal/Manager DeviceRemoved * * echo Headphones unplugged;
9 #
10 # Call recieved:
11 # S signal * com.nokia.csd.Call /com/nokia/csd/call Coming * * echo $DBUS_ARG1 is calling
12 #
13
14 import sys
15
16 if __name__ == '__main__':
17
18     from dbuscron import Logger, OptionsParser
19
20     options = OptionsParser(
21             daemon=dict(names=('-f', '--nodaemon'), action='store_false', default=True),
22             quiet=dict(names=('--quiet', '-q'), action='count', default=0),
23             verbose=dict(names=('--verbose', '-v'), action='count', default=0),
24             config=dict(names=('--conf', '--config', '-c'), default='/etc/dbuscrontab'),
25             logfile=dict(names=('--log', '--logfile', '-l')))
26
27     logout = sys.stderr
28     if options.logfile:
29         logout = open(options.logfile, 'wb')
30
31     log = Logger(__name__, out=logout)
32     log.level = options.verbose - options.quiet + Logger.WARNING
33
34     if options.daemon:
35         from dbuscron.daemonize import daemonize
36         daemonize(
37             pidfile='/var/run/dbuscron.pid',
38             logfile='/var/log/dbuscron.log'
39             )
40
41     from dbuscron import DbusBus, DbusRule, Command, Commands, CrontabParser
42
43     bus = DbusBus()
44     commands = Commands()
45
46     crontab = CrontabParser(options.config)
47
48     def load_config(parser):
49         for rule, cmd in parser:
50             matcher = DbusRule(**rule)
51             command = Command(cmd)
52             matcher.register()
53             log('rule parsed', matcher, command)
54             commands.add(matcher, command)
55
56     load_config(crontab)
57
58     def reload_config_on_signal(sig_no, stack):
59         log('Signal #%d received: reloading config...' % (sig_no))
60         commands.clear()
61         load_config(crontab)
62         log('Done config reloading.')
63
64     import signal
65     signal.signal(signal.SIGHUP, reload_config_on_signal)
66
67     commands.environ = crontab.environ
68     bus.attach_handler(commands.handler)
69
70     try:
71         bus.listen()
72     except KeyboardInterrupt:
73         sys.exit(2)
74
75 # vim: ts=8 sts=4 sw=4 et
76