log info about config source
[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         log("Loading config from", parser.filename, "...")
58         try:
59             for rule, cmd in parser:
60                 matcher = DbusRule(**rule)
61                 command = Command(cmd)
62                 matcher.register()
63                 log('rule parsed', matcher, command)
64                 commands.add(matcher, command)
65
66             commands.environ = parser.environ
67
68         except CrontabParserError, e:
69             log.error(e.message)
70             sys.exit(3)
71
72     load_config(crontab)
73
74     # 6. setup signal handlers
75     def reload_config_on_signal(sig_no, stack):
76         log('Signal #%d received: reloading config...' % (sig_no))
77         commands.clear()
78         load_config(crontab)
79         log('Done config reloading.')
80
81     import signal
82     signal.signal(signal.SIGHUP, reload_config_on_signal)
83
84     # 7. setup DBUS handlers
85     bus.attach_handler(commands.handler)
86
87     # 8. run main application listen loop
88     try:
89         bus.listen()
90     except KeyboardInterrupt:
91         sys.exit(2)
92