moved shell part into modules
[dbuscron] / dbuscron / shell / main.py
1 import sys
2 from dbuscron import Logger, OptionsParser
3
4 def run():
5
6     options = OptionsParser(
7             daemon=dict(names=('-f', '--nodaemon'), action='store_false', default=True),
8             quiet=dict(names=('--quiet', '-q'), action='count', default=0),
9             verbose=dict(names=('--verbose', '-v'), action='count', default=0),
10             config=dict(names=('--conf', '--config', '-c'), default='/etc/dbuscrontab'),
11             logfile=dict(names=('--log', '--logfile', '-l')))
12
13     logout = sys.stderr
14     if options.logfile:
15         logout = open(options.logfile, 'wb')
16
17     log = Logger(__name__, out=logout)
18     log.level = options.verbose - options.quiet + Logger.WARNING
19
20     if options.daemon:
21         from dbuscron.daemonize import daemonize
22         daemonize(
23             pidfile='/var/run/dbuscron.pid',
24             logfile='/var/log/dbuscron.log'
25             )
26
27     from dbuscron import DbusBus, DbusRule, Command, Commands, CrontabParser
28
29     bus = DbusBus()
30     commands = Commands()
31
32     crontab = CrontabParser(options.config)
33
34     def load_config(parser):
35         for rule, cmd in parser:
36             matcher = DbusRule(**rule)
37             command = Command(cmd)
38             matcher.register()
39             log('rule parsed', matcher, command)
40             commands.add(matcher, command)
41
42     load_config(crontab)
43
44     def reload_config_on_signal(sig_no, stack):
45         log('Signal #%d received: reloading config...' % (sig_no))
46         commands.clear()
47         load_config(crontab)
48         log('Done config reloading.')
49
50     import signal
51     signal.signal(signal.SIGHUP, reload_config_on_signal)
52
53     commands.environ = crontab.environ
54     bus.attach_handler(commands.handler)
55
56     try:
57         bus.listen()
58     except KeyboardInterrupt:
59         sys.exit(2)
60