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

[or-cvs] r10934: Add uptime to router class. Commit a statssplitter script wh (in torflow/trunk: . TorCtl)



Author: mikeperry
Date: 2007-07-26 03:23:36 -0400 (Thu, 26 Jul 2007)
New Revision: 10934

Added:
   torflow/trunk/statsplitter.py
Modified:
   torflow/trunk/TorCtl/TorCtl.py
Log:

Add uptime to router class. Commit a statssplitter script
which kicks out some statistics on the directory by
percentile.



Modified: torflow/trunk/TorCtl/TorCtl.py
===================================================================
--- torflow/trunk/TorCtl/TorCtl.py	2007-07-25 22:57:07 UTC (rev 10933)
+++ torflow/trunk/TorCtl/TorCtl.py	2007-07-26 07:23:36 UTC (rev 10934)
@@ -199,7 +199,7 @@
   def __str__(self): return self.ver_string
 
 class Router:
-  def __init__(self, idhex, name, bw, down, exitpolicy, flags, ip, version, os):
+  def __init__(self, idhex, name, bw, down, exitpolicy, flags, ip, version, os, uptime):
     self.idhex = idhex
     self.nickname = name
     self.bw = bw
@@ -210,6 +210,7 @@
     self.version = RouterVersion(version)
     self.os = os
     self.list_rank = 0 # position in a sorted list of routers.
+    self.uptime = uptime
 
   def update_to(self, new):
     if self.idhex != new.idhex:
@@ -222,6 +223,7 @@
     self.ip = new.ip
     self.version = new.version
     self.os = new.os
+    self.uptime = new.uptime
 
   def will_exit_to(self, ip, port):
     for line in self.exitpolicy:
@@ -528,6 +530,7 @@
     bw_observed = 0
     version = None
     os = None
+    uptime = 0
     if router != ns.nickname:
       plog("NOTICE", "Got different names " + ns.nickname + " vs " +
              router + " for " + ns.idhex)
@@ -539,6 +542,7 @@
       ac = re.search(r"^accept (\S+):([^-]+)(?:-(\d+))?", line)
       rj = re.search(r"^reject (\S+):([^-]+)(?:-(\d+))?", line)
       bw = re.search(r"^bandwidth \d+ \d+ (\d+)", line)
+      up = re.search(r"^uptime (\d+)", line)
       if re.search(r"^opt hibernating 1", line):
         #dead = 1 # XXX: Technically this may be stale..
         if ("Running" in ns.flags):
@@ -551,12 +555,14 @@
         bw_observed = int(bw.group(1))
       elif pl:
         version, os = pl.groups()
+      elif up:
+        uptime = int(up.group(1))
     if not bw_observed and not dead and ("Valid" in ns.flags):
       plog("INFO", "No bandwidth for live router " + ns.nickname)
     if not version or not os:
       plog("INFO", "No version and/or OS for router " + ns.nickname)
     return Router(ns.idhex, ns.nickname, bw_observed, dead, exitpolicy,
-        ns.flags, ip, version, os)
+        ns.flags, ip, version, os, uptime)
 
   def read_routers(self, nslist):
     bad_key = 0

Added: torflow/trunk/statsplitter.py
===================================================================
--- torflow/trunk/statsplitter.py	                        (rev 0)
+++ torflow/trunk/statsplitter.py	2007-07-26 07:23:36 UTC (rev 10934)
@@ -0,0 +1,78 @@
+#!/usr/bin/python
+import sys
+import socket
+from TorCtl import *
+from TorCtl.PathSupport import *
+
+TorUtil.loglevel = "NOTICE"
+
+s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+s.connect(("127.0.0.1",9051))
+c = Connection(s)
+c.debug(file("control.log", "w"))
+c.authenticate()
+nslist = c.get_network_status()
+sorted_rlist = c.read_routers(c.get_network_status())
+
+sorted_rlist.sort(lambda x, y: cmp(y.bw, x.bw))
+for i in xrange(len(sorted_rlist)): sorted_rlist[i].list_rank = i
+
+exit_rst = FlagsRestriction(["Exit"], [])
+dir_rst = FlagsRestriction(["V2Dir"], [])
+heavy_exits = OrNodeRestriction(
+      [ExitPolicyRestriction("255.255.255.255", 6881),
+      ExitPolicyRestriction("255.255.255.255", 6889),
+      ExitPolicyRestriction("255.255.255.255", 6346),
+      ExitPolicyRestriction("255.255.255.255", 25)])
+
+
+def check(start, stop):
+  pct_rst = PercentileRestriction(start, stop, sorted_rlist)
+  bw = 0
+  nodes = 0
+  exits = 0
+  exit_bw = 0
+  heavy = 0
+  dirs = 0
+  nodes_up = 0
+  up = 0
+  
+  for r in sorted_rlist:
+    if pct_rst.r_is_ok(r):
+      nodes += 1
+      bw += r.bw
+      if r.uptime > 0:
+        nodes_up += 1.0
+        up += r.uptime
+      if exit_rst.r_is_ok(r):
+        exits += 1
+        exit_bw += r.bw
+      if heavy_exits.r_is_ok(r):
+        heavy += 1
+      if dir_rst.r_is_ok(r):
+        dirs += 1
+  
+  print str(start)+"-"+str(stop)+": N: "+str(nodes)+", Bw: "+str(round(bw/(1024*1024.0), 2))+", X: "+str(exits)+", XBw: "+str(round(exit_bw/(1024*1024.0),2))+", BT: "+str(heavy)+", Dirs:"+str(dirs)+", Up: "+str(round(up/nodes_up/60/60/24, 2))
+
+
+for i in xrange(0,80,5):
+  check(i,i+5)
+
+clipped = 0
+clipped_bw = 0
+exits = 0
+nodes = 0
+bw = 0
+exit_bw = 0
+for r in sorted_rlist:
+  if r.bw > 1500000:
+    clipped +=1
+    clipped_bw += r.bw - 1500000
+  nodes += 1
+  bw += r.bw
+  if exit_rst.r_is_ok(r):
+    exits += 1
+    exit_bw += r.bw
+
+print "Nodes: "+str(nodes)+", Exits: "+str(exits)+" Total bw: "+str(round(bw/(1024.0*1024),2))+", Exit Bw: "+str(round(exit_bw/(1024.0*1024),2))
+print "Clipped: "+str(clipped)+", bw: "+str(round(clipped_bw/(1024.0*1024),2))


Property changes on: torflow/trunk/statsplitter.py
___________________________________________________________________
Name: svn:executable
   + *