merge: chore/cleanup-remove-bloat-and-secrets into main
This commit is contained in:
commit
bde2f3a97d
1173 changed files with 437609 additions and 0 deletions
133
generate_env.py
Executable file
133
generate_env.py
Executable file
|
|
@ -0,0 +1,133 @@
|
|||
#!/usr/bin/env python3
|
||||
"""
|
||||
RMI Backend — Environment Generator
|
||||
====================================
|
||||
Generates /root/backend/.env from .env.example + Hermes .env matching keys.
|
||||
Also syncs from /root/.secrets/ where available.
|
||||
|
||||
Usage:
|
||||
python3 generate_env.py # Generate .env, show diff
|
||||
python3 generate_env.py --force # Overwrite existing .env
|
||||
"""
|
||||
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
BACKEND_DIR = Path("/root/backend")
|
||||
HERMES_ENV = Path("/root/.hermes/.env")
|
||||
SECRETS_DIR = Path("/root/.secrets")
|
||||
EXAMPLE = BACKEND_DIR / ".env.example"
|
||||
TARGET = BACKEND_DIR / ".env"
|
||||
|
||||
# Known key mappings between Hermes .env and backend .env
|
||||
KEY_MAP = {
|
||||
# Hermes key -> Backend key (or same if one name)
|
||||
"TELEGRAM_BOT_TOKEN": "BOT_TOKEN",
|
||||
}
|
||||
|
||||
|
||||
def load_env_file(path: Path) -> dict:
|
||||
"""Parse a .env file into a dict, handling basic quoting."""
|
||||
env = {}
|
||||
if not path.exists():
|
||||
return env
|
||||
for line in path.read_text().splitlines():
|
||||
line = line.strip()
|
||||
if not line or line.startswith("#") or "=" not in line:
|
||||
continue
|
||||
key, _, val = line.partition("=")
|
||||
key = key.strip()
|
||||
val = val.strip().strip('"').strip("'")
|
||||
if val:
|
||||
env[key] = val
|
||||
return env
|
||||
|
||||
|
||||
def get_secret(name: str) -> str:
|
||||
"""Read a secret from /root/.secrets/"""
|
||||
path = SECRETS_DIR / name
|
||||
if path.exists():
|
||||
return path.read_text().strip()
|
||||
# Try with _api_key suffix
|
||||
path = SECRETS_DIR / f"{name}_api_key"
|
||||
if path.exists():
|
||||
return path.read_text().strip()
|
||||
return ""
|
||||
|
||||
|
||||
def generate():
|
||||
hermes_env = load_env_file(HERMES_ENV)
|
||||
secrets_found = []
|
||||
|
||||
# Read example template
|
||||
if not EXAMPLE.exists():
|
||||
print(f"ERROR: {EXAMPLE} not found")
|
||||
sys.exit(1)
|
||||
|
||||
lines = EXAMPLE.read_text().splitlines()
|
||||
output = []
|
||||
filled = 0
|
||||
missing = 0
|
||||
|
||||
for line in lines:
|
||||
if "=" not in line or line.strip().startswith("#"):
|
||||
output.append(line)
|
||||
continue
|
||||
|
||||
key = line.split("=")[0].strip()
|
||||
val = ""
|
||||
|
||||
# Check Hermes env first
|
||||
if hermes_env.get(key):
|
||||
val = hermes_env[key]
|
||||
elif key in KEY_MAP and KEY_MAP[key] in hermes_env:
|
||||
val = hermes_env[KEY_MAP[key]]
|
||||
|
||||
# Check secrets
|
||||
if not val:
|
||||
secret_val = get_secret(key.lower())
|
||||
if secret_val:
|
||||
val = secret_val
|
||||
secrets_found.append(key)
|
||||
|
||||
if val:
|
||||
output.append(f"{key}={val}")
|
||||
filled += 1
|
||||
else:
|
||||
output.append(line)
|
||||
missing += 1
|
||||
|
||||
content = "\n".join(output) + "\n"
|
||||
|
||||
# Show what we found
|
||||
print(f"\n{'=' * 60}")
|
||||
print("Generated .env from:")
|
||||
print(f" Hermes .env: {len(hermes_env)} keys loaded")
|
||||
print(f" Secrets dir: {len(secrets_found)} found ({', '.join(secrets_found) if secrets_found else 'none'})")
|
||||
print(f" Result: {filled} filled, {missing} still empty")
|
||||
print(f"{'=' * 60}\n")
|
||||
|
||||
if missing > 0:
|
||||
print(f"⚠️ {missing} variables still need values. Check {TARGET}")
|
||||
|
||||
# Write
|
||||
if TARGET.exists() and "--force" not in sys.argv:
|
||||
print(f"\n{TARGET} already exists. Use --force to overwrite.")
|
||||
print("Showing diff instead:\n")
|
||||
existing = TARGET.read_text()
|
||||
import difflib
|
||||
|
||||
diff = difflib.unified_diff(
|
||||
existing.splitlines(keepends=True),
|
||||
content.splitlines(keepends=True),
|
||||
fromfile=str(TARGET),
|
||||
tofile="generated",
|
||||
)
|
||||
sys.stdout.writelines(diff)
|
||||
else:
|
||||
TARGET.write_text(content)
|
||||
print(f"✅ Written {TARGET}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
generate()
|
||||
Loading…
Add table
Add a link
Reference in a new issue