#!/usr/bin/env python
"""
Read Ganglia in, write NetLogger out.
"""
from __future__ import with_statement

import logging
import optparse
import re
import socket
import sys
import time

from netlogger import nlapi
from netlogger import nlganglia
from netlogger import nllog

# Global logger
log = nllog.NullLogger()
def activateLogging(name):
    global log
    log = nllog.getScriptLogger(name)
    nlganglia.activateLogging()    

BASE_METRICS = ('load_one', 'load_five', 'cpu_user', 'cpu_system', 'cpu_idle',
                'bytes_in', 'bytes_out', 'mem_free')
                
def main(cmdline):
    activateLogging("netlogger.nl_ganglia")
    # parse command line
    usage = "%prog [options]"
    parser = optparse.OptionParser(usage=usage,version="0.1")
    parser.add_option('-e', '--filter', dest="expr", default=None,
                       metavar="REGEX",
                       help="regular expression to use as a filter. " +
                       "This expression operates on the formatted output, " +
                       "i.e. name=value pairs")
    parser.add_option('-i','--interval', dest="interval", type='float',
                      default=-1.0, metavar="SEC",                      
                      help="poll interval in seconds (default=run once)")
    parser.add_option('-m', '--metrics', dest="metrics",
                      default="base", action="store", type="choice", 
                      choices=("base", "all"),
                      help="set of metrics to display (default=%default)")
    parser.add_option('-o',"--output", dest="filename",
                      default=None, metavar="FILE",
                      help="output file (default=stdout)")
    parser.add_option('-s', '--server', dest="server",
                      default="localhost",
                      help="gmetad server host (default=%default)")
    parser.add_option('-p', '--port', dest='port',
                      default=8651, type='int',
                      help="gmetad server port (default=%default)")
    parser.add_option('-v','--verbose',action='store_true',
                       dest='verbose', default=False,
                       help="verbose output")
    options, args = parser.parse_args(cmdline[1:])
    # init logging
    if options.verbose:
        log.setDefaultLevel(logging.DEBUG)
    else:
        log.setDefaultLevel(logging.INFO)
    # connect to server
    gmetad = nlganglia.Gmetad(host=options.server, port=options.port)
    # metrics
    if options.metrics == "all":
        metrics = None
    elif options.metrics == "base":
        metrics = dict.fromkeys(BASE_METRICS)
    else:
        parser.error("internal error: bad --metrics='%s'" % options.metrics)
    # output
    if options.filename is None:
        ofile = sys.stdout
    else:
        ofile = file(options.filename,'w')
    # filter
    if options.expr:
        expr = re.compile(options.expr)
    else:
        expr = None
    # read loop(s)
    while 1:
        with nllog.logged(log, "gmetad.read", host=options.server, port=options.port):
            data = gmetad.read()
        if data == '':
            break
        for metric, log_entry in nlganglia.parse(data):
            if metrics is None or metric in metrics:
                if expr is None:
                    ofile.write(log_entry)
                else:
                    if expr.search(log_entry):
                        ofile.write(log_entry)
        if options.interval < 0:
            break
        if log.isEnabledFor(logging.DEBUG):
            log.debug("sleep for %lf seconds" % options.interval)
        time.sleep(options.interval)
        
if __name__ == '__main__':
    main(sys.argv)
    
