fix external ip setup

fixes https://github.com/lbryio/lbry/issues/1561
This commit is contained in:
Jack Robison 2018-10-29 13:41:14 -04:00
parent b6f9b60683
commit 2e921437d8
No known key found for this signature in database
GPG key ID: DF25C68FE0239BB2

View file

@ -424,12 +424,18 @@ class DHTComponent(Component):
node_id = CS.get_node_id() node_id = CS.get_node_id()
if node_id is None: if node_id is None:
node_id = generate_id() node_id = generate_id()
external_ip = self.upnp_component.external_ip
if not external_ip:
log.warning("UPnP component failed to get external ip")
external_ip = CS.get_external_ip()
if not external_ip:
log.warning("failed to get external ip")
self.dht_node = node.Node( self.dht_node = node.Node(
node_id=node_id, node_id=node_id,
udpPort=GCS('dht_node_port'), udpPort=GCS('dht_node_port'),
externalUDPPort=self.external_udp_port, externalUDPPort=self.external_udp_port,
externalIP=self.upnp_component.external_ip, externalIP=external_ip,
peerPort=self.external_peer_port peerPort=self.external_peer_port
) )
@ -710,33 +716,39 @@ class UPnPComponent(Component):
log.info("found upnp gateway: %s", self.upnp.gateway.manufacturer_string) log.info("found upnp gateway: %s", self.upnp.gateway.manufacturer_string)
except Exception as err: except Exception as err:
log.warning("upnp discovery failed: %s", err) log.warning("upnp discovery failed: %s", err)
return self.upnp = None
# update the external ip # update the external ip
try: external_ip = None
external_ip = yield from_future(self.upnp.get_external_ip()) if self.upnp:
if external_ip == "0.0.0.0":
log.warning("upnp doesn't know the external ip address (returned 0.0.0.0), using fallback")
external_ip = CS.get_external_ip()
if self.external_ip and self.external_ip != external_ip:
log.info("external ip changed from %s to %s", self.external_ip, external_ip)
elif not self.external_ip:
log.info("got external ip: %s", external_ip)
self.external_ip = external_ip
except (asyncio.TimeoutError, UPnPError):
pass
if not self.upnp_redirects: # setup missing redirects
try: try:
external_ip = yield from_future(self.upnp.get_external_ip())
if external_ip != "0.0.0.0":
log.info("got external ip from UPnP: %s", external_ip)
except (asyncio.TimeoutError, UPnPError):
pass
if external_ip == "0.0.0.0" or not external_ip:
log.warning("unable to get external ip from UPnP, checking lbry.io fallback")
external_ip = CS.get_external_ip()
if self.external_ip and self.external_ip != external_ip:
log.info("external ip changed from %s to %s", self.external_ip, external_ip)
self.external_ip = external_ip
assert self.external_ip is not None # TODO: handle going/starting offline
if not self.upnp_redirects and self.upnp: # setup missing redirects
try:
log.info("add UPnP port mappings")
upnp_redirects = yield DeferredDict({ upnp_redirects = yield DeferredDict({
"UDP": from_future(self.upnp.get_next_mapping(self._int_dht_node_port, "UDP", "LBRY DHT port")), "UDP": from_future(self.upnp.get_next_mapping(self._int_dht_node_port, "UDP", "LBRY DHT port")),
"TCP": from_future(self.upnp.get_next_mapping(self._int_peer_port, "TCP", "LBRY peer port")) "TCP": from_future(self.upnp.get_next_mapping(self._int_peer_port, "TCP", "LBRY peer port"))
}) })
log.info("set up redirects: %s", upnp_redirects)
self.upnp_redirects.update(upnp_redirects) self.upnp_redirects.update(upnp_redirects)
except (asyncio.TimeoutError, UPnPError): except (asyncio.TimeoutError, UPnPError):
self.upnp = None self.upnp = None
return self._maintain_redirects() return self._maintain_redirects()
else: # check existing redirects are still active elif self.upnp: # check existing redirects are still active
found = set() found = set()
mappings = yield from_future(self.upnp.get_redirects()) mappings = yield from_future(self.upnp.get_redirects())
for mapping in mappings: for mapping in mappings:
@ -767,6 +779,7 @@ class UPnPComponent(Component):
@defer.inlineCallbacks @defer.inlineCallbacks
def start(self): def start(self):
log.info("detecting external ip")
if not self.use_upnp: if not self.use_upnp:
self.external_ip = CS.get_external_ip() self.external_ip = CS.get_external_ip()
return return