a6f8dd19e2a6fd2fe6b36a3fbd1e17d84573bb94
[dbuscron] / dbuscron / shell / main.py
1
2 def run():
3
4     # 1. parse arguments
5     from dbuscron.parser import OptionsParser
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             userid=dict(names=('-u', '--user', '--uid', '--userid')),
13             groupid=dict(names=('-g', '--group', '--gid', '--groupid')))
14
15     # 2. logging setup
16     import sys
17     logout = sys.stderr
18     if options.logfile:
19         logout = open(options.logfile, 'wb')
20
21     from dbuscron.logger import Logger
22     log = Logger(__name__, out=logout)
23     log.level = options.verbose - options.quiet + Logger.WARNING
24
25     # 3. process properties setup
26     try:
27         if options.userid or options.groupid:
28             from dbuscron.util import set_user_and_group
29             set_user_and_group(options.userid, options.groupid)
30
31         if options.daemon:
32             from dbuscron.util import daemonize
33             daemonize(
34                 pidfile='/var/run/dbuscron.pid',
35                 logfile='/var/log/dbuscron.log')
36
37     except SystemError, e:
38         log.error(e.message)
39         sys.exit(4)
40
41     # 4. main instances initialization
42     from dbuscron.bus import DbusBus, DbusRule
43     from dbuscron.command import Command, Commands
44     from dbuscron.parser import CrontabParser, CrontabParserError
45
46     bus = DbusBus()
47     commands = Commands()
48     crontab = CrontabParser(options.config)
49
50     # 5. load config file
51     def load_config(parser):
52         try:
53             for rule, cmd in parser:
54                 matcher = DbusRule(**rule)
55                 command = Command(cmd)
56                 matcher.register()
57                 log('rule parsed', matcher, command)
58                 commands.add(matcher, command)
59
60             commands.environ = parser.environ
61
62         except CrontabParserError, e:
63             log.error(e.message)
64             sys.exit(3)
65
66     load_config(crontab)
67
68     # 6. setup signal handlers
69     def reload_config_on_signal(sig_no, stack):
70         log('Signal #%d received: reloading config...' % (sig_no))
71         commands.clear()
72         load_config(crontab)
73         log('Done config reloading.')
74
75     import signal
76     signal.signal(signal.SIGHUP, reload_config_on_signal)
77
78     # 7. setup DBUS handlers
79     bus.attach_handler(commands.handler)
80
81     # 8. run main application listen loop
82     try:
83         bus.listen()
84     except KeyboardInterrupt:
85         sys.exit(2)
86