Advertisement
Guest User

Untitled

a guest
Nov 28th, 2015
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.85 KB | None | 0 0
  1. #!/usr/bin/python -u
  2. import sys
  3. import time
  4. import re
  5. import threading
  6. import argparse
  7. import os
  8. import subprocess
  9. import traceback
  10. from distutils.spawn import find_executable
  11.  
  12. sync_start_tollerance = 0.001
  13. killed = threading.Event()
  14. buckets = []
  15. lock = threading.RLock()
  16.  
  17.  
  18. def printit():
  19.  
  20. global buckets
  21.  
  22. # sync all threads
  23. while (time.time() % 1.0) > sync_start_tollerance:
  24. pass
  25.  
  26. start_time = time.time()
  27.  
  28. while not killed.is_set():
  29.  
  30. with lock:
  31. now = time.time()
  32. buckets_copy = buckets
  33. buckets = [0]*len(args.ips)
  34.  
  35. elapsed_seconds = now - start_time
  36. bps = [(B/elapsed_seconds)*8 for B in buckets_copy]
  37. start_time = now
  38.  
  39. print "%f,%s" % (now, ",".join(map(str, bps)))
  40.  
  41. # sleep for a reporting interval with jitter compensation
  42. time.sleep(args.rep_seconds - time.time() % args.rep_seconds)
  43.  
  44.  
  45. def main():
  46.  
  47. global buckets
  48.  
  49. # compile regex expression
  50. regex = re.compile("length (\d+): (\d+\.\d+\.\d+\.\d+)\.\d+")
  51. # build fast access dictionary to associate ips to list index
  52. ips_to_idx = {args.ips[i]: i for i in range(len(args.ips))}
  53. # get tcpdump command
  54. tcpdump_path = find_executable('tcpdump')
  55. if not tcpdump_path:
  56. print >> sys.stderr, 'error: unable to locate tcpdump'
  57. sys.exit(-1)
  58. filter_str = 'or '.join(['src '+ip for ip in args.ips])
  59. cmd = "%s -i %s -l -e -n %s" % (tcpdump_path, args.iface, filter_str)
  60. # initialize buckets
  61. buckets = [0]*len(args.ips)
  62. # start print thread
  63. threading.Thread(target=printit).start()
  64.  
  65. # start tcp dump, parse stdout
  66. try:
  67. p = subprocess.Popen(
  68. cmd.split(), stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
  69.  
  70. for line in iter(p.stdout.readline, b''):
  71. m = regex.search(line.rstrip())
  72. if m:
  73. with lock:
  74. buckets[ips_to_idx[m.group(2)]] += int(m.group(1))
  75.  
  76. except (KeyboardInterrupt, SystemExit):
  77. pass
  78.  
  79. except:
  80. print >> sys.stderr, 'error: unable to parse tcpdump output'
  81. traceback.print_exc(file=sys.stderr)
  82.  
  83. finally:
  84. p.kill()
  85. killed.set()
  86. sys.exit()
  87.  
  88.  
  89. if __name__ == '__main__':
  90.  
  91. parser = argparse.ArgumentParser(
  92. description='Print rx bitrate by IP hosts as timestamped CSV report')
  93.  
  94. parser.add_argument(
  95. 'ips', metavar='ip_addr', type=str,
  96. nargs='+', help='ip addresses')
  97. parser.add_argument(
  98. '-i', metavar='iface', required=True, type=str,
  99. help='interface to monitor', dest='iface')
  100. parser.add_argument(
  101. '-r', metavar='seconds', default='1', type=float,
  102. help='report interval in seconds', dest='rep_seconds')
  103.  
  104. if os.getuid() != 0:
  105. print >> sys.stderr, 'error: need sudo privileges to run'
  106. sys.exit(-1)
  107.  
  108. args = parser.parse_args()
  109.  
  110. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement