config.py 5.0 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
#coding:utf-8
# Copyright (c) 2019  PaddlePaddle Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import argparse
import json
import os
import re
import logging

from paddlehub.common import utils
from paddlehub.module.manager import default_module_manager
from paddlehub.commands.base_command import BaseCommand, ENTRY
from paddlehub.common.dir import CONF_HOME
from paddlehub.common.server_config import default_server_config
from paddlehub.common.logger import logger


class ConfigCommand(BaseCommand):
    name = "config"

    def __init__(self, name):
        super(ConfigCommand, self).__init__(name)
        self.show_in_help = True
        self.description = "Configure PaddleHub."
        self.parser = argparse.ArgumentParser(
            description=self.__class__.__doc__,
            prog='%s %s [COMMAND]' % (ENTRY, name),
            usage='%(prog)s',
            add_help=True)
        self.parser.add_argument("command")
        self.parser.add_argument("option", nargs="?")
        self.parser.add_argument("value", nargs="?")

    @staticmethod
    def show_config():
        print("The current configuration is shown below.")
        with open(os.path.join(CONF_HOME, "config.json"), "r") as fp:
            print(json.dumps(json.load(fp), indent=4))

    @staticmethod
    def set_server_url(server_url):
        with open(os.path.join(CONF_HOME, "config.json"), "r") as fp:
            config = json.load(fp)
            re_str = "^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~:/?#[\]@!\$&'\*\+,;=.]+$"
            if re.match(re_str, server_url) is not None:
                config["server_url"] = list([server_url])
                ConfigCommand.set_config(config)
            else:
                print("The format of the input url is invalid.")

    @staticmethod
    def set_config(config):
        with open(os.path.join(CONF_HOME, "config.json"), "w") as fp:
            fp.write(json.dumps(config))
        print("Set success! The current configuration is shown below.")
        print(json.dumps(config, indent=4))

    @staticmethod
    def show_server_url():
        with open(os.path.join(CONF_HOME, "config.json"), "r") as fp:
            config = json.load(fp)
            print(config["server_url"])

    @staticmethod
    def show_log_level():
        with open(os.path.join(CONF_HOME, "config.json"), "r") as fp:
            print(json.load(fp)["log_level"])

    @staticmethod
    def set_log_level(level):
        if level not in logging._nameToLevel.keys():
            print("Allowed values include: " + str(list(logging._nameToLevel.keys())))
            return
        with open(os.path.join(CONF_HOME, "config.json"), "r") as fp:
            current_config = json.load(fp)
        with open(os.path.join(CONF_HOME, "config.json"), "w") as fp:
            current_config["log_level"] = level
            fp.write(json.dumps(current_config))
            print("Set success! The current configuration is shown below.")
            print(json.dumps(current_config, indent=4))

        # logger.setLevel(level)

    @staticmethod
    def show_help():
        str = "config <option> <value>\n"
        str += "\tShow hub server config without any option.\n"
        str += "option:\n"
        str += "reset\n"
        str += "\tReset config as default.\n"
        str += "server\n"
        str += "\tShow server url.\n"
        str += "server [URL]\n"
        str += "\tSet hub server url as [URL].\n"
        str += "log\n"
        str += "\tShow log level.\n"
        str += "log [LEVEL]\n"
        str += "\tSet log level as [LEVEL:NOLOG, DEBUG, INFO, WARNING, ERROR, CRITICAL].\n"
        print(str)

    def execute(self, argv):
        # logger.setLevel("ERROR")
        # print(argv)
        args = self.parser.parse_args()
        # print(args)
        if args.option is None:
            ConfigCommand.show_config()
        elif args.option == "reset":
            ConfigCommand.set_config(default_server_config)
        elif args.option == "server":
            if args.value is not None:
                ConfigCommand.set_server_url(args.value)
            else:
                ConfigCommand.show_server_url()
        elif args.option == "log":
            if args.value is not None:
                ConfigCommand.set_log_level(args.value)
            else:
                ConfigCommand.show_log_level()
        else:
            ConfigCommand.show_help()
        return True


command = ConfigCommand.instance()