aboutsummaryrefslogtreecommitdiff
path: root/tools/cru-py/crupest/config.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/cru-py/crupest/config.py')
-rw-r--r--tools/cru-py/crupest/config.py134
1 files changed, 134 insertions, 0 deletions
diff --git a/tools/cru-py/crupest/config.py b/tools/cru-py/crupest/config.py
new file mode 100644
index 0000000..7a63e2a
--- /dev/null
+++ b/tools/cru-py/crupest/config.py
@@ -0,0 +1,134 @@
+import os
+import typing
+import uuid
+import random
+import string
+from dataclasses import dataclass
+
+from rich.prompt import Prompt
+
+from cru.config import Configuration
+from cru.parsing import SimpleLineConfigParser
+from .path import config_file_path
+
+
+@dataclass
+class ConfigurationMigrationInfo:
+ duplicate_item_in_old_config: list[str]
+ item
+
+
+class OldConfiguration:
+ def __init__(self, items: None | dict[str, str] = None) -> None:
+ self._items = items or {}
+
+ @staticmethod
+ def load_from_str(s: str) -> tuple["OldConfiguration", list[str, str]]:
+ d, duplicate = SimpleLineConfigParser().parse_to_dict(s, True)
+ return OldConfiguration(d), duplicate
+
+ def convert_to_new_config(self) -> Configuration:
+
+
+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_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),
+ ConfigVar("CRUPEST_GITHUB_TODO_COUNT",
+ "github todo count", "Please input your github todo count", 10),
+ ConfigVar("CRUPEST_V2RAY_TOKEN",
+ "v2ray user id", generate_uuid),
+ ConfigVar("CRUPEST_V2RAY_PATH",
+ "v2ray path, which will be prefixed by _", generate_uuid),
+ ConfigVar("CRUPEST_FORGEJO_MAILER_USER",
+ "Forgejo SMTP user.", "Please input your Forgejo SMTP user."),
+ ConfigVar("CRUPEST_FORGEJO_MAILER_PASSWD",
+ "Forgejo SMTP password.", "Please input your Forgejo SMTP password."),
+ ConfigVar("CRUPEST_2FAUTH_APP_KEY",
+ "2FAuth App Key.", generate_random_string_32),
+ ConfigVar("CRUPEST_2FAUTH_MAIL_USERNAME",
+ "2FAuth SMTP user.", "Please input your 2FAuth SMTP user."),
+ ConfigVar("CRUPEST_2FAUTH_MAIL_PASSWORD",
+ "2FAuth SMTP password.", "Please input your 2FAuth SMTP password."),
+]
+
+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[str]) -> tuple[bool, list[str], list[str]]:
+ 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 ensure_file(Paths.config_file_path, must_exist=False)
+
+
+def parse_config(str: str) -> dict[str, str]:
+ return ConfigMap().load_from_str(str).to_dict()
+
+
+def get_domain() -> str:
+ if configuration is None:
+ raise ValueError("Config file not found!")
+ return configuration.get_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}")