Store opened port status per IP version

This commit is contained in:
shortcutme 2019-01-23 02:11:31 +01:00
parent ce78e330d3
commit 447f5fd5c8
No known key found for this signature in database
GPG key ID: 5B63BAE6CB9613AE
7 changed files with 65 additions and 36 deletions

View file

@ -42,8 +42,11 @@ class FileServer(ConnectionServer):
ConnectionServer.__init__(self, ip, port, self.handleRequest)
self.port_opened = {}
if config.ip_external: # Ip external defined in arguments
self.port_opened = True
self.port_opened[helper.getIpType(config.ip_external)] = True
SiteManager.peer_blacklist.append((config.ip_external, self.port)) # Add myself to peer blacklist
else:
self.port_opened = None # Check it later
@ -108,23 +111,47 @@ class FileServer(ConnectionServer):
self.port_opened = True
def portCheck(self):
res = self.portchecker.portCheck(self.port, helper.getIpType(self.ip))
if not res["opened"]:
if self.portchecker.portOpen(self.port):
res = self.portchecker.portCheck(self.port, helper.getIpType(self.ip))
self.port_opened = {}
if self.ui_server:
self.ui_server.updateWebsocket()
if res["ip"]:
config.ip_external = res["ip"]
SiteManager.peer_blacklist.append((config.ip_external, self.port)) # Add myself to peer blacklist
if "ipv6" in self.supported_ip_types:
res_ipv6_thread = gevent.spawn(self.portchecker.portCheck, self.port, "ipv6")
else:
res_ipv6_thread = None
res_ipv4 = self.portchecker.portCheck(self.port, "ipv4")
if not res_ipv4["opened"]:
if self.portchecker.portOpen(self.port):
res_ipv4 = self.portchecker.portCheck(self.port, "ipv4")
if res_ipv6_thread == None:
res_ipv6 = {"ip": None, "opened": None}
else:
res_ipv6 = res_ipv6_thread.get()
if res_ipv6["opened"] and not helper.getIpType(res_ipv6["ip"]) == "ipv6":
self.log.info("Invalid IPv6 address from port check: %s" % res_ipv6["ip"])
res_ipv6["opened"] = False
if res_ipv4["ip"]:
config.ip_external = res_ipv4["ip"]
SiteManager.peer_blacklist.append((res_ipv4["ip"], self.port))
else:
config.ip_external = False
if res["opened"]:
self.log.info("Server port on %s:%s: Open" % (self.ip, self.port))
return True
else:
self.log.info("Server port on %s:%s: Closed" % (self.ip, self.port))
return False
if res_ipv6["ip"]:
SiteManager.peer_blacklist.append((res_ipv6["ip"], self.port))
self.log.info("Server port opened ipv4: %s, ipv6: %s" % (res_ipv4["opened"], res_ipv6["opened"]))
res = {"ipv4": res_ipv4["opened"], "ipv6": res_ipv6["opened"]}
self.port_opened.update(res)
if self.ui_server:
self.ui_server.updateWebsocket()
return res
# Check site file integrity
def checkSite(self, site, check_files=False):
@ -140,18 +167,15 @@ class FileServer(ConnectionServer):
self.log.debug("Checking sites...")
s = time.time()
sites_checking = False
if self.port_opened is None or force_port_check: # Test and open port if not tested yet
if not self.port_opened or force_port_check: # Test and open port if not tested yet
if len(self.sites) <= 2: # Don't wait port opening on first startup
sites_checking = True
for address, site in self.sites.items():
gevent.spawn(self.checkSite, site, check_files)
if force_port_check:
self.port_opened = None
self.portCheck()
self.port_opened = self.portCheck()
if self.port_opened is False:
if not self.port_opened["ipv4"]:
self.tor_manager.startOnions()
if not sites_checking: