112 lines
2.8 KiB
Go
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
|
|
}
|