mirror of
https://github.com/kairos-io/kairos-agent.git
synced 2025-06-03 01:44:53 +00:00
89 lines
2.4 KiB
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
|
|
}
|