mirror of
https://github.com/kairos-io/kairos-agent.git
synced 2025-04-27 03:11:14 +00:00
76 lines
2.7 KiB
Go
76 lines
2.7 KiB
Go
package hook
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/kairos-io/kairos-agent/v2/pkg/config"
|
|
v1 "github.com/kairos-io/kairos-agent/v2/pkg/types/v1"
|
|
"github.com/kairos-io/kairos-sdk/utils"
|
|
"strings"
|
|
)
|
|
|
|
type Interface interface {
|
|
Run(c config.Config, spec v1.Spec) error
|
|
}
|
|
|
|
// FinishInstall is a list of hooks that run when the install process is finished completely.
|
|
// Its mean for options that are not related to the install process itself
|
|
var FinishInstall = []Interface{
|
|
&Lifecycle{}, // Handles poweroff/reboot by config options
|
|
}
|
|
|
|
// FinishReset is a list of hooks that run when the reset process is finished completely.
|
|
var FinishReset = []Interface{
|
|
&CopyLogs{}, // Try to copy the reset logs to the persistent partition
|
|
&Lifecycle{}, // Handles poweroff/reboot by config options
|
|
}
|
|
|
|
// FinishUpgrade is a list of hooks that run when the upgrade process is finished completely.
|
|
var FinishUpgrade = []Interface{
|
|
&Lifecycle{}, // Handles poweroff/reboot by config options
|
|
}
|
|
|
|
// FirstBoot is a list of hooks that run on the first boot of the node.
|
|
var FirstBoot = []Interface{
|
|
&BundleFirstBoot{},
|
|
&GrubPostInstallOptions{},
|
|
}
|
|
|
|
// FinishUKIInstall is a list of hooks that run when the install process is finished completely.
|
|
// Its mean for options that are not related to the install process itself
|
|
var FinishUKIInstall = []Interface{
|
|
&SysExtPostInstall{}, // Installs sysexts into the EFI partition
|
|
&Lifecycle{}, // Handles poweroff/reboot by config options
|
|
}
|
|
|
|
// PostInstall is a list of hooks that run after the install process has run.
|
|
// Runs things that need to be done before we run other post install stages like
|
|
// encrypting partitions, copying the install logs or installing bundles
|
|
// Most of this options are optional so they are not run by default unless specified in the config
|
|
var PostInstall = []Interface{
|
|
&Finish{},
|
|
}
|
|
|
|
func Run(c config.Config, spec v1.Spec, hooks ...Interface) error {
|
|
for _, h := range hooks {
|
|
if err := h.Run(c, spec); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// lockPartitions will try to close all the partitions that are unencrypted.
|
|
func lockPartitions(c config.Config) {
|
|
for _, p := range c.Install.Encrypt {
|
|
_, _ = utils.SH("udevadm trigger --type=all || udevadm trigger")
|
|
c.Logger.Debugf("Closing unencrypted /dev/disk/by-label/%s", p)
|
|
out, err := utils.SH(fmt.Sprintf("cryptsetup close /dev/disk/by-label/%s", p))
|
|
// There is a known error with cryptsetup that it can't close the device because of a semaphore
|
|
// doesnt seem to affect anything as the device is closed as expected so we ignore it if it matches the
|
|
// output of the error
|
|
if err != nil && !strings.Contains(out, "incorrect semaphore state") {
|
|
c.Logger.Debugf("could not close /dev/disk/by-label/%s: %s", p, out)
|
|
}
|
|
}
|
|
}
|