diff --git a/cmd/dkl-local-server/bootv2.go b/cmd/dkl-local-server/bootv2.go index 3e0db9c..290f2cc 100644 --- a/cmd/dkl-local-server/bootv2.go +++ b/cmd/dkl-local-server/bootv2.go @@ -16,8 +16,10 @@ import ( "slices" "strings" + "github.com/cavaliergopher/cpio" "github.com/klauspost/compress/zstd" + "novit.tech/direktil/pkg/base64" "novit.tech/direktil/pkg/config" "novit.tech/direktil/pkg/cpiocat" "novit.tech/direktil/pkg/localconfig" @@ -38,7 +40,7 @@ func renderBootstrapConfig(w http.ResponseWriter, ctx *renderContext) (err error func buildInitrd(out io.Writer, ctx *renderContext) (err error) { _, cfg, err := ctx.Config() if err != nil { - return + return fmt.Errorf("render config failed: %w", err) } zout, err := zstd.NewWriter(out, zstd.WithEncoderLevel(zstd.EncoderLevelFromZstd(12))) @@ -51,10 +53,32 @@ func buildInitrd(out io.Writer, ctx *renderContext) (err error) { // initrd initrdPath, err := distFetch("initrd", ctx.Host.Initrd) if err != nil { - return + return fmt.Errorf("fetch initrd failed: %w", err) } cat.AppendArchFile(initrdPath) + // copy config's udev rules (FIXME: too much logic for dls) + for _, file := range cfg.Files { + if !strings.HasPrefix(file.Path, "/etc/udev/rules.d/") { + continue + } + + content := []byte(file.Content) + if c := file.Content64; c != "" { + content, err = base64.Decode(c) + if err != nil { + return fmt.Errorf("decode %s failed: %w", file.Path, err) + } + } + + mode := file.Mode + if mode == 0 { + mode = 0o644 + } + + cat.AppendBytes(content, file.Path, cpio.FileMode(mode)) + } + // embedded layers (modules) for _, layer := range cfg.Layers { switch layer { @@ -65,7 +89,7 @@ func buildInitrd(out io.Writer, ctx *renderContext) (err error) { } modulesPath, err := distFetch("layers", layer, layerVersion) if err != nil { - return err + return fmt.Errorf("fetch layer %s failed: %w", layer, err) } cat.AppendFile(modulesPath, "modules.sqfs") @@ -75,7 +99,7 @@ func buildInitrd(out io.Writer, ctx *renderContext) (err error) { // config cfgBytes, err := ctx.BootstrapConfig() if err != nil { - return + return fmt.Errorf("render bootstrap config failed: %w", err) } cat.AppendBytes(cfgBytes, "config.yaml", 0o600)