talm
1// This Source Code Form is subject to the terms of the Mozilla Public
2// License, v. 2.0. If a copy of the MPL was not distributed with this
3// file, You can obtain one at http://mozilla.org/MPL/2.0/.
4
5package main6
7import (8"context"9"log"10"os"11
12"github.com/aenix-io/talm/internal/app/machined/pkg/runtime/v1alpha1/bootloader"13"github.com/aenix-io/talm/internal/pkg/meta"14)
15
16func revertBootloader(ctx context.Context) {17if err := revertBootloadInternal(ctx); err != nil {18log.Printf("failed to revert bootloader: %s", err)19}20}
21
22func revertBootloadInternal(ctx context.Context) error {23metaState, err := meta.New(ctx, nil)24if err != nil {25if os.IsNotExist(err) {26// no META, no way to revert27return nil28}29
30return err31}32
33label, ok := metaState.ReadTag(meta.Upgrade)34if !ok {35return nil36}37
38if label == "" {39if _, err = metaState.DeleteTag(ctx, meta.Upgrade); err != nil {40return err41}42
43return metaState.Flush()44}45
46log.Printf("reverting failed upgrade, switching to %q", label)47
48if err = func() error {49config, probeErr := bootloader.Probe(ctx, "")50if probeErr != nil {51if os.IsNotExist(probeErr) {52// no bootloader found, nothing to do53return nil54}55
56return probeErr57}58
59return config.Revert(ctx)60}(); err != nil {61return err62}63
64if _, err = metaState.DeleteTag(ctx, meta.Upgrade); err != nil {65return err66}67
68return metaState.Flush()69}
70