1 #!/usr/bin/env python |
|
2 |
|
3 """ |
|
4 Syslog -> Irk |
|
5 """ |
|
6 |
|
7 __version__ = '0.0' |
|
8 |
|
9 import pvl.args |
|
10 import pvl.syslog.args |
|
11 import pvl.syslog.rule |
|
12 import pvl.irk |
|
13 |
|
14 import logging, optparse |
|
15 |
|
16 log = logging.getLogger('main') |
|
17 |
|
18 def parse_options (argv) : |
|
19 """ |
|
20 Parse command-line arguments. |
|
21 """ |
|
22 |
|
23 prog = argv[0] |
|
24 |
|
25 parser = optparse.OptionParser( |
|
26 prog = prog, |
|
27 usage = '%prog: [options]', |
|
28 version = __version__, |
|
29 |
|
30 # module docstring |
|
31 description = __doc__, |
|
32 ) |
|
33 |
|
34 # options |
|
35 parser.add_option_group(pvl.args.parser(parser)) |
|
36 |
|
37 # input |
|
38 parser.add_option_group(pvl.syslog.args.parser(parser)) |
|
39 parser.add_option_group(pvl.syslog.rule.parser(parser)) |
|
40 parser.add_option_group(pvl.irk.parser(parser, connect=None)) |
|
41 |
|
42 parser.add_option('--irker-target', metavar='IRC', |
|
43 help="Irker target URL") |
|
44 |
|
45 # parse |
|
46 options, args = parser.parse_args(argv[1:]) |
|
47 |
|
48 # apply |
|
49 pvl.args.apply(options, prog) |
|
50 |
|
51 return options, args |
|
52 |
|
53 def main (argv) : |
|
54 options, args = parse_options(argv) |
|
55 |
|
56 if args : |
|
57 # XXX: targets |
|
58 target, = args |
|
59 else : |
|
60 target = None |
|
61 |
|
62 log.info("Open syslog...") |
|
63 syslog = pvl.syslog.args.apply(options) |
|
64 |
|
65 log.info("Load rules...") |
|
66 rules = pvl.syslog.rule.apply(options) |
|
67 |
|
68 log.info("Connect IRK..") |
|
69 irker = pvl.irk.apply(options) |
|
70 |
|
71 log.info("Process syslog messages...") |
|
72 for item in syslog.main() : |
|
73 match, rulepath, apply = rules.apply(item) |
|
74 |
|
75 log.info("%s: %s", item, apply) |
|
76 |
|
77 target = apply.get('irk', options.irker_target) |
|
78 |
|
79 tag = '/'.join(str(rule) for rule in reversed(rulepath[:-1])) |
|
80 text = apply.get('text') |
|
81 |
|
82 if not text : |
|
83 # XXX: plain irk = ... in rule is broken, as it always applies, and skips any further rules |
|
84 continue |
|
85 |
|
86 if irker and target : |
|
87 irker[target]('[' + tag + '] ' + text) |
|
88 else : |
|
89 print target, tag, text |
|
90 |
|
91 # done |
|
92 log.info("Exiting...") |
|
93 return 0 |
|
94 |
|
95 if __name__ == '__main__': |
|
96 import sys |
|
97 |
|
98 sys.exit(main(sys.argv)) |
|