diff options
Diffstat (limited to 'dumpspice.py')
-rwxr-xr-x | dumpspice.py | 83 |
1 files changed, 72 insertions, 11 deletions
diff --git a/dumpspice.py b/dumpspice.py index 4c69db4..9c643c9 100755 --- a/dumpspice.py +++ b/dumpspice.py @@ -1,22 +1,83 @@ #!/usr/bin/env python import sys import pcaputil -import pcapspice +from proxy import proxy, closeallsockets +from collections import defaultdict +from time import time +from select import select +from optparse import OptionParser +import logging -def main(stdscr=None): - p = pcaputil.packet_iter('lo') +dt = 1.0 + +class Histogram(defaultdict): + def __init__(self): + super(Histogram, self).__init__(lambda: (0,0)) + self.last = defaultdict(lambda: (0,0)) + def show(self): + print "----------------------------" + print '\n'.join(['%20s: %6d %4d' % (k, self[k][1], self[k][1] - self.last[k][1]) for t,k in sorted((t,k) for k,(t,c) in self.items())]) + self.last.update(self) + +verbose = 0 + +def dumpspice(p, stdscr=None): + import pcapspice spice = pcapspice.spice_iter(p) + hist = Histogram() + last_print = start_time = time() if stdscr: stdscr.erase() - for d in spice: - if verbose: - print d + # replace the "for d in spice:" loop with a select + while True: + #rds, _ws, _xs = select([p.fileno()],[],[],dt) + cur_time = time() + do_read = True # = len(rds) > 0: + if do_read: + d = spice.next() + if verbose: + print d + old_time, old_count = hist[d.msg.data.result_name] + hist[d.msg.data.result_name] = (cur_time, old_count + 1) + if cur_time - last_print > dt: + hist.show() + last_print = cur_time + +def frompcap(stdscr=None): + p = pcaputil.packet_iter('lo') + return dumpspice(p, stdscr) + +def fromproxy(stdscr, local_port, remote_addr): + p = proxy(local_port=local_port, remote_addr=remote_addr) + return dumpspice(p, stdscr=stdscr) if __name__ == '__main__': - verbose = '-v' in sys.argv - if '-c' in sys.argv: - import curses - curses.wrapper(main) + parser = OptionParser() + parser.add_option('-p', '--proxy', dest='proxy', help='use proxy', + action='store_true') + parser.add_option('-l', '--localport', dest='local_port', help='set proxy local port') + parser.add_option('-r', '--remoteaddr', dest='remote_addr', help='set proxy remote address') + parser.add_option('-v', '--verbose', dest='verbose', action='count', help='verbosity', default=0) + parser.add_option('-c', '--curses', dest='curses', action='store_true', help='use curses') + opts, rest = parser.parse_args(sys.argv[1:]) + if opts.verbose >= 2 in sys.argv: + logging.basicConfig(filename='dumpspice.log', level=logging.DEBUG) + print "saving debug log to dumpspice.log" + if opts.proxy: + local_port = int(opts.local_port) + remote_addr = opts.remote_addr.split(':') + remote_addr = (remote_addr[0], int(remote_addr[1])) + main = (lambda stdscr, local_port=local_port, remote_addr=remote_addr: + fromproxy(stdscr, local_port, remote_addr)) else: - main(None) + main = frompcap + verbose = opts.verbose + try: + if opts.curses in sys.argv: + import curses + curses.wrapper(main) + else: + main(None) + except KeyboardInterrupt, e: + closeallsockets() |