Loading sbws/lib/v3bwfile.py +65 −65 Original line number Diff line number Diff line Loading @@ -249,38 +249,30 @@ class V3BWLine(object): [setattr(self, k, v) for k, v in kwargs.items() if k in BW_EXTRA_ARG_KEYVALUES] @property def bw_keyvalue_tuple_ls(self): """Return list of KeyValue Bandwidth Line tuples.""" # sort the list to generate determinist headers keyvalue_tuple_ls = sorted([(k, v) for k, v in self.__dict__.items() if k in BW_KEYVALUES]) return keyvalue_tuple_ls @property def bw_keyvalue_v110str_ls(self): """Return list of KeyValue Bandwidth Line strings following spec v1.1.0. """ bw_keyvalue_str = [KEYVALUE_SEP_V110 .join([k, str(v)]) for k, v in self.bw_keyvalue_tuple_ls] return bw_keyvalue_str @property def bw_strv110(self): """Return Bandwidth Line string following spec v1.1.0.""" bw_line_str = BW_KEYVALUE_SEP_V110.join( self.bw_keyvalue_v110str_ls) + LINE_SEP if len(bw_line_str) > BW_LINE_SIZE: # if this is the case, probably there are too many KeyValues, # or the limit needs to be changed in Tor log.warn("The bandwidth line %s is longer than %s", len(bw_line_str), BW_LINE_SIZE) return bw_line_str def __str__(self): return self.bw_strv110 @classmethod def from_results(cls, results): success_results = [r for r in results if isinstance(r, ResultSuccess)] # log.debug('len(success_results) %s', len(success_results)) node_id = '$' + results[0].fingerprint bw = cls.bw_from_results(success_results) kwargs = dict() kwargs['nick'] = results[0].nickname if getattr(results[0], 'master_key_ed25519'): kwargs['master_key_ed25519'] = results[0].master_key_ed25519 kwargs['rtt'] = cls.rtt_from_results(success_results) kwargs['time'] = cls.last_time_from_results(results) kwargs.update(cls.result_types_from_results(results)) bwl = cls(node_id, bw, **kwargs) return bwl @classmethod def from_data(cls, data, fingerprint): assert fingerprint in data return cls.from_results(data[fingerprint]) @classmethod def from_bw_line_v110(cls, line): assert isinstance(line, str) Loading @@ -293,6 +285,24 @@ class V3BWLine(object): bw_line = cls(**kwargs) return bw_line @staticmethod def last_time_from_results(results): return unixts_to_isodt_str(round(max([r.time for r in results]))) @staticmethod def rtt_from_results(results): # convert from miliseconds to seconds rtts = [(round(rtt * 1000)) for r in results for rtt in r.rtts] rtt = round(median(rtts)) return rtt @staticmethod def result_types_from_results(results): rt_dict = dict([(result_type_to_key(rt.value), num_results_of_type(results, rt.value)) for rt in _ResultType]) return rt_dict @staticmethod def bw_from_results(results): median_bw = median([dl['amount'] / dl['duration'] Loading @@ -319,44 +329,34 @@ class V3BWLine(object): bw_kb = max(round(bw / 1024), 1) return bw_kb @staticmethod def last_time_from_results(results): return unixts_to_isodt_str(round(max([r.time for r in results]))) @staticmethod def rtt_from_results(results): # convert from miliseconds to seconds rtts = [(round(rtt * 1000)) for r in results for rtt in r.rtts] rtt = round(median(rtts)) return rtt @staticmethod def result_types_from_results(results): rt_dict = dict([(result_type_to_key(rt.value), num_results_of_type(results, rt.value)) for rt in _ResultType]) return rt_dict @property def bw_keyvalue_tuple_ls(self): """Return list of KeyValue Bandwidth Line tuples.""" # sort the list to generate determinist headers keyvalue_tuple_ls = sorted([(k, v) for k, v in self.__dict__.items() if k in BW_KEYVALUES]) return keyvalue_tuple_ls @classmethod def from_results(cls, results): success_results = [r for r in results if isinstance(r, ResultSuccess)] # log.debug('len(success_results) %s', len(success_results)) node_id = '$' + results[0].fingerprint bw = cls.bw_from_results(success_results) kwargs = dict() kwargs['nick'] = results[0].nickname if getattr(results[0], 'master_key_ed25519'): kwargs['master_key_ed25519'] = results[0].master_key_ed25519 kwargs['rtt'] = cls.rtt_from_results(success_results) kwargs['time'] = cls.last_time_from_results(results) kwargs.update(cls.result_types_from_results(results)) bwl = cls(node_id, bw, **kwargs) return bwl @property def bw_keyvalue_v110str_ls(self): """Return list of KeyValue Bandwidth Line strings following spec v1.1.0. """ bw_keyvalue_str = [KEYVALUE_SEP_V110 .join([k, str(v)]) for k, v in self.bw_keyvalue_tuple_ls] return bw_keyvalue_str @classmethod def from_data(cls, data, fingerprint): assert fingerprint in data return cls.from_results(data[fingerprint]) @property def bw_strv110(self): """Return Bandwidth Line string following spec v1.1.0.""" bw_line_str = BW_KEYVALUE_SEP_V110.join( self.bw_keyvalue_v110str_ls) + LINE_SEP if len(bw_line_str) > BW_LINE_SIZE: # if this is the case, probably there are too many KeyValues, # or the limit needs to be changed in Tor log.warn("The bandwidth line %s is longer than %s", len(bw_line_str), BW_LINE_SIZE) return bw_line_str class V3BWFile(object): Loading Loading
sbws/lib/v3bwfile.py +65 −65 Original line number Diff line number Diff line Loading @@ -249,38 +249,30 @@ class V3BWLine(object): [setattr(self, k, v) for k, v in kwargs.items() if k in BW_EXTRA_ARG_KEYVALUES] @property def bw_keyvalue_tuple_ls(self): """Return list of KeyValue Bandwidth Line tuples.""" # sort the list to generate determinist headers keyvalue_tuple_ls = sorted([(k, v) for k, v in self.__dict__.items() if k in BW_KEYVALUES]) return keyvalue_tuple_ls @property def bw_keyvalue_v110str_ls(self): """Return list of KeyValue Bandwidth Line strings following spec v1.1.0. """ bw_keyvalue_str = [KEYVALUE_SEP_V110 .join([k, str(v)]) for k, v in self.bw_keyvalue_tuple_ls] return bw_keyvalue_str @property def bw_strv110(self): """Return Bandwidth Line string following spec v1.1.0.""" bw_line_str = BW_KEYVALUE_SEP_V110.join( self.bw_keyvalue_v110str_ls) + LINE_SEP if len(bw_line_str) > BW_LINE_SIZE: # if this is the case, probably there are too many KeyValues, # or the limit needs to be changed in Tor log.warn("The bandwidth line %s is longer than %s", len(bw_line_str), BW_LINE_SIZE) return bw_line_str def __str__(self): return self.bw_strv110 @classmethod def from_results(cls, results): success_results = [r for r in results if isinstance(r, ResultSuccess)] # log.debug('len(success_results) %s', len(success_results)) node_id = '$' + results[0].fingerprint bw = cls.bw_from_results(success_results) kwargs = dict() kwargs['nick'] = results[0].nickname if getattr(results[0], 'master_key_ed25519'): kwargs['master_key_ed25519'] = results[0].master_key_ed25519 kwargs['rtt'] = cls.rtt_from_results(success_results) kwargs['time'] = cls.last_time_from_results(results) kwargs.update(cls.result_types_from_results(results)) bwl = cls(node_id, bw, **kwargs) return bwl @classmethod def from_data(cls, data, fingerprint): assert fingerprint in data return cls.from_results(data[fingerprint]) @classmethod def from_bw_line_v110(cls, line): assert isinstance(line, str) Loading @@ -293,6 +285,24 @@ class V3BWLine(object): bw_line = cls(**kwargs) return bw_line @staticmethod def last_time_from_results(results): return unixts_to_isodt_str(round(max([r.time for r in results]))) @staticmethod def rtt_from_results(results): # convert from miliseconds to seconds rtts = [(round(rtt * 1000)) for r in results for rtt in r.rtts] rtt = round(median(rtts)) return rtt @staticmethod def result_types_from_results(results): rt_dict = dict([(result_type_to_key(rt.value), num_results_of_type(results, rt.value)) for rt in _ResultType]) return rt_dict @staticmethod def bw_from_results(results): median_bw = median([dl['amount'] / dl['duration'] Loading @@ -319,44 +329,34 @@ class V3BWLine(object): bw_kb = max(round(bw / 1024), 1) return bw_kb @staticmethod def last_time_from_results(results): return unixts_to_isodt_str(round(max([r.time for r in results]))) @staticmethod def rtt_from_results(results): # convert from miliseconds to seconds rtts = [(round(rtt * 1000)) for r in results for rtt in r.rtts] rtt = round(median(rtts)) return rtt @staticmethod def result_types_from_results(results): rt_dict = dict([(result_type_to_key(rt.value), num_results_of_type(results, rt.value)) for rt in _ResultType]) return rt_dict @property def bw_keyvalue_tuple_ls(self): """Return list of KeyValue Bandwidth Line tuples.""" # sort the list to generate determinist headers keyvalue_tuple_ls = sorted([(k, v) for k, v in self.__dict__.items() if k in BW_KEYVALUES]) return keyvalue_tuple_ls @classmethod def from_results(cls, results): success_results = [r for r in results if isinstance(r, ResultSuccess)] # log.debug('len(success_results) %s', len(success_results)) node_id = '$' + results[0].fingerprint bw = cls.bw_from_results(success_results) kwargs = dict() kwargs['nick'] = results[0].nickname if getattr(results[0], 'master_key_ed25519'): kwargs['master_key_ed25519'] = results[0].master_key_ed25519 kwargs['rtt'] = cls.rtt_from_results(success_results) kwargs['time'] = cls.last_time_from_results(results) kwargs.update(cls.result_types_from_results(results)) bwl = cls(node_id, bw, **kwargs) return bwl @property def bw_keyvalue_v110str_ls(self): """Return list of KeyValue Bandwidth Line strings following spec v1.1.0. """ bw_keyvalue_str = [KEYVALUE_SEP_V110 .join([k, str(v)]) for k, v in self.bw_keyvalue_tuple_ls] return bw_keyvalue_str @classmethod def from_data(cls, data, fingerprint): assert fingerprint in data return cls.from_results(data[fingerprint]) @property def bw_strv110(self): """Return Bandwidth Line string following spec v1.1.0.""" bw_line_str = BW_KEYVALUE_SEP_V110.join( self.bw_keyvalue_v110str_ls) + LINE_SEP if len(bw_line_str) > BW_LINE_SIZE: # if this is the case, probably there are too many KeyValues, # or the limit needs to be changed in Tor log.warn("The bandwidth line %s is longer than %s", len(bw_line_str), BW_LINE_SIZE) return bw_line_str class V3BWFile(object): Loading