more robust loggin of unicode messages
[dbuscron] / dbuscron.py
index a2bfb17..89d3130 100755 (executable)
@@ -15,25 +15,54 @@ import sys
 
 if __name__ == '__main__':
 
-    daemon = (len(sys.argv) < 2) or (sys.argv[1] != '-f')
-    if daemon:
+    from dbuscron import Logger, OptionsParser
+
+    options = OptionsParser(
+            daemon=dict(names=('-f', '--nodaemon'), action='store_false', default=True),
+            quiet=dict(names=('--quiet', '-q'), action='count', default=0),
+            verbose=dict(names=('--verbose', '-v'), action='count', default=0),
+            config=dict(names=('--conf', '--config', '-c'), default='/etc/dbuscrontab'),
+            logfile=dict(names=('--log', '--logfile', '-l')))
+
+    logout = sys.stderr
+    if options.logfile:
+        logout = open(options.logfile, 'wb')
+
+    log = Logger(__name__, out=logout)
+    log.level = options.verbose - options.quiet + Logger.WARNING
+
+    if options.daemon:
         from dbuscron.daemonize import daemonize
         daemonize(
             pidfile='/var/run/dbuscron.pid',
             logfile='/var/log/dbuscron.log'
             )
 
-    from dbuscron import DbusBus, DbusRuleMatcher, Command, Commands, CrontabParser
+    from dbuscron import DbusBus, DbusRule, Command, Commands, CrontabParser
 
     bus = DbusBus()
     commands = Commands()
-    crontab = CrontabParser('/etc/dbuscrontab')
 
-    for rule, cmd in crontab:
-        matcher = DbusRuleMatcher(**rule)
-        command = Command(cmd)
-        matcher.register()
-        commands.add(matcher, command)
+    crontab = CrontabParser(options.config)
+
+    def load_config(parser):
+        for rule, cmd in parser:
+            matcher = DbusRule(**rule)
+            command = Command(cmd)
+            matcher.register()
+            log.info('%s %s' % (matcher, command))
+            commands.add(matcher, command)
+
+    load_config(crontab)
+
+    def reload_config_on_signal(sig_no, stack):
+        log.info('Signal #%d received: reloading config...' % (sig_no))
+        commands.clear()
+        load_config(crontab)
+        log.info('Done config reloading.')
+
+    import signal
+    signal.signal(signal.SIGHUP, reload_config_on_signal)
 
     commands.environ = crontab.environ
     bus.attach_handler(commands.handler)