diff --git a/cmd/wwbuild/overlay-runtime.go b/cmd/wwbuild/overlay-runtime.go deleted file mode 100644 index 1b738b01..00000000 --- a/cmd/wwbuild/overlay-runtime.go +++ /dev/null @@ -1,61 +0,0 @@ -package main - -import ( - "fmt" - "github.com/hpcng/warewulf/internal/pkg/assets" - "github.com/hpcng/warewulf/internal/pkg/config" - "github.com/hpcng/warewulf/internal/pkg/util" - "os" - "os/exec" - "path" - "sync" -) - -func overlayRuntime(node assets.NodeInfo, replace map[string]string, wg *sync.WaitGroup) { - defer wg.Done() - - OverlayDir := fmt.Sprintf("%s/overlays/runtime/%s", config.LocalStateDir, node.RuntimeOverlay) - OverlayFile := fmt.Sprintf("%s/provision/overlays/runtime/%s.img", config.LocalStateDir, node.Fqdn) - /* - destModTime := time.Time{} - destMod, err := os.Stat(OverlayFile) - if err == n - - il { - destModTime = destMod.ModTime() - } - configMod, err := os.Stat("/etc/warewulf/nodes.conf") - if err != nil { - fmt.Printf("ERROR: could not find node file: /etc/warewulf/nodes.conf") - os.Exit(1) - } - configModTime := configMod.ModTime() - sourceModTime, _ := util.DirModTime(OverlayDir) - */ - err := os.MkdirAll(path.Dir(OverlayFile), 0755) - if err != nil { - fmt.Printf("ERROR: %s\n", err) - return - } - err = os.MkdirAll(OverlayDir, 0755) - if err != nil { - fmt.Printf("ERROR: %s\n", err) - return - } - // if sourceModTime.After(destModTime) || configModTime.After(destModTime) { - fmt.Printf("RUNTIME: %s\n", node.Fqdn) - - overlayDest := "/tmp/.system-overlay-" + util.RandomString(16) - BuildOverlayDir(OverlayDir, overlayDest, replace) - - cmd := fmt.Sprintf("cd %s && find . | cpio --quiet -o -H newc -F \"%s\"", overlayDest, OverlayFile) - err = exec.Command("/bin/sh", "-c", cmd).Run() - if err != nil { - fmt.Printf("%s", err) - } - - os.RemoveAll(overlayDest) - // } else { - // fmt.Printf("RUNTIME: %s (skipped no changes)\n", node.Fqdn) - // } -} diff --git a/cmd/wwbuild/overlay-system.go b/cmd/wwbuild/overlay-system.go deleted file mode 100644 index 1fbb0f23..00000000 --- a/cmd/wwbuild/overlay-system.go +++ /dev/null @@ -1,59 +0,0 @@ -package main - -import ( - "fmt" - "github.com/hpcng/warewulf/internal/pkg/assets" - "github.com/hpcng/warewulf/internal/pkg/config" - "github.com/hpcng/warewulf/internal/pkg/util" - "os" - "os/exec" - "path" - "sync" - "time" -) - -func overlaySystem(node assets.NodeInfo, replace map[string]string, wg *sync.WaitGroup) { - defer wg.Done() - - OverlayDir := fmt.Sprintf("%s/overlays/system/%s", config.LocalStateDir, node.SystemOverlay) - OverlayFile := fmt.Sprintf("%s/provision/overlays/system/%s.img", config.LocalStateDir, node.Fqdn) - - destModTime := time.Time{} - destMod, err := os.Stat(OverlayFile) - if err == nil { - destModTime = destMod.ModTime() - } - configMod, err := os.Stat(config.SysConfDir + "nodes.conf") - if err != nil { - fmt.Printf("ERROR: could not find node file: nodes.conf\n", config.SysConfDir) - os.Exit(1) - } - configModTime := configMod.ModTime() - sourceModTime, _ := util.DirModTime(OverlayDir) - - err = os.MkdirAll(path.Dir(OverlayFile), 0755) - if err != nil { - fmt.Printf("ERROR: %s\n", err) - return - } - err = os.MkdirAll(OverlayDir, 0755) - if err != nil { - fmt.Printf("ERROR: %s\n", err) - return - } - - if sourceModTime.After(destModTime) || configModTime.After(destModTime) { - fmt.Printf("SYSTEM: %s\n", node.Fqdn) - - overlayDest := "/tmp/.system-overlay-" + util.RandomString(16) - BuildOverlayDir(OverlayDir, overlayDest, replace) - - cmd := fmt.Sprintf("cd %s && find . | cpio --quiet -o -H newc -F \"%s\"", overlayDest, OverlayFile) - err = exec.Command("/bin/sh", "-c", cmd).Run() - if err != nil { - fmt.Printf("%s", err) - } - - os.RemoveAll(overlayDest) - } -} diff --git a/cmd/wwbuild/overlay.go b/cmd/wwbuild/overlay.go deleted file mode 100644 index 1ef294e7..00000000 --- a/cmd/wwbuild/overlay.go +++ /dev/null @@ -1,132 +0,0 @@ -package main - -import ( - "bufio" - "fmt" - "github.com/hpcng/warewulf/internal/pkg/util" - "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") - skip := false - - 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) - } - - if strings.HasPrefix(newLine, "#WWEND") { - skip = false - } else if skip == true { - - } else if strings.HasPrefix(newLine, "#WWIFDEF ") { - line := strings.Split(newLine, " ") - if len(line) > 0 && line[1] != "false" { - skip = true - } - } else if strings.HasPrefix(newLine, "#WWIFNDEF ") { - line := strings.Split(newLine, " ") - if len(line) > 0 && line[1] == "false" { - skip = true - } - } else if strings.HasPrefix(newLine, "#WWIF ") { - line := strings.Split(newLine, " ") - if len(line) == 2 && line[1] != "false" { - skip = true - } else if len(line) > 3 { - - if line[2] == "==" { - if line[1] != line[3] { - skip = true - } - } - } - } else if strings.HasPrefix(newLine, "#WWELSE") { - if skip == true { - skip = false - } else { - skip = true - } - } else if strings.HasPrefix(newLine, "#WWINCLUDE ") { - line := strings.Split(newLine, " ") - //fmt.Printf("Including file (%s): %s\n", destDir + "/" + destFile, line[1]) - includeFD, err := os.Open(line[1]) - if err != nil { - fmt.Printf("ERROR(os.Open): %s\n", err) - return err - } - _, err = io.Copy(w, includeFD) - if err != nil { - fmt.Printf("ERROR(io.Copy): %s\n", err) - return err - } - includeFD.Close() - } else if strings.HasPrefix(newLine, "#WW") { - // Anything else is a comment or to be ignored - continue - } else { - _, err := w.WriteString(newLine + "\n") - if err != nil { - return err - } - } - } - w.Flush() - sourceFD.Close() - destFD.Close() - } else { - err := util.CopyFile(sourceDir+"/"+path, destDir+"/"+path) - - if err != nil { - return err - } - } - } - - return nil - }) - if err != nil { - fmt.Println(err) - return err - } - - return nil -} diff --git a/cmd/wwbuild/wwbuild.go b/cmd/wwbuild/wwbuild.go deleted file mode 100644 index ef23ffa9..00000000 --- a/cmd/wwbuild/wwbuild.go +++ /dev/null @@ -1,151 +0,0 @@ -package main - -import ( - "fmt" - "os" - "os/exec" - "path" - "strings" - "sync" - "time" - - "github.com/hpcng/warewulf/internal/pkg/assets" - "github.com/hpcng/warewulf/internal/pkg/config" - "github.com/hpcng/warewulf/internal/pkg/vnfs" -) - -func main() { - - if len(os.Args) < 2 { - fmt.Printf("USAGE: %s [vnfs/kernel/system-overlay] (node regex)\n", os.Args[0]) - return - } - - if os.Args[1] == "vnfs" { - var nodeList []assets.NodeInfo - set := make(map[string]bool) - var wg sync.WaitGroup - - if len(os.Args) >= 3 { - nodeList, _ = assets.SearchByName(os.Args[2]) - } else { - nodeList, _ = assets.FindAllNodes() - } - - if len(nodeList) == 0 { - fmt.Printf("ERROR: No nodes found\n") - return - } - - for _, node := range nodeList { - if node.Vnfs != "" { - set[node.Vnfs] = true - } - } - - for entry := range set { - wg.Add(1) - if strings.HasPrefix(entry, "/") { - vnfsLocalBuild(entry, &wg) - } else { - vnfsOciBuild(entry, &wg) - } - } - - time.Sleep(1000 * time.Millisecond) - fmt.Printf("Waiting for build(s) to complete...\n") - wg.Wait() - - } else if os.Args[1] == "kernel" { - var nodeList []assets.NodeInfo - set := make(map[string]bool) - - if len(os.Args) >= 3 { - nodeList, _ = assets.SearchByName(os.Args[2]) - } else { - nodeList, _ = assets.FindAllNodes() - } - - if len(nodeList) == 0 { - fmt.Printf("ERROR: No nodes found\n") - return - } - - for _, node := range nodeList { - if node.KernelVersion != "" { - set[node.KernelVersion] = true - } - } - - for kernelVers := range set { - kernelSource := fmt.Sprintf("/boot/vmlinuz-%s", kernelVers) - // TODO: Check time stamps of source and dests to see if we need to rebuild or skip - if _, err := os.Stat(kernelSource); err == nil { - kernelDestination := fmt.Sprintf("%s/provision/kernel/vmlinuz-%s", config.LocalStateDir, kernelVers) - kmodsDestination := fmt.Sprintf("%s/provision/kernel/kmods-%s.img", config.LocalStateDir, kernelVers) - - err := os.MkdirAll(path.Dir(kernelDestination), 0755) - if err != nil { - fmt.Printf("ERROR: %s\n", err) - return - } - - 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) - 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) - err := exec.Command("/bin/sh", "-c", cmd).Run() - if err != nil { - fmt.Printf("OUTPUT: %s", err) - } - - } - } - } - } else if os.Args[1] == "system-overlay" { - var nodeList []assets.NodeInfo - var wg sync.WaitGroup - - if len(os.Args) >= 3 { - nodeList, _ = assets.SearchByName(os.Args[2]) - } else { - nodeList, _ = assets.FindAllNodes() - } - - if len(nodeList) == 0 { - fmt.Printf("ERROR: No nodes found\n") - return - } - - for _, node := range nodeList { - v := vnfs.New(node.Vnfs) - replace := make(map[string]string) - replace["HOSTNAME"] = node.HostName - replace["FQDN"] = node.Fqdn - replace["VNFS"] = node.Vnfs - replace["VNFSDIR"] = v.Root() - 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 - } - - wg.Add(2) - overlayRuntime(node, replace, &wg) - overlaySystem(node, replace, &wg) - } - wg.Wait() - - } -} diff --git a/cmd/wwclient/wwclient.go b/cmd/wwclient/wwclient.go index 6153639d..9905446c 100644 --- a/cmd/wwclient/wwclient.go +++ b/cmd/wwclient/wwclient.go @@ -78,18 +78,12 @@ func main() { time.Sleep(1000 * time.Millisecond) } -// defer resp.Body.Close() - - - - if resp.StatusCode != 200 { log.Printf("Not updating runtime system-overlay, got status code: %d\n", resp.StatusCode) time.Sleep(60000 * time.Millisecond) continue } - log.Printf("Updating runtime system\n") command := exec.Command("/bin/cpio", "-iu") command.Stdin = resp.Body diff --git a/internal/pkg/assets/assets.go b/internal/pkg/assets/assets.go index 8415232d..0412d2ff 100644 --- a/internal/pkg/assets/assets.go +++ b/internal/pkg/assets/assets.go @@ -3,6 +3,7 @@ package assets import ( "fmt" "github.com/hpcng/warewulf/internal/pkg/vnfs" + "github.com/hpcng/warewulf/internal/pkg/wwlog" "gopkg.in/yaml.v2" "io/ioutil" "strings" @@ -137,13 +138,16 @@ func FindAllNodes() ([]NodeInfo, error) { n.Fqdn = node.Hostname } - if strings.HasPrefix(n.Vnfs, "docker://") { + if b, _ := regexp.MatchString(`^[a-z\-]+://`, n.Vnfs); b == true { + //if strings.HasPrefix(n.Vnfs, "docker://") { //TODO: This is a kludge and shouldn't be done here. We need to go back // and do this from a "vnfs" interface or package v := vnfs.New(n.Vnfs) n.VnfsDir = v.Root() - } else { + } else if strings.HasPrefix(n.Vnfs, "/"){ n.VnfsDir = n.Vnfs + } else { + wwlog.Printf(wwlog.ERROR, "Configuration 'Vnfs' is invalid for node: %s\n", n.Fqdn) } ret = append(ret, n) diff --git a/internal/pkg/config/config.go b/internal/pkg/config/config.go index 1717cdd9..acd5236b 100644 --- a/internal/pkg/config/config.go +++ b/internal/pkg/config/config.go @@ -7,10 +7,10 @@ import ( "io/ioutil" ) -// THIS IS NOT BEING USED YET AND IS THUS A WORK IN PROGRESS - -const SysConfDir = "/etc/warewulf/" -const LocalStateDir = "/var/warewulf" +const ( + SysConfDir = "/etc/warewulf/" + LocalStateDir = "/var/warewulf" +) type Config struct { Port int `yaml:"warewulfd port", envconfig:"WAREWULFD_PORT"` diff --git a/internal/pkg/vnfs/vnfs.go b/internal/pkg/vnfs/vnfs.go index 433afcdf..5c39cb00 100644 --- a/internal/pkg/vnfs/vnfs.go +++ b/internal/pkg/vnfs/vnfs.go @@ -43,7 +43,7 @@ func (self *VnfsObject) NameClean() string { } uri := strings.Split(self.SourcePath, "://") - return strings.ReplaceAll(uri[1], "/", "_") + return strings.ReplaceAll(uri[0]+":"+uri[1], "/", "_") } func (self *VnfsObject) Source() string { diff --git a/internal/pkg/wwlog/wwlog.go b/internal/pkg/wwlog/wwlog.go index 14f36204..085a8c38 100644 --- a/internal/pkg/wwlog/wwlog.go +++ b/internal/pkg/wwlog/wwlog.go @@ -22,7 +22,12 @@ var ( func SetLevel(level uint) { logLevel = level - log.SetFlags(0) + if level == DEBUG { + log.SetFlags(log.Lmicroseconds) + } else { + log.SetFlags(0) + } + Printf(DEBUG, "Set log level to: %d\n", logLevel) }