diff -r 6842794c20e8 -r ed410776effd bin/pvl.irker-syslog --- 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))