pvl/syslog/args.py
author Tero Marttila <terom@fixme.fi>
Thu, 03 Jan 2013 13:06:30 +0200
changeset 46 0bdbbda4cdea
parent 44 977442ccb72d
child 48 40ccb8d3c96e
permissions -rw-r--r--
pvl.syslog: have --syslog-tail skip to end of file
import optparse, sys

from pvl.syslog.parser import SyslogParser
from pvl.syslog.filter import SyslogFilter
from pvl.syslog.syslog import SyslogSource
from pvl.syslog import fifo, tail

# XXX: use optparse parser.error()?
import logging; log = logging.getLogger('pvl.syslog.args')

def parser (parser, prog=None) :
    """
        Optparse option group

            prog        - filter to only process lines from given process
    """
    
    syslog = optparse.OptionGroup(parser, 'Syslog collector')

    syslog.add_option('--syslog-fifo',          metavar='PATH',
            help="Read syslog messages from given fifo")

    syslog.add_option('--syslog-file',          metavar='FILE',
            help="Read syslog messages from given file")

    syslog.add_option('--syslog-tail',          type='float', metavar='POLL',
            help="Continuously poll file")

    syslog.add_option('--syslog-raw',           action='store_true',
            help="Parse raw syslog lines without timestamp/etc")

    syslog.add_option('--syslog-prog',          metavar='PROG',     default=prog,
            help="Filter by given prog: %default")

    return syslog

def apply (options, optional=False) :
    """
        Handle options, returning a SyslogSource, if any.

        May log.error/sys.exit
    """

    if options.syslog_fifo :
        # read fifo
        source = fifo.Fifo(options.syslog_fifo)
        poll = True

    elif options.syslog_tail :
        # tail file
        source = tail.TailFile(options.syslog_file, skip=True)
        poll = options.syslog_tail # float

    elif options.syslog_file :
        # read file
        source = open(options.syslog_file)
        poll = False

    elif optional :
        log.debug("No --syslog source given")
        return None

    else :
        log.error("No --syslog source given")
        sys.exit(2)

    parser = SyslogParser(
        raw     = options.syslog_raw,
    )

    filter = SyslogFilter(
        prog    = options.syslog_prog,
    )

    # build
    return SyslogSource(source, parser,
            filter  = filter,
            poll    = poll,
    )