carlos / platform Public

Clone
git clone https://amadan.net/carlos/platform

Plain git — no account needed to clone.

Download

Download this file

1package host
2
3import (
4 "context"
5 "os"
6
7 "github.com/carlosframework/platform/internal/release"
8 "github.com/carlosframework/platform/internal/rootstate"
9)
10
11type generationPinSource struct {
12 legacy func() (bool, error)
13 open func() (rootstate.Store, error)
14 verify func(context.Context, []release.GenerationReservation) error
15 reconcile func(context.Context, []release.GenerationReservation) (release.GenerationEvidence, error)
16 retire func(context.Context, *release.RootGenerations) error
17}
18
19func productionRootGenerationPins() release.PinSource {
20 s := generationPinSource{legacy: legacyRootRestart, retire: productionRetireGenerations, open: func() (rootstate.Store, error) {
21 return rootstate.Open(release.RootGenerationsDir, false, false)
22 }}
23 s.reconcile = (generationReconciler{read: productionGenerationInventory, kernel: productionRetiredGenerationKernelCensus}).reconcile
24 return s
25}
26
27func (s generationPinSource) StagedPins(ctx context.Context, optDir string) (release.StagedPaths, error) {
28 if s.legacy != nil {
29 legacy, err := s.legacy()
30 if err != nil {
31 return nil, err
32 }
33 if legacy {
34 return release.StagedPaths{}, nil
35 }
36 }
37 if s.open == nil {
38 return nil, os.ErrPermission
39 }
40 store, err := s.open()
41 if err != nil {
42 return nil, err
43 }
44 if store == nil {
45 return nil, os.ErrPermission
46 }
47 defer store.Close()
48 ledger := &release.RootGenerations{Store: store}
49 if s.retire != nil {
50 if err := s.retire(ctx, ledger); err != nil {
51 return nil, err
52 }
53 }
54 return (release.RootGenerationPins{Ledger: ledger, Verify: s.verify, Reconcile: s.reconcile}).StagedPins(ctx, optDir)
55}
56