|
|
|
|
|
from __future__ import annotations |
|
|
|
|
|
import os |
|
|
from dataclasses import dataclass |
|
|
from pathlib import Path |
|
|
from typing import List |
|
|
|
|
|
from dotenv import load_dotenv |
|
|
|
|
|
|
|
|
load_dotenv() |
|
|
|
|
|
|
|
|
def _get_env_str(key: str, default: str) -> str: |
|
|
val = os.getenv(key, default) |
|
|
return val if isinstance(val, str) and val.strip() != "" else default |
|
|
|
|
|
def _get_env_int(key: str, default: int) -> int: |
|
|
raw = os.getenv(key) |
|
|
if raw is None or raw.strip() == "": |
|
|
return default |
|
|
try: |
|
|
return int(raw.strip()) |
|
|
except Exception: |
|
|
return default |
|
|
|
|
|
def _get_env_bool(key: str, default: bool) -> bool: |
|
|
raw = os.getenv(key) |
|
|
if raw is None: |
|
|
return default |
|
|
raw = raw.strip().lower() |
|
|
return raw in ("1", "true", "yes", "y", "on") |
|
|
|
|
|
def _get_env_list(key: str, default_csv: str) -> List[str]: |
|
|
raw = os.getenv(key, default_csv) |
|
|
items = [x.strip() for x in raw.split(",") if x.strip()] |
|
|
|
|
|
seen, out = set(), [] |
|
|
for x in items: |
|
|
xl = x.lower() |
|
|
if xl not in seen: |
|
|
seen.add(xl) |
|
|
out.append(x) |
|
|
return out |
|
|
|
|
|
|
|
|
ROOT: Path = Path(__file__).parent.resolve() |
|
|
DATA_DIR: Path = Path(_get_env_str("DATA_DIR", str(ROOT / "data"))).resolve() |
|
|
LOGS_DIR: Path = Path(_get_env_str("LOGS_DIR", str(ROOT / "logs"))).resolve() |
|
|
|
|
|
|
|
|
DATA_DIR.mkdir(parents=True, exist_ok=True) |
|
|
LOGS_DIR.mkdir(parents=True, exist_ok=True) |
|
|
|
|
|
|
|
|
HOST: str = _get_env_str("HOST", "localhost") |
|
|
PORT: int = _get_env_int("PORT", 8080) |
|
|
|
|
|
|
|
|
TIMEOUT_DEFAULT: int = _get_env_int("TIMEOUT_DEFAULT", 60) |
|
|
AUDIT_ENABLED: bool = _get_env_bool("AUDIT_ENABLED", True) |
|
|
|
|
|
_DELETE_MODE = _get_env_str("DELETE_MODE", "trash").lower() |
|
|
if _DELETE_MODE not in {"trash", "hard"}: |
|
|
_DELETE_MODE = "trash" |
|
|
DELETE_MODE: str = _DELETE_MODE |
|
|
|
|
|
PY_UNSAFE_DEFAULT: bool = _get_env_bool("PY_UNSAFE_DEFAULT", False) |
|
|
|
|
|
|
|
|
EXEC_ALLOWLIST: List[str] = _get_env_list( |
|
|
"EXEC_ALLOWLIST", |
|
|
"cmd,ipconfig,ping,tracert,where,tasklist,python,git", |
|
|
) |
|
|
|
|
|
|
|
|
__all__ = [ |
|
|
"ROOT", |
|
|
"DATA_DIR", |
|
|
"LOGS_DIR", |
|
|
"HOST", |
|
|
"PORT", |
|
|
"TIMEOUT_DEFAULT", |
|
|
"AUDIT_ENABLED", |
|
|
"DELETE_MODE", |
|
|
"PY_UNSAFE_DEFAULT", |
|
|
"EXEC_ALLOWLIST", |
|
|
] |
|
|
|