commit 92af0a5c0f9c6924cfddfb6388f581f3b6014732 Author: Damian Johnson atagar@torproject.org Date: Sun Dec 2 16:16:20 2012 -0800
Support for NS events
Implementation and testing for NS events. To get test data I wiped my cached_consensus, then listened for NS events while bootstraping. The first time I did this it provided a flood of entries (probably the whole consensus), but then when I restarted tor and tried again it just proved one. --- stem/control.py | 1 + stem/response/events.py | 22 ++++++++++++++++++++++ test/unit/response/events.py | 20 ++++++++++++++++++++ 3 files changed, 43 insertions(+), 0 deletions(-)
diff --git a/stem/control.py b/stem/control.py index c2c014d..5fd69c7 100644 --- a/stem/control.py +++ b/stem/control.py @@ -89,6 +89,7 @@ providing its own for interacting at a higher level. **INFO** :class:`stem.response.events.LogEvent` **NEWDESC** :class:`stem.response.events.NewDescEvent` **NOTICE** :class:`stem.response.events.LogEvent` + **NS** :class:`stem.response.events.NetworkStatusEvent` **ORCONN** :class:`stem.response.events.ORConnEvent` **STATUS_CLIENT** :class:`stem.response.events.StatusEvent` **STATUS_GENERAL** :class:`stem.response.events.StatusEvent` diff --git a/stem/response/events.py b/stem/response/events.py index bca9557..1bdfd02 100644 --- a/stem/response/events.py +++ b/stem/response/events.py @@ -1,9 +1,11 @@ import re import datetime +import StringIO
import stem import stem.control import stem.response +import stem.descriptor.router_status_entry
from stem.util import connection, log, str_tools, tor_tools
@@ -360,6 +362,25 @@ class LogEvent(Event): log_id = "event.logging.unknown_runlevel.%s" % self.runlevel log.log_once(log_id, log.INFO, unrecognized_msg % ('runlevel', self.runlevel))
+class NetworkStatusEvent(Event): + """ + Event for when our copy of the consensus has changed. This was introduced in + tor version 0.1.2.3. + + :param list desc: :class:`~stem.descriptor.router_status_entry.RouterStatusEntryV3` for the changed descriptors + """ + + _SKIP_PARSING = True + + def _parse(self): + content = str(self).lstrip("NS\n") + + self.desc = list(stem.descriptor.router_status_entry.parse_file( + StringIO.StringIO(content), + True, + entry_class = stem.descriptor.router_status_entry.RouterStatusEntryV3, + )) + class NewDescEvent(Event): """ Event that indicates that a new descriptor is available. @@ -567,6 +588,7 @@ EVENT_TYPE_TO_CLASS = { "INFO": LogEvent, "NEWDESC": NewDescEvent, "NOTICE": LogEvent, + "NS": NetworkStatusEvent, "ORCONN": ORConnEvent, "STATUS_CLIENT": StatusEvent, "STATUS_GENERAL": StatusEvent, diff --git a/test/unit/response/events.py b/test/unit/response/events.py index 2a64a27..84a1e7b 100644 --- a/test/unit/response/events.py +++ b/test/unit/response/events.py @@ -47,6 +47,15 @@ GUARD_NEW = "650 GUARD ENTRY $36B5DBA788246E8369DBAF58577C6BC044A9A374 NEW" GUARD_GOOD = "650 GUARD ENTRY $5D0034A368E0ABAF663D21847E1C9B6CFA09752A GOOD" GUARD_BAD = "650 GUARD ENTRY $5D0034A368E0ABAF663D21847E1C9B6CFA09752A BAD"
+# NS event from tor v0.2.1.30. + +NS_EVENT = """650+NS +r whnetz dbBxYcJriTTrcxsuy4PUZcMRwCA VStM7KAIH/mXXoGDUpoGB1OXufg 2012-12-02 21:03:56 141.70.120.13 9001 9030 +s Fast HSDir Named Stable V2Dir Valid +. +650 OK +""" + # STATUS_* events that I was able to easily trigger. Most came from starting # TBB, then listening while it bootstrapped.
@@ -380,6 +389,17 @@ class TestEvents(unittest.TestCase): self.assertEqual(NEWDESC_MULTIPLE.lstrip("650 "), str(event)) self.assertEqual(expected_relays, event.relays)
+ def test_ns_event(self): + expected_desc = mocking.get_router_status_entry_v3({ + "r": "whnetz dbBxYcJriTTrcxsuy4PUZcMRwCA VStM7KAIH/mXXoGDUpoGB1OXufg 2012-12-02 21:03:56 141.70.120.13 9001 9030", + "s": "Fast HSDir Named Stable V2Dir Valid", + }) + + event = _get_event(NS_EVENT) + + self.assertTrue(isinstance(event, stem.response.events.NetworkStatusEvent)) + self.assertEqual([expected_desc], event.desc) + def test_orconn_event(self): event = _get_event(ORCONN_CONNECTED)
tor-commits@lists.torproject.org