package cmd import ( "fmt" "log/slog" "github.com/portainer/kubesolo-os/update/pkg/state" ) // Rollback forces an immediate switch to the other partition. // Use this to manually revert to the previous version. // // State transition: any → RolledBack with LastError="manual rollback". func Rollback(args []string) error { opts := parseOpts(args) env := opts.NewBootEnv() st, err := state.Load(opts.StatePath) if err != nil { slog.Warn("state file unreadable, starting fresh", "error", err) st = state.New() } activeSlot, err := env.ActiveSlot() if err != nil { return fmt.Errorf("reading active slot: %w", err) } passiveSlot, err := env.PassiveSlot() if err != nil { return fmt.Errorf("reading passive slot: %w", err) } slog.Info("forcing rollback", "from", activeSlot, "to", passiveSlot) if err := env.ForceRollback(); err != nil { _ = st.RecordError(opts.StatePath, fmt.Errorf("rollback failed: %w", err)) return fmt.Errorf("rollback failed: %w", err) } if err := st.Transition(opts.StatePath, state.PhaseRolledBack, "", "manual rollback"); err != nil { slog.Warn("state transition failed", "phase", state.PhaseRolledBack, "error", err) } fmt.Printf("Rolled back: %s → %s\n", activeSlot, passiveSlot) fmt.Println("Reboot to complete rollback.") return nil }