Files
playwish/server/verwaltung.py
T
99admandClaude Opus 5.5 fc15f2b933 Umbenennung: Audiofy heißt jetzt Playwish
Name, Seitentitel, Dienste (playwish-web, playwish-controller), Dienst-Benutzer
(playwish), Pfade (/opt/playwish, /usr/local/src/playwish), Vorlagen und
Repository-Adresse. „Audiofy“ war bereits von mehreren Produkten belegt.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 20:27:59 +01:00

72 lines
2.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python3
"""Playwish-Web – Verwaltung auf der Kommandozeile.
geheimnisse SESSION_SECRET und PLAYER_API_TOKEN erzeugen (nur falls noch nicht vorhanden)
passwort Admin-Passwort setzen (verdeckte Eingabe, gespeichert wird nur der argon2-Hash)
turnstile Cloudflare-Turnstile-Schlüssel setzen (Secret-Key verdeckt)
Auf dem Server als Dienst-Benutzer ausführen, damit die .env ihm gehört:
sudo -u playwish /opt/playwish/.venv/bin/python /opt/playwish/app/verwaltung.py passwort
"""
import argparse
import getpass
import os
import secrets
import sys
from pathlib import Path
from argon2 import PasswordHasher
sys.path.insert(0, str(Path(__file__).resolve().parent))
from app.config import env_lesen, env_wert_setzen # noqa: E402
MIN_LAENGE = 12
def geheimnisse(env: Path) -> None:
werte = env_lesen(env) if env.is_file() else {}
if werte.get("PI_API_TOKEN") and not werte.get("PLAYER_API_TOKEN"):
# alten Namen übernehmen, damit ein bereits eingerichteter Player weiterläuft
env_wert_setzen(env, "PLAYER_API_TOKEN", werte["PI_API_TOKEN"])
werte["PLAYER_API_TOKEN"] = werte["PI_API_TOKEN"]
print("PLAYER_API_TOKEN: aus PI_API_TOKEN übernommen")
for key in ("SESSION_SECRET", "PLAYER_API_TOKEN"):
if werte.get(key):
print(f"{key}: schon vorhanden – unverändert")
else:
env_wert_setzen(env, key, secrets.token_urlsafe(48))
print(f"{key}: neu erzeugt")
def passwort(env: Path) -> None:
erstes = getpass.getpass("Neues Admin-Passwort: ")
if len(erstes) < MIN_LAENGE:
sys.exit(f"Zu kurz – mindestens {MIN_LAENGE} Zeichen.")
if getpass.getpass("Wiederholen: ") != erstes:
sys.exit("Die Eingaben stimmen nicht überein.")
env_wert_setzen(env, "ADMIN_PASSWORD_HASH", PasswordHasher().hash(erstes))
print(f"Passwort-Hash in {env} gespeichert. Bitte den Dienst neu starten (playwish-web.service).")
def turnstile(env: Path) -> None:
site_key = input("Turnstile Site-Key (öffentlich): ").strip()
secret = getpass.getpass("Turnstile Secret-Key (verdeckt): ").strip()
if not site_key or not secret:
sys.exit("Beide Schlüssel sind nötig.")
env_wert_setzen(env, "TURNSTILE_SITE_KEY", site_key)
env_wert_setzen(env, "TURNSTILE_SECRET_KEY", secret)
print(f"Turnstile-Schlüssel in {env} gespeichert. Bitte den Dienst neu starten (playwish-web.service).")
def main() -> None:
parser = argparse.ArgumentParser(description="Playwish-Web – Verwaltung")
parser.add_argument("aktion", choices=("geheimnisse", "passwort", "turnstile"))
parser.add_argument("--env", type=Path, default=Path(os.environ.get("PLAYWISH_ENV", "/opt/playwish/.env")))
args = parser.parse_args()
{"geheimnisse": geheimnisse, "passwort": passwort, "turnstile": turnstile}[args.aktion](args.env)
if __name__ == "__main__":
main()