def save(self): if not os.path.exists(self.root): mkdir_p(self.root) if self.pickle: self.pickle_save() else: self.json_save()
def load(self): """ Loads the Storage data from disk. In conjunction with setting the storages paused_saving to true, this allows you to make changes to a wrapper storage on disk while wrapper is running. :return: Nothing """ mkdir_p(self.root) if not os.path.exists( "%s/%s.%s" % (self.root, self.name, self.file_ext)): # load old json storages if there is no pickled # file (and if storage is using pickle) if self.pickle: self.Data = self._json_load() # save to the selected file mode (json or pkl) self.save() if self.pickle: filenameis = "%s.pkl" % self.name self.Data = pickle_load(self.root, filenameis) else: self.Data = self._json_load()
def save(self): if not os.path.exists(self.root): mkdir_p(self.root) if self.pickle: filenameis = "%s.pkl" % self.name pickle_save(self.root, filenameis, self.Data, self.encoding) else: self.json_save()
def __init__(self, filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=0): mkdir_p(os.path.dirname(filename)) super(WrapperHandler, self).__init__(filename, mode, maxBytes, backupCount, encoding, delay)
def createdefaultscripts(self): if not os.path.exists("wrapper-data"): mkdir_p("wrapper-data") if not os.path.exists("wrapper-data/scripts"): mkdir_p("wrapper-data/scripts") for script in scripts: path = "wrapper-data/scripts/%s" % script if not os.path.exists(path): with open(path, "w") as f: f.write(scripts[script]) os.chmod(path, os.stat(path).st_mode | stat.S_IEXEC)
def _checkforbackupfolder(self): if not os.path.exists(self.config["Backups"]["backup-location"]): self.log.warning( "Backup location %s does not exist -- creating target " "location...", self.config["Backups"]["backup-location"]) mkdir_p(self.config["Backups"]["backup-location"]) if not os.path.exists(self.config["Backups"]["backup-location"]): self.log.error("Backup location %s could not be created!", self.config["Backups"]["backup-location"]) return False return True
def __init__(self, wrapper): self.wrapper = wrapper self.log = wrapper.log self.config = wrapper.config self.plugins = {} self.plugins_loaded = [] if "disabled_plugins" not in self.wrapper.storage: self.wrapper.storage["disabled_plugins"] = [] if not os.path.exists("wrapper-plugins"): mkdir_p("wrapper-plugins") sys.path.append("wrapper-plugins")
def _checkforbackupfolder(self): if not os.path.exists(self.config["Backups"]["backup-location"]): self.log.warning( "Backup location %s does not exist -- creating target " "location...", self.config["Backups"]["backup-location"] ) mkdir_p(self.config["Backups"]["backup-location"]) if not os.path.exists(self.config["Backups"]["backup-location"]): self.log.error( "Backup location %s could not be created!", self.config["Backups"]["backup-location"] ) return False return True
def save(self): """ Force a save of the Storage to disk. Saves are also done periodically and when the storage is closed. :return: Nothing """ if not os.path.exists(self.root): mkdir_p(self.root) if self.pickle: filenameis = "%s.pkl" % self.name pickle_save(self.root, filenameis, self.Data, self.encoding) else: self._json_save()
def load(self): mkdir_p(self.root) if not os.path.exists("%s/%s.%s" % (self.root, self.name, self.file_ext)): # load old json storages if there is no pickled # file (and if storage is using pickle) if self.pickle: self.Data = self.json_load() # save to the selected file mode (json or pkl) self.save() if self.pickle: self.Data = self.pickle_load() else: self.Data = self.json_load()
def _checkforbackupfolder(self): if not os.path.exists(self.config["Backups"]["backup-location"]): self.log.warning("Backup location %s does not exist -- creating target location...", self.config["Backups"]["backup-location"]) mkdir_p(self.config["Backups"]["backup-location"])
def _checkforbackupfolder(self): if not os.path.exists(self.config["Backups"]["backup-location"]): self.log.warning( "Backup location %s does not exist -- creating target location...", self.config["Backups"]["backup-location"]) mkdir_p(self.config["Backups"]["backup-location"])
def run_action(self, request): # Entire requested action request_action = request.split("/")[2] or "" # split the action into two parts - action and args action_parts = request_action.split("?") # get the action - read_server_props, halt_wrapper, server_action, etc action = action_parts[0] # develop args into a dictionary for later action_arg_list = action_parts[1].split("&") argdict = {"key": ""} for argument in action_arg_list: argparts = argument.split("=") argname = argument.split("=")[0] if len(argparts) > 1: value = argparts[1] value = value.replace("%2F", "/").replace("+", " ") else: value = "" argdict[argname] = value # convert %xx items from argument values scrubs = { "+": " ", "%20": " ", "%21": "!", '%23': "#", '%24': "$", "%26": "&", "%27": "'", "%28": "(", "%29": ")", "%2B": "+", "%2F": "/", "%3D": "=", "%3A": ":", "%3B": ";", "%40": "@", "%7E": "~", "%22": "\"", "%25": "%", "%3C": "<", "%3E": ">", "%3F": "?", "%5B": "[", "%5C": "\\", "%5E": "^", "%7C": "|", "%7B": "{", "%7D": "}", } for arguments in argdict: temparg = copy.copy(argdict[arguments]) for scrub in scrubs: temparg = temparg.replace(scrub, scrubs[scrub]) argdict[arguments] = temparg if action == "login": password = argdict["password"] remember_me = argdict["remember-me"] user = argdict["username"] if remember_me == "true": remember_me = True else: remember_me = False log_status = self.web.check_login(password) if log_status: key = self.web.make_key(remember_me, user) self.log.info( "%s/%s logged in to web mode (remember me: %s)" % ( self.addr[0], user, remember_me)) return {"session-key": key} elif log_status is None: return LookupError else: self.log.warning("%s failed to login" % self.addr[0]) return EOFError if action == "is_admin": if self.web.validate_key(argdict["key"]): return {"status": "good"} return EOFError if action == "logout": if self.web.validate_key(argdict["key"]): self.web.remove_key(argdict["key"]) self.web.storage.save() self.log.info("[%s] Logged out." % self.addr[0]) return "goodbye" return EOFError if action == "read_server_props": if not self.web.validate_key(argdict["key"]): return EOFError with open("%s/server.properties" % self.web.serverpath, 'r') as f: file_contents = f.read() return file_contents if action == "send_server_props": # no need for this # if not self.web.validate_key(argdict["key"]): # return EOFError prop = argdict["prop"] if self.web.props == "": self.web.props += prop else: self.web.props += '\n' + prop self.web.propsCount += 1 return "ok" if action == "save_server_props": if not self.web.validate_key(argdict["key"]): return EOFError prop_count = int(argdict["propCount"]) if prop_count != self.web.propsCount: return False props = copy.copy(self.web.props) self.web.props = "" self.web.propsCount = 0 with open("%s/server.properties" % self.web.serverpath, 'w') as f: f.write(props) return "ok" if action == "listdir": if not self.web.validate_key(argdict["key"]): return EOFError if not self.config["Web"]["web-allow-file-management"]: return EOFError safe = ".abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWYXZ0123456789_-/ " # noqa path_unfiltered = argdict["path"] path = "" for i in path_unfiltered: if i in safe: path += i if path == "": path = "." files = [] folders = [] try: listdir = os.listdir(path) except: return EOFError listdir.sort() for p in listdir: fullpath = path + "/" + p if p[-1] == "~": continue if p[0] == ".": continue if os.path.isdir(fullpath): folders.append( {"filename": p, "count": len(os.listdir(fullpath))}) else: files.append( {"filename": p, "size": os.path.getsize(fullpath)}) return {"files": files, "folders": folders} if action == "add_directory": if not self.web.validate_key(argdict["key"]): return EOFError if not self.config["Web"]["web-allow-file-management"]: return EOFError sourcefolder = argdict["source_dir"] newfolder = argdict["new_dir"] mkdir_p(sourcefolder + "/" + newfolder) return "ok" if action == "rename_file": if not self.web.validate_key(argdict["key"]): return EOFError if not self.config["Web"]["web-allow-file-management"]: return EOFError ren_file = argdict["path"] rename = argdict["rename"] if os.path.exists(ren_file): try: os.rename(ren_file, rename) except: print(traceback.format_exc()) return False return "ok" return False if action == "delete_file": if not self.web.validate_key(argdict["key"]): return EOFError if not self.config["Web"]["web-allow-file-management"]: return EOFError del_file = argdict["path"] if os.path.exists(del_file): try: if os.path.isdir(del_file): os.removedirs(del_file) else: os.remove(del_file) except Exception as ex: print(traceback.format_exc()) return str(ex) return "ok" return False if action == "halt_wrapper": # if not self.web.validate_key(argdict["key"]): # return EOFError self.wrapper.shutdown() if action == "get_player_skin": if not self.web.validate_key(argdict["key"]): return EOFError if not self.wrapper.proxymode: return {"error": "Proxy mode not enabled."} uuid = argdict["uuid"] if uuid in self.wrapper.proxy.skins: skin = self.wrapper.proxy.getskintexture(uuid) if skin: return skin else: return None else: return None if action == "admin_stats": if not self.web.validate_key(argdict["key"]): return EOFError if not self.wrapper.javaserver: return try: last_refresh = float(argdict["last_refresh"]) except ValueError: last_refresh = time.time() players = [] refresh_time = time.time() for i in self.wrapper.players: player = self.wrapper.players[i] players.append({ "name": i, "loggedIn": player.loggedIn, "uuid": str(player.mojangUuid), "isOp": player.isOp() }) plugins = [] for plugid in self.wrapper.plugins: plugin = self.wrapper.plugins[plugid] if plugin["good"]: if plugin["description"]: description = plugin["description"] else: description = None plugins.append({ "name": plugin["name"], "version": plugin["version"], "description": description, "summary": plugin["summary"], "author": plugin["author"], "website": plugin["website"], "id": plugid, "good": True }) else: plugins.append({ "name": plugin["name"], "good": False }) console_scrollback = [] for line in self.web.consoleScrollback: if line[0] > last_refresh: console_scrollback.append(line[1]) chat_scrollback = [] for line in self.web.chatScrollback: if line[0] > last_refresh: chat_scrollback.append(line[1]) memory_graph = [] for line in self.web.memoryGraph: if line[0] > last_refresh: memory_graph.append(line[1]) mem_use = self.wrapper.memory_usage() wrapper_peak_mem = mem_use["peak"] * 1000 wrapper_rss_mem = mem_use["rss"] * 1000 stats = {"playerCount": (len(self.wrapper.players), self.wrapper.proxy.maxplayers), "players": players, "plugins": plugins, "server_state": self.wrapper.javaserver.state, "wrapper_build": self.wrapper.getbuildstring(), "console": console_scrollback, "chat": chat_scrollback, "level_name": self.wrapper.javaserver.worldname, "server_version": self.wrapper.javaserver.version, "motd": self.wrapper.javaserver.motd, "last_refresh": refresh_time, "disk_avail": self.web.getdisk_usage(), "server_name": self.config["Web"]["server-name"], "server_memory": self.wrapper.javaserver.getmemoryusage(), "wrapper_memory_rss": wrapper_rss_mem, "wrapper_memory_peak": wrapper_peak_mem, "server_memory_graph": memory_graph, "world_size": self.wrapper.javaserver.worldsize } return stats if action == "console": if not self.web.validate_key(argdict["key"]): return EOFError command = argdict["execute"] self.wrapper.process_command(command, self.web.xplayer) self.log.info("[%s] Executed: %s" % (self.addr[0], argdict["execute"])) # noqa return True if action == "chat": if not self.web.validate_key(argdict["key"]): return EOFError message = argdict["message"] self.web.chatScrollback.append( (time.time(), {"type": "raw", "payload": "[%s] %s" % ( self.web.adminname, message)}) ) self.wrapper.javaserver.broadcast("&c[%s]&r %s" % ( self.web.adminname, message)) return True if action == "kick_player": if not self.web.validate_key(argdict["key"]): return EOFError player = argdict["player"] reason = argdict["reason"].split("%20") args = [player] args += reason payload = {"player": self.web.xplayer, "args": args, "command": "kick"} # noqa self.wrapper.commands.playercommand(payload) self.log.info("[WEB][%s] kicked %s with reason: %s" "" % (self.addr[0], player, " ".join(reason))) return True if action == "ban_player": if not self.web.validate_key(argdict["key"]): return EOFError player = argdict["player"] reason = argdict["reason"].split("%20") args = [player] args += reason self.log.info( "[%s] %s was banned with reason: %s" % ( self.addr[0], player, " ".join(reason)) ) payload = {"player": self.web.xplayer, "args": args, "command": "ban"} self.wrapper.commands.playercommand(payload) return True if action == "change_plugin": if not self.web.validate_key(argdict["key"]): return EOFError plugin = argdict["plugin"] state = argdict["state"] payload = {"player": self.web.xplayer, "args": "", "command": "reload"} if state == "enable": if plugin in self.wrapper.storage["disabled_plugins"]: for thisone in self.wrapper.storage["disabled_plugins"]: if plugin == self.wrapper.storage["disabled_plugins"][thisone]: # noqa del self.wrapper.storage["disabled_plugins"][thisone] # noqa break self.wrapper.wrapper_storage.save() self.log.info( "[%s] Set plugin enabled: '%s'" % ( self.addr[0], plugin) ) self.wrapper.commands.playercommand(payload) else: if plugin not in self.wrapper.storage["disabled_plugins"]: self.wrapper.storage["disabled_plugins"].append(plugin) self.wrapper.wrapper_storage.save() self.log.info( "[%s] Set plugin disabled: '%s'" % ( self.addr[0], plugin) ) self.wrapper.commands.playercommand(payload) if action == "reload_plugins": if not self.web.validate_key(argdict["key"]): return EOFError payload = {"player": self.web.xplayer, "args": "", "command": "reload"} self.wrapper.commands.playercommand(payload) return True if action == "reload_disabled_plugins": self.wrapper.storage["disabled_plugins"] = [] self.wrapper.wrapper_storage.save() payload = {"player": self.web.xplayer, "args": "", "command": "reload"} self.wrapper.commands.playercommand(payload) return True if action == "server_action": if not self.web.validate_key(argdict["key"]): return EOFError command = argdict["action"] if command == "stop": reason = argdict["reason"] self.wrapper.javaserver.stop_server_command(reason) self.log.info( "[%s] Server stop with reason: %s" % (self.addr[0], reason)) return "success" elif command == "restart": reason = argdict["reason"] self.wrapper.javaserver.restart(reason) self.log.info( "[%s] Server restart with reason: %s" % ( self.addr[0], reason) ) return "success" elif command == "start": self.wrapper.javaserver.start() self.log.info("[%s] Server started" % (self.addr[0])) return "success" elif command == "kill": self.wrapper.javaserver.kill("Server killed by Web module...") self.log.info("[%s] Server killed." % self.addr[0]) return "success" return {"error": "invalid_server_action"} return False
def run_action(self, request): # Entire requested action request_action = request.split("/")[2] or "" # split the action into two parts - action and args action_parts = request_action.split("?") # get the action - read_server_props, halt_wrapper, server_action, etc action = action_parts[0] # develop args into a dictionary for later action_arg_list = action_parts[1].split("&") argdict = {"key": ""} for argument in action_arg_list: argparts = argument.split("=") argname = argument.split("=")[0] if len(argparts) > 1: value = argparts[1] value = value.replace("%2F", "/").replace("+", " ") else: value = "" argdict[argname] = value # convert %xx items from argument values scrubs = { "+": " ", "%20": " ", "%21": "!", '%23': "#", '%24': "$", "%26": "&", "%27": "'", "%28": "(", "%29": ")", "%2B": "+", "%2F": "/", "%3D": "=", "%3A": ":", "%3B": ";", "%40": "@", "%7E": "~", "%22": "\"", "%25": "%", "%3C": "<", "%3E": ">", "%3F": "?", "%5B": "[", "%5C": "\\", "%5E": "^", "%7C": "|", "%7B": "{", "%7D": "}", } for arguments in argdict: temparg = copy.copy(argdict[arguments]) for scrub in scrubs: temparg = temparg.replace(scrub, scrubs[scrub]) argdict[arguments] = temparg if action == "login": password = argdict["password"] remember_me = argdict["remember-me"] user = argdict["username"] if remember_me == "true": remember_me = True else: remember_me = False log_status = self.web.check_login(password) if log_status: key = self.web.make_key(remember_me, user) self.log.info("%s/%s logged in to web mode (remember me: %s)" % (self.addr[0], user, remember_me)) return {"session-key": key} elif log_status is None: return LookupError else: self.log.warning("%s failed to login" % self.addr[0]) return EOFError if action == "is_admin": if self.web.validate_key(argdict["key"]): return {"status": "good"} return EOFError if action == "logout": if self.web.validate_key(argdict["key"]): self.web.remove_key(argdict["key"]) self.web.storage.save() self.log.info("[%s] Logged out." % self.addr[0]) return "goodbye" return EOFError if action == "read_server_props": if not self.web.validate_key(argdict["key"]): return EOFError with open("%s/server.properties" % self.web.serverpath, 'r') as f: file_contents = f.read() return file_contents if action == "send_server_props": # no need for this # if not self.web.validate_key(argdict["key"]): # return EOFError prop = argdict["prop"] if self.web.props == "": self.web.props += prop else: self.web.props += '\n' + prop self.web.propsCount += 1 return "ok" if action == "save_server_props": if not self.web.validate_key(argdict["key"]): return EOFError prop_count = int(argdict["propCount"]) if prop_count != self.web.propsCount: return False props = copy.copy(self.web.props) self.web.props = "" self.web.propsCount = 0 with open("%s/server.properties" % self.web.serverpath, 'w') as f: f.write(props) return "ok" if action == "listdir": if not self.web.validate_key(argdict["key"]): return EOFError if not self.config["Web"]["web-allow-file-management"]: return EOFError safe = ".abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWYXZ0123456789_-/ " # noqa path_unfiltered = argdict["path"] path = "" for i in path_unfiltered: if i in safe: path += i if path == "": path = "." files = [] folders = [] try: listdir = os.listdir(path) except: return EOFError listdir.sort() for p in listdir: fullpath = path + "/" + p if p[-1] == "~": continue if p[0] == ".": continue if os.path.isdir(fullpath): folders.append({ "filename": p, "count": len(os.listdir(fullpath)) }) else: files.append({ "filename": p, "size": os.path.getsize(fullpath) }) return {"files": files, "folders": folders} if action == "add_directory": if not self.web.validate_key(argdict["key"]): return EOFError if not self.config["Web"]["web-allow-file-management"]: return EOFError sourcefolder = argdict["source_dir"] newfolder = argdict["new_dir"] mkdir_p(sourcefolder + "/" + newfolder) return "ok" if action == "rename_file": if not self.web.validate_key(argdict["key"]): return EOFError if not self.config["Web"]["web-allow-file-management"]: return EOFError ren_file = argdict["path"] rename = argdict["rename"] if os.path.exists(ren_file): try: os.rename(ren_file, rename) except: print(traceback.format_exc()) return False return "ok" return False if action == "delete_file": if not self.web.validate_key(argdict["key"]): return EOFError if not self.config["Web"]["web-allow-file-management"]: return EOFError del_file = argdict["path"] if os.path.exists(del_file): try: if os.path.isdir(del_file): os.removedirs(del_file) else: os.remove(del_file) except Exception as ex: print(traceback.format_exc()) return str(ex) return "ok" return False if action == "halt_wrapper": # if not self.web.validate_key(argdict["key"]): # return EOFError self.wrapper.shutdown() if action == "get_player_skin": if not self.web.validate_key(argdict["key"]): return EOFError if not self.wrapper.proxymode: return {"error": "Proxy mode not enabled."} uuid = argdict["uuid"] if uuid in self.wrapper.proxy.skins: skin = self.wrapper.proxy.getskintexture(uuid) if skin: return skin else: return None else: return None if action == "admin_stats": if not self.web.validate_key(argdict["key"]): return EOFError if not self.wrapper.javaserver: return try: last_refresh = float(argdict["last_refresh"]) except ValueError: last_refresh = time.time() players = [] refresh_time = time.time() for i in self.wrapper.players: player = self.wrapper.players[i] players.append({ "name": i, "loggedIn": player.loggedIn, "uuid": str(player.mojangUuid), "isOp": player.isOp() }) plugins = [] for plugid in self.wrapper.plugins: plugin = self.wrapper.plugins[plugid] if plugin["good"]: if plugin["description"]: description = plugin["description"] else: description = None plugins.append({ "name": plugin["name"], "version": plugin["version"], "description": description, "summary": plugin["summary"], "author": plugin["author"], "website": plugin["website"], "id": plugid, "good": True }) else: plugins.append({"name": plugin["name"], "good": False}) console_scrollback = [] for line in self.web.consoleScrollback: if line[0] > last_refresh: console_scrollback.append(line[1]) chat_scrollback = [] for line in self.web.chatScrollback: if line[0] > last_refresh: chat_scrollback.append(line[1]) memory_graph = [] for line in self.web.memoryGraph: if line[0] > last_refresh: memory_graph.append(line[1]) mem_use = self.wrapper.memory_usage() wrapper_peak_mem = mem_use["peak"] * 1000 wrapper_rss_mem = mem_use["rss"] * 1000 stats = { "playerCount": (len(self.wrapper.players), self.wrapper.proxy.maxplayers), "players": players, "plugins": plugins, "server_state": self.wrapper.javaserver.state, "wrapper_build": self.wrapper.getbuildstring(), "console": console_scrollback, "chat": chat_scrollback, "level_name": self.wrapper.javaserver.worldname, "server_version": self.wrapper.javaserver.version, "motd": self.wrapper.javaserver.motd, "last_refresh": refresh_time, "disk_avail": self.web.getdisk_usage(), "server_name": self.config["Web"]["server-name"], "server_memory": self.wrapper.javaserver.getmemoryusage(), "wrapper_memory_rss": wrapper_rss_mem, "wrapper_memory_peak": wrapper_peak_mem, "server_memory_graph": memory_graph, "world_size": self.wrapper.javaserver.worldsize } return stats if action == "console": if not self.web.validate_key(argdict["key"]): return EOFError command = argdict["execute"] self.wrapper.process_command(command, self.web.xplayer) self.log.info("[%s] Executed: %s" % (self.addr[0], argdict["execute"])) # noqa return True if action == "chat": if not self.web.validate_key(argdict["key"]): return EOFError message = argdict["message"] self.web.chatScrollback.append((time.time(), { "type": "raw", "payload": "[%s] %s" % (self.web.adminname, message) })) self.wrapper.javaserver.broadcast("&c[%s]&r %s" % (self.web.adminname, message)) return True if action == "kick_player": if not self.web.validate_key(argdict["key"]): return EOFError player = argdict["player"] reason = argdict["reason"].split("%20") args = [player] args += reason payload = { "player": self.web.xplayer, "args": args, "command": "kick" } # noqa self.wrapper.commands.playercommand(payload) self.log.info("[WEB][%s] kicked %s with reason: %s" "" % (self.addr[0], player, " ".join(reason))) return True if action == "ban_player": if not self.web.validate_key(argdict["key"]): return EOFError player = argdict["player"] reason = argdict["reason"].split("%20") args = [player] args += reason self.log.info("[%s] %s was banned with reason: %s" % (self.addr[0], player, " ".join(reason))) payload = { "player": self.web.xplayer, "args": args, "command": "ban" } self.wrapper.commands.playercommand(payload) return True if action == "change_plugin": if not self.web.validate_key(argdict["key"]): return EOFError plugin = argdict["plugin"] state = argdict["state"] payload = { "player": self.web.xplayer, "args": "", "command": "reload" } if state == "enable": if plugin in self.wrapper.storage["disabled_plugins"]: for thisone in self.wrapper.storage["disabled_plugins"]: if plugin == self.wrapper.storage["disabled_plugins"][ thisone]: # noqa del self.wrapper.storage["disabled_plugins"][ thisone] # noqa break self.wrapper.wrapper_storage.save() self.log.info("[%s] Set plugin enabled: '%s'" % (self.addr[0], plugin)) self.wrapper.commands.playercommand(payload) else: if plugin not in self.wrapper.storage["disabled_plugins"]: self.wrapper.storage["disabled_plugins"].append(plugin) self.wrapper.wrapper_storage.save() self.log.info("[%s] Set plugin disabled: '%s'" % (self.addr[0], plugin)) self.wrapper.commands.playercommand(payload) if action == "reload_plugins": if not self.web.validate_key(argdict["key"]): return EOFError payload = { "player": self.web.xplayer, "args": "", "command": "reload" } self.wrapper.commands.playercommand(payload) return True if action == "reload_disabled_plugins": self.wrapper.storage["disabled_plugins"] = [] self.wrapper.wrapper_storage.save() payload = { "player": self.web.xplayer, "args": "", "command": "reload" } self.wrapper.commands.playercommand(payload) return True if action == "server_action": if not self.web.validate_key(argdict["key"]): return EOFError command = argdict["action"] if command == "stop": reason = argdict["reason"] self.wrapper.javaserver.stop_server_command(reason) self.log.info("[%s] Server stop with reason: %s" % (self.addr[0], reason)) return "success" elif command == "restart": reason = argdict["reason"] self.wrapper.javaserver.restart(reason) self.log.info("[%s] Server restart with reason: %s" % (self.addr[0], reason)) return "success" elif command == "start": self.wrapper.javaserver.start() self.log.info("[%s] Server started" % (self.addr[0])) return "success" elif command == "kill": self.wrapper.javaserver.kill("Server killed by Web module...") self.log.info("[%s] Server killed." % self.addr[0]) return "success" return {"error": "invalid_server_action"} return False