Deterministischer Abgleich zwischen DMS file_revisions und Objekt-Storage-Verzeichnis, existenz-only (keine Inhaltspruefung, saubere Abgrenzung zu BAK-08). Report sortiert nach storage_key fuer stabile Weiterverarbeitung durch BAK-08. Systemd-Timer taeglich, real auf 192.168.1.131 verdrahtet und ausgeloest.
56 lines
1.5 KiB
Go
56 lines
1.5 KiB
Go
// reconcile-cli ist der Aufrufpunkt für BAK-05, für systemd-Timer gedacht
|
|
// (siehe deploy/systemd/) — "geplanter Abgleichs-Job" (Ticket-Vorgabe)
|
|
// entsteht durch die Timer-Definition, kein eigener Dauerprozess.
|
|
package main
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"log"
|
|
"os"
|
|
|
|
"github.com/jackc/pgx/v5/pgxpool"
|
|
|
|
"gitea.perlbach24.de/scripte/nexarch/archive/internal/reconcile"
|
|
)
|
|
|
|
func main() {
|
|
dsn := os.Getenv("NEXARCH_RECONCILE_TENANT_DSN")
|
|
storageDir := os.Getenv("NEXARCH_RECONCILE_STORAGE_DIR")
|
|
if dsn == "" || storageDir == "" {
|
|
log.Fatal("NEXARCH_RECONCILE_TENANT_DSN und NEXARCH_RECONCILE_STORAGE_DIR muessen gesetzt sein")
|
|
}
|
|
|
|
ctx := context.Background()
|
|
pool, err := pgxpool.New(ctx, dsn)
|
|
if err != nil {
|
|
log.Fatalf("datenbankverbindung: %v", err)
|
|
}
|
|
defer pool.Close()
|
|
|
|
dbEntries, err := reconcile.ListDBStorageKeys(ctx, pool)
|
|
if err != nil {
|
|
log.Fatalf("datenbank-eintraege lesen: %v", err)
|
|
}
|
|
storageKeys, err := reconcile.ListStorageObjects(storageDir)
|
|
if err != nil {
|
|
log.Fatalf("objekt-storage durchlaufen: %v", err)
|
|
}
|
|
|
|
report := reconcile.Reconcile(dbEntries, storageKeys)
|
|
|
|
encoder := json.NewEncoder(os.Stdout)
|
|
encoder.SetIndent("", " ")
|
|
if err := encoder.Encode(report); err != nil {
|
|
log.Fatalf("bericht ausgeben: %v", err)
|
|
}
|
|
|
|
// Nicht-null-Exit-Code bei Abweichungen (Akzeptanzkriterium 3:
|
|
// Abweichungen werden BERICHTET, nicht automatisch behoben — der
|
|
// Exit-Code macht das fuer systemd/Monitoring sichtbar, OHNE selbst
|
|
// irgendetwas zu reparieren).
|
|
if !report.IsClean() {
|
|
os.Exit(1)
|
|
}
|
|
}
|