summaryrefslogtreecommitdiff
path: root/dumpspice.py
diff options
context:
space:
mode:
Diffstat (limited to 'dumpspice.py')
-rwxr-xr-xdumpspice.py83
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()