From 7d2581208774edc10c5b459b63f7123f36b283d8 Mon Sep 17 00:00:00 2001 From: HelloZeroNet Date: Tue, 19 Jan 2016 20:42:00 +0100 Subject: [PATCH] Rev859, Don't display port closed warning in Tor always mode, Reload trackers files every minute, Log users.json save time, Use Udp connect to avoid Gevent lockdown bug, Site needfile startup command, Log uPnP punch targets --- src/Config.py | 7 ++++++- src/File/FileServer.py | 17 +++++++++++------ src/Test/testdata/bootstrapper.db | Bin 0 -> 13312 bytes src/User/User.py | 4 +++- src/lib/subtl/subtl.py | 3 ++- src/main.py | 12 ++++++++++++ src/util/UpnpPunch.py | 1 + 7 files changed, 35 insertions(+), 9 deletions(-) create mode 100644 src/Test/testdata/bootstrapper.db diff --git a/src/Config.py b/src/Config.py index b48b24cf..73b52de9 100644 --- a/src/Config.py +++ b/src/Config.py @@ -8,7 +8,7 @@ class Config(object): def __init__(self, argv): self.version = "0.3.5" - self.rev = 843 + self.rev = 859 self.argv = argv self.action = None self.createParser() @@ -53,6 +53,11 @@ class Config(object): # SiteCreate action = self.subparsers.add_parser("siteCreate", help='Create a new site') + # SiteNeedFile + action = self.subparsers.add_parser("siteNeedFile", help='Get a file from site') + action.add_argument('address', help='Site address') + action.add_argument('inner_path', help='File inner path') + # SiteSign action = self.subparsers.add_parser("siteSign", help='Update and sign content.json: address [privatekey]') action.add_argument('address', help='Site to sign') diff --git a/src/File/FileServer.py b/src/File/FileServer.py index a232930d..66cf9985 100644 --- a/src/File/FileServer.py +++ b/src/File/FileServer.py @@ -91,7 +91,8 @@ class FileServer(ConnectionServer): data = "" if "closed" in message or "Error" in message: - self.log.info("[BAD :(] Port closed: %s" % message) + if config.tor != "always": + self.log.info("[BAD :(] Port closed: %s" % message) if port == self.port: self.port_opened = False # Self port, update port_opened status match = re.match(".*targetIP.*?value=\"(.*?)\"", data, re.DOTALL) # Try find my external ip in message @@ -123,7 +124,8 @@ class FileServer(ConnectionServer): message = "Error: %s" % Debug.formatException(err) if "Error" in message: - self.log.info("[BAD :(] Port closed: %s" % message) + if config.tor != "always": + self.log.info("[BAD :(] Port closed: %s" % message) if port == self.port: self.port_opened = False # Self port, update port_opened status match = re.match(".*?([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)", message) # Try find my external ip in message @@ -178,13 +180,18 @@ class FileServer(ConnectionServer): time.sleep(2) # Prevent too quick request site = None + def trackersFileReloader(self): + while 1: + config.loadTrackersFile() + time.sleep(60) + # Announce sites every 20 min def announceSites(self): import gc + if config.trackers_file: + gevent.spawn(self.trackersFileReloader) while 1: # Sites health care every 20 min - if config.trackers_file: - config.loadTrackersFile() for address, site in self.sites.items(): if not site.settings["serving"]: continue @@ -209,8 +216,6 @@ class FileServer(ConnectionServer): # Find new peers for tracker_i in range(len(config.trackers)): time.sleep(60 * 20 / len(config.trackers)) # Query all trackers one-by-one in 20 minutes evenly distributed - if config.trackers_file: - config.loadTrackersFile() for address, site in self.sites.items(): if not site.settings["serving"]: continue diff --git a/src/Test/testdata/bootstrapper.db b/src/Test/testdata/bootstrapper.db new file mode 100644 index 0000000000000000000000000000000000000000..0513f1e54d230724a53f66bd8618b947eefe680c GIT binary patch literal 13312 zcmeHN&2G~`5MKYpX;XUO5aqySFHsV;mr^8XLfeyo7t?T`C5mDH*)dYU~t+S;a#L6 zNkY#tMhI=vM=Tq(AqgF;fON3lwi`8* zYONE~#%;59*e2L)*w}0v#`a>BR8>?Wl@{427BMTN#W#hEd~MGu;f9H;#2|Ff6}?r_ zt7Kj&Gm`BuDhre{5nK!fOR;U0o~E?iL0&?h@3`l~vlHsTZf`sac)J?|VMlCfO-0LX zZAl%DcsOzBo{e4qjXTp+W4O-@7X99-yG>`7E*?thTsA9xPW|;FTTzb9W|9jT4x%}?<9PXu{vlOuaxDDb_&pNcIOa(c`Yj^j>T zTcv?(*Xo4E!@k}&Y+S6gEgCd-m-V)6z1}R%uQXBO`@xuc#ld$`5)Y4ptmXEyH--lf z3wj*aRes1-b~K>?0)Rl$5Xdlt;ru7f?O-n;z!8A^9|8doNG<|!{*&u_upAJ8?|+B^ zKp?pY!2O?G--G3V0Nno&1Asts5n%VfiY^hllwZn2`G@jFxk3e0n90o-)^5rv@-+2h z_M5q%gz){WA`%6n^f9EJr@8Cp($32NXCVNWWN9u5-2ch_?+42P0e1gu(oZCx%iol* z%9UKA4Ja#sKs}@79_1yEvjRgRp~wc@3^{r=vr3L|D8Sf@qR^CrSYH>^aS_iEB_G7p zg#z>H!hz*Ej33@>oN;*ZiZc$`zS)zGF%DVJ0>)uvq(BRdvkm`^8_HLia01Ilqs(i! u5=sS*;1bln^sS%aJ8V~Lcm7_7`+o(FI+y?mEQtV||0RKgX@I~AAn*ql2&ruV literal 0 HcmV?d00001 diff --git a/src/User/User.py b/src/User/User.py index d1d81c17..fe9f7848 100644 --- a/src/User/User.py +++ b/src/User/User.py @@ -27,6 +27,7 @@ class User(object): # Save to data/users.json def save(self): + s = time.time() users = json.load(open("%s/users.json" % config.data_dir)) if self.master_address not in users: users[self.master_address] = {} # Create if not exist @@ -36,7 +37,7 @@ class User(object): user_data["sites"] = self.sites user_data["certs"] = self.certs helper.atomicWrite("%s/users.json" % config.data_dir, json.dumps(users, indent=2, sort_keys=True)) - self.log.debug("Saved") + self.log.debug("Saved in %.3fs" % (time.time()-s)) def getAddressAuthIndex(self, address): return int(address.encode("hex"), 16) @@ -120,6 +121,7 @@ class User(object): self.save() return True + # Set active cert for a site def setCert(self, address, domain): site_data = self.getSiteData(address) if domain: diff --git a/src/lib/subtl/subtl.py b/src/lib/subtl/subtl.py index e98ac69e..bf6acad1 100644 --- a/src/lib/subtl/subtl.py +++ b/src/lib/subtl/subtl.py @@ -123,7 +123,8 @@ class UdpTrackerClient: 'payload': payload, 'completed': False, } - self.sock.sendto(header + payload, (self.host, self.port)) + self.sock.connect((self.host, self.port)) + self.sock.send(header + payload) return trans def _request_header(self, action): diff --git a/src/main.py b/src/main.py index 2a24b1cc..54c9b7a4 100644 --- a/src/main.py +++ b/src/main.py @@ -237,6 +237,18 @@ class Actions(object): def siteNeedFile(self, address, inner_path): from Site import Site + def checker(): + while 1: + s = time.time() + time.sleep(1) + print time.time()-s + gevent.spawn(checker) + + logging.info("Opening a simple connection server") + global file_server + from Connection import ConnectionServer + file_server = ConnectionServer("127.0.0.1", 1234) + site = Site(address) site.announce() print site.needFile(inner_path, update=True) diff --git a/src/util/UpnpPunch.py b/src/util/UpnpPunch.py index 01df380f..01471ee7 100644 --- a/src/util/UpnpPunch.py +++ b/src/util/UpnpPunch.py @@ -171,6 +171,7 @@ def _send_soap_request(location, upnp_schema, control_url, soap_message): ), 'Content-Type': 'text/xml' } + logging.debug("Sending UPnP request to {0}:{1}...".format(location.hostname, location.port)) conn = httplib.HTTPConnection(location.hostname, location.port) conn.request('POST', control_url, soap_message, headers)