From 0897154584ee1ee699f9ec503baff24e5654c420 Mon Sep 17 00:00:00 2001 From: HelloZeroNet Date: Fri, 11 Mar 2016 12:39:39 +0100 Subject: [PATCH] Rev966, New Greenlet debug hook to support Gevent 1.1.0, Publish to 8 peers on external publish request, Dont try to download banned user files, Check user files even if its own site --- plugins/Sidebar/SidebarPlugin.py | 2 +- src/Config.py | 2 +- src/Debug/DebugHook.py | 36 +++++++++++++++++--------------- src/File/FileRequest.py | 2 +- src/Site/Site.py | 11 +++++----- src/Site/SiteStorage.py | 4 ++-- src/main.py | 3 +-- 7 files changed, 30 insertions(+), 30 deletions(-) diff --git a/plugins/Sidebar/SidebarPlugin.py b/plugins/Sidebar/SidebarPlugin.py index 03dba3f8..bb63e215 100644 --- a/plugins/Sidebar/SidebarPlugin.py +++ b/plugins/Sidebar/SidebarPlugin.py @@ -302,7 +302,7 @@ class UiWebsocketPlugin(object): body.append("""
  • - + {auth_address} Change
  • diff --git a/src/Config.py b/src/Config.py index c1e2f5eb..bb1c9342 100644 --- a/src/Config.py +++ b/src/Config.py @@ -8,7 +8,7 @@ class Config(object): def __init__(self, argv): self.version = "0.3.6" - self.rev = 966 + self.rev = 986 self.argv = argv self.action = None self.config_file = "zeronet.conf" diff --git a/src/Debug/DebugHook.py b/src/Debug/DebugHook.py index 68afd220..1bb8e1e4 100644 --- a/src/Debug/DebugHook.py +++ b/src/Debug/DebugHook.py @@ -2,6 +2,7 @@ import sys import logging import gevent +import gevent.hub from Config import config @@ -30,20 +31,19 @@ def handleErrorNotify(*args): sys.__excepthook__(*args) -OriginalGreenlet = gevent.Greenlet - - -class ErrorhookedGreenlet(OriginalGreenlet): - def _report_error(self, exc_info): - sys.excepthook(exc_info[0], exc_info[1], exc_info[2]) - -if config.debug: +if config.debug: # Keep last error for /Debug sys.excepthook = handleError else: sys.excepthook = handleErrorNotify -gevent.Greenlet = gevent.greenlet.Greenlet = ErrorhookedGreenlet -reload(gevent) + +# Override default error handler to allow silent killing / custom logging +gevent.hub.Hub._original_handle_error = gevent.hub.Hub.handle_error + +def handleGreenletError(self, context, type, value, tb): + sys.excepthook(type, value, tb) + +gevent.hub.Hub.handle_error = handleGreenletError if __name__ == "__main__": import time @@ -51,14 +51,16 @@ if __name__ == "__main__": monkey.patch_all(thread=False, ssl=False) import Debug - def sleeper(): - print "started" + def sleeper(num): + print "started", num time.sleep(3) - print "stopped" - thread1 = gevent.spawn(sleeper) - thread2 = gevent.spawn(sleeper) + raise Exception("Error") + print "stopped", num + thread1 = gevent.spawn(sleeper, 1) + thread2 = gevent.spawn(sleeper, 2) time.sleep(1) print "killing..." - thread1.throw(Exception("Hello")) - thread2.throw(Debug.Notify("Throw")) + thread1.kill(exception=Debug.Notify("Worker stopped")) + #thread2.throw(Debug.Notify("Throw")) print "killed" + gevent.joinall([thread1,thread2]) diff --git a/src/File/FileRequest.py b/src/File/FileRequest.py index 289bd547..19b68ae2 100644 --- a/src/File/FileRequest.py +++ b/src/File/FileRequest.py @@ -364,7 +364,7 @@ class FileRequest(object): self.response({"error": "Only local host allowed"}) site = self.sites.get(params["site"]) - num = site.publish(inner_path=params.get("inner_path", "content.json")) + num = site.publish(limit=8, inner_path=params.get("inner_path", "content.json")) self.response({"ok": "Successfuly published to %s peers" % num}) diff --git a/src/Site/Site.py b/src/Site/Site.py index 57089d10..9580bbe8 100644 --- a/src/Site/Site.py +++ b/src/Site/Site.py @@ -218,6 +218,9 @@ class Site(object): content = self.content_manager.contents.get(inner_path) if (not content or modified > content["modified"]) and inner_path not in self.bad_files: self.log.debug("New modified file from %s: %s" % (peer, inner_path)) + if inner_path != "content.json" and self.content_manager.getRules(inner_path) == False: + self.log.debug("Banned user %s: %s, skipping." % (peer, inner_path)) + continue # We dont have this file or we have older self.bad_files[inner_path] = self.bad_files.get(inner_path, 0) + 1 # Mark as bad file gevent.spawn(self.downloadContent, inner_path) # Download the content.json + the changed files @@ -273,10 +276,6 @@ class Site(object): queried = self.checkModifications() - if not queried: # Not found any client that supports listModifications - self.log.debug("Fallback to old-style update") - self.redownloadContents() - self.storage.checkFiles(quick_check=True) # Quick check and mark bad files based on file size changed, deleted = self.content_manager.loadContent("content.json") @@ -363,8 +362,8 @@ class Site(object): threads = 5 if limit == "default": if len(self.peers) > 50: - limit = 3 - threads = 3 + limit = 4 + threads = 4 else: limit = 5 diff --git a/src/Site/SiteStorage.py b/src/Site/SiteStorage.py index 8d7c6187..8e1fad75 100644 --- a/src/Site/SiteStorage.py +++ b/src/Site/SiteStorage.py @@ -287,7 +287,7 @@ class SiteStorage: if not ok: self.log.debug("[CHANGED] %s" % file_inner_path) - if add_changed: + if add_changed or content.get("cert_sign"): # If updating own site only add changed user files bad_files.append(file_inner_path) # Optional files @@ -338,7 +338,7 @@ class SiteStorage: if bad_files: for bad_file in bad_files: self.site.bad_files[bad_file] = 1 - self.log.debug("Checked files in %.2fs... Quick:%s" % (time.time() - s, quick_check)) + self.log.debug("Checked files in %.2fs... Found bad files: %s, Quick:%s" % (time.time() - s, len(bad_files), quick_check)) # Delete site's all file def deleteFiles(self): diff --git a/src/main.py b/src/main.py index fdfbe3b3..24e8eb7c 100644 --- a/src/main.py +++ b/src/main.py @@ -6,6 +6,7 @@ import logging # Third party modules import gevent + from gevent import monkey if "patch_subprocess" in dir(monkey): # New gevent monkey.patch_all(thread=False, subprocess=False) @@ -66,7 +67,6 @@ else: logging.getLogger('').addHandler(console_log) # Add console logger logging.getLogger('').name = "-" # Remove root prefix - # Debug dependent configuration from Debug import DebugHook if config.debug: @@ -101,7 +101,6 @@ elif config.tor == "always": config.fileserver_ip = '127.0.0.1' # Do not accept connections anywhere but localhost SocksProxy.monkeyPatch(*config.tor_proxy.split(":")) config.disable_udp = True - # -- Actions --