From fe4bcb8bbd46c2fa247bee0120b9b0acba0449f8 Mon Sep 17 00:00:00 2001 From: Gregory Kurtzer Date: Sat, 31 Oct 2020 18:25:48 -0700 Subject: [PATCH] Node specific overlay and templating now functioning with other minor fixups --- Makefile | 4 +- cmd/warewulfd/warewulfd.go | 3 + cmd/wwbuild/overlay-utils.go | 90 +++++++++++++++++++ cmd/wwbuild/wwbuild.go | 49 ++++++---- internal/pkg/assets/assets.go | 5 ++ internal/pkg/util/util.go | 64 ++++++------- nodes.yaml | 18 ++-- overlays/generic/etc/hostname.in | 1 + overlays/generic/etc/sysconfig/network | 1 - .../etc/sysconfig/network-scripts/ifcfg-ens33 | 6 -- .../sysconfig/network-scripts/ifcfg-eth0.in | 8 ++ overlays/generic/etc/sysconfig/network.in | 2 + 12 files changed, 186 insertions(+), 65 deletions(-) create mode 100644 cmd/wwbuild/overlay-utils.go create mode 100644 overlays/generic/etc/hostname.in delete mode 100644 overlays/generic/etc/sysconfig/network delete mode 100644 overlays/generic/etc/sysconfig/network-scripts/ifcfg-ens33 create mode 100644 overlays/generic/etc/sysconfig/network-scripts/ifcfg-eth0.in create mode 100644 overlays/generic/etc/sysconfig/network.in diff --git a/Makefile b/Makefile index 2332903a..af9cfeca 100644 --- a/Makefile +++ b/Makefile @@ -20,8 +20,8 @@ services: files sudo systemctl restart dhcpd build: - go build cmd/warewulfd/warewulfd.go - go build cmd/wwbuild/wwbuild.go + cd cmd/warewulfd; go build -o ../../warewulfd + cd cmd/wwbuild; go build -o ../../wwbuild clean: rm -f warewulfd diff --git a/cmd/warewulfd/warewulfd.go b/cmd/warewulfd/warewulfd.go index f9616cdb..09a0f2de 100644 --- a/cmd/warewulfd/warewulfd.go +++ b/cmd/warewulfd/warewulfd.go @@ -12,6 +12,9 @@ import ( "github.com/hpcng/warewulf/internal/pkg/assets" "net/http" ) +// TODO: https://github.com/danderson/netboot/blob/master/pixiecore/dhcp.go +// TODO: https://github.com/pin/tftp + const LocalStateDir = "/var/warewulf" diff --git a/cmd/wwbuild/overlay-utils.go b/cmd/wwbuild/overlay-utils.go new file mode 100644 index 00000000..ca02aba2 --- /dev/null +++ b/cmd/wwbuild/overlay-utils.go @@ -0,0 +1,90 @@ +package main + +import ( + "bufio" + "fmt" + "io" + "os" + "path/filepath" + "strings" +) + + +func BuildOverlayDir(sourceDir string, destDir string, replace map[string]string) error { + err := os.Chdir(sourceDir) + if err != nil { + fmt.Println(err) + return err + } + + err = filepath.Walk(".", func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + + if info.IsDir() { + err := os.MkdirAll(destDir + "/" + path, info.Mode()) + if err != nil { + fmt.Println(err) + } + } else { + if filepath.Ext(path) == ".in" { + destFile := strings.TrimSuffix(path, ".in") + + sourceFD, err := os.Open(sourceDir + "/" + path) + if err != nil { + return err + } + + destFD, err :=os.OpenFile(destDir + "/" + destFile, os.O_RDWR|os.O_CREATE, info.Mode()) + if err != nil { + return err + } + + scanner := bufio.NewScanner(sourceFD) + w := bufio.NewWriter(destFD) + + for scanner.Scan() { + newLine := scanner.Text() + for k, v := range replace { + replaceString := fmt.Sprintf("@%s@", strings.ToUpper(k)) + newLine = strings.ReplaceAll(newLine, replaceString, v) + } + _, err := w.WriteString(newLine + "\n") + if err != nil { + return err + } + + } + w.Flush() + sourceFD.Close() + destFD.Close() + } else { + sourceFD, err := os.Open(sourceDir + "/" + path) + if err != nil { + return err + } + defer sourceFD.Close() + + destFD, err := os.OpenFile(destDir + "/" + path, os.O_RDWR|os.O_CREATE, info.Mode()) + if err != nil { + return err + } + defer destFD.Close() + + _, err = io.Copy(destFD, sourceFD) + if err != nil { + return err + } + } + } + + return nil + }) + if err != nil { + fmt.Println(err) + return err + } + + return nil +} \ No newline at end of file diff --git a/cmd/wwbuild/wwbuild.go b/cmd/wwbuild/wwbuild.go index 29f5e316..29b752ab 100644 --- a/cmd/wwbuild/wwbuild.go +++ b/cmd/wwbuild/wwbuild.go @@ -1,14 +1,14 @@ package main - import ( "fmt" + "github.com/hpcng/warewulf/internal/pkg/assets" + "github.com/hpcng/warewulf/internal/pkg/util" "os" "os/exec" "path" - - "github.com/hpcng/warewulf/internal/pkg/assets" + "strings" ) @@ -74,21 +74,36 @@ func main(){ } else if os.Args[1] == "overlay" { fmt.Printf("note: This needs to create an overlay for each node with macro expansions\n") - for _, node := range assets.FindAllNodes() { - overlayDir := fmt.Sprintf("/etc/warewulf/overlays/%s", node.Overlay) - if _, err := os.Stat(overlayDir); err == nil { - cmd := fmt.Sprintf("cd %s; find . | cpio --quiet -o -H newc | gzip -c > \"%s/provision/overlays/%s.img\"", overlayDir, LocalStateDir, node.Fqdn) - fmt.Printf("BUILDING OVERLAY: %s\n", node.Fqdn) - err := exec.Command("/bin/sh", "-c", cmd).Run() - if err != nil { - fmt.Printf("%s", err) - } - } else { - fmt.Printf("SKIPPING OVERLAY: (bad path) %s\n", overlayDir) - } - } - + fmt.Printf("BUILDING OVERLAY: %s\n", node.Fqdn) + overlayDir := fmt.Sprintf("/etc/warewulf/overlays/%s", node.Overlay) + replace := make(map[string]string) + replace["HOSTNAME"] = node.HostName + replace["FQDN"] = node.Fqdn + replace["VNFS"] = node.Vnfs + replace["KERNELVERSION"] = node.KernelVersion + replace["GROUPNAME"] = node.GroupName + replace["DOMAIN"] = node.DomainName + for key, dev := range node.NetDevs { + replace[fmt.Sprintf("%s:NAME", key)] = key + replace[fmt.Sprintf("%s:HWADDR", key)] = strings.ReplaceAll(dev.Hwaddr, "-", ":") + replace[fmt.Sprintf("%s:IPADDR", key)] = dev.Ipaddr + replace[fmt.Sprintf("%s:NETMASK", key)] = dev.Netmask + replace[fmt.Sprintf("%s:GATEWAY", key)] = dev.Gateway + } + + overlayDest := "/tmp/.overlay-" + util.RandomString(16) + BuildOverlayDir(overlayDir, overlayDest, replace) + + cmd := fmt.Sprintf("cd %s; find . | cpio --quiet -o -H newc -F \"%s/provision/overlays/%s.img\"", overlayDest, LocalStateDir, node.Fqdn) + err := exec.Command("/bin/sh", "-c", cmd).Run() + if err != nil { + fmt.Printf("%s", err) + } + + os.RemoveAll(overlayDest) + + } } } diff --git a/internal/pkg/assets/assets.go b/internal/pkg/assets/assets.go index edda1587..ae1a8a56 100644 --- a/internal/pkg/assets/assets.go +++ b/internal/pkg/assets/assets.go @@ -57,6 +57,7 @@ type NodeInfo struct { Vnfs string Overlay string KernelVersion string + DomainName string NetDevs map[string]netDevs } @@ -85,6 +86,7 @@ func FindAllNodes() []NodeInfo { n.Vnfs = group.Vnfs n.Overlay = group.Overlay n.KernelVersion = group.KernelVersion + n.DomainName = group.DomainSuffix n.NetDevs = node.NetDevs if group.DomainSuffix != "" { @@ -101,6 +103,9 @@ func FindAllNodes() []NodeInfo { if node.Overlay != "" { n.Overlay = node.Overlay } + if node.DomainSuffix != "" { + n.DomainName = node.DomainSuffix + } ret = append(ret, n) } } diff --git a/internal/pkg/util/util.go b/internal/pkg/util/util.go index 739a5473..3465f820 100644 --- a/internal/pkg/util/util.go +++ b/internal/pkg/util/util.go @@ -2,40 +2,44 @@ package util import ( - "bufio" - "fmt" + "io" + "math/rand" "os" - "strings" + + // "strings" ) -func FileCopyReplace(sourceFile string, destFile string, replace map[string]string) error{ - sourceFD, err := os.Open(sourceFile) - if err != nil { - return err +func RandomString(n int) string { + var letter = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") + + b := make([]rune, n) + for i := range b { + b[i] = letter[rand.Intn(len(letter))] } - - destFD, err := os.Create(destFile) - if err != nil { - return err - } - defer sourceFD.Close() - defer destFD.Close() - - scanner := bufio.NewScanner(sourceFD) - w := bufio.NewWriter(destFD) - - for scanner.Scan() { - newLine := scanner.Text() - for k, v := range replace { - replaceString := fmt.Sprintf("@{%s}", strings.ToUpper(k)) - newLine = strings.Replace(newLine, replaceString, v, -1) - - } - w.WriteString(newLine + "\n") - - } - - return w.Flush() + return string(b) } + +func CopyFile(source string, dest string) error { + sourceFD, err := os.Open(source) + if err != nil { + return err + } + + finfo, err := sourceFD.Stat() + + destFD, err := os.OpenFile(dest, os.O_RDWR|os.O_CREATE, finfo.Mode()) + if err != nil { + return err + } + + _, err = io.Copy(destFD, sourceFD) + if err != nil { + return err + } + sourceFD.Close() + destFD.Close() + + return nil +} \ No newline at end of file diff --git a/nodes.yaml b/nodes.yaml index 1a5e525c..80d192fb 100644 --- a/nodes.yaml +++ b/nodes.yaml @@ -11,9 +11,9 @@ nodegroups: netdevs: eth0: hwaddr: xx:xx:xx:xx:aa - ipaddr: x.x.x.x - netmask: x.x.x.x - gateway: x.x.x.x + ipaddr: 192.168.0.101 + netmask: 255.255.255.0 + gateway: 192.168.1.1 group_2: comment: This is the group 2 vnfs: /var/chroots/centos-7 @@ -27,9 +27,9 @@ nodegroups: netdevs: eth0: hwaddr: 00-0c-29-c3-bf-42 - ipaddr: x.x.x.x - netmask: x.x.x.x - gateway: x.x.x.x + ipaddr: 192.168.1.100 + netmask: 255.255.255.0 + gateway: 192.168.1.1 type: ethernet ib0: hwaddr: xx:xx:xx:xx:xx @@ -43,9 +43,9 @@ nodegroups: netdevs: eth0: hwaddr: xx:xx:xx:xx:xx - ipaddr: x.x.x.x - netmask: x.x.x.x - gateway: x.x.x.x + ipaddr: 192.168.1.101 + netmask: 255.255.255.0 + gateway: 192.168.1.1 ib0: hwaddr: xx:xx:xx:xx:xx ipaddr: x.x.x.x diff --git a/overlays/generic/etc/hostname.in b/overlays/generic/etc/hostname.in new file mode 100644 index 00000000..77515887 --- /dev/null +++ b/overlays/generic/etc/hostname.in @@ -0,0 +1 @@ +@HOSTNAME@ diff --git a/overlays/generic/etc/sysconfig/network b/overlays/generic/etc/sysconfig/network deleted file mode 100644 index 61c4a5ad..00000000 --- a/overlays/generic/etc/sysconfig/network +++ /dev/null @@ -1 +0,0 @@ -NETWORKING=yes diff --git a/overlays/generic/etc/sysconfig/network-scripts/ifcfg-ens33 b/overlays/generic/etc/sysconfig/network-scripts/ifcfg-ens33 deleted file mode 100644 index e6e2c599..00000000 --- a/overlays/generic/etc/sysconfig/network-scripts/ifcfg-ens33 +++ /dev/null @@ -1,6 +0,0 @@ -DEVICE=ens33 -BOOTPROTO=static -IPADDR=192.168.1.100 -NETMASK=255.255.255.0 -GATEWAY=192.168.1.1 -ONBOOT=yes diff --git a/overlays/generic/etc/sysconfig/network-scripts/ifcfg-eth0.in b/overlays/generic/etc/sysconfig/network-scripts/ifcfg-eth0.in new file mode 100644 index 00000000..f0c09f54 --- /dev/null +++ b/overlays/generic/etc/sysconfig/network-scripts/ifcfg-eth0.in @@ -0,0 +1,8 @@ +DEVICE=@ETH0:NAME@ +NAME=@ETH0:NAME@ +IPADDR=@ETH0:IPADDR@ +NETMASK=@ETH0:NETMASK@ +GATEWAY=@ETH0:GATEWAY@ +HWADDR=@ETH0:HWADDR@ +BOOTPROTO=static +ONBOOT=yes diff --git a/overlays/generic/etc/sysconfig/network.in b/overlays/generic/etc/sysconfig/network.in new file mode 100644 index 00000000..4e0b31ac --- /dev/null +++ b/overlays/generic/etc/sysconfig/network.in @@ -0,0 +1,2 @@ +NETWORKING=yes +HOSTNAME=@FQDN@