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 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()
Exemple #4
0
 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()
Exemple #5
0
 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)
Exemple #7
0
 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")
Exemple #9
0
 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 __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 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"])
Exemple #16
0
 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"])
Exemple #17
0
    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
Exemple #19
0
 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)