Files
Athena-Deck/deploy/provision.py
T

36 lines
1.5 KiB
Python

"""Executed interactively inside a one-shot container. Never prints credentials."""
import getpass
import os
from pathlib import Path
import secrets
import sys
from auth import CredentialStore
store = CredentialStore('/var/lib/deck/auth.json')
if store.read() is not None:
raise SystemExit('Zugangsdaten existieren bereits; keine Überschreibung.')
if not sys.stdin.isatty():
raise SystemExit('Interaktives Terminal benötigt. Keine Kennwörter als Argumente übergeben.')
password = getpass.getpass('Neues Oberflächenkennwort (mindestens 16 Zeichen): ')
repeat = getpass.getpass('Kennwort wiederholen: ')
if password != repeat:
raise SystemExit('Kennwörter stimmen nicht überein.')
token = getpass.getpass('API-Token (mindestens 32 Zeichen; leer = sicher erzeugen): ')
generated = not token
if generated:
token = 'ad_' + secrets.token_hex(32)
if generated and Path('/bootstrap/api-token.txt').exists():
raise SystemExit('Bootstrap-Datei existiert bereits; keine Überschreibung.')
try:
record = store.setup(password, token)
except ValueError as exc:
raise SystemExit(str(exc)) from None
if generated:
path = Path('/bootstrap/api-token.txt')
fd = os.open(path, os.O_WRONLY | os.O_CREAT | os.O_EXCL, 0o600)
with os.fdopen(fd,'w') as stream:
stream.write(token+'\n')
print('API-Token wurde geschützt in der Bootstrap-Datei abgelegt (nicht ausgegeben).')
print('Zugang eingerichtet. Kennwort und API-Token sind in der Anwendung nur als Prüfwerte gespeichert.')