// 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) } }