new cli args: userid and groupid to set user and group to change too
[dbuscron] / dbuscron / shell / main.py
1 import os, sys
2
3 def run():
4
5     from dbuscron import Logger, OptionsParser
6
7     options = OptionsParser(
8             daemon=dict(names=('-f', '--nodaemon'), action='store_false', default=True),
9             quiet=dict(names=('--quiet', '-q'), action='count', default=0),
10             verbose=dict(names=('--verbose', '-v'), action='count', default=0),
11             config=dict(names=('--conf', '--config', '-c'), default='/etc/dbuscrontab'),
12             logfile=dict(names=('--log', '--logfile', '-l')),
13             userid=dict(names=('-u', '--user', '--uid', '--userid')),
14             groupid=dict(names=('-g', '--group', '--gid', '--groupid')))
15
16     logout = sys.stderr
17     if options.logfile:
18         logout = open(options.logfile, 'wb')
19
20     log = Logger(__name__, out=logout)
21     log.level = options.verbose - options.quiet + Logger.WARNING
22
23     if os.getuid() == 0:
24         if options.userid:
25             try:
26                 import pwd
27                 try:
28                     userid = int(options.userid)
29                 except ValueError:
30                     userid = pwd.getpwnam(options.userid)[2]
31
32             except:
33                 log.warn('Unable to find user', options.userid)
34                 userid = None
35
36         else:
37             userid = None
38
39         if options.groupid:
40             try:
41                 try:
42                     groupid = int(options.groupid)
43                 except ValueError:
44                     import grp
45                     groupid = grp.getgrnam(options.groupid)[2]
46
47             except:
48                 log.warn('Unable to find group', options.groupid)
49                 groupid = None
50
51         elif userid:
52             groupid = pwd.getpwuid(userid)[3]
53
54         else:
55             groupid = None
56
57         if groupid:
58             os.setgid(groupid)
59         if userid:
60             os.getuid(userid)
61
62     elif options.userid or options.groupid:
63         log.warn('Ignoring userid and groupid arguments: I am not a root to pretend somebody else.')
64
65     if options.daemon:
66         from dbuscron.daemonize import daemonize
67         daemonize(
68             pidfile='/var/run/dbuscron.pid',
69             logfile='/var/log/dbuscron.log'
70             )
71
72     from dbuscron import DbusBus, DbusRule, Command, Commands, CrontabParser
73
74     bus = DbusBus()
75     commands = Commands()
76
77     crontab = CrontabParser(options.config)
78
79     def load_config(parser):
80         for rule, cmd in parser:
81             matcher = DbusRule(**rule)
82             command = Command(cmd)
83             matcher.register()
84             log('rule parsed', matcher, command)
85             commands.add(matcher, command)
86
87     load_config(crontab)
88
89     def reload_config_on_signal(sig_no, stack):
90         log('Signal #%d received: reloading config...' % (sig_no))
91         commands.clear()
92         load_config(crontab)
93         log('Done config reloading.')
94
95     import signal
96     signal.signal(signal.SIGHUP, reload_config_on_signal)
97
98     commands.environ = crontab.environ
99     bus.attach_handler(commands.handler)
100
101     try:
102         bus.listen()
103     except KeyboardInterrupt:
104         sys.exit(2)
105