Files
warewulf/internal/app/wwctl/overlay/show/main.go
Christian Goll 0c6e7cc58a fixes for split overlays
Signed-off-by: Christian Goll <cgoll@suse.com>
2024-10-17 15:39:54 -04:00

112 lines
2.8 KiB
Go

package show
import (
"bufio"
"bytes"
"errors"
"os"
"path"
"path/filepath"
"regexp"
"strings"
"github.com/spf13/cobra"
"github.com/warewulf/warewulf/internal/pkg/node"
"github.com/warewulf/warewulf/internal/pkg/overlay"
"github.com/warewulf/warewulf/internal/pkg/util"
"github.com/warewulf/warewulf/internal/pkg/wwlog"
)
func CobraRunE(cmd *cobra.Command, args []string) error {
var overlaySourceDir string
overlayName := args[0]
fileName := args[1]
overlaySourceDir = overlay.OverlaySourceDir(overlayName)
if !util.IsDir(overlaySourceDir) {
err := errors.New("overlay does not exist")
return err
}
overlayFile := path.Join(overlaySourceDir, fileName)
if !util.IsFile(overlayFile) {
err := errors.New("file does not exist within overlay")
return err
}
if NodeName == "" {
f, err := os.ReadFile(overlayFile)
if err != nil {
return err
}
wwlog.Output("%s", string(f))
} else {
if !util.IsFile(overlayFile) {
err := errors.New("not a file")
return err
}
if filepath.Ext(overlayFile) != ".ww" {
wwlog.Warn("%s lacks the '.ww' suffix, will not be rendered in an overlay", fileName)
}
nodeDB, err := node.New()
if err != nil {
return err
}
nodeConf, err := nodeDB.GetNode(NodeName)
if err == node.ErrNotFound {
hostName, err := os.Hostname()
if err != nil {
wwlog.Error("Could not get host name: %s", err)
}
nodeConf = node.NewNode(hostName)
nodeConf.ClusterName = hostName
}
tstruct, err := overlay.InitStruct(nodeConf)
if err != nil {
return err
}
tstruct.BuildSource = overlayFile
buffer, backupFile, writeFile, err := overlay.RenderTemplateFile(overlayFile, tstruct)
if err != nil {
return err
}
var outBuffer bytes.Buffer
// search for magic file name comment
bufferScanner := bufio.NewScanner(bytes.NewReader(buffer.Bytes()))
bufferScanner.Split(overlay.ScanLines)
reg := regexp.MustCompile(`.*{{\s*/\*\s*file\s*["'](.*)["']\s*\*/\s*}}.*`)
foundFileComment := false
destFileName := strings.TrimSuffix(fileName, ".ww")
for bufferScanner.Scan() {
line := bufferScanner.Text()
filenameFromTemplate := reg.FindAllStringSubmatch(line, -1)
if len(filenameFromTemplate) != 0 {
wwlog.Debug("Found multifile comment, new filename %s", filenameFromTemplate[0][1])
if foundFileComment {
if !Quiet {
wwlog.Info("backupFile: %v", backupFile)
wwlog.Info("writeFile: %v", writeFile)
wwlog.Info("Filename: %s", destFileName)
}
wwlog.Output("%s", outBuffer.String())
outBuffer.Reset()
}
destFileName = filenameFromTemplate[0][1]
foundFileComment = true
} else {
_, _ = outBuffer.WriteString(line)
}
}
if !Quiet {
wwlog.Info("backupFile: %v", backupFile)
wwlog.Info("writeFile: %v", writeFile)
wwlog.Info("Filename: %s", destFileName)
}
wwlog.Output("%s", outBuffer.String())
}
return nil
}