Add isolated Debian installer with credential setup and guarded updates
This commit is contained in:
@@ -0,0 +1,35 @@
|
||||
"""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.')
|
||||
Reference in New Issue
Block a user