package host import ( "context" "os" "github.com/carlosframework/platform/internal/release" "github.com/carlosframework/platform/internal/rootstate" ) type generationPinSource struct { legacy func() (bool, error) open func() (rootstate.Store, error) verify func(context.Context, []release.GenerationReservation) error reconcile func(context.Context, []release.GenerationReservation) (release.GenerationEvidence, error) retire func(context.Context, *release.RootGenerations) error } func productionRootGenerationPins() release.PinSource { s := generationPinSource{legacy: legacyRootRestart, retire: productionRetireGenerations, open: func() (rootstate.Store, error) { return rootstate.Open(release.RootGenerationsDir, false, false) }} s.reconcile = (generationReconciler{read: productionGenerationInventory, kernel: productionRetiredGenerationKernelCensus}).reconcile return s } func (s generationPinSource) StagedPins(ctx context.Context, optDir string) (release.StagedPaths, error) { if s.legacy != nil { legacy, err := s.legacy() if err != nil { return nil, err } if legacy { return release.StagedPaths{}, nil } } if s.open == nil { return nil, os.ErrPermission } store, err := s.open() if err != nil { return nil, err } if store == nil { return nil, os.ErrPermission } defer store.Close() ledger := &release.RootGenerations{Store: store} if s.retire != nil { if err := s.retire(ctx, ledger); err != nil { return nil, err } } return (release.RootGenerationPins{Ledger: ledger, Verify: s.verify, Reconcile: s.reconcile}).StagedPins(ctx, optDir) }