#!/usr/bin/env python """ Extract iperf data from json blob and format for gnuplot. """ import json import os import sys import os.path from optparse import OptionParser import pprint # for debugging, so output to stderr to keep verbose # output out of any redirected stdout. pp = pprint.PrettyPrinter(indent=4, stream=sys.stderr) def generate_output(iperf, options): for i in iperf.get('intervals'): for ii in i.get('streams'): if options.verbose: pp.pprint(ii) row = '{0} {1} {2} {3} {4}\n'.format( round(float(ii.get('start')), 4), ii.get('bytes'), # to Gbits/sec round(float(ii.get('bits_per_second')) / (1000*1000*1000), 3), ii.get('retransmits'), round(float(ii.get('snd_cwnd')) / (1000*1000), 2) ) yield row def main(): usage = '%prog [ -f FILE | -o OUT | -v ]' parser = OptionParser(usage=usage) parser.add_option('-f', '--file', metavar='FILE', type='string', dest='filename', help='Input filename.') parser.add_option('-o', '--output', metavar='OUT', type='string', dest='output', help='Optional file to append output to.') parser.add_option('-v', '--verbose', dest='verbose', action='store_true', default=False, help='Verbose debug output to stderr.') options, args = parser.parse_args() if not options.filename: parser.error('Filename is required.') file_path = os.path.normpath(options.filename) if not os.path.exists(file_path): parser.error('{f} does not exist'.format(f=file_path)) with open(file_path,'r') as fh: data = fh.read() try: iperf = json.loads(data) except Exception as e: parser.error('Could not parse JSON from file (ex): {0}'.format(str(e))) if options.output: absp = os.path.abspath(options.output) d,f = os.path.split(absp) if not os.path.exists(d): parser.error('Output file directory path {0} does not exist'.format(d)) fh = open(absp, 'a') else: fh = sys.stdout for i in generate_output(iperf, options): fh.write(i) if __name__ == '__main__': main()