Implement new websocket command serverSetOfflineMode
This commit is contained in:
parent
e3daa09316
commit
19b840defd
4 changed files with 89 additions and 43 deletions
|
@ -479,15 +479,27 @@ class ConnectionServer(object):
|
||||||
self.had_external_incoming = False
|
self.had_external_incoming = False
|
||||||
self.log.info("Internet offline")
|
self.log.info("Internet offline")
|
||||||
|
|
||||||
|
def setOfflineMode(self, offline_mode):
|
||||||
|
if config.offline == offline_mode:
|
||||||
|
return
|
||||||
|
config.offline = offline_mode # Yep, awkward
|
||||||
|
if offline_mode:
|
||||||
|
self.log.info("offline mode is ON")
|
||||||
|
else:
|
||||||
|
self.log.info("offline mode is OFF")
|
||||||
|
|
||||||
|
def isOfflineMode(self):
|
||||||
|
return config.offline
|
||||||
|
|
||||||
def allowsCreatingConnections(self):
|
def allowsCreatingConnections(self):
|
||||||
if config.offline:
|
if self.isOfflineMode():
|
||||||
return False
|
return False
|
||||||
if self.stopping:
|
if self.stopping:
|
||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def allowsAcceptingConnections(self):
|
def allowsAcceptingConnections(self):
|
||||||
if config.offline:
|
if self.isOfflineMode():
|
||||||
return False
|
return False
|
||||||
if self.stopping:
|
if self.stopping:
|
||||||
return False
|
return False
|
||||||
|
|
|
@ -43,8 +43,10 @@ class FileServer(ConnectionServer):
|
||||||
self.update_sites_task_next_nr = 1
|
self.update_sites_task_next_nr = 1
|
||||||
|
|
||||||
self.passive_mode = None
|
self.passive_mode = None
|
||||||
|
self.active_mode = None
|
||||||
self.active_mode_threads = {}
|
self.active_mode_threads = {}
|
||||||
|
|
||||||
|
|
||||||
self.supported_ip_types = ["ipv4"] # Outgoing ip_type support
|
self.supported_ip_types = ["ipv4"] # Outgoing ip_type support
|
||||||
if helper.getIpType(ip) == "ipv6" or self.isIpv6Supported():
|
if helper.getIpType(ip) == "ipv6" or self.isIpv6Supported():
|
||||||
self.supported_ip_types.append("ipv6")
|
self.supported_ip_types.append("ipv6")
|
||||||
|
@ -196,7 +198,7 @@ class FileServer(ConnectionServer):
|
||||||
FileRequest = imp.load_source("FileRequest", "src/File/FileRequest.py").FileRequest
|
FileRequest = imp.load_source("FileRequest", "src/File/FileRequest.py").FileRequest
|
||||||
|
|
||||||
def portCheck(self):
|
def portCheck(self):
|
||||||
if config.offline:
|
if self.isOfflineMode():
|
||||||
log.info("Offline mode: port check disabled")
|
log.info("Offline mode: port check disabled")
|
||||||
res = {"ipv4": None, "ipv6": None}
|
res = {"ipv4": None, "ipv6": None}
|
||||||
self.port_opened = res
|
self.port_opened = res
|
||||||
|
@ -276,7 +278,7 @@ class FileServer(ConnectionServer):
|
||||||
# Returns True if we've spent some time waiting for Internet
|
# Returns True if we've spent some time waiting for Internet
|
||||||
# Returns None if FileServer is stopping or the Offline mode is enabled
|
# Returns None if FileServer is stopping or the Offline mode is enabled
|
||||||
def waitForInternetOnline(self):
|
def waitForInternetOnline(self):
|
||||||
if config.offline or self.stopping:
|
if self.isOfflineMode() or self.stopping:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
if self.isInternetOnline():
|
if self.isInternetOnline():
|
||||||
|
@ -284,7 +286,7 @@ class FileServer(ConnectionServer):
|
||||||
|
|
||||||
while not self.isInternetOnline():
|
while not self.isInternetOnline():
|
||||||
self.sleep(30)
|
self.sleep(30)
|
||||||
if config.offline or self.stopping:
|
if self.isOfflineMode() or self.stopping:
|
||||||
return None
|
return None
|
||||||
if self.isInternetOnline():
|
if self.isInternetOnline():
|
||||||
break
|
break
|
||||||
|
@ -364,7 +366,7 @@ class FileServer(ConnectionServer):
|
||||||
self.sleep(1)
|
self.sleep(1)
|
||||||
self.waitForInternetOnline()
|
self.waitForInternetOnline()
|
||||||
|
|
||||||
if not self.inActiveMode():
|
if not self.isActiveMode():
|
||||||
break
|
break
|
||||||
|
|
||||||
site = self.getSite(site_address)
|
site = self.getSite(site_address)
|
||||||
|
@ -376,7 +378,7 @@ class FileServer(ConnectionServer):
|
||||||
|
|
||||||
thread = self.update_pool.spawn(self.updateSite, site)
|
thread = self.update_pool.spawn(self.updateSite, site)
|
||||||
|
|
||||||
if not self.inActiveMode():
|
if not self.isActiveMode():
|
||||||
break
|
break
|
||||||
|
|
||||||
if time.time() - progress_print_time > 60:
|
if time.time() - progress_print_time > 60:
|
||||||
|
@ -395,7 +397,7 @@ class FileServer(ConnectionServer):
|
||||||
time_left
|
time_left
|
||||||
)
|
)
|
||||||
|
|
||||||
if not self.inActiveMode():
|
if not self.isActiveMode():
|
||||||
log.info("%s: stopped", task_description)
|
log.info("%s: stopped", task_description)
|
||||||
else:
|
else:
|
||||||
log.info("%s: finished in %.2fs", task_description, time.time() - start_time)
|
log.info("%s: finished in %.2fs", task_description, time.time() - start_time)
|
||||||
|
@ -422,11 +424,11 @@ class FileServer(ConnectionServer):
|
||||||
|
|
||||||
self.sleep(long_timeout)
|
self.sleep(long_timeout)
|
||||||
|
|
||||||
while self.inActiveMode():
|
while self.isActiveMode():
|
||||||
site = None
|
site = None
|
||||||
self.sleep(short_timeout)
|
self.sleep(short_timeout)
|
||||||
|
|
||||||
if not self.inActiveMode():
|
if not self.isActiveMode():
|
||||||
break
|
break
|
||||||
|
|
||||||
site_address, mode = self.peekSiteForVerification()
|
site_address, mode = self.peekSiteForVerification()
|
||||||
|
@ -465,10 +467,10 @@ class FileServer(ConnectionServer):
|
||||||
long_timeout = min_long_timeout
|
long_timeout = min_long_timeout
|
||||||
short_cycle_time_limit = 60 * 2
|
short_cycle_time_limit = 60 * 2
|
||||||
|
|
||||||
while self.inActiveMode():
|
while self.isActiveMode():
|
||||||
self.sleep(long_timeout)
|
self.sleep(long_timeout)
|
||||||
|
|
||||||
if not self.inActiveMode():
|
if not self.isActiveMode():
|
||||||
break
|
break
|
||||||
|
|
||||||
start_time = time.time()
|
start_time = time.time()
|
||||||
|
@ -485,7 +487,7 @@ class FileServer(ConnectionServer):
|
||||||
sites_processed = 0
|
sites_processed = 0
|
||||||
|
|
||||||
for site_address in site_addresses:
|
for site_address in site_addresses:
|
||||||
if not self.inActiveMode():
|
if not self.isActiveMode():
|
||||||
break
|
break
|
||||||
|
|
||||||
site = self.getSite(site_address)
|
site = self.getSite(site_address)
|
||||||
|
@ -544,13 +546,13 @@ class FileServer(ConnectionServer):
|
||||||
# performing the update for a random site. It's way better than just
|
# performing the update for a random site. It's way better than just
|
||||||
# silly pinging a random peer for no profit.
|
# silly pinging a random peer for no profit.
|
||||||
log.info("keepAliveThread started")
|
log.info("keepAliveThread started")
|
||||||
while self.inActiveMode():
|
while self.isActiveMode():
|
||||||
self.waitForInternetOnline()
|
self.waitForInternetOnline()
|
||||||
|
|
||||||
threshold = self.internet_outage_threshold / 2.0
|
threshold = self.internet_outage_threshold / 2.0
|
||||||
|
|
||||||
self.sleep(threshold / 2.0)
|
self.sleep(threshold / 2.0)
|
||||||
if not self.inActiveMode():
|
if not self.isActiveMode():
|
||||||
break
|
break
|
||||||
|
|
||||||
last_activity_time = max(
|
last_activity_time = max(
|
||||||
|
@ -578,9 +580,9 @@ class FileServer(ConnectionServer):
|
||||||
# and do it more often.
|
# and do it more often.
|
||||||
log.info("reloadTrackerFilesThread started")
|
log.info("reloadTrackerFilesThread started")
|
||||||
interval = 60 * 10
|
interval = 60 * 10
|
||||||
while self.inActiveMode():
|
while self.isActiveMode():
|
||||||
self.sleep(interval)
|
self.sleep(interval)
|
||||||
if not self.inActiveMode():
|
if not self.isActiveMode():
|
||||||
break
|
break
|
||||||
config.loadTrackersFile()
|
config.loadTrackersFile()
|
||||||
log.info("reloadTrackerFilesThread stopped")
|
log.info("reloadTrackerFilesThread stopped")
|
||||||
|
@ -590,9 +592,9 @@ class FileServer(ConnectionServer):
|
||||||
log.info("wakeupWatcherThread started")
|
log.info("wakeupWatcherThread started")
|
||||||
last_time = time.time()
|
last_time = time.time()
|
||||||
last_my_ips = socket.gethostbyname_ex('')[2]
|
last_my_ips = socket.gethostbyname_ex('')[2]
|
||||||
while self.inActiveMode():
|
while self.isActiveMode():
|
||||||
self.sleep(30)
|
self.sleep(30)
|
||||||
if not self.inActiveMode():
|
if not self.isActiveMode():
|
||||||
break
|
break
|
||||||
is_time_changed = time.time() - max(self.last_request, last_time) > 60 * 3
|
is_time_changed = time.time() - max(self.last_request, last_time) > 60 * 3
|
||||||
if is_time_changed:
|
if is_time_changed:
|
||||||
|
@ -620,31 +622,47 @@ class FileServer(ConnectionServer):
|
||||||
last_my_ips = my_ips
|
last_my_ips = my_ips
|
||||||
log.info("wakeupWatcherThread stopped")
|
log.info("wakeupWatcherThread stopped")
|
||||||
|
|
||||||
|
def setOfflineMode(self, offline_mode):
|
||||||
|
ConnectionServer.setOfflineMode(self, offline_mode)
|
||||||
|
self.setupActiveMode()
|
||||||
|
|
||||||
|
def setPassiveMode(self, passive_mode):
|
||||||
|
if self.passive_mode == passive_mode:
|
||||||
|
return
|
||||||
|
self.passive_mode = passive_mode
|
||||||
|
if self.passive_mode:
|
||||||
|
log.info("passive mode is ON");
|
||||||
|
else:
|
||||||
|
log.info("passive mode is OFF");
|
||||||
|
self.setupActiveMode()
|
||||||
|
|
||||||
|
def isPassiveMode(self):
|
||||||
|
return self.passive_mode
|
||||||
|
|
||||||
|
def setupActiveMode(self):
|
||||||
|
active_mode = (not self.passive_mode) and (not self.isOfflineMode())
|
||||||
|
if self.active_mode == active_mode:
|
||||||
|
return
|
||||||
|
self.active_mode = active_mode
|
||||||
|
if self.active_mode:
|
||||||
|
log.info("active mode is ON");
|
||||||
|
self.enterActiveMode();
|
||||||
|
else:
|
||||||
|
log.info("active mode is OFF");
|
||||||
|
self.leaveActiveMode();
|
||||||
|
|
||||||
def killActiveModeThreads(self):
|
def killActiveModeThreads(self):
|
||||||
for key, thread in list(self.active_mode_threads.items()):
|
for key, thread in list(self.active_mode_threads.items()):
|
||||||
if thread:
|
if thread:
|
||||||
if not thread.ready():
|
if not thread.ready():
|
||||||
self.log.info("killing %s" % key)
|
log.info("killing %s" % key)
|
||||||
gevent.kill(thread)
|
gevent.kill(thread)
|
||||||
del self.active_mode_threads[key]
|
del self.active_mode_threads[key]
|
||||||
|
|
||||||
def setPassiveMode(self, passive_mode):
|
|
||||||
if passive_mode:
|
|
||||||
self.leaveActiveMode();
|
|
||||||
else:
|
|
||||||
self.enterActiveMode();
|
|
||||||
|
|
||||||
def leaveActiveMode(self):
|
def leaveActiveMode(self):
|
||||||
if self.passive_mode:
|
pass
|
||||||
return
|
|
||||||
log.info("passive mode is ON");
|
|
||||||
self.passive_mode = True
|
|
||||||
|
|
||||||
def enterActiveMode(self):
|
def enterActiveMode(self):
|
||||||
if not self.passive_mode and self.passive_mode is not None:
|
|
||||||
return
|
|
||||||
log.info("passive mode is OFF");
|
|
||||||
self.passive_mode = False
|
|
||||||
self.killActiveModeThreads()
|
self.killActiveModeThreads()
|
||||||
x = self.active_mode_threads
|
x = self.active_mode_threads
|
||||||
p = self.active_mode_thread_pool
|
p = self.active_mode_thread_pool
|
||||||
|
@ -658,8 +676,9 @@ class FileServer(ConnectionServer):
|
||||||
|
|
||||||
# Returns True, if an active mode thread should keep going,
|
# Returns True, if an active mode thread should keep going,
|
||||||
# i.e active mode is enabled and the server not going to shutdown
|
# i.e active mode is enabled and the server not going to shutdown
|
||||||
def inActiveMode(self):
|
def isActiveMode(self):
|
||||||
if self.passive_mode:
|
self.setupActiveMode()
|
||||||
|
if not self.active_mode:
|
||||||
return False
|
return False
|
||||||
if not self.running:
|
if not self.running:
|
||||||
return False
|
return False
|
||||||
|
|
|
@ -285,7 +285,7 @@ class Site(object):
|
||||||
|
|
||||||
# Returns False if any network activity for the site should not happen
|
# Returns False if any network activity for the site should not happen
|
||||||
def isServing(self):
|
def isServing(self):
|
||||||
if config.offline:
|
if self.connection_server.isOfflineMode():
|
||||||
return False
|
return False
|
||||||
elif self.isStopping():
|
elif self.isStopping():
|
||||||
return False
|
return False
|
||||||
|
@ -1375,6 +1375,7 @@ class Site(object):
|
||||||
|
|
||||||
# Return: Recently found peers
|
# Return: Recently found peers
|
||||||
def getRecentPeers(self, need_num):
|
def getRecentPeers(self, need_num):
|
||||||
|
need_num = int(need_num)
|
||||||
found = list(set(self.peers_recent))
|
found = list(set(self.peers_recent))
|
||||||
self.log.debug(
|
self.log.debug(
|
||||||
"Recent peers %s of %s (need: %s)" %
|
"Recent peers %s of %s (need: %s)" %
|
||||||
|
|
|
@ -1170,13 +1170,27 @@ class UiWebsocket(object):
|
||||||
def actionServerSetPassiveMode(self, to, passive_mode=False):
|
def actionServerSetPassiveMode(self, to, passive_mode=False):
|
||||||
import main
|
import main
|
||||||
file_server = main.file_server
|
file_server = main.file_server
|
||||||
|
if file_server.isPassiveMode() != passive_mode:
|
||||||
file_server.setPassiveMode(passive_mode)
|
file_server.setPassiveMode(passive_mode)
|
||||||
if passive_mode:
|
if file_server.isPassiveMode():
|
||||||
self.cmd("notification", ["info", _["Passive mode enabled"], 5000])
|
self.cmd("notification", ["info", _["Passive mode enabled"], 5000])
|
||||||
else:
|
else:
|
||||||
self.cmd("notification", ["info", _["Passive mode disabled"], 5000])
|
self.cmd("notification", ["info", _["Passive mode disabled"], 5000])
|
||||||
self.server.updateWebsocket()
|
self.server.updateWebsocket()
|
||||||
|
|
||||||
|
@flag.admin
|
||||||
|
@flag.no_multiuser
|
||||||
|
def actionServerSetOfflineMode(self, to, offline_mode=False):
|
||||||
|
import main
|
||||||
|
file_server = main.file_server
|
||||||
|
if file_server.isOfflineMode() != offline_mode:
|
||||||
|
file_server.setOfflineMode(offline_mode)
|
||||||
|
if file_server.isOfflineMode():
|
||||||
|
self.cmd("notification", ["info", _["Offline mode enabled"], 5000])
|
||||||
|
else:
|
||||||
|
self.cmd("notification", ["info", _["Offline mode disabled"], 5000])
|
||||||
|
self.server.updateWebsocket()
|
||||||
|
|
||||||
@flag.admin
|
@flag.admin
|
||||||
@flag.no_multiuser
|
@flag.no_multiuser
|
||||||
def actionServerShutdown(self, to, restart=False):
|
def actionServerShutdown(self, to, restart=False):
|
||||||
|
|
Loading…
Reference in a new issue