pvl/syslog/args.py
author Tero Marttila <terom@paivola.fi>
Sun, 15 Jun 2014 19:43:13 +0300
changeset 29 8fcb140f1ee0
parent 2 5a8a32cbc944
permissions -rw-r--r--
pvl.args: load default config from /etc/pvl/package/module.conf, if specified to parse(...)
2
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     1
import optparse, sys
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     2
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     3
from pvl.syslog.parser import SyslogParser
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     4
from pvl.syslog.filter import SyslogFilter
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     5
from pvl.syslog.syslog import SyslogSource
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     6
from pvl.syslog import fifo, tail, file
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     7
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     8
# XXX: use optparse parser.error()?
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     9
import logging; log = logging.getLogger('pvl.syslog.args')
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    10
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    11
def parser (parser, prog=None) :
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    12
    """
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    13
        Optparse option group
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    14
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    15
            prog        - filter to only process lines from given process
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    16
    """
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    17
    
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    18
    syslog = optparse.OptionGroup(parser, 'Syslog collector')
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    19
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    20
    syslog.add_option('--syslog-fifo',          metavar='PATH',
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    21
            help="Read syslog messages from given fifo")
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    22
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    23
    syslog.add_option('--syslog-file',          metavar='FILE',
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    24
            help="Read syslog messages from given file")
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    25
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    26
    syslog.add_option('--syslog-tail',          metavar='FILE',
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    27
            help="Continuously poll syslog messages given file")
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    28
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    29
    syslog.add_option('--syslog-stdin',         action='store_true',
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    30
            help="Read syslog messages from stdin")
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    31
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    32
    syslog.add_option('--syslog-raw',           action='store_true',
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    33
            help="Parse raw syslog lines without timestamp/etc")
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    34
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    35
    syslog.add_option('--syslog-facility',      metavar='FACILITY',
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    36
            help="Set/filter by given facility")
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    37
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    38
    syslog.add_option('--syslog-severity',      metavar='SEVERITY',
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    39
            help="Set given facility")
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    40
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    41
    syslog.add_option('--syslog-prog',          metavar='PROG',     default=prog,
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    42
            help="Filter by given prog: %default")
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    43
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    44
    return syslog
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    45
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    46
def apply (options, optional=False) :
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    47
    """
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    48
        Handle options, returning a SyslogSource, if any.
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    49
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    50
        May log.error/sys.exit
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    51
    """
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    52
    
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    53
    # XXX: this belongs in pvl.syslog.source
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    54
    if options.syslog_fifo :
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    55
        # fifo pipe
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    56
        source = fifo.Fifo(options.syslog_fifo)
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    57
        poll = True # select(source)
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    58
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    59
    elif options.syslog_tail :
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    60
        # tail file
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    61
        source = tail.Tail(options.syslog_tail, skip=True)
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    62
        poll = tail.Tail.POLL # select(float)
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    63
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    64
    elif options.syslog_file :
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    65
        # read file
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    66
        source = file.File(open(options.syslog_file))
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    67
        poll = False # do not loop, just read up to EOF
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    68
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    69
    elif options.syslog_stdin :
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    70
        # read pipe
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    71
        source = fifo.Pipe.file(sys.stdin) # puts stdin into non-blocking mode
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    72
        poll = True # select(source)
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    73
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    74
    elif optional :
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    75
        return None
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    76
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    77
    else :
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    78
        # from stdin
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    79
        if sys.stdin.isatty() :
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    80
            log.warning("Reading syslog messages from TTY?")
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    81
        
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    82
        source = file.File(sys.stdin)
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    83
        poll = False # XXX: tty vs pipe vs file? False -> just block
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    84
    
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    85
    # options
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    86
    parser = SyslogParser(
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    87
        raw         = options.syslog_raw,
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    88
        facility    = options.syslog_facility,
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    89
        severity    = options.syslog_severity,
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    90
    )
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    91
    
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    92
    # TODO: filter optional
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    93
    filter = SyslogFilter.build(
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    94
        # glob pattern
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    95
        prog        = options.syslog_prog,
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    96
        facility    = options.syslog_facility,
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    97
        #severity   = options.sylog_severity,   # XXX: match as greater-than?
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    98
    )
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    99
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   100
    # polling
5a8a32cbc944 import pvl.syslog from pvl-verkko
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   101
    return SyslogSource(source, parser, filter, poll)