Merge branch 'wartung/einstellungen-stand-altreste' into wartung/restarbeiten

# Conflicts:
#	deploy/deploy.sh
This commit is contained in:
Hitonabi
2026-09-24 20:47:53 +02:00
27 changed files with 2738 additions and 110 deletions
+62 -3
View File
@@ -9,9 +9,9 @@ import { fehlerText, laeuftNoch } from "./anzeige"
import { melden } from "./meldungen"
import { stromVerbunden } from "./strom"
import type {
AktionsErgebnis, AufraeumKandidat, Hinweis, HomelabLauf, HomelabStand, Instanz, Job, Modell, Nutzung, PartnerStatus,
Radar,
Sicherung, Start, UpdateDetails, ZielAktion, ZielStand,
AktionsErgebnis, Altrest, AufraeumKandidat, EinstellungenStand, Hinweis, HomelabLauf, HomelabStand, Instanz,
InstanzMitStand, Job, Modell, Nutzung, PartnerStatus, Radar, Sicherung, Start, TelegramTest, UpdateDetails,
ZielAktion, ZielStand,
} from "./typen"
import { gbText } from "./zeit"
@@ -302,3 +302,62 @@ export const useHomelabHinweise = (aktiv: boolean) =>
enabled: aktiv,
refetchInterval: takt(60_000),
})
// --- Einstellungen, Software-Stand, Altreste (seit 24.09.2026) --------------------------------------------------
/** Update-Zeitfenster und Radar-Schalter der KI-Box, samt nächstem Lauf laut systemd. */
export const useEinstellungenStand = (aktiv: boolean) =>
useQuery({
queryKey: ["einstellungen"],
queryFn: () => api<EinstellungenStand>("/api/einstellungen"),
enabled: aktiv,
retry: false,
})
export const useUpdateFensterSetzen = () =>
useAktion(
(f: { tag: number; uhrzeit: string }) => post<AktionsErgebnis>("/api/einstellungen/update-fenster", f),
{ erfolg: (_, e) => (e as AktionsErgebnis).text ?? "Gespeichert.", neuLaden: ["einstellungen", "start"] },
)
export const useRadarSchalten = () =>
useAktion((an: boolean) => post<AktionsErgebnis>("/api/einstellungen/radar", { an }), {
erfolg: (_, e) => (e as AktionsErgebnis).text ?? "Geschaltet.",
neuLaden: ["einstellungen", "start", "radar"],
})
/** Testmeldung über den echten Meldeweg der KI-Box oder des Homelab-Teils (lib/instanz.ts findet die Instanz). */
export const useTelegramTest = () =>
useAktion(
(ziel: "box" | "homelab") =>
post<TelegramTest>(ziel === "homelab" ? "/api/homelab/einstellungen/telegram-test" : "/api/einstellungen/telegram-test"),
{ erfolg: (_, e) => e.text ?? "Die Testmeldung ist raus.", neuLaden: [] },
)
/** Software-Stand dieser Instanz und der anderen (über /api/partner/instanz). */
export const useSoftwareStand = (aktiv: boolean, mitPartner: boolean) =>
useQueries({
queries: [
{ queryKey: ["stand", "hier"], queryFn: () => api<InstanzMitStand>("/api/instanz"), enabled: aktiv },
{
queryKey: ["stand", "partner"],
queryFn: () => api<InstanzMitStand>("/api/partner/instanz"),
enabled: aktiv && mitPartner,
retry: false,
},
],
})
/** Altreste neben dem Betrieb (Test-Ordner, alte Umgebungen, Worktrees …) — nur, was noch da ist. */
export const useAltreste = () =>
useQuery({
queryKey: ["altreste"],
queryFn: () => api<{ altreste: Altrest[] }>("/api/aufraeumen/altreste"),
staleTime: 60_000,
})
export const useAltrestLoeschen = () =>
useAktion((a: Altrest) => post<AktionsErgebnis>("/api/aufraeumen/altreste/loeschen", { id: a.id }), {
erfolg: (_, e) => (e as AktionsErgebnis).text ?? "Gelöscht.",
neuLaden: ["altreste", "start"],
})
+71
View File
@@ -304,3 +304,74 @@ export interface HomelabLauf {
text: string | null
schritte: string[]
}
// --- Einstellungen, Software-Stand, Altreste (seit 24.09.2026) --------------------------------------------------
/** Welcher Stand einer Instanz seit wann live ist (services/software_stand.py). */
export interface SoftwareStand {
/** "deploy" = Stand-Datei des Deploys, "git" = aus dem Checkout gelesen (Entwicklung), sonst "unbekannt". */
quelle: "deploy" | "git" | "unbekannt"
commit: string | null
betreff: string | null
/** ISO-Zeit des Commits */
commit_datum: string | null
/** ISO-Zeit des Deploys, nur mit Stand-Datei */
deploy_zeit: string | null
}
/** GET /api/instanz bzw. /api/partner/instanz, seit 24.09.2026 mit dem Software-Stand. */
export interface InstanzMitStand extends Instanz {
stand?: SoftwareStand
}
/** Einstellungen der KI-Box samt dem, was systemd daraus gemacht hat (GET /api/einstellungen). */
export interface EinstellungenStand {
/** false, wo es kein systemd gibt (Entwicklung am PC): Dann lässt sich nichts schalten. */
schaltbar: boolean
update_fenster: {
/** 1 = Montag … 7 = Sonntag */
tag: number
/** "HH:MM" */
uhrzeit: string
tag_name: string
/** Wann die Box nach einem Update neu starten darf, z. B. „Sonntag 04:00–06:59“. */
neustart_fenster: string
timer_aktiv: boolean
naechster_lauf: string | null
/** false: Der Timer läuft noch nach einem anderen Plan als eingestellt. */
wirksam: boolean
}
radar: {
/** Was eingestellt ist. */
an: boolean
/** Was systemd sagt: „schlaeft“ = abgeschaltet und nicht im Autostart. */
zustand: "an" | "schlaeft" | "aus" | "unbekannt"
naechster_lauf: string | null
wirksam: boolean
}
}
/** Antwort des Telegram-Tests (POST /api/einstellungen/telegram-test bzw. /api/homelab/einstellungen/telegram-test). */
export interface TelegramTest extends AktionsErgebnis {
gesendet: boolean
/** Über Hermes oder direkt an die Telegram-Bot-API. */
weg: "hermes" | "direkt" | null
/** Warum nicht, aus dem Melde-Log. */
grund: string | null
instanz: string
/** ISO-Zeit des Tests */
zeit: string
kennung?: string
}
/** Ein Altrest neben dem Betrieb (GET /api/aufraeumen/altreste). */
export interface Altrest {
/** Kennung aus der festen Liste — gelöscht wird nur darüber, nie über einen Pfad. */
id: string
name: string
pfade: string[]
groesse_bytes: number
/** fertig lesbar, z. B. „7,7 GB“ */
groesse: string
hinweis: string
}