bin/pvl.irker-syslog
author Tero Marttila <terom@paivola.fi>
Sun, 13 Jan 2013 03:11:53 +0200
changeset 126 bf2555ae7d06
parent 121 4f16bf6365f1
child 129 c66c8020babe
permissions -rwxr-xr-x
pvl.irker-syslog: rearrange to handle EOF on both syslog and irker
#!/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 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 :
            apply_syslog(options, syslog, rules, irker)

        except EOFError as ex :
            log.error("syslog: EOF")
            return 1

        # 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 :
                # exit
                log.error("irk: EOF")
                return 1
     
    # done
    log.info("Exiting...")
    return 0

if __name__ == '__main__':
    import sys

    sys.exit(main(sys.argv))