+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
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())
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)
def stopService(self):
if self.queen_pburl:
self.connector.stopConnecting()
+ service.MultiService.stopService(self)
def _got_queen(self, queen):
log.msg("connected to queen")
--- /dev/null
+
+# 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