Mercurial > libervia-backend
diff sat/plugins/plugin_misc_ip.py @ 3132:b64dd7c1496d
plugin ip: fixed IP detection with external website
author | Goffi <goffi@goffi.org> |
---|---|
date | Mon, 27 Jan 2020 19:53:31 +0100 |
parents | ab2696e34d29 |
children | 9d0df638c8b4 |
line wrap: on
line diff
--- a/sat/plugins/plugin_misc_ip.py Mon Jan 27 19:53:31 2020 +0100 +++ b/sat/plugins/plugin_misc_ip.py Mon Jan 27 19:53:31 2020 +0100 @@ -164,8 +164,8 @@ def _insertFirst(self, addresses, ip_addr): """Insert ip_addr as first item in addresses + @param addresses(list): list of IP addresses @param ip_addr(str): IP addresse - @param addresses(list): list of IP addresses """ if ip_addr in addresses: if addresses[0] != ip_addr: @@ -174,11 +174,11 @@ else: addresses.insert(0, ip_addr) - def _getIPFromExternal(self, ext_url): + async def _getIPFromExternal(self, ext_url): """Get local IP by doing a connection on an external url @param ext_utl(str): url to connect to - @return (D(str)): return local IP + @return (str, None): return local IP, or None if it's not possible """ url = urllib.parse.urlparse(ext_url) port = url.port @@ -189,20 +189,16 @@ port = 443 else: log.error("Unknown url scheme: {}".format(url.scheme)) - defer.returnValue(None) + return None if url.hostname is None: log.error("Can't find url hostname for {}".format(GET_IP_PAGE)) point = endpoints.TCP4ClientEndpoint(reactor, url.hostname, port) - def gotConnection(p): - local_ip = p.transport.getHost().host - p.transport.loseConnection() - return local_ip - - d = endpoints.connectProtocol(point, protocol.Protocol()) - d.addCallback(gotConnection) - return d + p = await endpoints.connectProtocol(point, protocol.Protocol()) + local_ip = p.transport.getHost().host + p.transport.loseConnection() + return local_ip @defer.inlineCallbacks def getLocalIPs(self, client): @@ -255,12 +251,14 @@ defer.returnValue(addresses or localhost) try: - ip_tuple = yield self._getIPFromExternal(GET_IP_PAGE) + local_ip = yield defer.ensureDeferred(self._getIPFromExternal(GET_IP_PAGE)) except (internet_error.DNSLookupError, internet_error.TimeoutError): log.warning("Can't access Domain Name System") - defer.returnValue(addresses or localhost) - self._insertFirst(addresses, ip_tuple.local) - defer.returnValue(addresses) + else: + if local_ip is not None: + self._insertFirst(addresses, local_ip) + + defer.returnValue(addresses or localhost) @defer.inlineCallbacks def getExternalIP(self, client):