bin/pvl.irker-syslog
changeset 224 ed410776effd
parent 223 6842794c20e8
child 225 3c2d0dd42045
--- a/bin/pvl.irker-syslog	Tue Feb 19 19:28:40 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,188 +0,0 @@
-#!/usr/bin/env python
-
-"""
-    Syslog -> Irk
-"""
-
-__version__ = '0.0'
-
-import pvl.args
-import pvl.syslog.args
-import pvl.syslog.rule
-import pvl.irk
-
-import logging, optparse
-
-log = logging.getLogger('main')
-
-def parse_options (argv) :
-    """
-        Parse command-line arguments.
-    """
-
-    prog = argv[0]
-
-    parser = optparse.OptionParser(
-            prog        = prog,
-            usage       = '%prog: [options]',
-            version     = __version__,
-
-            # module docstring
-            description = __doc__,
-    )
-    
-    # options
-    parser.add_option_group(pvl.args.parser(parser))
-
-    # input
-    parser.add_option_group(pvl.syslog.args.parser(parser))
-    parser.add_option_group(pvl.syslog.rule.parser(parser))
-    parser.add_option_group(pvl.irk.parser(parser, connect=None))
-
-    parser.add_option('--irker-target', metavar='IRC',
-            help="Irker target URL")
-
-    # parse
-    options, args = parser.parse_args(argv[1:])
-    
-    # apply
-    pvl.args.apply(options, prog, rootok=False)
-
-    return options, args
-
-def apply_irker (irker) :
-    """
-        Handle irker activity.
-    """
-
-    for msg in irker.irk :
-        log.info("irk: %s", msg)
- 
-def apply_syslog (options, syslog, rules, irker) :
-    """
-        Handle syslog activity.
-    """
-
-    # syslogs
-    for item in syslog :
-        match, rulepath, apply = rules.apply(item)
-        
-        log.debug("%s: %s: %s", item, rulepath, apply)
-        
-        target = apply.get('irk', options.irker_target)
-        
-        tag = '/'.join(str(rule) for rule in reversed(rulepath[:-1]))
-        text = apply.get('text')
-        
-        log.info("%s: %s: %s", target, tag, text)
-
-        if not text :
-            # XXX: plain irk = ... in rule is broken, as it always applies, and skips any further rules
-            continue
-        
-        if irker and target :
-            irker[target]('[' + tag + '] ' + text)
-        else :
-            print tag, text
-
-def close_irker (irker) :
-    """
-        Shutdown irker before quitting.
-
-        XXX: irker.close() to disconnect?
-    """
-    
-    log.info("Shutting down IRK...")
-
-    for target in list(irker) :
-        log.warn("%s", target)
-        del irker[target]
-
-def close_syslog (syslog) :
-    """
-        Shutdown syslog before quitting
-    """
-    
-    # XXX: do all sources support close()?
-    log.warn("%s", syslog)
-    syslog.close()
-
-def main (argv) :
-    options, args = parse_options(argv)
-    
-    # no args
-    if args :
-        log.error("Usage: pvl.irker-syslog [options]")
-        return 2
-    
-    # setup
-    log.info("Open syslog...")
-    syslog = pvl.syslog.args.apply(options)
-    
-    log.info("Load rules...")
-    rules = pvl.syslog.rule.apply(options)
-
-    log.info("Connect IRK..")
-    irker = pvl.irk.apply(options)
-    
-    if options.irker_target :
-        # pre-join target
-        irker[options.irker_target]
-
-    log.info("Process syslog messages...")
-
-    # customized mainloop that supports irker.irk
-    while True :
-        try :
-            # TODO: seprate IrkError, to not confuse irk write vs syslog read eof
-            apply_syslog(options, syslog, rules, irker)
-
-        except EOFError as ex :
-            log.error("syslog: EOF")
-
-            close_irker(irker)
-            
-            # 0 is controlled exit
-            return 0
-
-        except pvl.irk.IrkError as ex :
-            log.error("irker: %s", ex)
-
-            # XXX: copy-pasta
-            close_syslog(syslog)
-            return 0
-
-        # quit unless we have something to poll
-        if not syslog.poll :
-            break
-
-        # is irk pollable?
-        if irker.irk.recv :
-            reading = (irker.irk, )
-        else :
-            reading = ()
-        
-        poll = syslog.select(syslog.poll, reading=reading) or () # timeout -> ()
-        
-        if irker.irk in poll :
-            # irks?
-            try :
-                apply_irker(irker)
-
-            except EOFError :
-                log.error("irk: EOF")
-                
-                close_syslog(syslog)
-
-                # exit 0, so as to restart sooner
-                # XXX: maybe use a special exit code instead?
-                return 0
-     
-    # done
-    log.info("Exiting...")
-    return 0
-
-if __name__ == '__main__':
-    import sys
-
-    sys.exit(main(sys.argv))