[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[or-cvs] [torperf/master] Update the entrycons script



commit e25a73d61eda553e9aa6cc3e59d65728dd139c42
Author: Sebastian Hahn <sebastian@xxxxxxxxxxxxxx>
Date:   Sat Sep 11 05:14:17 2010 +0200

    Update the entrycons script
    
    Make it work, check that it plays nice with TorCtl
---
 entrycons.py   |  110 ++++++++++++++++++++++++-------------------------------
 extra_stats.py |    3 +-
 2 files changed, 50 insertions(+), 63 deletions(-)

diff --git a/entrycons.py b/entrycons.py
index 70c7753..116806f 100644
--- a/entrycons.py
+++ b/entrycons.py
@@ -1,26 +1,23 @@
-import socket,sys,re,os,getopt
-sys.path.append("/home/broo/tor/torctl/trunk/python/TorCtl")
-import TorCtl
+#!/usr/bin/python
+import sys, time
+import TorCtl.TorCtl as TorCtl
+import TorCtl.TorUtil as TorUtil
 
 HOST = "127.0.0.1"
-PORT = 9060
-AUTH = "broom"
 
 SAMPLE_SIZE = 3
 
-slow = False
-
 class EntryTracker(TorCtl.ConsensusTracker):
-  global slow
   used_entries = []
 
-  def __init__(self, c):
-    TorCtl.ConsensusTracker.__init__(self, c)
+  def __init__(self, conn, slow):
+    TorCtl.ConsensusTracker.__init__(self, conn, consensus_only=False)
+    self._slow = slow
     self.set_entries()
 
   def new_consensus_event(self, n):
     TorCtl.ConsensusTracker.new_consensus_event(self, n)
-    print "DEBUG: New consensus arrived. Rejoice!"
+    TorUtil.plog("INFO", "New consensus arrived. Rejoice!")
     self.used_entries = []
     self.set_entries()
 
@@ -37,13 +34,15 @@ class EntryTracker(TorCtl.ConsensusTracker):
         nodes_list.remove(event.idhex)
         nodes_list.append(self.get_next_router(event.idhex, nodes_list))
         self.c.set_option("EntryNodes", ",".join(nodes_list))
-        print "DEBUG: Entry: " + event.nick + ":" + event.idhex + " died, and we replaced it with: " + nodes_list[2] + "!"
+        TorUtil.plog("NOTICE", "Entry: " + event.nick + ":" + event.idhex +
+                     " died, and we replaced it with: " + nodes_list[-1] + "!")
         nodes_tuple = self.c.get_option("EntryNodes")
         nodes_list = nodes_tuple[0][1]
-        print "DEBUG: New nodes_list: " + nodes_list
+        TorUtil.plog("INFO", "New nodes_list: " + nodes_list)
       except ValueError:
-        print "DEBUG: GUARD event notified of an entry death that is not in nodes_list! Mysterioush!"
-        print "DEBUG: It was: " + event.nick + " : " + event.idhex
+        TorUtil.plog("INFO", "GUARD event notified of an entry death that " +
+                     "is not in nodes_list! Mysterioush!")
+        TorUtil.plog("INFO", "It was: " + event.nick + " : " + event.idhex)
 
   def get_next_router(self, event, nodes_list):
     cons = self.current_consensus()
@@ -51,7 +50,9 @@ class EntryTracker(TorCtl.ConsensusTracker):
 
     i = 0
     while (1):
-      if ((sorted_routers[i].idhex not in self.used_entries) and (not sorted_routers[i].down)):
+      if ((sorted_routers[i].idhex not in self.used_entries) and
+          (not sorted_routers[i].down
+           and "Guard" in sorted_routers[i].flags)):
         self.used_entries.append(sorted_routers[i].idhex)
         return sorted_routers[i].idhex
       i += 1
@@ -59,63 +60,48 @@ class EntryTracker(TorCtl.ConsensusTracker):
   def set_entries(self):
     sorted_routers = self.sorted_r
 
-    if (not slow):
+    if (not self._slow):
       fast_entry_nodes = []
-      for i in range(SAMPLE_SIZE):
-        if (not sorted_routers[i].down):
+      for i in xrange(len(sorted_routers)):
+        if len(fast_entry_nodes) >= SAMPLE_SIZE: break
+        if (not sorted_routers[i].down and "Guard" in sorted_routers[i].flags):
           fast_entry_nodes.append(sorted_routers[i].idhex)
           self.used_entries.append(sorted_routers[i].idhex)
       self.c.set_option("EntryNodes", ",".join(fast_entry_nodes))
     else:
       sorted_routers.reverse()
-      i=0
-      for k in sorted_routers:
-        print sorted_routers[i].nickname + " : " + sorted_routers[i].idhex
-        i += 1
       slow_entry_nodes = []
-      for i in range(SAMPLE_SIZE):
-        if (not sorted_routers[i].down):
+      for i in xrange(len(sorted_routers)):
+        if len(slow_entry_nodes) >= SAMPLE_SIZE: break
+        if (not sorted_routers[i].down and "Guard" in sorted_routers[i].flags):
           slow_entry_nodes.append(sorted_routers[i].idhex)
           self.used_entries.append(sorted_routers[i].idhex)
       self.c.set_option("EntryNodes", ",".join(slow_entry_nodes))
 
-    if (not slow):
-      print "DEBUG: Changed EntryNodes to: " + ",".join(fast_entry_nodes)
+    if (not self._slow):
+      TorUtil.plog("NOTICE", "Changed EntryNodes to: " +
+                   ",".join(map(lambda x: self.ns_map[x].nickname+"="+x,
+                                fast_entry_nodes)))
     else:
-      print "DEBUG: SLOW: Changed EntryNodes to: " + ",".join(slow_entry_nodes)
-
-def usage():
-  print sys.argv[0] + " [options]"
-  print "Options:\n\t -h/--help: Print this cute message."
-  print "\t -s/--slow: Choose slowest guards."
-
-def main(argv):
-
-  global slow
-  s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-  s.connect((HOST, PORT))
-  c = TorCtl.Connection(s)
-  th = c.launch_thread()
-  c.authenticate(AUTH)
-
-  c.set_events(["NEWCONSENSUS", "GUARD"])
-  c.set_option("StrictEntryNodes", "1")
-
-  try:
-    opts,args = getopt.getopt(argv, "hs", ["help", "slow"])
-  except getopt.GetoptError:
-    usage()
-    sys.exit(2)
-  for opt, arg in opts:
-    if opt in ("-h","--help"):
-      usage()
-      sys.exit()
-    elif opt in ("-s","--slow"):
-      print ".Shlow."
-      slow = True
-
-  EntryTracker(c)
-  th.join()
+      TorUtil.plog("NOTICE", "SLOW: Changed EntryNodes to: " +
+                   ",".join(map(lambda x: self.ns_map[x].nickname+"="+x,
+                                slow_entry_nodes)))
+
+def main():
+
+  port = int(sys.argv[1])
+  speed = sys.argv[2]
+  
+  if not speed in ("fast", "slow"):
+    TorUtil.plot("ERROR", "Second parameter must be 'fast' or 'slow'");
+
+  conn = TorCtl.connect(HOST, port)
+
+  conn.set_events(["NEWCONSENSUS", "NEWDESC", "NS", "GUARD"])
+  conn.set_option("StrictEntryNodes", "1")
+
+  EntryTracker(conn, speed == "slow")
+  conn.block_until_close()
 
 if __name__ == '__main__':
-  main(sys.argv[1:])
+  main()
diff --git a/extra_stats.py b/extra_stats.py
index 3da4c4e..f0c4ad4 100644
--- a/extra_stats.py
+++ b/extra_stats.py
@@ -10,9 +10,10 @@ class WriteStats(TorCtl.PostEventListener):
     self._filename = filename
     self._conn = None
 
-
   def connect(self):
     self._conn = TorCtl.connect(HOST, self._port)
+    if not self._conn
+      sys.exit(2)
 
   def setup_listener(self):
     self._conn.set_events(["Stream"])