[tor-commits] [bridgedb/master] 5482 - Parse timestamp from ns descs.
aagbsn at torproject.org
aagbsn at torproject.org
Wed Apr 17 00:26:44 UTC 2013
commit cbfd761f10e0e9b2b194d11900f5c2a4ba525267
Author: aagbsn <aagbsn at extc.org>
Date: Thu Sep 6 15:51:23 2012 -0700
5482 - Parse timestamp from ns descs.
Modifies parseDescFile to return an extra argument 'timestamp'
---
lib/bridgedb/Bridges.py | 80 ++++++++++++++++++++++++++++++++++++++++++----
1 files changed, 73 insertions(+), 7 deletions(-)
diff --git a/lib/bridgedb/Bridges.py b/lib/bridgedb/Bridges.py
index 3117d34..ed003ea 100644
--- a/lib/bridgedb/Bridges.py
+++ b/lib/bridgedb/Bridges.py
@@ -266,6 +266,68 @@ class Bridge:
except KeyError: return False # no blocklist
return True
+ # Bridge Stability (#5482) properties.
+ @property
+ def familiar(self):
+ """
+ A bridge is 'familiar' if 1/8 of all active bridges have appeared
+ more recently than it, or if it has been around for a Weighted Time of 8 days.
+ """
+ # if self.wt >= 8 days: return True
+ # bridges = session.query(Bridges).filter(time_first_seen, order=asc)
+ # if bridges[len(bridges) / 8].time_first_seen > self.time_first_seen: return True
+ # return False
+ pass
+
+ @property
+ def wfu(self):
+ """Weighted Fractional Uptime"""
+ pass
+
+ @property
+ def wt(self):
+ """Weighted Time"""
+ pass
+
+ @property
+ def wmtbac(self):
+ """Weighted Mean Time Between Address Change"""
+ pass
+
+ @property
+ def tosa(self):
+ """the Time On Same Address (TOSA)"""
+ pass
+
+ @property
+ def lastSeenWithDifferentAddressAndPort(self):
+ """Timestamp in milliseconds when this bridge was last
+ seen with a different address or port"""
+ db = bridgedb.Storage.getDB()
+ descs = db.getBridgeDescriptors(self.fingerprint)
+ assert(descs is not None) # should not happen
+ # sort by timestamp, newest first XXX: what is the db order?
+ descs.sort(lambda x,y: cmp(x[3] , y[3]), reverse=True)
+ # grab the most recent descriptor
+ last = descs.pop(0)
+ last_orport = last[2] # (fp, ip, orport, timestamp)
+ last_ip = last[1]
+ for desc in descs:
+ if desc[2] != last_orport or desc[1] != last_ip:
+ return desc[3]*1000 # timestamp in milliseconds
+ #XXX: hmm, we have never seen a different orport. What now?
+ return descs[-1][3]*1000 # the oldest descriptor known... maybe this is right
+ @property
+ def lastSeenWithThisAddressAndPort(self):
+ """Timestamp in milliseconds when this bridge was last
+ seen with this address and port"""
+ #XXX: what address and port would that be?
+ db = bridgedb.Storage.getDB()
+ descs = db.getBridgeDescriptors(self.fingerprint)
+ assert(descs is not None) # should not happen
+ descs.sort(lambda x,y: cmp(x[3] , y[3]), reverse=True)
+ return descs.pop(0)[3]*1000 # just return the most recent timestamp
+
def parseDescFile(f, bridge_purpose='bridge'):
"""Generator. Parses a cached-descriptors file 'f' and yeilds a Bridge object
for every entry whose purpose matches bridge_purpose.
@@ -295,7 +357,7 @@ def parseDescFile(f, bridge_purpose='bridge'):
PORT = a number between 1 and 65535 inclusive.
"""
- nickname = ip = orport = fingerprint = purpose = None
+ nickname = ip = orport = fingerprint = purpose = timestamp = None
num_or_address_lines = 0
or_addresses = {}
@@ -303,7 +365,6 @@ def parseDescFile(f, bridge_purpose='bridge'):
line = line.strip()
if line.startswith("opt "):
line = line[4:]
-
if line.startswith("@purpose "):
items = line.split()
purpose = items[1]
@@ -315,14 +376,19 @@ def parseDescFile(f, bridge_purpose='bridge'):
orport = int(items[3])
elif line.startswith("fingerprint "):
fingerprint = line[12:].replace(" ", "")
+ elif line.startswith("published "):
+ if line.startswith("published "):
+ try:
+ timestamp = time.strptime(line[10:],"%Y-%M-%d %H:%m:%S")
+ timestamp = time.mktime(timestamp)
+ except ValueError: timestamp = None
elif line.startswith("router-signature"):
- purposeMatches = (purpose == bridge_purpose or
- bridge_purpose is None)
- if purposeMatches and nickname and ip and orport and fingerprint:
+ purposeMatches = (purpose == bridge_purpose or bridge_purpose is None)
+ if purposeMatches and nickname and ip and orport and fingerprint and timestamp:
b = Bridge(nickname, ipaddr.IPAddress(ip), orport, fingerprint)
b.assertOK()
- yield b
- nickname = ip = orport = fingerprint = purpose = None
+ yield b, timestamp
+ nickname = ip = orport = fingerprint = purpose = timestamp = None
class PortList:
""" container class for port ranges
More information about the tor-commits
mailing list