[tor-commits] [bridgedb/master] 4297 - Prepopulate ipCategories, clusters, and email rings

aagbsn at torproject.org aagbsn at torproject.org
Sat Mar 16 23:46:31 UTC 2013


commit e6ce57e728802689544c130867edcadfeecd38ec
Author: aagbsn <aagbsn at extc.org>
Date:   Tue May 29 16:01:12 2012 -0700

    4297 - Prepopulate ipCategories, clusters, and email rings
---
 lib/bridgedb/Dist.py |   61 +++++++++++++++++++++++++++++++++++++++++++++-----
 lib/bridgedb/Main.py |   20 +++++++++------
 2 files changed, 67 insertions(+), 14 deletions(-)

diff --git a/lib/bridgedb/Dist.py b/lib/bridgedb/Dist.py
index 00cea72..ec13fb5 100644
--- a/lib/bridgedb/Dist.py
+++ b/lib/bridgedb/Dist.py
@@ -16,6 +16,8 @@ from ipaddr import IPv6Address, IPAddress
 
 from bridgedb.Filters import filterAssignBridgesToRing
 from bridgedb.Filters import filterBridgesByRules
+from bridgedb.Filters import filterBridgesByIP4
+from bridgedb.Filters import filterBridgesByIP6
 
 def uniformMap(ip):
     """Map an IP to an arbitrary 'area' string, such that any two /24 addresses
@@ -67,6 +69,43 @@ class IPBasedDistributor(bridgedb.Bridges.BridgeHolder):
 
         logging.debug("added splitter %s" % self.splitter)
 
+    def prepopulateRings(self):
+        # populate all rings (for dumping assignments and testing)
+        for filterFn in [None, filterBridgesByIP4, filterBridgesByIP6]:
+            n = self.nClusters
+            for category in self.categories:
+                g = filterAssignBridgesToRing(self.splitter.hmac,
+                        self.nClusters +
+                        len(self.categories),
+                        n)
+                bridgeFilterRules = [g]
+                if filterFn:
+                    bridgeFilterRules.append(filterFn)
+                ruleset = frozenset(bridgeFilterRules)
+                key1 = bridgedb.Bridges.get_hmac(self.splitter.key,
+                        "Order-Bridges-In-Ring-%d"%n) 
+                n += 1
+                ring = bridgedb.Bridges.BridgeRing(key1, self.answerParameters)
+                self.splitter.addRing(ring, ruleset, filterBridgesByRules(bridgeFilterRules),
+                                      populate_from=self.splitter.bridges)
+
+
+            # populate all ip clusters
+            for clusterNum in xrange(self.nClusters):
+                g = filterAssignBridgesToRing(self.splitter.hmac,
+                                              self.nClusters +
+                                              len(self.categories),
+                                              clusterNum) 
+                bridgeFilterRules = [g]
+                if filterFn:
+                    bridgeFilterRules.append(filterFn)
+                ruleset = frozenset(bridgeFilterRules)
+                key1 = bridgedb.Bridges.get_hmac(self.splitter.key,
+                                                 "Order-Bridges-In-Ring-%d"%clusterNum) 
+                ring = bridgedb.Bridges.BridgeRing(key1, self.answerParameters)
+                self.splitter.addRing(ring, ruleset, filterBridgesByRules(bridgeFilterRules),
+                                      populate_from=self.splitter.bridges)
+
     def clear(self):
         self.splitter.clear()
 
@@ -100,7 +139,6 @@ class IPBasedDistributor(bridgedb.Bridges.BridgeHolder):
         # try to match the request to an ip category
         for category in self.categories:
             # IP Categories
-            logging.info("---------------------------------")
             if category.contains(ip):
                 g = filterAssignBridgesToRing(self.splitter.hmac,
                                                       self.nClusters +
@@ -290,15 +328,16 @@ class EmailBasedDistributor(bridgedb.Bridges.BridgeHolder):
         """Assign a bridge to this distributor."""
         self.splitter.insert(bridge)
 
-    def getBridgesForEmail(self, emailaddress, epoch, N=1, parameters=None, countryCode=None,
-                           bridgeFilterRules=None):
+    def getBridgesForEmail(self, emailaddress, epoch, N=1,
+            parameters=None, countryCode=None, bridgeFilterRules=None):
         """Return a list of bridges to give to a user.
            emailaddress -- the user's email address, as given in a from line.
            epoch -- the time period when we got this request.  This can
                be any string, so long as it changes with every period.
            N -- the number of bridges to try to give back.
         """
-        if not bridgeFilterRules: bridgeFilterRules=[]
+        if not bridgeFilterRules:
+            bridgeFilterRules=[]
         now = time.time()
         try:
             emailaddress = normalizeEmail(emailaddress, self.domainmap,
@@ -342,9 +381,8 @@ class EmailBasedDistributor(bridgedb.Bridges.BridgeHolder):
             logging.debug("Cache miss %s" % ruleset)
 
             # add new ring 
-            #XXX what key do we use here? does it matter? 
             key1 = bridgedb.Bridges.get_hmac(self.splitter.key,
-                                             str(bridgeFilterRules))
+                    "Order-Bridges-In-Ring")
             ring = bridgedb.Bridges.BridgeRing(key1, self.answerParameters)
             # debug log: cache miss 
             self.splitter.addRing(ring, ruleset,
@@ -373,3 +411,14 @@ class EmailBasedDistributor(bridgedb.Bridges.BridgeHolder):
 
     def dumpAssignments(self, f, description=""):
         self.splitter.dumpAssignments(f, description)
+
+    def prepopulateRings(self):
+        # populate all rings (for dumping assignments and testing)
+        for filterFn in [filterBridgesByIP4, filterBridgesByIP6]:
+            ruleset = frozenset([filterFn])
+            key1 = bridgedb.Bridges.get_hmac(self.splitter.key,
+                    "Order-Bridges-In-Ring")
+            ring = bridgedb.Bridges.BridgeRing(key1, self.answerParameters)
+            self.splitter.addRing(ring, ruleset,
+                                  filterBridgesByRules([filterFn]),
+                                  populate_from=self.splitter.bridges)
diff --git a/lib/bridgedb/Main.py b/lib/bridgedb/Main.py
index 7d28684..fe34cb0 100644
--- a/lib/bridgedb/Main.py
+++ b/lib/bridgedb/Main.py
@@ -285,6 +285,7 @@ def startup(cfg):
             Bridges.get_hmac(key, "HTTPS-IP-Dist-Key"),
             categories,
             answerParameters=ringParams)
+        ipDistributor.prepopulateRings() # create default rings
         splitter.addRing(ipDistributor, "https", cfg.HTTPS_SHARE)
         #webSchedule = Time.IntervalSchedule("day", 2)
         webSchedule = Time.NoSchedule()
@@ -298,6 +299,7 @@ def startup(cfg):
             cfg.EMAIL_DOMAIN_MAP.copy(),
             cfg.EMAIL_DOMAIN_RULES.copy(),
             answerParameters=ringParams)
+        emailDistributor.prepopulateRings() # create default rings
         splitter.addRing(emailDistributor, "email", cfg.EMAIL_SHARE)
         #emailSchedule = Time.IntervalSchedule("day", 1)
         emailSchedule = Time.NoSchedule()
@@ -322,14 +324,16 @@ def startup(cfg):
             logging.info("%d for email", len(emailDistributor.splitter))
         if ipDistributor:
             logging.info("%d for web:", len(ipDistributor.splitter))
-            logging.info("  by location set: %s",
-                         " ".join(str(len(r)) for r in ipDistributor.rings))
-            logging.info("  by category set: %s",
-                         " ".join(str(len(r)) for r in ipDistributor.categoryRings))
-            logging.info("Here are all known bridges in the category section:")
-            for r in ipDistributor.categoryRings:
-                for name, b in r.bridges.items():
-                    logging.info("%s" % b.getConfigLine(True))
+	    for (n,(f,r)) in ipDistributor.splitter.filterRings.items():
+                logging.info(" by filter set %s, %d" % (n, len(r)))
+            #logging.info("  by location set: %s",
+            #             " ".join(str(len(r)) for r in ipDistributor.rings))
+            #logging.info("  by category set: %s",
+            #             " ".join(str(len(r)) for r in ipDistributor.categoryRings))
+            #logging.info("Here are all known bridges in the category section:")
+            #for r in ipDistributor.categoryRings:
+            #    for name, b in r.bridges.items():
+            #        logging.info("%s" % b.getConfigLine(True))
 
         # Dump bridge pool assignments to disk.
         try:





More information about the tor-commits mailing list