From 521745ce3faacf91f25e55991d11a9635e644aa8 Mon Sep 17 00:00:00 2001 From: Gregory Kurtzer Date: Tue, 3 Nov 2020 21:50:18 -0800 Subject: [PATCH] Fixed wwclient but and more code cleanups --- Makefile | 23 +++++----- cmd/wwbuild/overlay-system.go | 14 +++--- cmd/wwbuild/overlay.go | 3 ++ cmd/wwbuild/wwbuild.go | 10 ++--- cmd/wwclient/wwclient.go | 62 ++++++++++++++++++++------- internal/pkg/assets/assets.go | 23 +++++++--- overlays/runtime/default/etc/ww_hello | 1 + overlays/runtime/etc/test_file | 1 - 8 files changed, 89 insertions(+), 48 deletions(-) create mode 100644 overlays/runtime/default/etc/ww_hello delete mode 100644 overlays/runtime/etc/test_file diff --git a/Makefile b/Makefile index 644ff606..949c0096 100644 --- a/Makefile +++ b/Makefile @@ -3,19 +3,16 @@ all: warewulfd wwbuild wwclient files: all - sudo install -d -m 0755 /var/warewulf/provision - sudo install -d -m 0755 /var/warewulf/provision/kernels - sudo install -d -m 0755 /var/warewulf/provision/overlays - sudo install -d -m 0755 /var/warewulf/provision/bases - sudo install -d -m 0755 /etc/warewulf/ - sudo install -d -m 0755 /var/lib/tftpboot/warewulf/ipxe/ - sudo install -m 0644 dhcpd.conf /etc/dhcp/dhcpd.conf - sudo install -m 0644 nodes.yaml /etc/warewulf/nodes.yaml - sudo cp -r tftpboot/* /var/lib/tftpboot/warewulf/ipxe/ - sudo cp -r overlays /var/warewulf/ - sudo chmod +x /var/warewulf/overlays/system/default/init - sudo mkdir -p /var/warewulf/overlays/system/default/warewulf/bin/ - sudo cp wwclient /var/warewulf/overlays/system/default/warewulf/bin/ + install -d -m 0755 /var/warewulf/ + install -d -m 0755 /etc/warewulf/ + install -d -m 0755 /var/lib/tftpboot/warewulf/ipxe/ + install -m 0644 dhcpd.conf /etc/dhcp/dhcpd.conf + install -m 0644 nodes.yaml /etc/warewulf/nodes.yaml + cp -r tftpboot/* /var/lib/tftpboot/warewulf/ipxe/ + cp -r overlays /var/warewulf/ + chmod +x /var/warewulf/overlays/system/default/init + mkdir -p /var/warewulf/overlays/system/default/warewulf/bin/ + cp wwclient /var/warewulf/overlays/system/default/warewulf/bin/ services: files sudo systemctl enable tftp diff --git a/cmd/wwbuild/overlay-system.go b/cmd/wwbuild/overlay-system.go index 39863f37..e66e6d2c 100644 --- a/cmd/wwbuild/overlay-system.go +++ b/cmd/wwbuild/overlay-system.go @@ -8,6 +8,7 @@ import ( "os/exec" "path" "sync" + "time" ) func overlaySystem(node assets.NodeInfo, replace map[string]string, wg *sync.WaitGroup) { @@ -15,7 +16,7 @@ func overlaySystem(node assets.NodeInfo, replace map[string]string, wg *sync.Wai OverlayDir := fmt.Sprintf("%s/overlays/system/%s", LocalStateDir, node.SystemOverlay) OverlayFile := fmt.Sprintf("%s/provision/overlays/system/%s.img", LocalStateDir, node.Fqdn) -/* + destModTime := time.Time{} destMod, err := os.Stat(OverlayFile) if err == nil { @@ -28,8 +29,8 @@ func overlaySystem(node assets.NodeInfo, replace map[string]string, wg *sync.Wai } configModTime := configMod.ModTime() sourceModTime, _ := util.DirModTime(OverlayDir) -*/ - err := os.MkdirAll(path.Dir(OverlayFile), 0755) + + err = os.MkdirAll(path.Dir(OverlayFile), 0755) if err != nil { fmt.Printf("ERROR: %s\n", err) return @@ -40,7 +41,7 @@ func overlaySystem(node assets.NodeInfo, replace map[string]string, wg *sync.Wai return } -// if sourceModTime.After(destModTime) || configModTime.After(destModTime) { + if sourceModTime.After(destModTime) || configModTime.After(destModTime) { fmt.Printf("SYSTEM: %s\n", node.Fqdn) overlayDest := "/tmp/.overlay-" + util.RandomString(16) @@ -53,8 +54,5 @@ func overlaySystem(node assets.NodeInfo, replace map[string]string, wg *sync.Wai } os.RemoveAll(overlayDest) - -// } else { -// fmt.Printf("SYSTEM: %s (skipped no changes)\n", node.Fqdn) -// } + } } diff --git a/cmd/wwbuild/overlay.go b/cmd/wwbuild/overlay.go index 78d9a733..435590e0 100644 --- a/cmd/wwbuild/overlay.go +++ b/cmd/wwbuild/overlay.go @@ -49,6 +49,9 @@ func BuildOverlayDir(sourceDir string, destDir string, replace map[string]string replaceString := fmt.Sprintf("@%s@", strings.ToUpper(k)) newLine = strings.ReplaceAll(newLine, replaceString, v) } + //TODO: Support directives like '#include ' and + // conditionals like '#IFDEF ....` + _, err := w.WriteString(newLine + "\n") if err != nil { return err diff --git a/cmd/wwbuild/wwbuild.go b/cmd/wwbuild/wwbuild.go index 0d7b20ea..32dcf465 100644 --- a/cmd/wwbuild/wwbuild.go +++ b/cmd/wwbuild/wwbuild.go @@ -118,16 +118,16 @@ func main() { return } - fmt.Printf("SETUP KERNEL: %s (%s)\n", kernelSource, kernelDestination) + fmt.Printf("SETUP KERNEL: %s\n", kernelSource) err = exec.Command("cp", kernelSource, kernelDestination).Run() if err != nil { fmt.Printf("%s", err) } - kernelMods := fmt.Sprintf("./lib/modules/%s", kernelVers) + kernelMods := fmt.Sprintf("/lib/modules/%s", kernelVers) if _, err := os.Stat(kernelMods); err == nil { fmt.Printf("BUILDING MODS: %s\n", kernelMods) - cmd := fmt.Sprintf("cd /; find %s | cpio --quiet -o -H newc -F \"%s\"", kernelMods, kmodsDestination) + cmd := fmt.Sprintf("cd /; find .%s | cpio --quiet -o -H newc -F \"%s\"", kernelMods, kmodsDestination) err := exec.Command("/bin/sh", "-c", cmd).Run() if err != nil { fmt.Printf("OUTPUT: %s", err) @@ -174,8 +174,8 @@ func main() { } wg.Add(2) - overlayRuntime(node, replace, &wg) - overlaySystem(node, replace, &wg) + go overlayRuntime(node, replace, &wg) + go overlaySystem(node, replace, &wg) } wg.Wait() diff --git a/cmd/wwclient/wwclient.go b/cmd/wwclient/wwclient.go index 71b80a2e..79f61365 100644 --- a/cmd/wwclient/wwclient.go +++ b/cmd/wwclient/wwclient.go @@ -2,12 +2,13 @@ package main import ( "fmt" - "io" "log" "net" "net/http" "os" "os/exec" + + // "os/exec" "time" ) @@ -67,7 +68,10 @@ func main() { time.Sleep(1000 * time.Millisecond) } - defer resp.Body.Close() +// defer resp.Body.Close() + + + if resp.StatusCode != 200 { log.Printf("Not updating runtime overlay, got status code: %d\n", resp.StatusCode) @@ -75,25 +79,51 @@ func main() { continue } - command := exec.Command("cpio", "-i") - command.Wait() - stdin, err := command.StdinPipe() +/* + // TODO: Turn all of this into a pipe instead of having to use a tmpfile which + // I tried to get working, but when running on a node, it always gave a + // trying to write on closed file descriptor... This maybe ugly, but it + // works. + tmpfile := fmt.Sprintf("/tmp/.wwclient-%s", util.RandomString(14)) + tmpFD, _ := os.Create(tmpfile) + defer tmpFD.Close() + io.Copy(tmpFD, resp.Body) + tmpFD.Close() + + err := exec.Command("cpio", "-i", "-F", tmpfile).Run() if err != nil { - log.Println(err) + fmt.Printf("%s", err) } - defer stdin.Close() - go func() { - bytes, err := io.Copy(stdin, resp.Body) - if err != nil { - log.Printf("ERROR: io.Copy() failed: %s\n", err) - } else { - log.Printf("Updated the runtime overlay (recv: %d)\n", bytes) - } + os.Remove(tmpfile) - }() - command.Run() +*/ + log.Printf("Updating runtime system\n") + command := exec.Command("/bin/cpio", "-i") + command.Stdin = resp.Body + err := command.Run() + if err != nil { + log.Printf("ERROR: Failed running CPIO: %s\n", err) + } + /* + command.Wait() + stdin, err := command.StdinPipe() + if err != nil { + log.Println(err) + } + defer stdin.Close() + go func() { + bytes, err := io.Copy(stdin, resp.Body) + if err != nil { + log.Printf("ERROR: io.Copy() failed: %s\n", err) + } else { + log.Printf("Updated the runtime overlay (recv: %d)\n", bytes) + } + + }() + command.Run() + */ // defer webclient.CloseIdleConnections() diff --git a/internal/pkg/assets/assets.go b/internal/pkg/assets/assets.go index c9968803..fafee644 100644 --- a/internal/pkg/assets/assets.go +++ b/internal/pkg/assets/assets.go @@ -88,11 +88,7 @@ func FindAllNodes() ([]NodeInfo, error) { n.DomainName = group.DomainSuffix n.NetDevs = node.NetDevs - if group.DomainSuffix != "" { - n.Fqdn = node.Hostname + "." + group.DomainSuffix - } else { - n.Fqdn = node.Hostname - } + if node.KernelVersion != "" { n.KernelVersion = node.KernelVersion } @@ -109,6 +105,20 @@ func FindAllNodes() ([]NodeInfo, error) { n.DomainName = node.DomainSuffix } + + if n.RuntimeOverlay == "" { + n.RuntimeOverlay = "default" + } + if n.SystemOverlay == "" { + n.SystemOverlay = "default" + } + + if n.DomainName != "" { + n.Fqdn = node.Hostname + "." + n.DomainName + } else { + n.Fqdn = node.Hostname + } + ret = append(ret, n) } } @@ -172,6 +182,7 @@ func SearchByName(search string) ([]NodeInfo, error) { return ret, nil } +/* func FindAllVnfs() ([]string, error) { var ret []string set := make(map[string]bool) @@ -259,3 +270,5 @@ func ListRuntimeOverlays() ([]string, error) { return ret, nil } + + */ diff --git a/overlays/runtime/default/etc/ww_hello b/overlays/runtime/default/etc/ww_hello new file mode 100644 index 00000000..6e4a6b48 --- /dev/null +++ b/overlays/runtime/default/etc/ww_hello @@ -0,0 +1 @@ +Hello from Warewulf diff --git a/overlays/runtime/etc/test_file b/overlays/runtime/etc/test_file deleted file mode 100644 index 557db03d..00000000 --- a/overlays/runtime/etc/test_file +++ /dev/null @@ -1 +0,0 @@ -Hello World