Add isolated Debian installer with credential setup and guarded updates

This commit is contained in:
Mikei386
2026-09-28 15:35:17 +02:00
parent e1a54e3485
commit 2ad844ed20
12 changed files with 618 additions and 8 deletions
+35
View File
@@ -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.')