[tor-commits] [bridgedb/develop] Rewrite b.p.d.parseNetworkStatusFile() to use RouterStatusEntryV3.

isis at torproject.org isis at torproject.org
Thu Feb 19 02:21:12 UTC 2015


commit aa2d411c046318d541ef62d68c7d3da70918902b
Author: Isis Lovecruft <isis at torproject.org>
Date:   Fri Aug 29 05:31:24 2014 +0000

    Rewrite b.p.d.parseNetworkStatusFile() to use RouterStatusEntryV3.
    
    See Damian's comments on how we were using a RouterStatusEntryV2 in
    https://trac.torproject.org/projects/tor/ticket/9380#comment:16.
---
 lib/bridgedb/parse/descriptors.py |   73 ++++++++++++++++++++-----------------
 1 file changed, 40 insertions(+), 33 deletions(-)

diff --git a/lib/bridgedb/parse/descriptors.py b/lib/bridgedb/parse/descriptors.py
index a0806e2..5028ad3 100644
--- a/lib/bridgedb/parse/descriptors.py
+++ b/lib/bridgedb/parse/descriptors.py
@@ -16,48 +16,55 @@ import datetime
 import logging
 
 from stem.descriptor import extrainfo_descriptor
-from stem.descriptor import networkstatus
 from stem.descriptor import server_descriptor
 from stem.descriptor import parse_file
+from stem.descriptor.router_status_entry import _parse_file as _parseNSFile
+from stem.descriptor.router_status_entry import RouterStatusEntryV3
 
 from bridgedb import safelog
 
 
-def parseNetworkStatusFile(filename, validate=True):
+def parseNetworkStatusFile(filename, validate=True, skipHeaders=True,
+                           descriptorClass=RouterStatusEntryV3):
     """Parse a file which contains an ``@type bridge-networkstatus`` document.
 
-    :rtype: dict
-    :returns: A dictionary fingerprints mapped to
-        :api:`stem.descriptor.router_status_entry.RouterStatusEntryV2`s.
+    See `ticket #12254 <https://bugs.torproject.org/12254>`__ for why
+    networkstatus-bridges documents don't look anything like the networkstatus
+    v2 documents that they are purported to look like. They are missing all
+    headers, and the entire footer including authority signatures.
+
+    :param str filename: The location of the file containing bridge
+        networkstatus descriptors.
+    :param bool validate: Passed along to Stem's parsers. If ``True``, the
+        descriptors will raise exceptions if they do not meet some definition
+        of correctness.
+    :param bool skipHeaders: If ``True``, skip parsing everything before the
+        first ``r`` line.
+    :param descriptorClass: A class (probably from
+        :api:`stem.descriptors.router_status_entry`) which Stem will parse
+        each descriptor it reads from **filename** into.
+    :raises ValueError: if the contents of a descriptor are malformed and
+        **validate** is ``True``.
+    :raises IOError: if the file at **filename** can't be read.
+    :rtype: list
+    :returns: A list of
+        :api:`stem.descriptor.router_status_entry.RouterStatusEntryV#`s.
     """
-    logging.info("Parsing networkstatus entries with Stem: %s" % filename)
-
-    fh = open(filename)
-    descriptors = fh.read()
-    fh.close()
-
-    # See ticket #12254 for why networkstatus-bridges documents don't look
-    # anything like the networkstatus v2 documents that they are purported to
-    # look like. They are missing all headers, and the entire footer including
-    # authority signatures.
-    #
-    # https://trac.torproject.org/projects/tor/ticket/12254
-    #
-    # As such, they do not currently start with a "published" line with an
-    # ISO8601 timestamp, as stem expects them to:
-    #
-    if not descriptors.startswith("published"):
-        precise = datetime.datetime.now().isoformat(sep=chr(0x20))
-        timestamp = precise.rsplit('.', 1)[0]
-        descriptors = "published {t}\n{d}".format(t=timestamp, d=descriptors)
-    else:
-        logging.warn(
-            ("Networkstatus file '%s' started with 'published' line! Please "
-             "revise this function!") % filename)
-
-    document = networkstatus.BridgeNetworkStatusDocument(descriptors,
-                                                         validate=validate)
-    return document.routers
+    routers = []
+
+    logging.info("Parsing networkstatus file: %s" % filename)
+    with open(filename) as fh:
+        position = fh.tell()
+        if skipHeaders:
+            while not fh.readline().startswith('r '):
+                position = fh.tell()
+        logging.debug("Skipping %d bytes of networkstatus file." % position)
+        document = _parseNSFile(fh, validate, entry_class=descriptorClass,
+                                start_position=position)
+        routers.extend(list(document))
+    logging.info("Closed networkstatus file: %s" % filename)
+
+    return routers
 
 def parseServerDescriptorsFile(filename, validate=False):
     """Parse a file which contains ``@type bridge-server-descriptor``s.





More information about the tor-commits mailing list