From 60bfac63dad4ee689da18b0a1f444a00df69f6c2 Mon Sep 17 00:00:00 2001 From: HelloZeroNet Date: Fri, 17 Apr 2015 23:12:22 +0200 Subject: [PATCH] rev100, Revision numbering for sub-versions, Assign connection to peer on filerequest/pex, Pex count bugfix, Disable unnecessary topright button click animation, Topright burger utf8 character change to more supported one --- plugins/Stats/StatsPlugin.py | 2 +- src/Config.py | 315 ++++++++++++++++++----------------- src/Connection/Connection.py | 3 +- src/File/FileRequest.py | 12 +- src/Peer/Peer.py | 21 ++- src/Site/Site.py | 20 +-- src/Ui/UiWebsocket.py | 1 + src/Ui/media/Sidebar.coffee | 4 +- src/Ui/media/Wrapper.css | 3 +- src/Ui/media/all.css | 3 +- src/Ui/media/all.js | 17 +- src/Ui/template/wrapper.html | 2 +- src/Worker/WorkerManager.py | 2 +- src/main.py | 2 +- 14 files changed, 206 insertions(+), 201 deletions(-) diff --git a/plugins/Stats/StatsPlugin.py b/plugins/Stats/StatsPlugin.py index d0270e53..3f25c05e 100644 --- a/plugins/Stats/StatsPlugin.py +++ b/plugins/Stats/StatsPlugin.py @@ -90,7 +90,7 @@ class UiRequestPlugin(object): ("%.0fkB", connection.bytes_recv/1024), ("%s", connection.last_cmd), ("%s", connection.waiting_requests.keys()), - ("%s", connection.handshake.get("version")), + ("%s r%s", (connection.handshake.get("version"), connection.handshake.get("rev", "?")) ), ("%s", connection.handshake.get("peer_id")), ]) yield "" diff --git a/src/Config.py b/src/Config.py index 413e965f..126c1550 100644 --- a/src/Config.py +++ b/src/Config.py @@ -1,157 +1,158 @@ -import argparse, sys, os, time -import ConfigParser - -class Config(object): - def __init__(self): - self.version = "0.2.9" - self.parser = self.createArguments() - argv = sys.argv[:] # Copy command line arguments - argv = self.parseConfig(argv) # Add arguments from config file - self.parseCommandline(argv) # Parse argv - self.setAttributes() - - - def __str__(self): - return str(self.arguments).replace("Namespace", "Config") # Using argparse str output - - - # Create command line arguments - def createArguments(self): - # Platform specific - if sys.platform.startswith("win"): - coffeescript = "type %s | tools\\coffee\\coffee.cmd" - else: - coffeescript = None - - # Create parser - parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) - subparsers = parser.add_subparsers(title="Action to perform", dest="action") - - # Main - action = subparsers.add_parser("main", help='Start UiServer and FileServer (default)') - - # SiteCreate - action = subparsers.add_parser("siteCreate", help='Create a new site') - - # SiteSign - action = subparsers.add_parser("siteSign", help='Update and sign content.json: address [privatekey]') - action.add_argument('address', help='Site to sign') - action.add_argument('privatekey', help='Private key (default: ask on execute)', nargs='?') - action.add_argument('--inner_path', help='File you want to sign (default: content.json)', default="content.json", metavar="inner_path") - - # SitePublish - action = subparsers.add_parser("sitePublish", help='Publish site to other peers: address') - action.add_argument('address', help='Site to publish') - action.add_argument('peer_ip', help='Peer ip to publish (default: random peers ip from tracker)', default=None, nargs='?') - action.add_argument('peer_port', help='Peer port to publish (default: random peer port from tracker)', default=15441, nargs='?') - action.add_argument('--inner_path', help='Content.json you want to publish (default: content.json)', default="content.json", metavar="inner_path") - - # SiteVerify - action = subparsers.add_parser("siteVerify", help='Verify site files using sha512: address') - action.add_argument('address', help='Site to verify') - - #dbRebuild - action = subparsers.add_parser("dbRebuild", help='Rebuild site database cache') - action.add_argument('address', help='Site to rebuild') - - #dbQuery - action = subparsers.add_parser("dbQuery", help='Query site sql cache') - action.add_argument('address', help='Site to query') - action.add_argument('query', help='Sql query') - - # PeerPing - action = subparsers.add_parser("peerPing", help='Send Ping command to peer') - action.add_argument('peer_ip', help='Peer ip') - action.add_argument('peer_port', help='Peer port') - - # PeerGetFile - action = subparsers.add_parser("peerGetFile", help='Request and print a file content from peer') - action.add_argument('peer_ip', help='Peer ip') - action.add_argument('peer_port', help='Peer port') - action.add_argument('site', help='Site address') - action.add_argument('filename', help='File name to request') - - - - # Config parameters - parser.add_argument('--debug', help='Debug mode', action='store_true') - parser.add_argument('--debug_socket', help='Debug socket connections', action='store_true') - - parser.add_argument('--ui_ip', help='Web interface bind address', default="127.0.0.1", metavar='ip') - parser.add_argument('--ui_port', help='Web interface bind port', default=43110, type=int, metavar='port') - parser.add_argument('--ui_restrict', help='Restrict web access', default=False, metavar='ip') - parser.add_argument('--open_browser', help='Open homepage in web browser automatically', nargs='?', const="default_browser", metavar='browser_name') - parser.add_argument('--homepage', help='Web interface Homepage', default='1EU1tbG9oC1A8jz2ouVwGZyQ5asrNsE4Vr', metavar='address') - parser.add_argument('--size_limit', help='Default site size limit in MB', default=10, metavar='size_limit') - - parser.add_argument('--fileserver_ip', help='FileServer bind address', default="*", metavar='ip') - parser.add_argument('--fileserver_port',help='FileServer bind port', default=15441, type=int, metavar='port') - parser.add_argument('--disable_zeromq', help='Disable compatibility with old clients', action='store_true') - parser.add_argument('--proxy', help='Socks proxy address', metavar='ip:port') - parser.add_argument('--disable_udp', help='Disable UDP connections', action='store_true') - parser.add_argument('--ip_external', help='External ip (tested on start if None)', metavar='ip') - - parser.add_argument('--coffeescript_compiler', help='Coffeescript compiler for developing', default=coffeescript, metavar='executable_path') - - parser.add_argument('--version', action='version', version='ZeroNet %s' % self.version) - - return parser - - - # Find arguments specificed for current action - def getActionArguments(self): - back = {} - arguments = self.parser._subparsers._group_actions[0].choices[self.action]._actions[1:] # First is --version - for argument in arguments: - back[argument.dest] = getattr(self, argument.dest) - return back - - - - # Try to find action from sys.argv - def getAction(self, argv): - actions = [action.choices.keys() for action in self.parser._actions if action.dest == "action"][0] # Valid actions - found_action = False - for action in actions: # See if any in sys.argv - if action in argv: - found_action = action - break - return found_action - - - # Parse command line arguments - def parseCommandline(self, argv): - # Find out if action is specificed on start - action = self.getAction(argv) - if len(argv) == 1 or not action: # If no action specificed set the main action - argv.append("main") - if "zeronet.py" in argv[0]: - self.arguments = self.parser.parse_args(argv[1:]) - else: # Silent errors if not started with zeronet.py - self.arguments = self.parser.parse_args(argv[1:]) - - - # Parse config file - def parseConfig(self, argv): - if os.path.isfile("zeronet.conf"): - config = ConfigParser.ConfigParser(allow_no_value=True) - config.read('zeronet.conf') - for section in config.sections(): - for key, val in config.items(section): - if section != "global": # If not global prefix key with section - key = section+"_"+key - if val: argv.insert(1, val) - argv.insert(1, "--%s" % key) - return argv - - - - # Expose arguments as class attributes - def setAttributes(self): - # Set attributes from arguments - args = vars(self.arguments) - for key, val in args.items(): - setattr(self, key, val) - - -config = Config() +import argparse, sys, os, time +import ConfigParser + +class Config(object): + def __init__(self): + self.version = "0.2.9" + self.rev = 100 + self.parser = self.createArguments() + argv = sys.argv[:] # Copy command line arguments + argv = self.parseConfig(argv) # Add arguments from config file + self.parseCommandline(argv) # Parse argv + self.setAttributes() + + + def __str__(self): + return str(self.arguments).replace("Namespace", "Config") # Using argparse str output + + + # Create command line arguments + def createArguments(self): + # Platform specific + if sys.platform.startswith("win"): + coffeescript = "type %s | tools\\coffee\\coffee.cmd" + else: + coffeescript = None + + # Create parser + parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) + subparsers = parser.add_subparsers(title="Action to perform", dest="action") + + # Main + action = subparsers.add_parser("main", help='Start UiServer and FileServer (default)') + + # SiteCreate + action = subparsers.add_parser("siteCreate", help='Create a new site') + + # SiteSign + action = subparsers.add_parser("siteSign", help='Update and sign content.json: address [privatekey]') + action.add_argument('address', help='Site to sign') + action.add_argument('privatekey', help='Private key (default: ask on execute)', nargs='?') + action.add_argument('--inner_path', help='File you want to sign (default: content.json)', default="content.json", metavar="inner_path") + + # SitePublish + action = subparsers.add_parser("sitePublish", help='Publish site to other peers: address') + action.add_argument('address', help='Site to publish') + action.add_argument('peer_ip', help='Peer ip to publish (default: random peers ip from tracker)', default=None, nargs='?') + action.add_argument('peer_port', help='Peer port to publish (default: random peer port from tracker)', default=15441, nargs='?') + action.add_argument('--inner_path', help='Content.json you want to publish (default: content.json)', default="content.json", metavar="inner_path") + + # SiteVerify + action = subparsers.add_parser("siteVerify", help='Verify site files using sha512: address') + action.add_argument('address', help='Site to verify') + + #dbRebuild + action = subparsers.add_parser("dbRebuild", help='Rebuild site database cache') + action.add_argument('address', help='Site to rebuild') + + #dbQuery + action = subparsers.add_parser("dbQuery", help='Query site sql cache') + action.add_argument('address', help='Site to query') + action.add_argument('query', help='Sql query') + + # PeerPing + action = subparsers.add_parser("peerPing", help='Send Ping command to peer') + action.add_argument('peer_ip', help='Peer ip') + action.add_argument('peer_port', help='Peer port') + + # PeerGetFile + action = subparsers.add_parser("peerGetFile", help='Request and print a file content from peer') + action.add_argument('peer_ip', help='Peer ip') + action.add_argument('peer_port', help='Peer port') + action.add_argument('site', help='Site address') + action.add_argument('filename', help='File name to request') + + + + # Config parameters + parser.add_argument('--debug', help='Debug mode', action='store_true') + parser.add_argument('--debug_socket', help='Debug socket connections', action='store_true') + + parser.add_argument('--ui_ip', help='Web interface bind address', default="127.0.0.1", metavar='ip') + parser.add_argument('--ui_port', help='Web interface bind port', default=43110, type=int, metavar='port') + parser.add_argument('--ui_restrict', help='Restrict web access', default=False, metavar='ip') + parser.add_argument('--open_browser', help='Open homepage in web browser automatically', nargs='?', const="default_browser", metavar='browser_name') + parser.add_argument('--homepage', help='Web interface Homepage', default='1EU1tbG9oC1A8jz2ouVwGZyQ5asrNsE4Vr', metavar='address') + parser.add_argument('--size_limit', help='Default site size limit in MB', default=10, metavar='size_limit') + + parser.add_argument('--fileserver_ip', help='FileServer bind address', default="*", metavar='ip') + parser.add_argument('--fileserver_port',help='FileServer bind port', default=15441, type=int, metavar='port') + parser.add_argument('--disable_zeromq', help='Disable compatibility with old clients', action='store_true') + parser.add_argument('--proxy', help='Socks proxy address', metavar='ip:port') + parser.add_argument('--disable_udp', help='Disable UDP connections', action='store_true') + parser.add_argument('--ip_external', help='External ip (tested on start if None)', metavar='ip') + + parser.add_argument('--coffeescript_compiler', help='Coffeescript compiler for developing', default=coffeescript, metavar='executable_path') + + parser.add_argument('--version', action='version', version='ZeroNet %s r%s' % (self.version, self.rev)) + + return parser + + + # Find arguments specificed for current action + def getActionArguments(self): + back = {} + arguments = self.parser._subparsers._group_actions[0].choices[self.action]._actions[1:] # First is --version + for argument in arguments: + back[argument.dest] = getattr(self, argument.dest) + return back + + + + # Try to find action from sys.argv + def getAction(self, argv): + actions = [action.choices.keys() for action in self.parser._actions if action.dest == "action"][0] # Valid actions + found_action = False + for action in actions: # See if any in sys.argv + if action in argv: + found_action = action + break + return found_action + + + # Parse command line arguments + def parseCommandline(self, argv): + # Find out if action is specificed on start + action = self.getAction(argv) + if len(argv) == 1 or not action: # If no action specificed set the main action + argv.append("main") + if "zeronet.py" in argv[0]: + self.arguments = self.parser.parse_args(argv[1:]) + else: # Silent errors if not started with zeronet.py + self.arguments = self.parser.parse_args(argv[1:]) + + + # Parse config file + def parseConfig(self, argv): + if os.path.isfile("zeronet.conf"): + config = ConfigParser.ConfigParser(allow_no_value=True) + config.read('zeronet.conf') + for section in config.sections(): + for key, val in config.items(section): + if section != "global": # If not global prefix key with section + key = section+"_"+key + if val: argv.insert(1, val) + argv.insert(1, "--%s" % key) + return argv + + + + # Expose arguments as class attributes + def setAttributes(self): + # Set attributes from arguments + args = vars(self.arguments) + for key, val in args.items(): + setattr(self, key, val) + + +config = Config() diff --git a/src/Connection/Connection.py b/src/Connection/Connection.py index d3851526..4decdc62 100644 --- a/src/Connection/Connection.py +++ b/src/Connection/Connection.py @@ -183,7 +183,8 @@ class Connection: "protocol": "v2", "peer_id": self.server.peer_id, "fileserver_port": config.fileserver_port, - "port_opened": self.server.port_opened + "port_opened": self.server.port_opened, + "rev": config.rev } diff --git a/src/File/FileRequest.py b/src/File/FileRequest.py index 484a4ba7..abb80871 100644 --- a/src/File/FileRequest.py +++ b/src/File/FileRequest.py @@ -110,7 +110,10 @@ class FileRequest: if config.debug_socket: self.log.debug("File %s sent" % file_path) # Add peer to site if not added before - site.addPeer(self.connection.ip, self.connection.port) + connected_peer = site.addPeer(self.connection.ip, self.connection.port) + if connected_peer: # Just added + connected_peer.connect(self.connection) # Assign current connection to peer + except Exception, err: self.log.debug("GetFile read error: %s" % Debug.formatException(err)) self.response({"error": "File read error: %s" % Debug.formatException(err)}) @@ -126,7 +129,11 @@ class FileRequest: got_peer_keys = [] added = 0 - site.addPeer(self.connection.ip, self.connection.port) # Add requester peer to site + connected_peer = site.addPeer(self.connection.ip, self.connection.port) # Add requester peer to site + if connected_peer: # Just added + added +=1 + connected_peer.connect(self.connection) # Assign current connection to peer + for peer in params["peers"]: # Add sent peers to site address = self.unpackAddress(peer) got_peer_keys.append("%s:%s" % address) @@ -134,6 +141,7 @@ class FileRequest: # Send back peers that is not in the sent list and connectable (not port 0) packed_peers = [peer.packAddress() for peer in site.getConnectablePeers(params["need"], got_peer_keys)] if added: + site.worker_manager.onPeers() self.log.debug("Added %s peers to %s using pex, sending back %s" % (added, site, len(packed_peers))) self.response({"peers": packed_peers}) diff --git a/src/Peer/Peer.py b/src/Peer/Peer.py index 49146904..4f7259b1 100644 --- a/src/Peer/Peer.py +++ b/src/Peer/Peer.py @@ -26,22 +26,25 @@ class Peer: # Connect to host - def connect(self): + def connect(self, connection = None): if not self.log: self.log = logging.getLogger("Peer:%s:%s %s" % (self.ip, self.port, self.site)) if self.connection: self.log.debug("Getting connection (Closing %s)..." % self.connection) self.connection.close() else: self.log.debug("Getting connection...") - - self.connection = None - - try: - self.connection = self.connection_server.getConnection(self.ip, self.port) - except Exception, err: - self.onConnectionError() - self.log.debug("Getting connection error: %s (connection_error: %s, hash_failed: %s)" % (Debug.formatException(err), self.connection_error, self.hash_failed)) + + if connection: # Connection specificed + self.connection = connection + else: # Try to find from connection pool or create new connection self.connection = None + + try: + self.connection = self.connection_server.getConnection(self.ip, self.port) + except Exception, err: + self.onConnectionError() + self.log.debug("Getting connection error: %s (connection_error: %s, hash_failed: %s)" % (Debug.formatException(err), self.connection_error, self.hash_failed)) + self.connection = None def __str__(self): return "Peer %-12s" % self.ip diff --git a/src/Site/Site.py b/src/Site/Site.py index a4d94a6a..a51a7ece 100644 --- a/src/Site/Site.py +++ b/src/Site/Site.py @@ -282,6 +282,7 @@ class Site: # Add or update a peer to site def addPeer(self, ip, port, return_peer = False): if not ip: return False + if (ip, port) in self.peer_blacklist: return False # Ignore blacklist (eg. myself) key = "%s:%s" % (ip, port) if key in self.peers: # Already has this ip #self.peers[key].found() @@ -300,6 +301,7 @@ class Site: def announcePex(self, query_num=2, need_num=5): peers = [peer for peer in self.peers.values() if peer.connection and peer.connection.connected] # Connected peers if len(peers) == 0: # Small number of connected peers for this site, connect to any + self.log.debug("Small number of peers detected...query all of peers using pex") peers = self.peers.values() need_num = 10 @@ -308,19 +310,20 @@ class Site: added = 0 for peer in peers: if peer.connection: # Has connection - if "port_opened" in peer.connection.handshake: # This field added recently, so probably has gas peer exchange + if "port_opened" in peer.connection.handshake: # This field added recently, so probably has has peer exchange res = peer.pex(need_num=need_num) else: res = False else: # No connection res = peer.pex(need_num=need_num) - if res != False: + if type(res) == int: # We have result done += 1 added += res - if added: + if res: self.worker_manager.onPeers() - self.updateWebsocket(peers_added=added) + self.updateWebsocket(peers_added=res) if done == query_num: break + self.log.debug("Queried pex from %s peers got %s new peers." % (done, added)) # Add myself and get other peers from tracker @@ -336,7 +339,6 @@ class Site: else: # Port not opened, report port 0 fileserver_port = 0 - fileserver_port = config.fileserver_port s = time.time() announced = 0 @@ -385,8 +387,6 @@ class Site: added = 0 for peer in peers: if not peer["port"]: continue # Dont add peers with port 0 - if (peer["addr"], peer["port"]) in self.peer_blacklist: # Ignore blacklist (eg. myself) - continue if self.addPeer(peer["addr"], peer["port"]): added += 1 if added: self.worker_manager.onPeers() @@ -399,7 +399,7 @@ class Site: self.saveSettings() if len(errors) < len(SiteManager.TRACKERS): # Less errors than total tracker nums - self.log.debug("Announced to %s trackers in %.3fs, errors: %s" % (announced, time.time()-s, errors)) + self.log.debug("Announced port %s to %s trackers in %.3fs, errors: %s" % (fileserver_port, announced, time.time()-s, errors)) else: self.log.error("Announced to %s trackers in %.3fs, failed" % (announced, time.time()-s)) @@ -412,9 +412,7 @@ class Site: # Keep connections to get the updates (required for passive clients) def needConnections(self): - need = min(len(self.peers)/2, 10) # Connect to half of total peers, but max 10 - need = max(need, 5) # But minimum 5 peers - need = min(len(self.peers), need) # Max total peers + need = min(len(self.peers), 3) # Need 3 peer, but max total peers connected = 0 for peer in self.peers.values(): # Check current connected number diff --git a/src/Ui/UiWebsocket.py b/src/Ui/UiWebsocket.py index b27b10ee..0ea13b4d 100644 --- a/src/Ui/UiWebsocket.py +++ b/src/Ui/UiWebsocket.py @@ -219,6 +219,7 @@ class UiWebsocket(object): "ui_ip": config.ui_ip, "ui_port": config.ui_port, "version": config.version, + "rev": config.rev, "debug": config.debug, "plugins": PluginManager.plugin_manager.plugin_names } diff --git a/src/Ui/media/Sidebar.coffee b/src/Ui/media/Sidebar.coffee index d57c5bb2..fceff729 100644 --- a/src/Ui/media/Sidebar.coffee +++ b/src/Ui/media/Sidebar.coffee @@ -20,13 +20,13 @@ class Sidebar ### $(".fixbutton-bg").on "mousedown", -> - $(".fixbutton-burger").stop().animate({"scale": 0.7, "left": 0}, 300, "easeOutCubic") + # $(".fixbutton-burger").stop().animate({"scale": 0.7, "left": 0}, 300, "easeOutCubic") #$("#inner-iframe").toggleClass("back") #$(".wrapper-iframe").stop().animate({"scale": 0.9}, 600, "easeOutCubic") #$("body").addClass("back") $(".fixbutton-bg").on "mouseup", -> - $(".fixbutton-burger").stop().animate({"scale": 1, "left": 0}, 600, "easeOutElastic") + # $(".fixbutton-burger").stop().animate({"scale": 1, "left": 0}, 600, "easeOutElastic") diff --git a/src/Ui/media/Wrapper.css b/src/Ui/media/Wrapper.css index 2f7a4690..c10ccf34 100644 --- a/src/Ui/media/Wrapper.css +++ b/src/Ui/media/Wrapper.css @@ -27,8 +27,9 @@ a { color: black } /*box-shadow: inset 105px 260px 0px -200px rgba(0,0,0,0.1);*/ /* box-shadow: inset -75px 183px 0px -200px rgba(0,0,0,0.1); */ } .fixbutton-text { pointer-events: none; position: absolute; z-index: 999; width: 40px; backface-visibility: hidden; perspective: 1000px } -.fixbutton-burger { pointer-events: none; position: absolute; z-index: 999; width: 40px; opacity: 0; left: -20px } +.fixbutton-burger { pointer-events: none; position: absolute; z-index: 999; width: 40px; opacity: 0; left: -20px; font-size: 48px; line-height: 32px } .fixbutton-bg:hover { background-color: #AF3BFF } +.fixbutton-bg:active { background-color: #9E2FEA; top: 1px; transition: none } /* Notification */ diff --git a/src/Ui/media/all.css b/src/Ui/media/all.css index 3d9d37cc..6a2b53a7 100644 --- a/src/Ui/media/all.css +++ b/src/Ui/media/all.css @@ -32,8 +32,9 @@ a { color: black } /*box-shadow: inset 105px 260px 0px -200px rgba(0,0,0,0.1);*/ /* -webkit-box-shadow: inset -75px 183px 0px -200px rgba(0,0,0,0.1); -moz-box-shadow: inset -75px 183px 0px -200px rgba(0,0,0,0.1); -o-box-shadow: inset -75px 183px 0px -200px rgba(0,0,0,0.1); -ms-box-shadow: inset -75px 183px 0px -200px rgba(0,0,0,0.1); box-shadow: inset -75px 183px 0px -200px rgba(0,0,0,0.1) ; */ } .fixbutton-text { pointer-events: none; position: absolute; z-index: 999; width: 40px; backface-visibility: hidden; -webkit-perspective: 1000px ; -moz-perspective: 1000px ; -o-perspective: 1000px ; -ms-perspective: 1000px ; perspective: 1000px } -.fixbutton-burger { pointer-events: none; position: absolute; z-index: 999; width: 40px; opacity: 0; left: -20px } +.fixbutton-burger { pointer-events: none; position: absolute; z-index: 999; width: 40px; opacity: 0; left: -20px; font-size: 48px; line-height: 32px } .fixbutton-bg:hover { background-color: #AF3BFF } +.fixbutton-bg:active { background-color: #9E2FEA; top: 1px; -webkit-transition: none ; -moz-transition: none ; -o-transition: none ; -ms-transition: none ; transition: none } /* Notification */ diff --git a/src/Ui/media/all.js b/src/Ui/media/all.js index 994d9861..4389934a 100644 --- a/src/Ui/media/all.js +++ b/src/Ui/media/all.js @@ -724,18 +724,8 @@ jQuery.extend( jQuery.easing, /*$(".fixbutton-bg").on "click", -> return false */ - $(".fixbutton-bg").on("mousedown", function() { - return $(".fixbutton-burger").stop().animate({ - "scale": 0.7, - "left": 0 - }, 300, "easeOutCubic"); - }); - return $(".fixbutton-bg").on("mouseup", function() { - return $(".fixbutton-burger").stop().animate({ - "scale": 1, - "left": 0 - }, 600, "easeOutElastic"); - }); + $(".fixbutton-bg").on("mousedown", function() {}); + return $(".fixbutton-bg").on("mouseup", function() {}); }; return Sidebar; @@ -747,6 +737,7 @@ jQuery.extend( jQuery.easing, }).call(this); + /* ---- src/Ui/media/Wrapper.coffee ---- */ @@ -1178,4 +1169,4 @@ jQuery.extend( jQuery.easing, window.wrapper = new Wrapper(ws_url); -}).call(this); +}).call(this); \ No newline at end of file diff --git a/src/Ui/template/wrapper.html b/src/Ui/template/wrapper.html index 9faf65a2..bc83607b 100644 --- a/src/Ui/template/wrapper.html +++ b/src/Ui/template/wrapper.html @@ -18,7 +18,7 @@
0
-
+
diff --git a/src/Worker/WorkerManager.py b/src/Worker/WorkerManager.py index 19becec1..62fc8d06 100644 --- a/src/Worker/WorkerManager.py +++ b/src/Worker/WorkerManager.py @@ -100,8 +100,8 @@ class WorkerManager: # Start workers to process tasks def startWorkers(self, peers=None): - if len(self.workers) >= MAX_WORKERS and not peers: return False # Workers number already maxed and no starting peers definied if not self.tasks: return False # No task for workers + if len(self.workers) >= MAX_WORKERS and not peers: return False # Workers number already maxed and no starting peers definied if not peers: peers = self.site.peers.values() # No peers definied, use any from site random.shuffle(peers) for peer in peers: # One worker for every peer diff --git a/src/main.py b/src/main.py index f3199aa3..5d7a2c95 100644 --- a/src/main.py +++ b/src/main.py @@ -67,7 +67,7 @@ PluginManager.plugin_manager.loadPlugins() class Actions: # Default action: Start serving UiServer and FileServer def main(self): - logging.info("Version: %s, Python %s, Gevent: %s" % (config.version, sys.version, gevent.__version__)) + logging.info("Version: %s r%s, Python %s, Gevent: %s" % (config.version, config.rev, sys.version, gevent.__version__)) global ui_server, file_server from File import FileServer from Ui import UiServer