]> git.rkrishnan.org Git - tahoe-lafs/tahoe-lafs.git/commitdiff
introweb: fix connection hints for server announcements 190/head
authorBrian Warner <warner@lothar.com>
Tue, 22 Sep 2015 23:37:12 +0000 (16:37 -0700)
committerBrian Warner <warner@lothar.com>
Wed, 23 Sep 2015 00:19:52 +0000 (17:19 -0700)
A long time ago, the introducer's status web page would show the
advertised IP addresses for all published services, by parsing their
FURL's connection hints. This hasn't worked since about 12-Aug-2014 when
foolscap-0.6.5 changed the internal format of these hints (the column
has been empty this whole time).

This removes the "Advertised IPs" column from the Service Announcements
table. Instead, the service's full connection hints (not just the IP
address) is displayed in a tooltip/popup on the "Announced" timestamp
column.

The code that pulls these connection hints is now tolerant of all three
foolscap styles:

* foolscap<=0.6.4 : tuples of ("ipv4",host,port)
* 0.6.5 .. 0.8.0  : tuples of ("tcp",host,port)
* foolscap>=0.9.0 : strings

fixes ticket:2510

src/allmydata/introducer/common.py
src/allmydata/test/test_introducer.py
src/allmydata/util/rrefutil.py
src/allmydata/web/introducer.xhtml
src/allmydata/web/introweb.py

index 9c5638a36720e5910c865260ca48b6b4efffe24a..699408ece8d6cc996103fb5dce720ee26dd94e21 100644 (file)
@@ -131,9 +131,9 @@ class AnnouncementDescriptor:
      .nickname: their self-provided nickname, or "" (unicode)
      .serverid: the server identifier. This is a pubkey (for V2 clients),
                 or a tubid (for V1 clients).
-     .advertised_addresses: which hosts they listen on (list of strings)
-                            if the announcement included a key for
-                            'anonymous-storage-FURL', else an empty list.
+     .connection_hints: where they listen (list of strings) if the
+                        announcement included a key for
+                        'anonymous-storage-FURL', else an empty list.
     """
 
     def __init__(self, when, index, canary, ann_d):
@@ -148,6 +148,6 @@ class AnnouncementDescriptor:
         self.serverid = key_s or tubid_s
         furl = ann_d.get("anonymous-storage-FURL")
         if furl:
-            self.advertised_addresses = rrefutil.hosts_for_furl(furl)
+            self.connection_hints = rrefutil.connection_hints_for_furl(furl)
         else:
-            self.advertised_addresses = []
+            self.connection_hints = []
index 475b04dba6ac13b485d962210ecdc466513c9960..be7d05ddc37b638f7f1652a9a9d7485de8f79c4e 100644 (file)
@@ -877,8 +877,8 @@ class SystemTest(SystemTestMixin, unittest.TestCase):
 class FakeRemoteReference:
     def notifyOnDisconnect(self, *args, **kwargs): pass
     def getRemoteTubID(self): return "62ubehyunnyhzs7r6vdonnm2hpi52w6y"
-    def getLocationHints(self): return [("ipv4", "here.example.com", "1234"),
-                                        ("ipv4", "there.example.com", "2345")]
+    def getLocationHints(self): return ["tcp:here.example.com:1234",
+                                        "tcp:there.example.com2345"]
     def getPeer(self): return address.IPv4Address("TCP", "remote.example.com",
                                                   3456)
 
index b991267f1ad1998e1f8994bd4f31b2a23807ee6d..6481cabc9e3a82f9d8cde7df0b494a7a8c3ca2ee 100644 (file)
@@ -27,16 +27,18 @@ def trap_deadref(f):
     return trap_and_discard(f, DeadReferenceError)
 
 
-def hosts_for_furl(furl, ignore_localhost=True):
-    advertised = []
-    for hint in SturdyRef(furl).locationHints:
-        assert not isinstance(hint, str), hint
-        if hint[0] == "ipv4":
-            host = hint[1]
-            if ignore_localhost and host == "127.0.0.1":
-                continue
-            advertised.append(host)
-    return advertised
+def connection_hints_for_furl(furl):
+    hints = []
+    for h in SturdyRef(furl).locationHints:
+        # Foolscap-0.2.5 and earlier used strings in .locationHints, 0.2.6
+        # through 0.6.4 used tuples of ("ipv4",host,port), 0.6.5 through
+        # 0.8.0 used tuples of ("tcp",host,port), and >=0.9.0 uses strings
+        # again. Tolerate them all.
+        if isinstance(h, tuple):
+            hints.append(":".join([str(s) for s in h]))
+        else:
+            hints.append(h)
+    return hints
 
 def stringify_remote_address(rref):
     remote = rref.getPeer()
index 82c93764c0105d32dbdd1c089951b0dd01771bf6..f64f7e09236089d9150fb9b0ecaf2d019f693979 100644 (file)
@@ -30,7 +30,6 @@
     <th class="nickname-and-peerid">
       <div class="service-nickname">Nickname</div>
       <div class="nodeid data-chars">ServerID</div></th>
-    <th>Advertised IPs</th>
     <th>Announced</th>
     <th>Version</th>
     <th>Service Name</th>
@@ -39,8 +38,7 @@
     <td class="nickname-and-peerid">
       <div class="nickname"><n:slot name="nickname"/></div>
       <div class="nodeid data-chars"><n:slot name="serverid"/></div></td>
-    <td><n:slot name="advertised"/></td>
-    <td class="service-announced"><n:slot name="announced"/></td>
+    <td class="service-announced"><n:attr name="title"><n:slot name="connection-hints"/></n:attr><n:slot name="announced"/></td>
     <td class="service-version"><n:slot name="version"/></td>
     <td class="service-service-name"><n:slot name="service_name"/></td>
   </tr>
index 36bd66b15c5e15b10284a3dbf913b6d1d323e0c0..6287af63131351a15bcbf3ee1fd118c9b18aafd8 100644 (file)
@@ -89,7 +89,8 @@ class IntroducerRoot(rend.Page):
     def render_service_row(self, ctx, ad):
         ctx.fillSlots("serverid", ad.serverid)
         ctx.fillSlots("nickname", ad.nickname)
-        ctx.fillSlots("advertised", " ".join(ad.advertised_addresses))
+        ctx.fillSlots("connection-hints",
+                      "connection hints: " + " ".join(ad.connection_hints))
         ctx.fillSlots("connected", "?")
         when_s = time.strftime("%H:%M:%S %d-%b-%Y", time.localtime(ad.when))
         ctx.fillSlots("announced", when_s)