#!/usr/bin/env python
# pynfdump-top-talkers
# Copyright (C) 2008 Justin Azoff JAzoff@uamail.albany.edu
#
# This module is released under the MIT License:
# http://www.opensource.org/licenses/mit-license.php

from dateutil.parser import parse
import pynfdump


def show_top(data_dir, remote_host, profile, sources, start_date=None, first='ip/bytes', second='ip/bytes', number=5, query=''):
    if start_date is None:
        start_date = parse("")
    d=pynfdump.Dumper(data_dir, profile, sources, remote_host)
    d.set_where(start_date)

    s, so = first.split("/")
    s2, s2o = second.split("/")

    second_q = "%s %s %s %%s" % (query, query and 'and', s)

    print "%-19s %-10s %-10s %-10s" % ('ip','flows','packets','bytes')
    for tt in d.search(query,statistics=s,statistics_order=so, limit=number):
        tt['whatever'] = tt[s]
        print "%(whatever)-19s %(flows)-10s %(packets)-10s %(bytes)-10s" % tt
        for (x,r) in enumerate(d.search(second_q % tt[s], statistics=s2,statistics_order=s2o, limit=number)):
            r['whatever'] = r[s2]
            if x==0 and s == s2: continue
            print "    %(whatever)-15s %(flows)-10s %(packets)-10s %(bytes)-10s" % r
            
def main():
    import sys
    from optparse import OptionParser
    parser = OptionParser()
    parser.add_option("-s", "--startdate", dest="start_date", action="store", help="start date")
    parser.add_option("-d", "--datadir",   dest="dir",        action="store", help="data directory")
    parser.add_option("-r", "--remote",    dest="remote",     action="store", help="remote host")
    parser.add_option("-p", "--profile",   dest="profile",    action="store", help="profile", default="live")
    parser.add_option("-o", "--source",    dest="sources",    action="append", help="source")
    parser.add_option("-n", "--number",    dest="number",     action="store", help="number of top talkers", default=5)
    parser.add_option("-q", "--query",     dest="query",      action="store", help="query", default="")
    parser.add_option('',"--fs",           dest="first",      action="store", help="first statistic", default="ip/bytes")
    parser.add_option('',"--ss",           dest="second",     action="store", help="second statistic", default="ip/bytes")

    (options, args) = parser.parse_args()

    if not (options.dir and options.sources):
        sys.stderr.write("Specify a datadir and a source\n")
        parser.print_help()
        sys.exit(1)

    if 1:
        pass

    o = options
    show_top(o.dir, o.remote, o.profile, o.sources, o.start_date, o.first, o.second, o.number, o.query)

if __name__ == "__main__":
    main()
