release: 0.2.2

This commit is contained in:
2026-01-15 17:24:54 +01:00
parent fb096f7897
commit 835244b7e0
134 changed files with 563 additions and 168 deletions

1
.gitignore vendored
View File

@ -3,6 +3,7 @@ __pycache__/
*$py.class *$py.class
.venv/ .venv/
upload.token upload.token
update-addon.env
venv/ venv/
ENV/ ENV/
.env .env

View File

@ -1,4 +1,4 @@
ID: DOC_000001 | Version: 0.2.1 | Status: Final ID: DOC_000001 | Version: 0.2.2 | Status: Final
By: Codex (GPT-5) By: Codex (GPT-5)
# Projekt-Logbuch (Changelog) # Projekt-Logbuch (Changelog)
@ -76,6 +76,12 @@ By: Codex (GPT-5)
| 15.01.2026 | 🏗️ Planning | ID: US_000048/TASK_000057 Release-Upload automatisieren. By: Codex (GPT-5) | | 15.01.2026 | 🏗️ Planning | ID: US_000048/TASK_000057 Release-Upload automatisieren. By: Codex (GPT-5) |
| 15.01.2026 | ⚙️ Code | ID: Release-Upload Script hinzugefuegt (tar.gz + curl). By: Codex (GPT-5) | | 15.01.2026 | ⚙️ Code | ID: Release-Upload Script hinzugefuegt (tar.gz + curl). By: Codex (GPT-5) |
| 15.01.2026 | ⚙️ Code | ID: Upload-Script toleriert fehlende Leserechte fuer /etc/skd/*. By: Codex (GPT-5) | | 15.01.2026 | ⚙️ Code | ID: Upload-Script toleriert fehlende Leserechte fuer /etc/skd/*. By: Codex (GPT-5) |
| 15.01.2026 | 🏗️ Planning | ID: US_000049/TASK_000058 deployment.env fuer lokale Uploads. By: Codex (GPT-5) |
| 15.01.2026 | ⚙️ Code | ID: deployment.env.example hinzugefuegt und Scripts angepasst. By: Codex (GPT-5) |
| 15.01.2026 | ⚙️ Code | ID: deployment.env als lokale Quelle fuer Enrollment/Upload Scripts. By: Codex (GPT-5) |
| 15.01.2026 | ⚙️ Code | ID: EPIC_000013 System Telemetry Endpoint und UI umgesetzt. By: Codex (GPT-5) |
| 15.01.2026 | 📝 Req | ID: EPIC_000009 Update Webservice als erledigt markiert. By: Codex (GPT-5) |
| 15.01.2026 | 🚀 Release | ID: VERSION auf 0.2.2 erhoeht. By: Codex (GPT-5) |
| 15.01.2026 | ⚙️ Code | ID: Makefile restart-Target hinzugefuegt. By: Codex (GPT-5) | | 15.01.2026 | ⚙️ Code | ID: Makefile restart-Target hinzugefuegt. By: Codex (GPT-5) |
--- ---

View File

@ -1,4 +1,4 @@
ID: README_000001 | Version: 0.2.1 | Status: Draft ID: README_000001 | Version: 0.2.2 | Status: Draft
By: Codex (GPT-5) By: Codex (GPT-5)
# Safe Kiddo Daemon # Safe Kiddo Daemon

View File

@ -1 +1 @@
0.2.1 0.2.2

View File

@ -28,11 +28,13 @@ from backend.models import (
UpdateLogEntry, UpdateLogEntry,
UpdateServiceStatus, UpdateServiceStatus,
UpdateStatus, UpdateStatus,
SystemMetrics,
UserStatus, UserStatus,
) )
from backend.oidc import OIDCClient, OIDCError from backend.oidc import OIDCClient, OIDCError
from backend.settings import Settings, get_settings from backend.settings import Settings, get_settings
from backend import update from backend import update
from backend import system_metrics
logging.basicConfig( logging.basicConfig(
level=logging.INFO, level=logging.INFO,
@ -321,6 +323,12 @@ def update_service_status(settings: Settings = Depends(get_settings)) -> UpdateS
return UpdateServiceStatus(**data) return UpdateServiceStatus(**data)
@app.get("/system/metrics", response_model=SystemMetrics, dependencies=[Depends(get_current_admin)])
def system_metrics_status() -> SystemMetrics:
data = system_metrics.get_system_metrics()
return SystemMetrics(**data)
@app.get("/", response_class=HTMLResponse) @app.get("/", response_class=HTMLResponse)
@app.get("/login", response_class=HTMLResponse) @app.get("/login", response_class=HTMLResponse)
@app.get("/dashboard", response_class=HTMLResponse) @app.get("/dashboard", response_class=HTMLResponse)

View File

@ -82,3 +82,14 @@ class UpdateServiceStatus(BaseModel):
error: Optional[str] = None error: Optional[str] = None
checked_url: str checked_url: str
environment: str environment: str
class SystemMetrics(BaseModel):
cpu_percent: float
ram_total_mb: float
ram_used_percent: float
gpu_vram_total_mb: Optional[float] = None
gpu_vram_used_percent: Optional[float] = None
gpu_present: bool = False
net_rx_mbps: float
net_tx_mbps: float

139
backend/system_metrics.py Normal file
View File

@ -0,0 +1,139 @@
import time
import shutil
import subprocess
from typing import Any, Dict, Optional, Tuple
_last_cpu: Optional[Tuple[float, float]] = None
_last_net: Optional[Tuple[float, float, float]] = None
def _read_cpu_times() -> Tuple[float, float]:
with open("/proc/stat", "r", encoding="utf-8") as handle:
line = handle.readline()
parts = line.strip().split()
if not parts or parts[0] != "cpu":
return 0.0, 0.0
values = [float(p) for p in parts[1:]]
total = sum(values)
idle = values[3] if len(values) > 3 else 0.0
return total, idle
def _cpu_percent() -> float:
global _last_cpu
total, idle = _read_cpu_times()
if _last_cpu is None:
_last_cpu = (total, idle)
return 0.0
last_total, last_idle = _last_cpu
_last_cpu = (total, idle)
delta_total = total - last_total
delta_idle = idle - last_idle
if delta_total <= 0:
return 0.0
return max(0.0, min(100.0, (delta_total - delta_idle) / delta_total * 100.0))
def _read_meminfo() -> Dict[str, float]:
data: Dict[str, float] = {}
with open("/proc/meminfo", "r", encoding="utf-8") as handle:
for line in handle:
key, value = line.split(":", 1)
parts = value.strip().split()
if not parts:
continue
data[key] = float(parts[0])
return data
def _read_net_bytes() -> Tuple[float, float]:
rx_total = 0.0
tx_total = 0.0
with open("/proc/net/dev", "r", encoding="utf-8") as handle:
for line in handle:
if ":" not in line:
continue
iface, stats = line.split(":", 1)
iface = iface.strip()
if iface == "lo":
continue
fields = stats.split()
if len(fields) < 16:
continue
rx_total += float(fields[0])
tx_total += float(fields[8])
return rx_total, tx_total
def _net_mbps() -> Tuple[float, float]:
global _last_net
now = time.time()
rx, tx = _read_net_bytes()
if _last_net is None:
_last_net = (now, rx, tx)
return 0.0, 0.0
last_time, last_rx, last_tx = _last_net
_last_net = (now, rx, tx)
delta_t = now - last_time
if delta_t <= 0:
return 0.0, 0.0
rx_mbps = (rx - last_rx) * 8.0 / (delta_t * 1_000_000.0)
tx_mbps = (tx - last_tx) * 8.0 / (delta_t * 1_000_000.0)
return max(0.0, rx_mbps), max(0.0, tx_mbps)
def _gpu_metrics() -> Dict[str, Any]:
if not shutil.which("nvidia-smi"):
return {
"gpu_vram_total_mb": None,
"gpu_vram_used_percent": None,
"gpu_present": False,
}
try:
output = subprocess.check_output(
[
"nvidia-smi",
"--query-gpu=memory.total,memory.used",
"--format=csv,noheader,nounits",
],
text=True,
).strip()
if not output:
raise ValueError("empty nvidia-smi output")
total_str, used_str = output.split(",", 1)
total_mb = float(total_str.strip())
used_mb = float(used_str.strip())
used_percent = 0.0 if total_mb == 0 else used_mb / total_mb * 100.0
return {
"gpu_vram_total_mb": total_mb,
"gpu_vram_used_percent": used_percent,
"gpu_present": True,
}
except Exception:
return {
"gpu_vram_total_mb": None,
"gpu_vram_used_percent": None,
"gpu_present": False,
}
def get_system_metrics() -> Dict[str, Any]:
meminfo = _read_meminfo()
total_kb = meminfo.get("MemTotal", 0.0)
available_kb = meminfo.get("MemAvailable", 0.0)
used_kb = max(0.0, total_kb - available_kb)
ram_total_mb = total_kb / 1024.0
ram_used_percent = 0.0 if total_kb == 0 else used_kb / total_kb * 100.0
cpu_percent = _cpu_percent()
rx_mbps, tx_mbps = _net_mbps()
gpu = _gpu_metrics()
return {
"cpu_percent": cpu_percent,
"ram_total_mb": ram_total_mb,
"ram_used_percent": ram_used_percent,
"net_rx_mbps": rx_mbps,
"net_tx_mbps": tx_mbps,
**gpu,
}

View File

@ -95,6 +95,30 @@
</div> </div>
</div> </div>
<!-- System Information Section -->
<section id="systemSection" class="panel-section hidden">
<h3><i data-lucide="monitor"></i> System Information</h3>
<div class="metrics" id="systemMetrics">
<div class="metric-card" id="metricCpu">
<div class="label"><i data-lucide="cpu"></i> CPU</div>
<div class="value">-</div>
</div>
<div class="metric-card" id="metricRam">
<div class="label"><i data-lucide="memory-stick"></i> RAM</div>
<div class="value">-</div>
</div>
<div class="metric-card" id="metricGpu">
<div class="label"><i data-lucide="monitor"></i> GPU</div>
<div class="value">-</div>
</div>
<div class="metric-card" id="metricNet">
<div class="label"><i data-lucide="network"></i> Netzwerk</div>
<div class="value">-</div>
</div>
</div>
<div class="text-muted" style="font-size: 0.75rem; margin-top: 0.5rem;">Aktualisierung alle 5 Sekunden.</div>
</section>
<!-- User Management Section --> <!-- User Management Section -->
<section id="userSection" class="panel-section hidden"> <section id="userSection" class="panel-section hidden">
<h3><i data-lucide="users"></i> Nutzerverwaltung</h3> <h3><i data-lucide="users"></i> Nutzerverwaltung</h3>
@ -326,14 +350,24 @@
showApp(); showApp();
document.getElementById('userSection').classList.remove('hidden'); document.getElementById('userSection').classList.remove('hidden');
document.getElementById('updateSection').classList.remove('hidden'); document.getElementById('updateSection').classList.remove('hidden');
document.getElementById('systemSection').classList.remove('hidden');
await refreshUsers(); await refreshUsers();
await refreshUpdateStatus(); await refreshUpdateStatus();
await refreshSystemMetrics();
if (!window.systemMetricsTimer) {
window.systemMetricsTimer = setInterval(refreshSystemMetrics, 5000);
}
return true; return true;
} catch (err) { } catch (err) {
document.getElementById('currentUser').textContent = 'Nicht angemeldet'; document.getElementById('currentUser').textContent = 'Nicht angemeldet';
showLanding(); showLanding();
document.getElementById('userSection').classList.add('hidden'); document.getElementById('userSection').classList.add('hidden');
document.getElementById('updateSection').classList.add('hidden'); document.getElementById('updateSection').classList.add('hidden');
document.getElementById('systemSection').classList.add('hidden');
if (window.systemMetricsTimer) {
clearInterval(window.systemMetricsTimer);
window.systemMetricsTimer = null;
}
return false; return false;
} }
} }
@ -513,6 +547,29 @@
} }
} }
async function refreshSystemMetrics() {
try {
const data = await api('/system/metrics');
document.querySelector('#metricCpu .value').textContent = `${data.cpu_percent.toFixed(1)}%`;
const ramGb = data.ram_total_mb / 1024.0;
document.querySelector('#metricRam .value').textContent = `${data.ram_used_percent.toFixed(1)}% (${ramGb.toFixed(1)} GB)`;
if (data.gpu_present && data.gpu_vram_total_mb) {
const gpuGb = data.gpu_vram_total_mb / 1024.0;
const gpuPct = data.gpu_vram_used_percent ?? 0;
document.querySelector('#metricGpu .value').textContent = `${gpuPct.toFixed(1)}% (${gpuGb.toFixed(1)} GB)`;
} else {
document.querySelector('#metricGpu .value').textContent = 'Nicht verfuegbar';
}
document.querySelector('#metricNet .value').textContent = `${data.net_rx_mbps.toFixed(1)} / ${data.net_tx_mbps.toFixed(1)} Mbps`;
lucide.createIcons();
} catch (err) {
document.querySelector('#metricCpu .value').textContent = 'Fehler';
document.querySelector('#metricRam .value').textContent = 'Fehler';
document.querySelector('#metricGpu .value').textContent = 'Fehler';
document.querySelector('#metricNet .value').textContent = 'Fehler';
}
}
// Event listeners // Event listeners
document.getElementById('loginForm').addEventListener('submit', async (e) => { document.getElementById('loginForm').addEventListener('submit', async (e) => {
e.preventDefault(); e.preventDefault();

View File

@ -1,4 +1,4 @@
ID: DOC_000012 | Version: 0.2.1 | Status: Draft ID: DOC_000012 | Version: 0.2.2 | Status: Draft
By: Codex (GPT-5) By: Codex (GPT-5)
# Architektur # Architektur

View File

@ -1,4 +1,4 @@
ID: DOC_000011 | Version: 0.2.1 | Status: Draft ID: DOC_000011 | Version: 0.2.2 | Status: Draft
By: Codex (GPT-5) By: Codex (GPT-5)
# Konfiguration # Konfiguration
@ -6,7 +6,8 @@ By: Codex (GPT-5)
## Speicherort ## Speicherort
Die Konfiguration erfolgt per ENV-Dateien: Die Konfiguration erfolgt per ENV-Dateien:
- `/etc/skd/env` (Core-App, Vorlage: `env.example`) - `/etc/skd/env` (Core-App, Vorlage: `env.example`)
- `/etc/skd/update.env` (Update-Service, Vorlage: `env.update.example`) - `/etc/skd/update.env` (Update-Service fuer Laufzeit, Vorlage: `env.update.example`)
- `update-addon.env` (lokal fuer Upload/Enrollment, Vorlage: `update-addon.env.example`)
## Authentifizierung ## Authentifizierung
- `SKD_AUTH_MODE` (default `pam`): `pam` oder `oidc`. Ungueltige Werte fallen auf `pam` zurueck. Hinweis: Der Wert wird aktuell nicht zur Erzwingung genutzt; OIDC ist aktiv, sobald die OIDC-Variablen gesetzt sind. - `SKD_AUTH_MODE` (default `pam`): `pam` oder `oidc`. Ungueltige Werte fallen auf `pam` zurueck. Hinweis: Der Wert wird aktuell nicht zur Erzwingung genutzt; OIDC ist aktiv, sobald die OIDC-Variablen gesetzt sind.
@ -67,6 +68,8 @@ Hinweis: OIDC ist aktiv, sobald Issuer, Client-ID und Secret gesetzt sind.
- `SKD_UPDATE_STATUS_FILE` (default `/var/lib/skd/update_status.json`) - `SKD_UPDATE_STATUS_FILE` (default `/var/lib/skd/update_status.json`)
- `SKD_UPDATE_LOG_FILE` (default `/var/lib/skd/update_logs.jsonl`) - `SKD_UPDATE_LOG_FILE` (default `/var/lib/skd/update_logs.jsonl`)
- `SKD_UPDATE_INTERVAL` (default `3600`): Hinweis: wird aktuell nur eingelesen, aber nicht automatisch genutzt. - `SKD_UPDATE_INTERVAL` (default `3600`): Hinweis: wird aktuell nur eingelesen, aber nicht automatisch genutzt.
- `SKD_UPDATE_UPLOAD_TOKEN` (optional; fuer Release-Upload)
- `SKD_UPDATE_UPLOAD_TOKEN_FILE` (optional; z.B. `/etc/skd/update.upload.token`)
## Dry-Run ## Dry-Run
- `SKD_DRY_RUN` (default `false`): Keine echten System-Aktionen, nur Logging. - `SKD_DRY_RUN` (default `false`): Keine echten System-Aktionen, nur Logging.

View File

@ -1,4 +1,4 @@
ID: DOC_000014 | Version: 0.2.1 | Status: Draft ID: DOC_000014 | Version: 0.2.2 | Status: Draft
By: Codex (GPT-5) By: Codex (GPT-5)
# Deployment # Deployment
@ -94,13 +94,31 @@ Hinweis: Der Update-Check ist erst moeglich, wenn der Langzeit-Token gespeichert
Enrollment-Tools: Enrollment-Tools:
- `scripts/manual_enroll.py`: Enrollment direkt gegen den Update-Service, schreibt Token in `SKD_UPDATE_TOKEN_FILE`. - `scripts/manual_enroll.py`: Enrollment direkt gegen den Update-Service, schreibt Token in `SKD_UPDATE_TOKEN_FILE`.
- `scripts/enroll_local.py`: Enrollment ueber die lokale API (`/update/enroll`), benoetigt Admin-Session; `--token` setzen (Default-Token ist nur Prototyp-Altlast). - `scripts/enroll_local.py`: Enrollment ueber die lokale API (`/update/enroll`), benoetigt Admin-Session; `--token` setzen (Default-Token ist nur Prototyp-Altlast).
- `scripts/enroll_update_service.sh`: Holt den Langzeit-Token per curl vom Update-Service (liest `/etc/skd/env`). - `scripts/enroll_update_service.sh`: Holt den Langzeit-Token per curl vom Update-Service (liest `update-addon.env`).
Beispiel (curl-Script): Beispiel (curl-Script):
```bash ```bash
sudo ./scripts/enroll_update_service.sh --enroll-token "enroll_example" sudo ./scripts/enroll_update_service.sh --enroll-token "enroll_example"
``` ```
## Release-Upload (Dev/Prod)
Fuer Dev/Prod Uploads kann ein Release-Archiv (tar.gz) automatisiert gebaut und hochgeladen werden.
Beispiel:
```bash
./scripts/upload_release.sh --profile dev
```
Token-Quelle:
- `update-addon.env` (z.B. `DEV_UPDATE_UPLOAD_TOKEN_FILE=./upload.token`).
## Lokale update-addon.env
Fuer lokale Tests kann eine `update-addon.env` im Repo genutzt werden (gitignored).
Beispiel:
```bash
cp update-addon.env.example update-addon.env
```
Lokale Status/Logs: Lokale Status/Logs:
- `SKD_UPDATE_STATUS_FILE` (default `/var/lib/skd/update_status.json`) - `SKD_UPDATE_STATUS_FILE` (default `/var/lib/skd/update_status.json`)
- `SKD_UPDATE_LOG_FILE` (default `/var/lib/skd/update_logs.jsonl`) - `SKD_UPDATE_LOG_FILE` (default `/var/lib/skd/update_logs.jsonl`)

View File

@ -1,4 +1,4 @@
ID: DOC_000013 | Version: 0.2.1 | Status: Draft ID: DOC_000013 | Version: 0.2.2 | Status: Draft
By: Codex (GPT-5) By: Codex (GPT-5)
# Development # Development
@ -23,6 +23,20 @@ Standard: `0.0.0.0:80`. Fuer andere Ports:
HOST=127.0.0.1 PORT=8000 ./scripts/run.sh HOST=127.0.0.1 PORT=8000 ./scripts/run.sh
``` ```
## Release-Upload (Dev/Prod)
Das Update-Artefakt wird als tar.gz gebaut und ueber den Update-Service hochgeladen.
Das Script nutzt `VERSION` und laedt ein vollstaendiges Release (kein Delta).
Vorbereitung:
```bash
cp update-addon.env.example update-addon.env
```
Beispiel (Dev):
```bash
./scripts/upload_release.sh --profile dev
```
## Tests und Lint ## Tests und Lint
Im Repo sind keine automatisierten Tests enthalten. Verfuegbare Checks: Im Repo sind keine automatisierten Tests enthalten. Verfuegbare Checks:
- Bash-Syntax: `bash -n sk.sh` - Bash-Syntax: `bash -n sk.sh`

View File

@ -1,4 +1,4 @@
ID: DOC_000015 | Version: 0.2.1 | Status: Draft ID: DOC_000015 | Version: 0.2.2 | Status: Draft
By: Codex (GPT-5) By: Codex (GPT-5)
# FAQ # FAQ

View File

@ -1,4 +1,4 @@
ID: DOC_000017 | Version: 0.2.1 | Status: Draft ID: DOC_000017 | Version: 0.2.2 | Status: Draft
By: Codex (GPT-5) By: Codex (GPT-5)
# Fuer Nutzerinnen und Nutzer # Fuer Nutzerinnen und Nutzer

View File

@ -1,4 +1,4 @@
ID: DOC_000009 | Version: 0.2.1 | Status: Draft ID: DOC_000009 | Version: 0.2.2 | Status: Draft
By: Codex (GPT-5) By: Codex (GPT-5)
# Getting Started # Getting Started

View File

@ -1,4 +1,4 @@
ID: DOC_000016 | Version: 0.2.1 | Status: Draft ID: DOC_000016 | Version: 0.2.2 | Status: Draft
By: Codex (GPT-5) By: Codex (GPT-5)
# Troubleshooting # Troubleshooting

View File

@ -1,4 +1,4 @@
ID: DOC_000010 | Version: 0.2.1 | Status: Draft ID: DOC_000010 | Version: 0.2.2 | Status: Draft
By: Codex (GPT-5) By: Codex (GPT-5)
# Usage # Usage
@ -61,6 +61,9 @@ Alle Update-Endpunkte erfordern Admin-Auth.
- `POST /update/rollback` - `POST /update/rollback`
- `GET /update/logs?limit=200` - `GET /update/logs?limit=200`
### System-API (lokal)
- `GET /system/metrics` (CPU %, RAM, GPU VRAM, Netzwerk Mbps)
Beispiel (Enrollment): Beispiel (Enrollment):
```bash ```bash
ENROLL_TOKEN="example-enroll-token" ENROLL_TOKEN="example-enroll-token"

View File

@ -1,4 +1,4 @@
ID: DOC_000006 | Version: 0.2.1 | Status: Draft ID: DOC_000006 | Version: 0.2.2 | Status: Draft
Archived – superseded by new documentation. Archived – superseded by new documentation.
By: Codex (GPT-5) By: Codex (GPT-5)

View File

@ -1,4 +1,4 @@
ID: DOC_000008 | Version: 0.2.1 | Status: Draft ID: DOC_000008 | Version: 0.2.2 | Status: Draft
Archived – superseded by new documentation. Archived – superseded by new documentation.
# Client Quickstart # Client Quickstart

View File

@ -1,4 +1,4 @@
ID: DOC_000003 | Version: 0.2.1 | Status: Draft ID: DOC_000003 | Version: 0.2.2 | Status: Draft
Archived – superseded by new documentation. Archived – superseded by new documentation.
By: Codex (GPT-5) By: Codex (GPT-5)

View File

@ -1,4 +1,4 @@
ID: DOC_000005 | Version: 0.2.1 | Status: Draft ID: DOC_000005 | Version: 0.2.2 | Status: Draft
Archived – superseded by new documentation. Archived – superseded by new documentation.
By: Codex (GPT-5) By: Codex (GPT-5)

View File

@ -1,4 +1,4 @@
ID: DOC_000006 | Version: 0.2.1 | Status: Draft ID: DOC_000006 | Version: 0.2.2 | Status: Draft
Archived – superseded by new documentation. Archived – superseded by new documentation.
By: Codex (GPT-5) By: Codex (GPT-5)

View File

@ -1,4 +1,4 @@
ID: DOC_000004 | Version: 0.2.1 | Status: Draft ID: DOC_000004 | Version: 0.2.2 | Status: Draft
Archived – superseded by new documentation. Archived – superseded by new documentation.
By: Codex (GPT-5) By: Codex (GPT-5)

View File

@ -1,4 +1,4 @@
ID: DOC_000005 | Version: 0.2.1 | Status: Draft ID: DOC_000005 | Version: 0.2.2 | Status: Draft
Archived – superseded by new documentation. Archived – superseded by new documentation.
By: Codex (GPT-5) By: Codex (GPT-5)

View File

@ -7,3 +7,5 @@ SKD_UPDATE_TOKEN_FILE=/var/lib/skd/update_token
SKD_UPDATE_INTERVAL=3600 SKD_UPDATE_INTERVAL=3600
SKD_UPDATE_STATUS_FILE=/var/lib/skd/update_status.json SKD_UPDATE_STATUS_FILE=/var/lib/skd/update_status.json
SKD_UPDATE_LOG_FILE=/var/lib/skd/update_logs.jsonl SKD_UPDATE_LOG_FILE=/var/lib/skd/update_logs.jsonl
SKD_UPDATE_UPLOAD_TOKEN=
SKD_UPDATE_UPLOAD_TOKEN_FILE=/etc/skd/update.upload.token

View File

@ -1,4 +1,4 @@
ID: AGENTS_000001 | Version: 0.2.1 | Status: Draft ID: AGENTS_000001 | Version: 0.2.2 | Status: Draft
By: Codex (GPT-5) By: Codex (GPT-5)
# Repository Guidelines # Repository Guidelines

View File

@ -1,4 +1,4 @@
ID: STATUS_000001 | Version: 0.2.1 | Status: Final ID: STATUS_000001 | Version: 0.2.2 | Status: Final
By: Codex (GPT-5) By: Codex (GPT-5)
# Projekt-Status # Projekt-Status
@ -113,11 +113,15 @@ Sicheres, remote steuerbares System zum Sperren/Entsperren lokaler Nutzerkonten.
- [x] TASK_000055: Endpoint und UI fuer Update-Service Status - [x] TASK_000055: Endpoint und UI fuer Update-Service Status
- [x] US_000047: Update-Config auslagern - [x] US_000047: Update-Config auslagern
- [x] TASK_000056: Update-ENV separieren - [x] TASK_000056: Update-ENV separieren
- [x] US_000048: Release-Upload automatisieren
- [x] TASK_000057: Script fuer Release-Upload erstellen
- [x] US_000049: Lokale deployment.env fuer Update-Uploads
- [x] TASK_000058: deployment.env Beispiel und Script-Anpassungen
### EPIC_000009: Update Webservice (External Team) ### EPIC_000009: Update Webservice (External Team)
- [ ] US_000026: Client bezieht Updates (Pull) - [x] US_000026: Client bezieht Updates (Pull)
- [ ] US_000027: Client verifiziert und wendet Updates an - [x] US_000027: Client verifiziert und wendet Updates an
- [ ] US_000028: Client meldet Update-Status - [x] US_000028: Client meldet Update-Status
### EPIC_000010: Update-Service v1 Migration (Major Release) ### EPIC_000010: Update-Service v1 Migration (Major Release)
- [x] US_000034: Enrollment fuer Langzeit-Token - [x] US_000034: Enrollment fuer Langzeit-Token
@ -144,9 +148,9 @@ Sicheres, remote steuerbares System zum Sperren/Entsperren lokaler Nutzerkonten.
- [x] TASK_000048: External Dependencies und Audience-Ergaenzungen - [x] TASK_000048: External Dependencies und Audience-Ergaenzungen
### EPIC_000013: System Telemetry im Dashboard ### EPIC_000013: System Telemetry im Dashboard
- [ ] US_000044: Systemmetriken im Dashboard anzeigen - [x] US_000044: Systemmetriken im Dashboard anzeigen
- [ ] TASK_000050: Backend-Endpoint fuer Systemmetriken - [x] TASK_000050: Backend-Endpoint fuer Systemmetriken
- [ ] TASK_000051: UI-Kacheln im Dashboard (System Information) - [x] TASK_000051: UI-Kacheln im Dashboard (System Information)
### EPIC_000014: Login-Zeitfenster und Parent-Control Regeln ### EPIC_000014: Login-Zeitfenster und Parent-Control Regeln
- [ ] US_000045: Regeln fuer Login-Zeitfenster definieren und durchsetzen - [ ] US_000045: Regeln fuer Login-Zeitfenster definieren und durchsetzen

View File

@ -1,4 +1,4 @@
ID: PROJECT_STATUS_TEMPLATE | Version: 0.2.1 | Status: Draft ID: PROJECT_STATUS_TEMPLATE | Version: 0.2.2 | Status: Draft
By: Codex (GPT-5) By: Codex (GPT-5)
# 📊 Projekt-Status (Template) # 📊 Projekt-Status (Template)

View File

@ -1,4 +1,4 @@
ID: SOP_000001 | Version: 0.2.1 | Status: Draft ID: SOP_000001 | Version: 0.2.2 | Status: Draft
By: Codex (GPT-5) By: Codex (GPT-5)
# Onboarding: Arbeitsweise im Sound Architect Projekt # Onboarding: Arbeitsweise im Sound Architect Projekt

View File

@ -1,4 +1,4 @@
ID: SETUP_000005 | Version: 0.2.1 | Status: Draft ID: SETUP_000005 | Version: 0.2.2 | Status: Draft
By: Codex (GPT-5) By: Codex (GPT-5)
# 🧬 SETUP_GUIDE: Phase 0 - Project Genesis # 🧬 SETUP_GUIDE: Phase 0 - Project Genesis

View File

@ -1,4 +1,4 @@
ID: PROMPT_000008 | Version: 0.2.1 | Status: Draft ID: PROMPT_000008 | Version: 0.2.2 | Status: Draft
By: Codex (GPT-5) By: Codex (GPT-5)
# Requirements Engineer Prompt # Requirements Engineer Prompt

View File

@ -1,4 +1,4 @@
ID: EPIC_000001 | Version: 0.2.1 | Status: Final ID: EPIC_000001 | Version: 0.2.2 | Status: Final
By: Codex (GPT-5) By: Codex (GPT-5)
# EPIC_000001: Legacy CLI Account Control (sk.sh) # EPIC_000001: Legacy CLI Account Control (sk.sh)

View File

@ -1,4 +1,4 @@
ID: EPIC_000002 | Version: 0.2.1 | Status: Final ID: EPIC_000002 | Version: 0.2.2 | Status: Final
By: Codex (GPT-5) By: Codex (GPT-5)
# EPIC_000002: Backend API Service # EPIC_000002: Backend API Service

View File

@ -1,4 +1,4 @@
ID: EPIC_000003 | Version: 0.2.1 | Status: Final ID: EPIC_000003 | Version: 0.2.2 | Status: Final
By: Codex (GPT-5) By: Codex (GPT-5)
# EPIC_000003: Authentication & Sessions # EPIC_000003: Authentication & Sessions

View File

@ -1,4 +1,4 @@
ID: EPIC_000004 | Version: 0.2.1 | Status: Final ID: EPIC_000004 | Version: 0.2.2 | Status: Final
By: Codex (GPT-5) By: Codex (GPT-5)
# EPIC_000004: Web UI # EPIC_000004: Web UI

View File

@ -1,4 +1,4 @@
ID: EPIC_000005 | Version: 0.2.1 | Status: Final ID: EPIC_000005 | Version: 0.2.2 | Status: Final
By: Codex (GPT-5) By: Codex (GPT-5)
# EPIC_000005: Automation Scripts # EPIC_000005: Automation Scripts

View File

@ -1,4 +1,4 @@
ID: EPIC_000006 | Version: 0.2.1 | Status: Final ID: EPIC_000006 | Version: 0.2.2 | Status: Final
By: Codex (GPT-5) By: Codex (GPT-5)
# EPIC_000006: Systemd & Deployment Artifacts # EPIC_000006: Systemd & Deployment Artifacts

View File

@ -1,4 +1,4 @@
ID: EPIC_000007 | Version: 0.2.1 | Status: Final ID: EPIC_000007 | Version: 0.2.2 | Status: Final
By: Codex (GPT-5) By: Codex (GPT-5)
# EPIC_000007: Documentation & Runbook # EPIC_000007: Documentation & Runbook

View File

@ -1,4 +1,4 @@
ID: EPIC_000008 | Version: 0.2.1 | Status: Draft ID: EPIC_000008 | Version: 0.2.2 | Status: Draft
By: Codex (GPT-5) By: Codex (GPT-5)
# EPIC_000008: Client-Side Update Mechanism # EPIC_000008: Client-Side Update Mechanism
@ -46,3 +46,5 @@ Ermoegliche einen robusten Client-Update-Flow mit Verifikation und Rollback.
- US_000033: Rollback im Web-UI anstossen - US_000033: Rollback im Web-UI anstossen
- US_000043: Enrollment-Token per Script abrufen - US_000043: Enrollment-Token per Script abrufen
- US_000046: Update-Service Erreichbarkeit anzeigen - US_000046: Update-Service Erreichbarkeit anzeigen
- US_000048: Release-Upload automatisieren
- US_000049: Lokale deployment.env fuer Update-Uploads

View File

@ -1,4 +1,4 @@
ID: EPIC_000009 | Version: 0.2.1 | Status: Draft ID: EPIC_000009 | Version: 0.2.2 | Status: Done
By: Codex (GPT-5) By: Codex (GPT-5)
# EPIC_000009: Update Webservice (External Team) # EPIC_000009: Update Webservice (External Team)

View File

@ -1,4 +1,4 @@
ID: EPIC_000010 | Version: 0.2.1 | Status: Done ID: EPIC_000010 | Version: 0.2.2 | Status: Done
By: Codex (GPT-5) By: Codex (GPT-5)
# EPIC_000010: Update-Service v1 Migration (Major Release) # EPIC_000010: Update-Service v1 Migration (Major Release)

View File

@ -1,4 +1,4 @@
ID: EPIC_000011 | Version: 0.2.1 | Status: Done ID: EPIC_000011 | Version: 0.2.2 | Status: Done
By: Codex (GPT-5) By: Codex (GPT-5)
# EPIC_000011: Documentation and Configuration Alignment # EPIC_000011: Documentation and Configuration Alignment

View File

@ -1,4 +1,4 @@
ID: EPIC_000012 | Version: 0.2.1 | Status: Done ID: EPIC_000012 | Version: 0.2.2 | Status: Done
By: Codex (GPT-5) By: Codex (GPT-5)
# EPIC_000012: Dokumentations-Overhaul # EPIC_000012: Dokumentations-Overhaul

View File

@ -1,4 +1,4 @@
ID: EPIC_000013 | Version: 0.2.1 | Status: Draft ID: EPIC_000013 | Version: 0.2.2 | Status: Done
By: Codex (GPT-5) By: Codex (GPT-5)
# EPIC_000013: System Telemetry im Dashboard # EPIC_000013: System Telemetry im Dashboard

View File

@ -1,4 +1,4 @@
ID: EPIC_000014 | Version: 0.2.1 | Status: Draft ID: EPIC_000014 | Version: 0.2.2 | Status: Draft
By: Codex (GPT-5) By: Codex (GPT-5)
# EPIC_000014: Login-Zeitfenster und Parent-Control Regeln # EPIC_000014: Login-Zeitfenster und Parent-Control Regeln

View File

@ -1,4 +1,4 @@
ID: US_000001 | Version: 0.2.1 | Status: Final ID: US_000001 | Version: 0.2.2 | Status: Final
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000001: Nutzerkonto per CLI deaktivieren # US_000001: Nutzerkonto per CLI deaktivieren

View File

@ -1,4 +1,4 @@
ID: US_000002 | Version: 0.2.1 | Status: Final ID: US_000002 | Version: 0.2.2 | Status: Final
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000002: Nutzerkonto per CLI aktivieren # US_000002: Nutzerkonto per CLI aktivieren

View File

@ -1,4 +1,4 @@
ID: US_000003 | Version: 0.2.1 | Status: Final ID: US_000003 | Version: 0.2.2 | Status: Final
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000003: Health-Status abfragen # US_000003: Health-Status abfragen

View File

@ -1,4 +1,4 @@
ID: US_000004 | Version: 0.2.1 | Status: Final ID: US_000004 | Version: 0.2.2 | Status: Final
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000004: Verfuegbare Nutzer auflisten # US_000004: Verfuegbare Nutzer auflisten

View File

@ -1,4 +1,4 @@
ID: US_000005 | Version: 0.2.1 | Status: Final ID: US_000005 | Version: 0.2.2 | Status: Final
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000005: Nutzer per API deaktivieren # US_000005: Nutzer per API deaktivieren

View File

@ -1,4 +1,4 @@
ID: US_000006 | Version: 0.2.1 | Status: Final ID: US_000006 | Version: 0.2.2 | Status: Final
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000006: Nutzer per API aktivieren # US_000006: Nutzer per API aktivieren

View File

@ -1,4 +1,4 @@
ID: US_000007 | Version: 0.2.1 | Status: Final ID: US_000007 | Version: 0.2.2 | Status: Final
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000007: PAM-Login mit Token # US_000007: PAM-Login mit Token

View File

@ -1,4 +1,4 @@
ID: US_000008 | Version: 0.2.1 | Status: Final ID: US_000008 | Version: 0.2.2 | Status: Final
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000008: OIDC-Login Flow # US_000008: OIDC-Login Flow

View File

@ -1,4 +1,4 @@
ID: US_000009 | Version: 0.2.1 | Status: Final ID: US_000009 | Version: 0.2.2 | Status: Final
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000009: Autorisierung und /me-Identitaet # US_000009: Autorisierung und /me-Identitaet

View File

@ -1,4 +1,4 @@
ID: US_000010 | Version: 0.2.1 | Status: Final ID: US_000010 | Version: 0.2.2 | Status: Final
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000010: Index-Seite ausliefern # US_000010: Index-Seite ausliefern

View File

@ -1,4 +1,4 @@
ID: US_000011 | Version: 0.2.1 | Status: Final ID: US_000011 | Version: 0.2.2 | Status: Final
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000011: Virtualenv und Abhaengigkeiten erstellen # US_000011: Virtualenv und Abhaengigkeiten erstellen

View File

@ -1,4 +1,4 @@
ID: US_000012 | Version: 0.2.1 | Status: Final ID: US_000012 | Version: 0.2.2 | Status: Final
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000012: Service lokal starten # US_000012: Service lokal starten

View File

@ -1,4 +1,4 @@
ID: US_000013 | Version: 0.2.1 | Status: Final ID: US_000013 | Version: 0.2.2 | Status: Final
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000013: Service installieren # US_000013: Service installieren

View File

@ -1,4 +1,4 @@
ID: US_000014 | Version: 0.2.1 | Status: Final ID: US_000014 | Version: 0.2.2 | Status: Final
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000014: Service aktualisieren # US_000014: Service aktualisieren

View File

@ -1,4 +1,4 @@
ID: US_000015 | Version: 0.2.1 | Status: Final ID: US_000015 | Version: 0.2.2 | Status: Final
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000015: Remote-Deployment durchfuehren # US_000015: Remote-Deployment durchfuehren

View File

@ -1,4 +1,4 @@
ID: US_000016 | Version: 0.2.1 | Status: Final ID: US_000016 | Version: 0.2.2 | Status: Final
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000016: OIDC-Client registrieren # US_000016: OIDC-Client registrieren

View File

@ -1,4 +1,4 @@
ID: US_000017 | Version: 0.2.1 | Status: Final ID: US_000017 | Version: 0.2.2 | Status: Final
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000017: Systemd-Unit im Repo # US_000017: Systemd-Unit im Repo

View File

@ -1,4 +1,4 @@
ID: US_000018 | Version: 0.2.1 | Status: Final ID: US_000018 | Version: 0.2.2 | Status: Final
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000018: Konfigurations-Templates verfuegbar # US_000018: Konfigurations-Templates verfuegbar

View File

@ -1,4 +1,4 @@
ID: US_000019 | Version: 0.2.1 | Status: Final ID: US_000019 | Version: 0.2.2 | Status: Final
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000019: Deployment-Archiv vorhanden # US_000019: Deployment-Archiv vorhanden

View File

@ -1,4 +1,4 @@
ID: US_000020 | Version: 0.2.1 | Status: Final ID: US_000020 | Version: 0.2.2 | Status: Final
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000020: Makefile-Automation bereitstellen # US_000020: Makefile-Automation bereitstellen

View File

@ -1,4 +1,4 @@
ID: US_000021 | Version: 0.2.1 | Status: Final ID: US_000021 | Version: 0.2.2 | Status: Final
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000021: Konfiguration per ENV steuern # US_000021: Konfiguration per ENV steuern

View File

@ -1,4 +1,4 @@
ID: US_000022 | Version: 0.2.1 | Status: Final ID: US_000022 | Version: 0.2.2 | Status: Final
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000022: Web-UI Aktionen ausfuehren # US_000022: Web-UI Aktionen ausfuehren

View File

@ -1,4 +1,4 @@
ID: US_000023 | Version: 0.2.1 | Status: Final ID: US_000023 | Version: 0.2.2 | Status: Final
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000023: Runbook und Security-Hinweise dokumentieren # US_000023: Runbook und Security-Hinweise dokumentieren

View File

@ -1,4 +1,4 @@
ID: US_000024 | Version: 0.2.1 | Status: Done ID: US_000024 | Version: 0.2.2 | Status: Done
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000024: Watchtower Theme fuer Web-UI # US_000024: Watchtower Theme fuer Web-UI

View File

@ -1,4 +1,4 @@
ID: US_000025 | Version: 0.2.1 | Status: Draft ID: US_000025 | Version: 0.2.2 | Status: Draft
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000025: OIDC End-to-End Validierung und Runbook # US_000025: OIDC End-to-End Validierung und Runbook

View File

@ -1,4 +1,4 @@
ID: US_000026 | Version: 0.2.1 | Status: Done ID: US_000026 | Version: 0.2.2 | Status: Done
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000026: Client bezieht Updates (Pull) # US_000026: Client bezieht Updates (Pull)

View File

@ -1,4 +1,4 @@
ID: US_000027 | Version: 0.2.1 | Status: Done ID: US_000027 | Version: 0.2.2 | Status: Done
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000027: Client verifiziert und wendet Updates an # US_000027: Client verifiziert und wendet Updates an

View File

@ -1,4 +1,4 @@
ID: US_000028 | Version: 0.2.1 | Status: Done ID: US_000028 | Version: 0.2.2 | Status: Done
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000028: Client meldet Update-Status # US_000028: Client meldet Update-Status

View File

@ -1,4 +1,4 @@
ID: US_000029 | Version: 0.2.1 | Status: Done ID: US_000029 | Version: 0.2.2 | Status: Done
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000029: Update-Status im Web-UI anzeigen # US_000029: Update-Status im Web-UI anzeigen

View File

@ -1,4 +1,4 @@
ID: US_000030 | Version: 0.2.1 | Status: Done ID: US_000030 | Version: 0.2.2 | Status: Done
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000030: Update-Check im Web-UI ausloesen # US_000030: Update-Check im Web-UI ausloesen

View File

@ -1,4 +1,4 @@
ID: US_000031 | Version: 0.2.1 | Status: Done ID: US_000031 | Version: 0.2.2 | Status: Done
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000031: Update im Web-UI anstossen # US_000031: Update im Web-UI anstossen

View File

@ -1,4 +1,4 @@
ID: US_000032 | Version: 0.2.1 | Status: Done ID: US_000032 | Version: 0.2.2 | Status: Done
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000032: Update-Logs im Web-UI anzeigen # US_000032: Update-Logs im Web-UI anzeigen

View File

@ -1,4 +1,4 @@
ID: US_000033 | Version: 0.2.1 | Status: Done ID: US_000033 | Version: 0.2.2 | Status: Done
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000033: Rollback im Web-UI anstossen # US_000033: Rollback im Web-UI anstossen

View File

@ -1,4 +1,4 @@
ID: US_000034 | Version: 0.2.1 | Status: Done ID: US_000034 | Version: 0.2.2 | Status: Done
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000034: Enrollment fuer Langzeit-Token # US_000034: Enrollment fuer Langzeit-Token

View File

@ -1,4 +1,4 @@
ID: US_000035 | Version: 0.2.1 | Status: Done ID: US_000035 | Version: 0.2.2 | Status: Done
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000035: v1 Update-Endpoints und Status-Schema # US_000035: v1 Update-Endpoints und Status-Schema

View File

@ -1,4 +1,4 @@
ID: US_000036 | Version: 0.2.1 | Status: Done ID: US_000036 | Version: 0.2.2 | Status: Done
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000036: Doku-Versionen auf VERSION synchronisieren # US_000036: Doku-Versionen auf VERSION synchronisieren

View File

@ -1,4 +1,4 @@
ID: US_000037 | Version: 0.2.1 | Status: Done ID: US_000037 | Version: 0.2.2 | Status: Done
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000037: Update-API-Doku mit /update/enroll abgleichen # US_000037: Update-API-Doku mit /update/enroll abgleichen

View File

@ -1,4 +1,4 @@
ID: US_000038 | Version: 0.2.1 | Status: Done ID: US_000038 | Version: 0.2.2 | Status: Done
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000038: ENV-Beispiele und Healthcheck-Auth angleichen # US_000038: ENV-Beispiele und Healthcheck-Auth angleichen

View File

@ -1,4 +1,4 @@
ID: US_000039 | Version: 0.2.1 | Status: Done ID: US_000039 | Version: 0.2.2 | Status: Done
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000039: Doku-Audit fuer verbleibende Abweichungen # US_000039: Doku-Audit fuer verbleibende Abweichungen

View File

@ -1,4 +1,4 @@
ID: US_000040 | Version: 0.2.1 | Status: Done ID: US_000040 | Version: 0.2.2 | Status: Done
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000040: Doku-Struktur und Inhalte erstellen # US_000040: Doku-Struktur und Inhalte erstellen

View File

@ -1,4 +1,4 @@
ID: US_000041 | Version: 0.2.1 | Status: Done ID: US_000041 | Version: 0.2.2 | Status: Done
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000041: Einbindung externer Services dokumentieren # US_000041: Einbindung externer Services dokumentieren

View File

@ -1,4 +1,4 @@
ID: US_000042 | Version: 0.2.1 | Status: Done ID: US_000042 | Version: 0.2.2 | Status: Done
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000042: Consumer-Perspektive und Audience-Split ergaenzen # US_000042: Consumer-Perspektive und Audience-Split ergaenzen

View File

@ -1,4 +1,4 @@
ID: US_000043 | Version: 0.2.1 | Status: Done ID: US_000043 | Version: 0.2.2 | Status: Done
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000043: Enrollment-Token per Script abrufen # US_000043: Enrollment-Token per Script abrufen

View File

@ -1,4 +1,4 @@
ID: US_000044 | Version: 0.2.1 | Status: Draft ID: US_000044 | Version: 0.2.2 | Status: Done
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000044: Systemmetriken im Dashboard anzeigen # US_000044: Systemmetriken im Dashboard anzeigen

View File

@ -1,4 +1,4 @@
ID: US_000045 | Version: 0.2.1 | Status: Draft ID: US_000045 | Version: 0.2.2 | Status: Draft
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000045: Regeln fuer Login-Zeitfenster definieren und durchsetzen # US_000045: Regeln fuer Login-Zeitfenster definieren und durchsetzen

View File

@ -1,4 +1,4 @@
ID: US_000046 | Version: 0.2.1 | Status: Done ID: US_000046 | Version: 0.2.2 | Status: Done
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000046: Update-Service Erreichbarkeit anzeigen # US_000046: Update-Service Erreichbarkeit anzeigen

View File

@ -1,4 +1,4 @@
ID: US_000047 | Version: 0.2.1 | Status: Done ID: US_000047 | Version: 0.2.2 | Status: Done
By: Codex (GPT-5) By: Codex (GPT-5)
# US_000047: Update-Config auslagern # US_000047: Update-Config auslagern

View File

@ -0,0 +1,17 @@
ID: US_000048 | Version: 0.2.2 | Status: Done
By: Codex (GPT-5)
# US_000048: Release-Upload automatisieren
Als Admin moechte ich das Erstellen des Release-Archivs und den Upload zum Update-Service
automatisieren, damit Dev/Prod Releases reproduzierbar und fehlerarm erstellt werden.
## Akzeptanzkriterien
- Given eine gueltige VERSION
- When das Upload-Script ausgefuehrt wird
- Then wird ein tar.gz Archiv erzeugt (vollstaendiges Release)
- And der Upload erfolgt gegen die konfigurierte Update-Service URL
- And Dev/Prod kann ueber URL oder Parameter unterschieden werden
## Task-Platzhalter
- TASK_000057: Script fuer Release-Upload erstellen und dokumentieren

View File

@ -0,0 +1,16 @@
ID: US_000049 | Version: 0.2.2 | Status: Done
By: Codex (GPT-5)
# US_000049: Lokale deployment.env fuer Update-Uploads
Als Admin moechte ich eine lokale deployment.env nutzen, um Update-Service Parameter
und Tokens fuer Dev/Prod Tests zu konfigurieren, ohne /etc/skd/ zu verwenden.
## Akzeptanzkriterien
- Given ich arbeite lokal im Repo
- When ich ein Update-Artefakt hochlade oder Enrollment teste
- Then kann ich eine deployment.env als Quelle fuer Update-Variablen nutzen
- And die Datei ist nicht Teil des Repos (lokal, gitignored)
## Task-Platzhalter
- TASK_000058: deployment.env Beispiel und Script-Anpassungen

View File

@ -1,4 +1,4 @@
ID: TASK_000025 | Version: 0.2.1 | Status: Blocked ID: TASK_000025 | Version: 0.2.2 | Status: Blocked
By: Codex (GPT-5) By: Codex (GPT-5)
# TASK_000025: OIDC E2E validation # TASK_000025: OIDC E2E validation

View File

@ -1,4 +1,4 @@
ID: TASK_000026 | Version: 0.2.1 | Status: Blocked ID: TASK_000026 | Version: 0.2.2 | Status: Blocked
By: Codex (GPT-5) By: Codex (GPT-5)
# TASK_000026: OIDC runbook update # TASK_000026: OIDC runbook update

View File

@ -1,4 +1,4 @@
ID: TASK_000027 | Version: 0.2.1 | Status: Done ID: TASK_000027 | Version: 0.2.2 | Status: Done
By: Codex (GPT-5) By: Codex (GPT-5)
# TASK_000027: Update endpoint config # TASK_000027: Update endpoint config

View File

@ -1,4 +1,4 @@
ID: TASK_000028 | Version: 0.2.1 | Status: Done ID: TASK_000028 | Version: 0.2.2 | Status: Done
By: Codex (GPT-5) By: Codex (GPT-5)
# TASK_000028: Verify and apply update # TASK_000028: Verify and apply update

View File

@ -1,4 +1,4 @@
ID: TASK_000029 | Version: 0.2.1 | Status: Done ID: TASK_000029 | Version: 0.2.2 | Status: Done
By: Codex (GPT-5) By: Codex (GPT-5)
# TASK_000029: Report update status # TASK_000029: Report update status

View File

@ -1,4 +1,4 @@
ID: TASK_000030 | Version: 0.2.1 | Status: Done ID: TASK_000030 | Version: 0.2.2 | Status: Done
By: Codex (GPT-5) By: Codex (GPT-5)
# TASK_000030: UI update status view # TASK_000030: UI update status view

Some files were not shown because too many files have changed in this diff Show More