[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[or-cvs] r18295: {torctl} Add __str__ support to restrictions to catch a bizzare restr (torctl/trunk/python/TorCtl)
Author: mikeperry
Date: 2009-01-28 09:30:28 -0500 (Wed, 28 Jan 2009)
New Revision: 18295
Modified:
torctl/trunk/python/TorCtl/PathSupport.py
Log:
Add __str__ support to restrictions to catch a bizzare
restriction-related error.
Modified: torctl/trunk/python/TorCtl/PathSupport.py
===================================================================
--- torctl/trunk/python/TorCtl/PathSupport.py 2009-01-28 13:58:02 UTC (rev 18294)
+++ torctl/trunk/python/TorCtl/PathSupport.py 2009-01-28 14:30:28 UTC (rev 18295)
@@ -108,6 +108,9 @@
lambda r: not isinstance(r, RestrictionClass),
self.restrictions)
+ def __str__(self):
+ return str(self.restrictions)
+
class PathRestriction:
"Interface for path restriction policies"
def path_is_ok(self, path):
@@ -137,6 +140,9 @@
lambda r: not isinstance(r, RestrictionClass),
self.restrictions)
+ def __str__(self):
+ return str(self.restrictions)
+
class NodeGenerator:
"Interface for node generation"
def __init__(self, sorted_r, rstr_list):
@@ -154,7 +160,7 @@
"Rewind the generator to the 'beginning'"
self.routers = copy.copy(self.rstr_routers)
if not self.routers:
- plog("ERROR", "No routers left after restrictions applied!")
+ plog("ERROR", "No routers left after restrictions applied: "+str(self.rstr_list))
raise NoNodesRemain()
def rebuild(self, sorted_r=None):
@@ -164,7 +170,7 @@
self.sorted_r = sorted_r
self.rstr_routers = filter(lambda r: self.rstr_list.r_is_ok(r), self.sorted_r)
if not self.rstr_routers:
- plog("ERROR", "No routers left after restrictions applied!")
+ plog("ERROR", "No routers left after restrictions applied: "+str(self.rstr_list))
raise NoNodesRemain()
def mark_chosen(self, r):
@@ -227,6 +233,9 @@
elif r.list_rank > len(self.sorted_r)*self.pct_fast/100: return False
return True
+
+ def __str__(self):
+ return self.__class__.__name__+"("+str(self.pct_skip)+","+str(self.pct_fast)+")"
class OSRestriction(NodeRestriction):
"Restriction based on operating system"
@@ -247,10 +256,16 @@
if self.ok: return False
if self.bad: return True
+ def __str__(self):
+ return self.__class__.__name__+"("+str(self.ok)+","+str(self.bad)+")"
+
class ConserveExitsRestriction(NodeRestriction):
"Restriction to reject exits from selection"
def r_is_ok(self, r): return not "Exit" in r.flags
+ def __str__(self):
+ return self.__class__.__name__+"()"
+
class FlagsRestriction(NodeRestriction):
"Restriction for mandatory and forbidden router flags"
def __init__(self, mandatory, forbidden=[]):
@@ -266,6 +281,9 @@
if f in router.flags: return False
return True
+ def __str__(self):
+ return self.__class__.__name__+"("+str(self.mandatory)+","+str(self.forbidden)+")"
+
class NickRestriction(NodeRestriction):
"""Require that the node nickname is as specified"""
def __init__(self, nickname):
@@ -274,6 +292,9 @@
def r_is_ok(self, router):
return router.nickname == self.nickname
+ def __str__(self):
+ return self.__class__.__name__+"("+str(self.nickname)+")"
+
class IdHexRestriction(NodeRestriction):
"""Require that the node idhash is as specified"""
def __init__(self, idhex):
@@ -284,13 +305,19 @@
def r_is_ok(self, router):
return router.idhex == self.idhex
-
+
+ def __str__(self):
+ return self.__class__.__name__+"("+str(self.idhex)+")"
+
class MinBWRestriction(NodeRestriction):
"""Require a minimum bandwidth"""
def __init__(self, minbw):
self.min_bw = minbw
def r_is_ok(self, router): return router.bw >= self.min_bw
+
+ def __str__(self):
+ return self.__class__.__name__+"("+str(self.min_bw)+")"
class VersionIncludeRestriction(NodeRestriction):
"""Require that the version match one in the list"""
@@ -306,6 +333,9 @@
return True
return False
+ def __str__(self):
+ return self.__class__.__name__+"("+str(self.eq)+")"
+
class VersionExcludeRestriction(NodeRestriction):
"""Require that the version not match one in the list"""
def __init__(self, exclude):
@@ -320,6 +350,9 @@
return False
return True
+ def __str__(self):
+ return self.__class__.__name__+"("+str(self.exclude)+")"
+
class VersionRangeRestriction(NodeRestriction):
"""Require that the versions be inside a specified range"""
def __init__(self, gr_eq, less_eq=None):
@@ -331,6 +364,9 @@
return (not self.gr_eq or router.version >= self.gr_eq) and \
(not self.less_eq or router.version <= self.less_eq)
+ def __str__(self):
+ return self.__class__.__name__+"("+str(self.gr_eq)+","+str(self.less_eq)+")"
+
class ExitPolicyRestriction(NodeRestriction):
"""Require that a router exit to an ip+port"""
def __init__(self, to_ip, to_port):
@@ -339,6 +375,9 @@
def r_is_ok(self, r): return r.will_exit_to(self.to_ip, self.to_port)
+ def __str__(self):
+ return self.__class__.__name__+"("+str(self.to_ip)+","+str(self.to_port)+")"
+
class MetaNodeRestriction(NodeRestriction):
"""Interface for a NodeRestriction that is an expression consisting of
multiple other NodeRestrictions"""
@@ -361,6 +400,9 @@
return True
return False
+ def __str__(self):
+ return self.__class__.__name__+"("+str(self.rstrs)+")"
+
class NotNodeRestriction(MetaNodeRestriction):
"""Negates a single restriction"""
def __init__(self, a):
@@ -368,6 +410,9 @@
def r_is_ok(self, r): return not self.a.r_is_ok(r)
+ def __str__(self):
+ return self.__class__.__name__+"("+str(self.a)+")"
+
class AtLeastNNodeRestriction(MetaNodeRestriction):
"""MetaNodeRestriction that is true if at least n member
restrictions are true."""
@@ -383,7 +428,10 @@
if cnt < self.n: return False
else: return True
+ def __str__(self):
+ return self.__class__.__name__+"("+str(self.rstrs)+","+str(self.n)+")"
+
#################### Path Restrictions #####################
class Subnet16Restriction(PathRestriction):
@@ -397,6 +445,9 @@
return False
return True
+ def __str__(self):
+ return self.__class__.__name__+"()"
+
class UniqueRestriction(PathRestriction):
"""Path restriction that mandates that the same router can't appear more
than once in a path"""
@@ -406,6 +457,9 @@
return False
return True
+ def __str__(self):
+ return self.__class__.__name__+"()"
+
#################### GeoIP Restrictions ###################
class CountryCodeRestriction(NodeRestriction):
@@ -413,6 +467,9 @@
def r_is_ok(self, r):
return r.country_code != None
+ def __str__(self):
+ return self.__class__.__name__+"()"
+
class CountryRestriction(NodeRestriction):
""" Only accept nodes that are in 'country_code' """
def __init__(self, country_code):
@@ -421,6 +478,9 @@
def r_is_ok(self, r):
return r.country_code == self.country_code
+ def __str__(self):
+ return self.__class__.__name__+"("+str(self.country_code)+")"
+
class ExcludeCountriesRestriction(NodeRestriction):
""" Exclude a list of countries """
def __init__(self, countries):
@@ -429,6 +489,9 @@
def r_is_ok(self, r):
return not (r.country_code in self.countries)
+ def __str__(self):
+ return self.__class__.__name__+"("+str(self.countries)+")"
+
class UniqueCountryRestriction(PathRestriction):
""" Ensure every router to have a distinct country_code """
def path_is_ok(self, path):
@@ -438,6 +501,9 @@
return False;
return True;
+ def __str__(self):
+ return self.__class__.__name__+"()"
+
class SingleCountryRestriction(PathRestriction):
""" Ensure every router to have the same country_code """
def path_is_ok(self, path):
@@ -447,6 +513,9 @@
return False
return True
+ def __str__(self):
+ return self.__class__.__name__+"()"
+
class ContinentRestriction(PathRestriction):
""" Do not more than n continent crossings """
# TODO: Add src and dest
@@ -466,6 +535,9 @@
if crossings > self.n: return False
else: return True
+ def __str__(self):
+ return self.__class__.__name__+"("+str(self.n)+")"
+
class ContinentJumperRestriction(PathRestriction):
""" Ensure continent crossings between all hops """
def path_is_ok(self, path):
@@ -478,6 +550,9 @@
prev = r
return True
+ def __str__(self):
+ return self.__class__.__name__+"()"
+
class UniqueContinentRestriction(PathRestriction):
""" Ensure every hop to be on a different continent """
def path_is_ok(self, path):
@@ -487,6 +562,9 @@
return False;
return True;
+ def __str__(self):
+ return self.__class__.__name__+"()"
+
class OceanPhobicRestriction(PathRestriction):
""" Not more than n ocean crossings """
# TODO: Add src and dest
@@ -506,6 +584,9 @@
if crossings > self.n: return False
else: return True
+ def __str__(self):
+ return self.__class__.__name__+"("+str(self.n)+")"
+
#################### Node Generators ######################
class UniformGenerator(NodeGenerator):