rev280, The whole project reformatted to PEP8, UiRequest getPosted to query posted variables
This commit is contained in:
parent
a5741704e4
commit
b5ecb62bc6
49 changed files with 5704 additions and 5205 deletions
|
@ -11,7 +11,8 @@ from Debug import Debug
|
|||
from Config import config
|
||||
from util import RateLimit, StreamingMsgpack
|
||||
|
||||
FILE_BUFF = 1024*512
|
||||
FILE_BUFF = 1024 * 512
|
||||
|
||||
|
||||
# Request from me
|
||||
class FileRequest(object):
|
||||
|
@ -52,7 +53,7 @@ class FileRequest(object):
|
|||
self.actionGetFile(params)
|
||||
elif cmd == "update":
|
||||
event = "%s update %s %s" % (self.connection.id, params["site"], params["inner_path"])
|
||||
if not RateLimit.isAllowed(event): # There was already an update for this file in the last 10 second
|
||||
if not RateLimit.isAllowed(event): # There was already an update for this file in the last 10 second
|
||||
self.response({"ok": "File update queued"})
|
||||
# If called more than once within 10 sec only keep the last update
|
||||
RateLimit.callAsync(event, 10, self.actionUpdate, params)
|
||||
|
@ -69,72 +70,86 @@ class FileRequest(object):
|
|||
# Update a site file request
|
||||
def actionUpdate(self, params):
|
||||
site = self.sites.get(params["site"])
|
||||
if not site or not site.settings["serving"]: # Site unknown or not serving
|
||||
if not site or not site.settings["serving"]: # Site unknown or not serving
|
||||
self.response({"error": "Unknown site"})
|
||||
return False
|
||||
if site.settings["own"] and params["inner_path"].endswith("content.json"):
|
||||
self.log.debug("Someone trying to push a file to own site %s, reload local %s first" % (site.address, params["inner_path"]))
|
||||
self.log.debug(
|
||||
"Someone trying to push a file to own site %s, reload local %s first" %
|
||||
(site.address, params["inner_path"])
|
||||
)
|
||||
changed = site.content_manager.loadContent(params["inner_path"], add_bad_files=False)
|
||||
if changed: # Content.json changed locally
|
||||
site.settings["size"] = site.content_manager.getTotalSize() # Update site size
|
||||
if changed: # Content.json changed locally
|
||||
site.settings["size"] = site.content_manager.getTotalSize() # Update site size
|
||||
buff = StringIO(params["body"])
|
||||
valid = site.content_manager.verifyFile(params["inner_path"], buff)
|
||||
if valid == True: # Valid and changed
|
||||
if valid is True: # Valid and changed
|
||||
self.log.info("Update for %s looks valid, saving..." % params["inner_path"])
|
||||
buff.seek(0)
|
||||
site.storage.write(params["inner_path"], buff)
|
||||
|
||||
site.onFileDone(params["inner_path"]) # Trigger filedone
|
||||
site.onFileDone(params["inner_path"]) # Trigger filedone
|
||||
|
||||
if params["inner_path"].endswith("content.json"): # Download every changed file from peer
|
||||
peer = site.addPeer(self.connection.ip, self.connection.port, return_peer = True) # Add or get peer
|
||||
site.onComplete.once(lambda: site.publish(inner_path=params["inner_path"]), "publish_%s" % params["inner_path"]) # On complete publish to other peers
|
||||
if params["inner_path"].endswith("content.json"): # Download every changed file from peer
|
||||
peer = site.addPeer(self.connection.ip, self.connection.port, return_peer=True) # Add or get peer
|
||||
# On complete publish to other peers
|
||||
site.onComplete.once(lambda: site.publish(inner_path=params["inner_path"]), "publish_%s" % params["inner_path"])
|
||||
|
||||
# Load new content file and download changed files in new thread
|
||||
gevent.spawn(
|
||||
lambda: site.downloadContent(params["inner_path"], peer=peer)
|
||||
) # Load new content file and download changed files in new thread
|
||||
)
|
||||
|
||||
self.response({"ok": "Thanks, file %s updated!" % params["inner_path"]})
|
||||
|
||||
elif valid == None: # Not changed
|
||||
peer = site.addPeer(*params["peer"], return_peer = True) # Add or get peer
|
||||
elif valid is None: # Not changed
|
||||
peer = site.addPeer(*params["peer"], return_peer=True) # Add or get peer
|
||||
if peer:
|
||||
self.log.debug("Same version, adding new peer for locked files: %s, tasks: %s" % (peer.key, len(site.worker_manager.tasks)) )
|
||||
for task in site.worker_manager.tasks: # New peer add to every ongoing task
|
||||
if task["peers"]: site.needFile(task["inner_path"], peer=peer, update=True, blocking=False) # Download file from this peer too if its peer locked
|
||||
self.log.debug(
|
||||
"Same version, adding new peer for locked files: %s, tasks: %s" %
|
||||
(peer.key, len(site.worker_manager.tasks))
|
||||
)
|
||||
for task in site.worker_manager.tasks: # New peer add to every ongoing task
|
||||
if task["peers"]:
|
||||
# Download file from this peer too if its peer locked
|
||||
site.needFile(task["inner_path"], peer=peer, update=True, blocking=False)
|
||||
|
||||
self.response({"ok": "File not changed"})
|
||||
|
||||
else: # Invalid sign or sha1 hash
|
||||
else: # Invalid sign or sha1 hash
|
||||
self.log.debug("Update for %s is invalid" % params["inner_path"])
|
||||
self.response({"error": "File invalid"})
|
||||
|
||||
# Send file content request
|
||||
def actionGetFile(self, params):
|
||||
site = self.sites.get(params["site"])
|
||||
if not site or not site.settings["serving"]: # Site unknown or not serving
|
||||
if not site or not site.settings["serving"]: # Site unknown or not serving
|
||||
self.response({"error": "Unknown site"})
|
||||
return False
|
||||
try:
|
||||
file_path = site.storage.getPath(params["inner_path"])
|
||||
if config.debug_socket: self.log.debug("Opening file: %s" % file_path)
|
||||
if config.debug_socket:
|
||||
self.log.debug("Opening file: %s" % file_path)
|
||||
with StreamingMsgpack.FilePart(file_path, "rb") as file:
|
||||
file.seek(params["location"])
|
||||
file.read_bytes = FILE_BUFF
|
||||
back = {"body": file,
|
||||
"size": os.fstat(file.fileno()).st_size,
|
||||
"location": min(file.tell()+FILE_BUFF, os.fstat(file.fileno()).st_size)
|
||||
}
|
||||
back = {
|
||||
"body": file,
|
||||
"size": os.fstat(file.fileno()).st_size,
|
||||
"location": min(file.tell() + FILE_BUFF, os.fstat(file.fileno()).st_size)
|
||||
}
|
||||
if config.debug_socket:
|
||||
self.log.debug("Sending file %s from position %s to %s" % (file_path,
|
||||
params["location"],
|
||||
back["location"]))
|
||||
self.log.debug(
|
||||
"Sending file %s from position %s to %s" %
|
||||
(file_path, params["location"], back["location"])
|
||||
)
|
||||
self.response(back, streaming=True)
|
||||
if config.debug_socket:
|
||||
self.log.debug("File %s sent" % file_path)
|
||||
|
||||
# Add peer to site if not added before
|
||||
connected_peer = site.addPeer(self.connection.ip, self.connection.port)
|
||||
if connected_peer: # Just added
|
||||
if connected_peer: # Just added
|
||||
connected_peer.connect(self.connection) # Assign current connection to peer
|
||||
|
||||
except Exception, err:
|
||||
|
@ -145,7 +160,7 @@ class FileRequest(object):
|
|||
# Peer exchange request
|
||||
def actionPex(self, params):
|
||||
site = self.sites.get(params["site"])
|
||||
if not site or not site.settings["serving"]: # Site unknown or not serving
|
||||
if not site or not site.settings["serving"]: # Site unknown or not serving
|
||||
self.response({"error": "Unknown site"})
|
||||
return False
|
||||
|
||||
|
@ -156,10 +171,11 @@ class FileRequest(object):
|
|||
added += 1
|
||||
connected_peer.connect(self.connection) # Assign current connection to peer
|
||||
|
||||
for peer in params["peers"]: # Add sent peers to site
|
||||
for peer in params["peers"]: # Add sent peers to site
|
||||
address = self.unpackAddress(peer)
|
||||
got_peer_keys.append("%s:%s" % address)
|
||||
if site.addPeer(*address): added += 1
|
||||
if site.addPeer(*address):
|
||||
added += 1
|
||||
# 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:
|
||||
|
@ -170,12 +186,14 @@ class FileRequest(object):
|
|||
# Get modified content.json files since
|
||||
def actionListModified(self, params):
|
||||
site = self.sites.get(params["site"])
|
||||
if not site or not site.settings["serving"]: # Site unknown or not serving
|
||||
if not site or not site.settings["serving"]: # Site unknown or not serving
|
||||
self.response({"error": "Unknown site"})
|
||||
return False
|
||||
modified_files = {inner_path: content["modified"]
|
||||
for inner_path, content in site.content_manager.contents.iteritems()
|
||||
if content["modified"] > params["since"]}
|
||||
modified_files = {
|
||||
inner_path: content["modified"]
|
||||
for inner_path, content in site.content_manager.contents.iteritems()
|
||||
if content["modified"] > params["since"]
|
||||
}
|
||||
|
||||
# Add peer to site if not added before
|
||||
connected_peer = site.addPeer(self.connection.ip, self.connection.port)
|
||||
|
|
|
@ -1,5 +1,10 @@
|
|||
import os, logging, urllib2, re, time
|
||||
import gevent, msgpack
|
||||
import logging
|
||||
import urllib2
|
||||
import re
|
||||
import time
|
||||
|
||||
import gevent
|
||||
|
||||
from Config import config
|
||||
from FileRequest import FileRequest
|
||||
from Site import SiteManager
|
||||
|
@ -9,216 +14,216 @@ from util import UpnpPunch
|
|||
|
||||
|
||||
class FileServer(ConnectionServer):
|
||||
def __init__(self):
|
||||
ConnectionServer.__init__(self, config.fileserver_ip, config.fileserver_port, self.handleRequest)
|
||||
if config.ip_external: # Ip external definied in arguments
|
||||
self.port_opened = True
|
||||
SiteManager.peer_blacklist.append((config.ip_external, self.port)) # Add myself to peer blacklist
|
||||
else:
|
||||
self.port_opened = None # Is file server opened on router
|
||||
self.sites = SiteManager.site_manager.list()
|
||||
|
||||
def __init__(self):
|
||||
ConnectionServer.__init__(self, config.fileserver_ip, config.fileserver_port, self.handleRequest)
|
||||
if config.ip_external: # Ip external definied in arguments
|
||||
self.port_opened = True
|
||||
SiteManager.peer_blacklist.append((config.ip_external, self.port)) # Add myself to peer blacklist
|
||||
else:
|
||||
self.port_opened = None # Is file server opened on router
|
||||
self.sites = SiteManager.site_manager.list()
|
||||
|
||||
# Handle request to fileserver
|
||||
def handleRequest(self, connection, message):
|
||||
if "params" in message:
|
||||
self.log.debug("FileRequest: %s %s %s %s" % (str(connection), message["cmd"], message["params"].get("site"), message["params"].get("inner_path")))
|
||||
else:
|
||||
self.log.debug("FileRequest: %s %s" % (str(connection), req["cmd"]))
|
||||
req = FileRequest(self, connection)
|
||||
req.route(message["cmd"], message.get("req_id"), message.get("params"))
|
||||
# Handle request to fileserver
|
||||
def handleRequest(self, connection, message):
|
||||
if "params" in message:
|
||||
self.log.debug(
|
||||
"FileRequest: %s %s %s %s" %
|
||||
(str(connection), message["cmd"], message["params"].get("site"), message["params"].get("inner_path"))
|
||||
)
|
||||
else:
|
||||
self.log.debug("FileRequest: %s %s" % (str(connection), message["cmd"]))
|
||||
req = FileRequest(self, connection)
|
||||
req.route(message["cmd"], message.get("req_id"), message.get("params"))
|
||||
|
||||
# Reload the FileRequest class to prevent restarts in debug mode
|
||||
def reload(self):
|
||||
global FileRequest
|
||||
import imp
|
||||
FileRequest = imp.load_source("FileRequest", "src/File/FileRequest.py").FileRequest
|
||||
|
||||
# Reload the FileRequest class to prevent restarts in debug mode
|
||||
def reload(self):
|
||||
global FileRequest
|
||||
import imp
|
||||
FileRequest = imp.load_source("FileRequest", "src/File/FileRequest.py").FileRequest
|
||||
# Try to open the port using upnp
|
||||
def openport(self, port=None, check=True):
|
||||
if not port:
|
||||
port = self.port
|
||||
if self.port_opened:
|
||||
return True # Port already opened
|
||||
if check: # Check first if its already opened
|
||||
if self.testOpenport(port)["result"] is True:
|
||||
return True # Port already opened
|
||||
|
||||
self.log.info("Trying to open port using UpnpPunch...")
|
||||
try:
|
||||
upnp_punch = UpnpPunch.open_port(self.port, 'ZeroNet')
|
||||
upnp_punch = True
|
||||
except Exception, err:
|
||||
self.log.error("UpnpPunch run error: %s" % Debug.formatException(err))
|
||||
upnp_punch = False
|
||||
|
||||
# Try to open the port using upnp
|
||||
def openport(self, port=None, check=True):
|
||||
if not port: port = self.port
|
||||
if self.port_opened: return True # Port already opened
|
||||
if check: # Check first if its already opened
|
||||
if self.testOpenport(port)["result"] == True:
|
||||
return True # Port already opened
|
||||
if upnp_punch and self.testOpenport(port)["result"] is True:
|
||||
return True
|
||||
|
||||
self.log.info("Trying to open port using UpnpPunch...")
|
||||
try:
|
||||
upnp_punch = UpnpPunch.open_port(self.port, 'ZeroNet')
|
||||
upnp_punch = True
|
||||
except Exception, err:
|
||||
self.log.error("UpnpPunch run error: %s" % Debug.formatException(err))
|
||||
upnp_punch = False
|
||||
self.log.info("Upnp mapping failed :( Please forward port %s on your router to your ipaddress" % port)
|
||||
return False
|
||||
|
||||
if upnp_punch and self.testOpenport(port)["result"] == True:
|
||||
return True
|
||||
# Test if the port is open
|
||||
def testOpenport(self, port=None):
|
||||
time.sleep(1) # Wait for port open
|
||||
if not port:
|
||||
port = self.port
|
||||
back = self.testOpenportPortchecker(port)
|
||||
if back["result"] is True: # Successful port check
|
||||
return back
|
||||
else: # Alternative port checker
|
||||
return self.testOpenportCanyouseeme(port)
|
||||
|
||||
self.log.info("Upnp mapping failed :( Please forward port %s on your router to your ipaddress" % port)
|
||||
return False
|
||||
def testOpenportPortchecker(self, port=None):
|
||||
self.log.info("Checking port %s using portchecker.co..." % port)
|
||||
try:
|
||||
data = urllib2.urlopen("http://portchecker.co/check", "port=%s" % port, timeout=20.0).read()
|
||||
message = re.match('.*<div id="results-wrapper">(.*?)</div>', data, re.DOTALL).group(1)
|
||||
message = re.sub("<.*?>", "", message.replace("<br>", " ").replace(" ", " ").strip()) # Strip http tags
|
||||
except Exception, err:
|
||||
message = "Error: %s" % Debug.formatException(err)
|
||||
data = ""
|
||||
|
||||
if "closed" in message or "Error" in message:
|
||||
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
|
||||
if match: # Found my ip in message
|
||||
config.ip_external = match.group(1)
|
||||
SiteManager.peer_blacklist.append((config.ip_external, self.port)) # Add myself to peer blacklist
|
||||
else:
|
||||
config.ip_external = False
|
||||
return {"result": False, "message": message}
|
||||
else:
|
||||
self.log.info("[OK :)] Port open: %s" % message)
|
||||
if port == self.port: # Self port, update port_opened status
|
||||
self.port_opened = True
|
||||
match = re.match(".*targetIP.*?value=\"(.*?)\"", data, re.DOTALL) # Try find my external ip in message
|
||||
if match: # Found my ip in message
|
||||
config.ip_external = match.group(1)
|
||||
SiteManager.peer_blacklist.append((config.ip_external, self.port)) # Add myself to peer blacklist
|
||||
else:
|
||||
config.ip_external = False
|
||||
return {"result": True, "message": message}
|
||||
|
||||
# Test if the port is open
|
||||
def testOpenport(self, port = None):
|
||||
time.sleep(1) # Wait for port open
|
||||
if not port: port = self.port
|
||||
back = self.testOpenportPortchecker(port)
|
||||
if back["result"] == True: # Successful port check
|
||||
return back
|
||||
else: # Alternative port checker
|
||||
return self.testOpenportCanyouseeme(port)
|
||||
def testOpenportCanyouseeme(self, port=None):
|
||||
self.log.info("Checking port %s using canyouseeme.org..." % port)
|
||||
try:
|
||||
data = urllib2.urlopen("http://www.canyouseeme.org/", "port=%s" % port, timeout=20.0).read()
|
||||
message = re.match('.*<p style="padding-left:15px">(.*?)</p>', data, re.DOTALL).group(1)
|
||||
message = re.sub("<.*?>", "", message.replace("<br>", " ").replace(" ", " ")) # Strip http tags
|
||||
except Exception, err:
|
||||
message = "Error: %s" % Debug.formatException(err)
|
||||
|
||||
if "Error" in message:
|
||||
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
|
||||
if match: # Found my ip in message
|
||||
config.ip_external = match.group(1)
|
||||
SiteManager.peer_blacklist.append((config.ip_external, self.port)) # Add myself to peer blacklist
|
||||
else:
|
||||
config.ip_external = False
|
||||
return {"result": False, "message": message}
|
||||
else:
|
||||
self.log.info("[OK :)] Port open: %s" % message)
|
||||
if port == self.port: # Self port, update port_opened status
|
||||
self.port_opened = True
|
||||
match = re.match(".*?([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)", message) # Try find my external ip in message
|
||||
if match: # Found my ip in message
|
||||
config.ip_external = match.group(1)
|
||||
SiteManager.peer_blacklist.append((config.ip_external, self.port)) # Add myself to peer blacklist
|
||||
else:
|
||||
config.ip_external = False
|
||||
return {"result": True, "message": message}
|
||||
|
||||
def testOpenportPortchecker(self, port = None):
|
||||
self.log.info("Checking port %s using portchecker.co..." % port)
|
||||
try:
|
||||
data = urllib2.urlopen("http://portchecker.co/check", "port=%s" % port, timeout=20.0).read()
|
||||
message = re.match('.*<div id="results-wrapper">(.*?)</div>', data, re.DOTALL).group(1)
|
||||
message = re.sub("<.*?>", "", message.replace("<br>", " ").replace(" ", " ").strip()) # Strip http tags
|
||||
except Exception, err:
|
||||
message = "Error: %s" % Debug.formatException(err)
|
||||
data = ""
|
||||
if "closed" in message or "Error" in message:
|
||||
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
|
||||
if match: # Found my ip in message
|
||||
config.ip_external = match.group(1)
|
||||
SiteManager.peer_blacklist.append((config.ip_external, self.port)) # Add myself to peer blacklist
|
||||
else:
|
||||
config.ip_external = False
|
||||
return {"result": False, "message": message}
|
||||
else:
|
||||
self.log.info("[OK :)] Port open: %s" % message)
|
||||
if port == self.port: # Self port, update port_opened status
|
||||
self.port_opened = True
|
||||
match = re.match(".*targetIP.*?value=\"(.*?)\"", data, re.DOTALL) # Try find my external ip in message
|
||||
if match: # Found my ip in message
|
||||
config.ip_external = match.group(1)
|
||||
SiteManager.peer_blacklist.append((config.ip_external, self.port)) # Add myself to peer blacklist
|
||||
else:
|
||||
config.ip_external = False
|
||||
return {"result": True, "message": message}
|
||||
# Set external ip without testing
|
||||
def setIpExternal(self, ip_external):
|
||||
logging.info("Setting external ip without testing: %s..." % ip_external)
|
||||
config.ip_external = ip_external
|
||||
self.port_opened = True
|
||||
|
||||
# Check site file integrity
|
||||
def checkSite(self, site):
|
||||
if site.settings["serving"]:
|
||||
site.announce() # Announce site to tracker
|
||||
site.update() # Update site's content.json and download changed files
|
||||
if self.port_opened is False: # In passive mode keep 5 active peer connection to get the updates
|
||||
site.needConnections()
|
||||
|
||||
def testOpenportCanyouseeme(self, port = None):
|
||||
self.log.info("Checking port %s using canyouseeme.org..." % port)
|
||||
try:
|
||||
data = urllib2.urlopen("http://www.canyouseeme.org/", "port=%s" % port, timeout=20.0).read()
|
||||
message = re.match('.*<p style="padding-left:15px">(.*?)</p>', data, re.DOTALL).group(1)
|
||||
message = re.sub("<.*?>", "", message.replace("<br>", " ").replace(" ", " ")) # Strip http tags
|
||||
except Exception, err:
|
||||
message = "Error: %s" % Debug.formatException(err)
|
||||
if "Error" in message:
|
||||
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
|
||||
if match: # Found my ip in message
|
||||
config.ip_external = match.group(1)
|
||||
SiteManager.peer_blacklist.append((config.ip_external, self.port)) # Add myself to peer blacklist
|
||||
else:
|
||||
config.ip_external = False
|
||||
return {"result": False, "message": message}
|
||||
else:
|
||||
self.log.info("[OK :)] Port open: %s" % message)
|
||||
if port == self.port: # Self port, update port_opened status
|
||||
self.port_opened = True
|
||||
match = re.match(".*?([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)", message) # Try find my external ip in message
|
||||
if match: # Found my ip in message
|
||||
config.ip_external = match.group(1)
|
||||
SiteManager.peer_blacklist.append((config.ip_external, self.port)) # Add myself to peer blacklist
|
||||
else:
|
||||
config.ip_external = False
|
||||
return {"result": True, "message": message}
|
||||
# Check sites integrity
|
||||
def checkSites(self):
|
||||
if self.port_opened is None: # Test and open port if not tested yet
|
||||
self.openport()
|
||||
|
||||
self.log.debug("Checking sites integrity..")
|
||||
for address, site in self.sites.items(): # Check sites integrity
|
||||
gevent.spawn(self.checkSite, site) # Check in new thread
|
||||
time.sleep(2) # Prevent too quick request
|
||||
site = None
|
||||
|
||||
# Set external ip without testing
|
||||
def setIpExternal(self, ip_external):
|
||||
logging.info("Setting external ip without testing: %s..." % ip_external)
|
||||
config.ip_external = ip_external
|
||||
self.port_opened = True
|
||||
# Announce sites every 20 min
|
||||
def announceSites(self):
|
||||
import gc
|
||||
while 1:
|
||||
time.sleep(20 * 60) # Announce sites every 20 min
|
||||
for address, site in self.sites.items():
|
||||
if site.settings["serving"]:
|
||||
site.announce() # Announce site to tracker
|
||||
|
||||
# Reset bad file retry counter
|
||||
for inner_path in site.bad_files:
|
||||
site.bad_files[inner_path] = 0
|
||||
|
||||
# Check site file integrity
|
||||
def checkSite(self, site):
|
||||
if site.settings["serving"]:
|
||||
site.announce() # Announce site to tracker
|
||||
site.update() # Update site's content.json and download changed files
|
||||
if self.port_opened == False: # In passive mode keep 5 active peer connection to get the updates
|
||||
site.needConnections()
|
||||
# Retry failed files
|
||||
if site.bad_files:
|
||||
site.retryBadFiles()
|
||||
|
||||
# In passive mode keep 5 active peer connection to get the updates
|
||||
if self.port_opened is False:
|
||||
site.needConnections()
|
||||
|
||||
# Check sites integrity
|
||||
def checkSites(self):
|
||||
if self.port_opened == None: # Test and open port if not tested yet
|
||||
self.openport()
|
||||
time.sleep(2) # Prevent too quick request
|
||||
|
||||
self.log.debug("Checking sites integrity..")
|
||||
for address, site in self.sites.items(): # Check sites integrity
|
||||
gevent.spawn(self.checkSite, site) # Check in new thread
|
||||
time.sleep(2) # Prevent too quick request
|
||||
site = None
|
||||
site = None
|
||||
gc.collect() # Implicit grabage collection
|
||||
|
||||
# Detects if computer back from wakeup
|
||||
def wakeupWatcher(self):
|
||||
last_time = time.time()
|
||||
while 1:
|
||||
time.sleep(30)
|
||||
if time.time() - last_time > 60: # If taken more than 60 second then the computer was in sleep mode
|
||||
self.log.info(
|
||||
"Wakeup detected: time wrap from %s to %s (%s sleep seconds), acting like startup..." %
|
||||
(last_time, time.time(), time.time() - last_time)
|
||||
)
|
||||
self.port_opened = None # Check if we still has the open port on router
|
||||
self.checkSites()
|
||||
last_time = time.time()
|
||||
|
||||
# Announce sites every 20 min
|
||||
def announceSites(self):
|
||||
import gc
|
||||
while 1:
|
||||
time.sleep(20*60) # Announce sites every 20 min
|
||||
for address, site in self.sites.items():
|
||||
if site.settings["serving"]:
|
||||
site.announce() # Announce site to tracker
|
||||
# Bind and start serving sites
|
||||
def start(self, check_sites=True):
|
||||
self.log = logging.getLogger("FileServer")
|
||||
|
||||
# Reset bad file retry counter
|
||||
for inner_path in site.bad_files:
|
||||
site.bad_files[inner_path] = 0
|
||||
if config.debug:
|
||||
# Auto reload FileRequest on change
|
||||
from Debug import DebugReloader
|
||||
DebugReloader(self.reload)
|
||||
|
||||
# Retry failed files
|
||||
if site.bad_files:
|
||||
site.retryBadFiles()
|
||||
|
||||
# In passive mode keep 5 active peer connection to get the updates
|
||||
if self.port_opened == False:
|
||||
site.needConnections()
|
||||
if check_sites: # Open port, Update sites, Check files integrity
|
||||
gevent.spawn(self.checkSites)
|
||||
|
||||
time.sleep(2) # Prevent too quick request
|
||||
thread_announce_sites = gevent.spawn(self.announceSites)
|
||||
thread_wakeup_watcher = gevent.spawn(self.wakeupWatcher)
|
||||
|
||||
site = None
|
||||
gc.collect() # Implicit grabage collection
|
||||
ConnectionServer.start(self)
|
||||
|
||||
|
||||
# Detects if computer back from wakeup
|
||||
def wakeupWatcher(self):
|
||||
last_time = time.time()
|
||||
while 1:
|
||||
time.sleep(30)
|
||||
if time.time()-last_time > 60: # If taken more than 60 second then the computer was in sleep mode
|
||||
self.log.info("Wakeup detected: time wrap from %s to %s (%s sleep seconds), acting like startup..." % (last_time, time.time(), time.time()-last_time))
|
||||
self.port_opened = None # Check if we still has the open port on router
|
||||
self.checkSites()
|
||||
last_time = time.time()
|
||||
|
||||
|
||||
# Bind and start serving sites
|
||||
def start(self, check_sites = True):
|
||||
self.log = logging.getLogger("FileServer")
|
||||
|
||||
if config.debug:
|
||||
# Auto reload FileRequest on change
|
||||
from Debug import DebugReloader
|
||||
DebugReloader(self.reload)
|
||||
|
||||
if check_sites: # Open port, Update sites, Check files integrity
|
||||
gevent.spawn(self.checkSites)
|
||||
|
||||
thread_announce_sites = gevent.spawn(self.announceSites)
|
||||
thread_wakeup_watcher = gevent.spawn(self.wakeupWatcher)
|
||||
|
||||
ConnectionServer.start(self)
|
||||
|
||||
# thread_wakeup_watcher.kill(exception=Debug.Notify("Stopping FileServer"))
|
||||
# thread_announce_sites.kill(exception=Debug.Notify("Stopping FileServer"))
|
||||
self.log.debug("Stopped.")
|
||||
# thread_wakeup_watcher.kill(exception=Debug.Notify("Stopping FileServer"))
|
||||
# thread_announce_sites.kill(exception=Debug.Notify("Stopping FileServer"))
|
||||
self.log.debug("Stopped.")
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue