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