commit d008ecfa68fee00fd63e75129677edd1b0502337 Author: Sathyanarayanan Gunasekaran gsathya.ceg@gmail.com Date: Wed Nov 21 23:19:12 2012 +0530
store all server descs in memory --- task-1854/pylinf.py | 44 +++++++++++++++++++++++++++++++++++--------- 1 files changed, 35 insertions(+), 9 deletions(-)
diff --git a/task-1854/pylinf.py b/task-1854/pylinf.py index 3bc6de1..4dff224 100644 --- a/task-1854/pylinf.py +++ b/task-1854/pylinf.py @@ -12,12 +12,14 @@ import sys import math import os import pygeoip +import tarfile import StringIO -import stem.descriptor +import stem.descriptor.server_descriptor
from optparse import OptionParser from binascii import b2a_hex, a2b_base64, a2b_hex -from stem.descriptor.server_descriptor import RelayDescriptor, BridgeDescriptor + +descriptors = {}
class Router: def __init__(self): @@ -54,13 +56,7 @@ class Router:
def get_advertised_bw(self, hex_digest): try: - with open(options.server_desc+'/'+hex_digest) as f: - data = f.read() - - desc_iter = stem.descriptor.server_descriptor.parse_file(StringIO.StringIO(data)) - desc_entries = list(desc_iter) - desc = desc_entries[0] - return min(desc.average_bandwidth, desc.burst_bandwidth, desc.observed_bandwidth) + return descriptors[self.hex_digest] except: return 0
@@ -74,6 +70,33 @@ def parse_bw_weights(values): except: return None
+def load_server_desc(tar_file_path): + """ + tar_file_path -> 'string' or 'list' + represents path{s} to tar file{s} + """ + global descriptors + + if type(tar_file_path) == str: tar_file_path = [tar_file_path] + + for file_path in tar_file_path: + with tarfile.open(file_path) as tar_fh: + for member in tar_fh: + if not member.isfile(): + continue + + tar_file_data=tar_fh.extractfile(member) + data=tar_file_data.read() + desc_iter = stem.descriptor.server_descriptor.parse_file( + StringIO.StringIO(data)) + desc_entries = list(desc_iter) + desc = desc_entries[0] + + # currently we require only advertised_bw + descriptors[desc.digest()] = min(desc.average_bandwidth, + desc.burst_bandwidth, + desc.observed_bandwidth) + def run(file_name): routers = [] router = None @@ -180,6 +203,9 @@ if __name__ == "__main__": gi_db = pygeoip.GeoIP(options.gi_db) as_db = pygeoip.GeoIP(options.as_db)
+ # load all server descs into memeory + load_server_desc(options.server_desc) + with open(options.output, 'w') as f: for file_name in os.listdir(options.consensus): string = run(os.path.join(options.consensus, file_name))