def __init__(self, ip=config.fileserver_ip, port=config.fileserver_port): self.site_manager = SiteManager.site_manager self.log = logging.getLogger("FileServer") ip = ip.replace("*", "0.0.0.0") if config.tor == "always": port = config.tor_hs_port config.fileserver_port = port elif port == 0: # Use random port port_range_from, port_range_to = map( int, config.fileserver_port_range.split("-")) port = self.getRandomPort(ip, port_range_from, port_range_to) config.fileserver_port = port if not port: raise Exception("Can't find bindable port") if not config.tor == "always": config.saveValue( "fileserver_port", port) # Save random port value for next restart ConnectionServer.__init__(self, ip, port, self.handleRequest) if config.ip_external: # Ip external defined 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.upnp_port_opened = False self.sites = {} self.last_request = time.time() self.files_parsing = {} self.ui_server = None
def actionOptionalLimitSet(self, to, limit): if "ADMIN" not in self.site.settings["permissions"]: return self.response(to, {"error": "Forbidden"}) config.optional_limit = re.sub( "\.0+$", "", limit) # Remove unnecessary digits from end config.saveValue("optional_limit", limit) self.response(to, "ok")
def actionConfigSet(self, to, key, value): allowed_keys = ["tor", "language", "tor_use_bridges", "trackers_proxy"] if key not in allowed_keys: self.response(to, {"error": "Forbidden"}) return config.saveValue(key, value) instant_change_keys = ["language", "tor_use_bridges", "trackers_proxy"] if key in instant_change_keys: setattr(config, key, value) if key == "language": import Translate for translate in Translate.translates: translate.setLanguage(value) message = _[ "You have successfully changed the web interface's language!"] + "<br>" message += _[ "Due to the browser's caching, the full transformation could take some minute."] self.cmd("notification", ["done", message, 10000]) if key == "tor_use_bridges": if value == None: value = False else: value = True tor_manager = sys.modules["main"].file_server.tor_manager tor_manager.request("SETCONF UseBridges=%i" % value) self.response(to, "ok")
def actionConfigSet(self, to, key, value): if key not in ["tor"]: self.response(to, {"error": "Forbidden"}) return config.saveValue(key, value) self.response(to, "ok")
def __init__(self, ip=config.fileserver_ip, port=config.fileserver_port): self.site_manager = SiteManager.site_manager self.log = logging.getLogger("FileServer") ip = ip.replace("*", "0.0.0.0") if config.tor == "always": port = config.tor_hs_port config.fileserver_port = port elif port == 0: # Use random port port_range_from, port_range_to = map(int, config.fileserver_port_range.split("-")) port = self.getRandomPort(ip, port_range_from, port_range_to) config.fileserver_port = port if not port: raise Exception("Can't find bindable port") if not config.tor == "always": config.saveValue("fileserver_port", port) # Save random port value for next restart ConnectionServer.__init__(self, ip, port, self.handleRequest) if config.ip_external: # Ip external defined 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.upnp_port_opened = False self.sites = {} self.last_request = time.time() self.files_parsing = {} self.ui_server = None
def __init__(self, ip=config.fileserver_ip, port=config.fileserver_port, ip_type=config.fileserver_ip_type): self.site_manager = SiteManager.site_manager self.portchecker = PeerPortchecker.PeerPortchecker(self) self.log = logging.getLogger("FileServer") self.ip_type = ip_type self.ip_external_list = [] self.supported_ip_types = ["ipv4"] # Outgoing ip_type support if helper.getIpType(ip) == "ipv6" or self.isIpv6Supported(): self.supported_ip_types.append("ipv6") if ip_type == "ipv6" or (ip_type == "dual" and "ipv6" in self.supported_ip_types): ip = ip.replace("*", "::") else: ip = ip.replace("*", "0.0.0.0") if config.tor == "always": port = config.tor_hs_port config.fileserver_port = port elif port == 0: # Use random port port_range_from, port_range_to = list( map(int, config.fileserver_port_range.split("-"))) port = self.getRandomPort(ip, port_range_from, port_range_to) config.fileserver_port = port if not port: raise Exception("Can't find bindable port") if not config.tor == "always": config.saveValue( "fileserver_port", port) # Save random port value for next restart config.arguments.fileserver_port = port ConnectionServer.__init__(self, ip, port, self.handleRequest) self.log.debug("Supported IP types: %s" % self.supported_ip_types) if ip_type == "dual" and ip == "::": # Also bind to ipv4 addres in dual mode try: self.log.debug("Binding proxy to %s:%s" % ("::", self.port)) self.stream_server_proxy = StreamServer( ("0.0.0.0", self.port), self.handleIncomingConnection, spawn=self.pool, backlog=100) except Exception as err: self.log.info("StreamServer proxy create error: %s" % Debug.formatException(err)) self.port_opened = {} self.sites = self.site_manager.sites self.last_request = time.time() self.files_parsing = {} self.ui_server = None
def loadFilesOptional(self): s = time.time() num = 0 total = 0 total_downloaded = 0 res = content_db.execute( "SELECT site_id, inner_path, size, is_downloaded FROM file_optional" ) site_sizes = collections.defaultdict( lambda: collections.defaultdict(int)) for row in res: self.optional_files[row["site_id"]][row["inner_path"][-8:]] = 1 num += 1 # Update site size stats site_sizes[row["site_id"]]["size_optional"] += row["size"] if row["is_downloaded"]: site_sizes[ row["site_id"]]["optional_downloaded"] += row["size"] # Site site size stats to sites.json settings site_ids_reverse = {val: key for key, val in self.site_ids.iteritems()} for site_id, stats in site_sizes.iteritems(): site_address = site_ids_reverse.get(site_id) if not site_address: self.log.error("Not found site_id: %s" % site_id) continue site = self.sites[site_address] site.settings["size_optional"] = stats["size_optional"] site.settings["optional_downloaded"] = stats["optional_downloaded"] total += stats["size_optional"] total_downloaded += stats["optional_downloaded"] self.log.debug( "Loaded %s optional files: %.2fMB, downloaded: %.2fMB in %.3fs" % (num, float(total) / 1024 / 1024, float(total_downloaded) / 1024 / 1024, time.time() - s)) if self.need_filling and self.getOptionalLimitBytes( ) >= 0 and self.getOptionalLimitBytes() < total_downloaded: limit_bytes = self.getOptionalLimitBytes() limit_new = round( (float(total_downloaded) / 1024 / 1024 / 1024) * 1.1, 2) # Current limit + 10% self.log.debug( "First startup after update and limit is smaller than downloaded files size (%.2fGB), increasing it from %.2fGB to %.2fGB" % (float(total_downloaded) / 1024 / 1024 / 1024, float(limit_bytes) / 1024 / 1024 / 1024, limit_new)) config.saveValue("optional_limit", limit_new) config.optional_limit = str(limit_new)
def actionConfigSet(self, to, key, value): if key not in config.keys_api_change_allowed: self.response(to, {"error": "Forbidden you cannot set this config key"}) return # Remove empty lines from lists if type(value) is list: value = [line for line in value if line] config.saveValue(key, value) if key not in config.keys_restart_need: if value is None: # Default value setattr(config, key, config.parser.get_default(key)) setattr(config.arguments, key, config.parser.get_default(key)) else: setattr(config, key, value) setattr(config.arguments, key, value) else: config.need_restart = True config.pending_changes[key] = value if key == "language": import Translate for translate in Translate.translates: translate.setLanguage(value) message = _["You have successfully changed the web interface's language!"] + "<br>" message += _["Due to the browser's caching, the full transformation could take some minute."] self.cmd("notification", ["done", message, 10000]) if key == "tor_use_bridges": if value is None: value = False else: value = True tor_manager = sys.modules["main"].file_server.tor_manager tor_manager.request("SETCONF UseBridges=%i" % value) if key == "trackers_file": config.loadTrackersFile() if key == "log_level": logging.getLogger('').setLevel(logging.getLevelName(config.log_level)) if key == "ip_external": gevent.spawn(sys.modules["main"].file_server.portCheck) self.response(to, "ok")
def actionConfigSet(self, to, key, value): if key not in ["tor", "language"]: self.response(to, {"error": "Forbidden"}) return config.saveValue(key, value) if key == "language": import Translate for translate in Translate.translates: translate.setLanguage(value) message = _["You have successfully changed the web interface's language!"] + "<br>" message += _["Due to the browser's caching, the full transformation could take some minute."] self.cmd("notification", ["done", message, 10000]) config.language = value self.response(to, "ok")
def actionConfigSet(self, to, key, value): if key not in ["tor", "language"]: self.response(to, {"error": "Forbidden"}) return config.saveValue(key, value) if key == "language": import Translate for translate in Translate.translates: translate.setLanguage(value) self.cmd("notification", ["done", _["You have successfully changed the web interface's language!"] + "<br>" + _["Due to the browser's caching, the full transformation could take some minute."] , 10000]) config.language = value self.response(to, "ok")
def loadFilesOptional(self): s = time.time() num = 0 total = 0 total_downloaded = 0 res = content_db.execute("SELECT site_id, inner_path, size, is_downloaded FROM file_optional") site_sizes = collections.defaultdict(lambda: collections.defaultdict(int)) for row in res: self.optional_files[row["site_id"]][row["inner_path"][-8:]] = 1 num += 1 # Update site size stats site_sizes[row["site_id"]]["size_optional"] += row["size"] if row["is_downloaded"]: site_sizes[row["site_id"]]["optional_downloaded"] += row["size"] # Site site size stats to sites.json settings site_ids_reverse = {val: key for key, val in self.site_ids.iteritems()} for site_id, stats in site_sizes.iteritems(): site_address = site_ids_reverse.get(site_id) if not site_address: self.log.error("Not found site_id: %s" % site_id) continue site = self.sites[site_address] site.settings["size_optional"] = stats["size_optional"] site.settings["optional_downloaded"] = stats["optional_downloaded"] total += stats["size_optional"] total_downloaded += stats["optional_downloaded"] self.log.debug( "Loaded %s optional files: %.2fMB, downloaded: %.2fMB in %.3fs" % (num, float(total) / 1024 / 1024, float(total_downloaded) / 1024 / 1024, time.time() - s) ) if self.need_filling and self.getOptionalLimitBytes() < total_downloaded: limit_bytes = self.getOptionalLimitBytes() limit_new = round((float(total_downloaded) / 1024 / 1024 / 1024) * 1.1, 2) # Current limit + 10% self.log.debug( "First startup after update and limit is smaller than downloaded files size (%.2fGB), increasing it from %.2fGB to %.2fGB" % (float(total_downloaded) / 1024 / 1024 / 1024, float(limit_bytes) / 1024 / 1024 / 1024, limit_new) ) config.saveValue("optional_limit", limit_new) config.optional_limit = str(limit_new)
def actionConfigSet(self, to, key, value): if key not in config.keys_api_change_allowed: self.response(to, {"error": "Forbidden you cannot set this config key"}) return config.saveValue(key, value) if key not in config.keys_restart_need: if value is None: # Default value setattr(config, key, config.parser.get_default(key)) setattr(config.arguments, key, config.parser.get_default(key)) else: setattr(config, key, value) setattr(config.arguments, key, value) else: config.need_restart = True config.pending_changes[key] = value if key == "language": import Translate for translate in Translate.translates: translate.setLanguage(value) message = _["You have successfully changed the web interface's language!"] + "<br>" message += _["Due to the browser's caching, the full transformation could take some minute."] self.cmd("notification", ["done", message, 10000]) if key == "tor_use_bridges": if value is None: value = False else: value = True tor_manager = sys.modules["main"].file_server.tor_manager tor_manager.request("SETCONF UseBridges=%i" % value) if key == "trackers_file": config.loadTrackersFile() self.response(to, "ok")
def actionOptionalLimitSet(self, to, limit): config.optional_limit = re.sub(r"\.0+$", "", limit) # Remove unnecessary digits from end config.saveValue("optional_limit", limit) self.response(to, "ok")
def actionOptionalLimitSet(self, to, limit): if "ADMIN" not in self.site.settings["permissions"]: return self.response(to, {"error": "Forbidden"}) config.optional_limit = re.sub("\.0+$", "", limit) # Remove unnecessary digits from end config.saveValue("optional_limit", limit) self.response(to, "ok")