Implement new websocket command serverSetOfflineMode

This commit is contained in:
Vadim Ushakov 2021-10-22 02:59:28 +07:00
parent e3daa09316
commit 19b840defd
4 changed files with 89 additions and 43 deletions

View file

@ -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

View file

@ -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

View file

@ -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)" %

View file

@ -1170,12 +1170,26 @@ 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
file_server.setPassiveMode(passive_mode) if file_server.isPassiveMode() != passive_mode:
if passive_mode: file_server.setPassiveMode(passive_mode)
self.cmd("notification", ["info", _["Passive mode enabled"], 5000]) if file_server.isPassiveMode():
else: self.cmd("notification", ["info", _["Passive mode enabled"], 5000])
self.cmd("notification", ["info", _["Passive mode disabled"], 5000]) else:
self.server.updateWebsocket() self.cmd("notification", ["info", _["Passive mode disabled"], 5000])
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