From b4eb68de619c6f690521b2726aaad6a6d26802bf Mon Sep 17 00:00:00 2001 From: Gregory Kurtzer Date: Sun, 1 Nov 2020 21:19:09 -0800 Subject: [PATCH] Created utility copy function and only update overlays if changed --- cmd/wwbuild/overlay-utils.go | 15 ++------------- cmd/wwbuild/wwbuild.go | 34 ++++++++++++++++++++++++---------- internal/pkg/util/util.go | 30 ++++++++++++++++++++++++++---- 3 files changed, 52 insertions(+), 27 deletions(-) diff --git a/cmd/wwbuild/overlay-utils.go b/cmd/wwbuild/overlay-utils.go index ca02aba2..5f5632fb 100644 --- a/cmd/wwbuild/overlay-utils.go +++ b/cmd/wwbuild/overlay-utils.go @@ -3,7 +3,7 @@ package main import ( "bufio" "fmt" - "io" + "github.com/hpcng/warewulf/internal/pkg/util" "os" "path/filepath" "strings" @@ -60,19 +60,8 @@ func BuildOverlayDir(sourceDir string, destDir string, replace map[string]string sourceFD.Close() destFD.Close() } else { - sourceFD, err := os.Open(sourceDir + "/" + path) - if err != nil { - return err - } - defer sourceFD.Close() + err := util.CopyFile(sourceDir + "/" + path, destDir + "/" + path) - 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 } diff --git a/cmd/wwbuild/wwbuild.go b/cmd/wwbuild/wwbuild.go index 29b752ab..9094f740 100644 --- a/cmd/wwbuild/wwbuild.go +++ b/cmd/wwbuild/wwbuild.go @@ -75,7 +75,6 @@ func main(){ fmt.Printf("note: This needs to create an overlay for each node with macro expansions\n") for _, node := range assets.FindAllNodes() { - fmt.Printf("BUILDING OVERLAY: %s\n", node.Fqdn) overlayDir := fmt.Sprintf("/etc/warewulf/overlays/%s", node.Overlay) replace := make(map[string]string) @@ -93,17 +92,32 @@ func main(){ replace[fmt.Sprintf("%s:GATEWAY", key)] = dev.Gateway } - overlayDest := "/tmp/.overlay-" + util.RandomString(16) - BuildOverlayDir(overlayDir, overlayDest, replace) + destFile := fmt.Sprintf("%s/provision/overlays/%s.img", LocalStateDir, node.Fqdn) - 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) + destMod, _ := os.Stat(destFile) + destModTime := destMod.ModTime() + + configMod, _ := os.Stat("/etc/warewulf/nodes.yaml") + configModTime := configMod.ModTime() + + sourceModTime := util.DirModTime(overlayDir) + + if sourceModTime.After(destModTime) || configModTime.After(destModTime) { + fmt.Printf("BUILDING OVERLAY: %s\n", node.Fqdn) + + overlayDest := "/tmp/.overlay-" + util.RandomString(16) + BuildOverlayDir(overlayDir, overlayDest, replace) + + cmd := fmt.Sprintf("cd %s; find . | cpio --quiet -o -H newc -F \"%s\"", overlayDest, destFile) + err := exec.Command("/bin/sh", "-c", cmd).Run() + if err != nil { + fmt.Printf("%s", err) + } + + os.RemoveAll(overlayDest) + } else { + fmt.Printf("Skipping overlay (nothing changed): %s\n", node.Fqdn) } - - os.RemoveAll(overlayDest) - } } } diff --git a/internal/pkg/util/util.go b/internal/pkg/util/util.go index 3465f820..ee771494 100644 --- a/internal/pkg/util/util.go +++ b/internal/pkg/util/util.go @@ -5,11 +5,34 @@ import ( "io" "math/rand" "os" + "path/filepath" + "time" // "strings" ) +func DirModTime (path string) time.Time { + + var lastTime time.Time + err := filepath.Walk(path, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + + cur := info.ModTime() + if cur.After(lastTime) { + lastTime = info.ModTime() + } + + return nil + }) + if err != nil { + return time.Now() + } + return lastTime +} + func RandomString(n int) string { var letter = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") @@ -20,7 +43,6 @@ func RandomString(n int) string { return string(b) } - func CopyFile(source string, dest string) error { sourceFD, err := os.Open(source) if err != nil { @@ -38,8 +60,8 @@ func CopyFile(source string, dest string) error { if err != nil { return err } - sourceFD.Close() - destFD.Close() - return nil + sourceFD.Close() + + return destFD.Close() } \ No newline at end of file