kairos-agent/internal/agent/hooks/sysext.go

89 lines
2.4 KiB
Go

package hook
import (
"github.com/kairos-io/kairos-agent/v2/pkg/config"
"github.com/kairos-io/kairos-agent/v2/pkg/constants"
"github.com/kairos-io/kairos-agent/v2/pkg/types/v1"
fsutils "github.com/kairos-io/kairos-agent/v2/pkg/utils/fs"
"github.com/kairos-io/kairos-agent/v2/pkg/utils/partitions"
"io/fs"
"path/filepath"
"strings"
)
type SysExtPostInstall struct{}
func (b SysExtPostInstall) Run(c config.Config, _ v1.Spec) error {
c.Logger.Logger.Debug().Msg("Running SysExtPostInstall hook")
// mount efi partition
efiPart, err := partitions.GetEfiPartition()
if err != nil {
c.Logger.Errorf("failed to get EFI partition: %s", err)
if c.FailOnBundleErrors {
return err
}
return nil
}
mounted, _ := c.Mounter.IsMountPoint(constants.EfiDir)
if !mounted {
err = c.Mounter.Mount(efiPart.Path, constants.EfiDir, efiPart.FS, []string{"rw"})
if err != nil {
c.Logger.Errorf("failed to mount EFI partition: %s", err)
if c.FailOnBundleErrors {
return err
}
return nil
}
defer func() {
_ = c.Mounter.Unmount(constants.EfiDir)
}()
} else {
// If its mounted, try to remount it RW
err = c.Mounter.Mount(efiPart.Path, constants.EfiDir, efiPart.FS, []string{"remount,rw"})
defer func() {
_ = c.Mounter.Unmount(constants.EfiDir)
}()
}
activeDir := filepath.Join(constants.EfiDir, "EFI/kairos/active.efi.extra.d/")
passiveDir := filepath.Join(constants.EfiDir, "EFI/kairos/passive.efi.extra.d/")
for _, dir := range []string{activeDir, passiveDir} {
err = fsutils.MkdirAll(c.Fs, dir, 0755)
if err != nil {
c.Logger.Errorf("failed to create directory %s: %s", dir, err)
if c.FailOnBundleErrors {
return err
}
return nil
}
}
err = fsutils.WalkDirFs(c.Fs, constants.LiveDir, func(path string, info fs.DirEntry, err error) error {
if err != nil {
return err
}
if info.IsDir() {
return nil
}
if strings.HasSuffix(info.Name(), ".sysext.raw") {
// copy it to /EFI/Kairos/{active,passive}.efi.extra.d/
err = fsutils.Copy(c.Fs, path, filepath.Join(activeDir, info.Name()))
if err != nil {
c.Logger.Errorf("failed to copy %s to %s: %s", path, activeDir, err)
if c.FailOnBundleErrors {
return err
}
return nil
}
c.Logger.Debugf("copied %s to %s", path, activeDir)
}
return nil
})
if c.FailOnBundleErrors && err != nil {
return err
}
c.Logger.Logger.Debug().Msg("Done SysExtPostInstall hook")
return nil
}