boxwart: Update-Verlauf zeigt das echte Ergebnis je Baustein, festgehaltene Bausteine sichtbar
Ampel / ampel (push) Failing after 22s

Der Verlauf las bisher nur den Hermes-Cron-Status ("Skript lief") und zeigte die
Laeufe vom 06. und 13.09. als "durchgelaufen", obwohl dort zurueckgerollt und
festgehalten wurde; ein abgebrochener Lauf stand als "laeuft" da. Jetzt kommt der
Verlauf aus dem Meldeprotokoll (~/mc2-notify.log), also aus dem, was autoupdate.sh
selbst je Baustein meldet.

Festgehaltene Bausteine (Pin-Register) werden zum Waechter-Hinweis mit Knopf
"Freigeben", auf der Updates-Seite markiert und in der Updates-Lampe gezaehlt.
Hermes zeigt seine laufende Version und die Zahl der neuen Aenderungen.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-09-23 21:56:19 +02:00
co-authored by Claude Opus 5.5
parent f3af2adec3
commit 790de19f1a
21 changed files with 544 additions and 80 deletions
+14 -5
View File
@@ -46,6 +46,8 @@ export const useSicherungen = () =>
export interface UpdateDetails {
kind: string
installed_version?: string | null
behind?: number
installed_build?: number | null
latest_build?: number | null
latest_tag?: string | null
@@ -66,11 +68,12 @@ export const useUpdateDetails = (art: string | null) =>
})
export interface UpdateLauf {
start: string | null
ende: string | null
status: string
fehler: string | null
job: string
start: string
ende: string
anlass: string
stufe: "rot" | "gelb" | "gruen" | "info" | "grau"
titel: string
zeilen: { baustein: string; ergebnis: string; stufe: UpdateLauf["stufe"]; text: string }[]
}
export const useUpdateVerlauf = () =>
@@ -138,6 +141,12 @@ export const useUpdateStarten = () =>
neuLaden: ["jobs", "start"],
})
export const useFreigeben = () =>
useAktion(
(baustein: string) => post<AktionsErgebnis>(`/api/updates/festgehalten/${encodeURIComponent(baustein)}/freigeben`),
{ erfolg: (_, e) => (e as AktionsErgebnis).text ?? "Freigegeben.", neuLaden: ["start"] },
)
export const useJetztSichern = () =>
useAktion(() => post<AktionsErgebnis>("/api/system/backup"), {
erfolg: () => "Sicherung erstellt.",
+7
View File
@@ -61,6 +61,13 @@ export function hauptleuchte(z: Start["zustand"]) {
export function versionen(id: string, d: UpdateDetails | undefined): { laeuft: string; neu: string | null } {
if (!d) return { laeuft: "…", neu: null }
if (id === "os") return { laeuft: "Ubuntu", neu: d.count ? `${d.count} Pakete` : null }
// Hermes kommt aus git: „Neu“ ist die Zahl der Änderungen seit dem eingespielten Stand.
if (id === "hermes") {
return {
laeuft: d.installed_version ? `v${d.installed_version}` : "–",
neu: d.behind ? `+${d.behind.toLocaleString("de-DE")} Änderungen` : null,
}
}
const pre = id === "engine" ? "b" : "v"
const laeuft = d.installed_build != null ? `${pre}${d.installed_build}` : "–"
const neuer = d.latest_build != null && d.installed_build != null && d.latest_build > d.installed_build
+10
View File
@@ -66,10 +66,20 @@ export interface Start {
updates: {
bausteine: { id: string; name: string; neu: string }[]
modelle: { role: string; title: string; repo: string }[]
festgehalten: Festgehalten[]
}
flugplan: { gelaufen: FlugplanEintrag[]; geplant: FlugplanEintrag[] }
}
/** Ein Baustein, den der Sonntags-Lauf nach einem gescheiterten Update überspringt. */
export interface Festgehalten {
baustein: string
name: string
version: string
seit: string
grund: string
}
export interface AktionsErgebnis {
ok: boolean
text?: string
+6
View File
@@ -50,6 +50,12 @@ describe("versionen", () => {
it("zählt beim Betriebssystem die Pakete", () => {
expect(versionen("os", { kind: "os", count: 24 })).toEqual({ laeuft: "Ubuntu", neu: "24 Pakete" })
})
it("zeigt bei Hermes die Version und die Zahl der Änderungen", () => {
expect(versionen("hermes", { kind: "hermes", installed_version: "0.21.3", behind: 2523 }))
.toEqual({ laeuft: "v0.21.3", neu: "+2.523 Änderungen" })
expect(versionen("hermes", { kind: "hermes", behind: 0 })).toEqual({ laeuft: "–", neu: null })
})
})
describe("rolleVon", () => {