aboutsummaryrefslogtreecommitdiff
path: root/tool/modules/config.py
blob: b9ad8180220fd4989d41570cf40cf486a3746008 (plain)
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
import pwd
import grp
import os
import typing
from rich.prompt import Prompt
from .path import config_file_path


class ConfigVar:
    def __init__(self, name: str, description: str, default_value_generator: typing.Callable[[], str] | str, /, default_value_for_ask=str | None):
        """Create a config var.

        Args:
            name (str): The name of the config var.
            description (str): The description of the config var.
            default_value_generator (typing.Callable[[], str] | str): The default value generator of the config var. If it is a string, it will be used as the input prompt and let user input the value.
        """
        self.name = name
        self.description = description
        self.default_value_generator = default_value_generator
        self.default_value_for_ask = default_value_for_ask

    def get_default_value(self, /, console):
        if isinstance(self.default_value_generator, str):
            return Prompt.ask(self.default_value_generator, console=console, default=self.default_value_for_ask)
        else:
            return self.default_value_generator()


config_var_list: list = [
    ConfigVar("CRUPEST_DOMAIN", "domain name",
              "Please input your domain name"),
    ConfigVar("CRUPEST_EMAIL", "admin email address",
              "Please input your email address"),
    ConfigVar("CRUPEST_USER", "your system account username",
              lambda: pwd.getpwuid(os.getuid()).pw_name),
    ConfigVar("CRUPEST_GROUP", "your system account group name",
              lambda: grp.getgrgid(os.getgid()).gr_name),
    ConfigVar("CRUPEST_UID", "your system account uid",
              lambda: str(os.getuid())),
    ConfigVar("CRUPEST_GID", "your system account gid",
              lambda: str(os.getgid())),
    ConfigVar("CRUPEST_HALO_DB_PASSWORD",
              "password for halo h2 database, once used never change it", lambda: os.urandom(8).hex()),
    ConfigVar("CRUPEST_IN_CHINA",
              "set to true if you are in China, some network optimization will be applied", lambda: "false"),
    ConfigVar("CRUPEST_AUTO_BACKUP_COS_SECRET_ID",
              "access key id for Tencent COS, used for auto backup", "Please input your Tencent COS access key id for backup"),
    ConfigVar("CRUPEST_AUTO_BACKUP_COS_SECRET_KEY",
              "access key secret for Tencent COS, used for auto backup", "Please input your Tencent COS access key for backup"),
    ConfigVar("CRUPEST_AUTO_BACKUP_COS_REGION",
              "region for Tencent COS, used for auto backup", "Please input your Tencent COS region for backup", "ap-hongkong"),
    ConfigVar("CRUPEST_AUTO_BACKUP_BUCKET_NAME",
              "bucket name for Tencent COS, used for auto backup", "Please input your Tencent COS bucket name for backup"),
    ConfigVar("CRUPEST_GITHUB_USERNAME",
              "github username for fetching todos", "Please input your github username for fetching todos", "crupest"),
    ConfigVar("CRUPEST_GITHUB_PROJECT_NUMBER",
              "github project number for fetching todos", "Please input your github project number for fetching todos", "2"),
    ConfigVar("CRUPEST_GITHUB_TOKEN",
              "github token for fetching todos", "Please input your github token for fetching todos"),
    ConfigVar("CRUPEST_GITHUB_TODO_COUNT",
              "github todo count", "Please input your github todo count", 10),
]

config_var_name_set = set([config_var.name for config_var in config_var_list])


def check_config_var_set(needed_config_var_set: set):
    more = []
    less = []
    for var_name in needed_config_var_set:
        if var_name not in config_var_name_set:
            more.append(var_name)
    for var_name in config_var_name_set:
        if var_name not in needed_config_var_set:
            less.append(var_name)
    return (True if len(more) == 0 else False, more, less)


def config_file_exists():
    return os.path.isfile(config_file_path)


def parse_config(str: str) -> dict:
    config = {}
    for line_number, line in enumerate(str.splitlines()):
        # check if it's a comment
        if line.startswith("#"):
            continue
        # check if there is a '='
        if line.find("=") == -1:
            raise ValueError(
                f"Invalid config string. Please check line {line_number + 1}. There is even no '='!")
        # split at first '='
        key, value = line.split("=", 1)
        key = key.strip()
        value = value.strip()
        config[key] = value
    return config


def get_domain() -> str:
    if not config_file_exists():
        raise ValueError("Config file not found!")
    with open(config_file_path) as f:
        config = parse_config(f.read())
    if "CRUPEST_DOMAIN" not in config:
        raise ValueError("Domain not found in config file!")
    return config["CRUPEST_DOMAIN"]


def config_to_str(config: dict) -> str:
    return "\n".join([f"{key}={value}" for key, value in config.items()])


def print_config(console, config: dict) -> None:
    for key, value in config.items():
        console.print(f"[magenta]{key}[/] = [cyan]{value}")