]> git.rkrishnan.org Git - tahoe-lafs/tahoe-lafs.git/commitdiff
start on client what-is-my-ipaddress functionality
authorBrian Warner <warner@lothar.com>
Thu, 30 Nov 2006 23:23:39 +0000 (16:23 -0700)
committerBrian Warner <warner@lothar.com>
Thu, 30 Nov 2006 23:23:39 +0000 (16:23 -0700)
allmydata/client.py
allmydata/util/__init__.py [new file with mode: 0644]
allmydata/util/iputil.py [new file with mode: 0644]
client.tac

index d410dd9f1adef0e78d03fe7ea1ae9905778c4838..3a3b38828006819899f7b18063e5bec37bd5a776 100644 (file)
@@ -1,8 +1,13 @@
 
+import os.path
 from foolscap import Tub, Referenceable
 from twisted.application import service
 from twisted.python import log
-import os.path
+from allmydata.util.iputil import get_local_ip_for
+
+from twisted.internet import reactor
+from twisted.internet.base import BlockingResolver
+reactor.installResolver(BlockingResolver())
 
 class Storage(service.MultiService, Referenceable):
     pass
@@ -10,8 +15,9 @@ class Storage(service.MultiService, Referenceable):
 class Client(service.MultiService):
     CERTFILE = "client.pem"
 
-    def __init__(self, queen_pburl):
+    def __init__(self, queen_host, queen_pburl):
         service.MultiService.__init__(self)
+        self.queen_host = queen_host
         self.queen_pburl = queen_pburl
         if os.path.exists(self.CERTFILE):
             self.tub = Tub(certData=open(self.CERTFILE, "rb").read())
@@ -20,14 +26,23 @@ class Client(service.MultiService):
             f = open(self.CERTFILE, "wb")
             f.write(self.tub.getCertData())
             f.close()
+        self.tub.setServiceParent(self)
         self.queen = None # self.queen is either None or a RemoteReference
         self.urls = {}
+
+    def _setup_services(self, local_ip):
+        portnum = 0
+        l = self.tub.listenOn("tcp:%d" % portnum)
+        self.tub.setLocation("%s:%d" % (local_ip, l.getPortnum()))
         s = Storage()
         s.setServiceParent(self)
-        #self.urls["storage"] = self.tub.registerReference(s, "storage")
+        self.urls["storage"] = self.tub.registerReference(s, "storage")
 
     def startService(self):
+        # note: this class can only be started and stopped once.
         service.MultiService.startService(self)
+        d = get_local_ip_for(self.queen_host)
+        d.addCallback(self._setup_services)
         if self.queen_pburl:
             self.connector = self.tub.connectTo(self.queen_pburl,
                                                 self._got_queen)
@@ -37,6 +52,7 @@ class Client(service.MultiService):
     def stopService(self):
         if self.queen_pburl:
             self.connector.stopConnecting()
+        service.MultiService.stopService(self)
 
     def _got_queen(self, queen):
         log.msg("connected to queen")
diff --git a/allmydata/util/__init__.py b/allmydata/util/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/allmydata/util/iputil.py b/allmydata/util/iputil.py
new file mode 100644 (file)
index 0000000..a8daa01
--- /dev/null
@@ -0,0 +1,48 @@
+
+# adapted from nattraverso.ipdiscover
+
+from twisted.internet import reactor
+from twisted.internet.protocol import DatagramProtocol
+#from twisted.internet.error import CannotListenError
+#from twisted.internet.interfaces import IReactorMulticast
+#from amdlib.util.nattraverso.utils import is_rfc1918_ip, is_bogus_ip
+
+def get_local_ip_for(target):
+    """Find out what our IP address is for use by a given target.
+
+    Returns a Deferred which will be fired with a string that holds the IP
+    address which could be used by 'target' to connect to us. It might work
+    for them, it might not.
+
+    The reactor must be running before you can call this, because we must
+    perform a DNS lookup on the target.
+
+    """
+    d = reactor.resolve(target)
+    def _resolved(target_ipaddr):
+        udpprot = DatagramProtocol()
+        port = reactor.listenUDP(0, udpprot)
+        udpprot.transport.connect(target_ipaddr, 7)
+        localip = udpprot.transport.getHost().host
+        port.stopListening()
+        return localip
+    d.addCallback(_resolved)
+    return d
+
+
+
+def BROKEN_get_local_ip_for(target_ipaddr):
+    """Find out what our IP address is for use by a given target.
+
+    Returns a Deferred which will be fired with a string that holds the IP
+    address which could be used by 'target' to connect to us. It might work
+    for them, it might not. 'target' must be an IP address.
+
+    """
+    udpprot = DatagramProtocol()
+    port = reactor.listenUDP(0, udpprot)
+    udpprot.transport.connect(target_ipaddr, 7)
+    localip = udpprot.transport.getHost().host
+    port.stopListening()
+
+    return localip
index eda14e6685e72d66e1108e3de284d1cc9c4b6f00..035156d8b3246c1900a20e1be2aa688c0df55586 100644 (file)
@@ -3,8 +3,9 @@
 from allmydata import client
 from twisted.application import service
 
+queen_host = "yumyum"
 queen_pburl = ""
-c = client.Client(queen_pburl)
+c = client.Client(queen_host, queen_pburl)
 
 application = service.Application("allmydata_client")
 c.setServiceParent(application)