diff --git a/cmd/warewulfd/warewulfd.go b/cmd/warewulfd/warewulfd.go index f80d85ce..f9616cdb 100644 --- a/cmd/warewulfd/warewulfd.go +++ b/cmd/warewulfd/warewulfd.go @@ -3,22 +3,20 @@ package main import ( "fmt" - "strings" - "os" - "strconv" "io" + "os" "path" + "strconv" + "strings" - "net/http" "github.com/hpcng/warewulf/internal/pkg/assets" + "net/http" ) const LocalStateDir = "/var/warewulf" -const SysConfDir = "/etc/warewulf" - func ipxe(w http.ResponseWriter, req *http.Request) { - url := strings.Split(req.URL.Path, "/"); + url := strings.Split(req.URL.Path, "/") if url[2] == "" { fmt.Printf("ERROR: Bad iPXE request from %s\n", req.RemoteAddr) @@ -28,17 +26,17 @@ func ipxe(w http.ResponseWriter, req *http.Request) { node := assets.FindByHwaddr(url[2]) if node.HostName != "" { - fmt.Printf("IPXE: %15s: hwaddr=%s\n", node.Fqdn, url[2]); + fmt.Printf("IPXE: %15s: hwaddr=%s\n", node.Fqdn, url[2]) - fmt.Fprintf(w, "#!ipxe\n"); + fmt.Fprintf(w, "#!ipxe\n") - fmt.Fprintf(w, "echo Now booting Warewulf - v4 Proof of Concept\n"); + fmt.Fprintf(w, "echo Now booting Warewulf - v4 Proof of Concept\n") fmt.Fprintf(w, "set base http://192.168.1.1:9873/\n") fmt.Fprintf(w, "kernel ${base}/files/kernel/%s crashkernel=no quiet\n", url[2]) fmt.Fprintf(w, "initrd ${base}/files/vnfs/%s\n", url[2]) fmt.Fprintf(w, "initrd ${base}/files/kmods/%s\n", url[2]) fmt.Fprintf(w, "initrd ${base}/files/overlay/%s\n", url[2]) - fmt.Fprintf(w, "boot\n"); + fmt.Fprintf(w, "boot\n") } else { fmt.Printf("ERROR: iPXE request from unknown Node (hwaddr=%s)\n", url[2]) } @@ -55,27 +53,27 @@ func files(w http.ResponseWriter, req *http.Request) { if url[2] == "kernel" { if node.KernelVersion != "" { - kernelFile := fmt.Sprintf("%s/provision/kernels/vmlinuz-%s", LocalStateDir, node.KernelVersion); + kernelFile := fmt.Sprintf("%s/provision/kernels/vmlinuz-%s", LocalStateDir, node.KernelVersion) - sendFile(w, kernelFile, node.Fqdn); + sendFile(w, kernelFile, node.Fqdn) } } else if url[2] == "kmods" { if node.KernelVersion != "" { - kmodsFile := fmt.Sprintf("%s/provision/kernels/kmods-%s.img", LocalStateDir, node.KernelVersion); + kmodsFile := fmt.Sprintf("%s/provision/kernels/kmods-%s.img", LocalStateDir, node.KernelVersion) - sendFile(w, kmodsFile, node.Fqdn); + sendFile(w, kmodsFile, node.Fqdn) } } else if url[2] == "vnfs" { if node.Vnfs != "" { vnfsFile := fmt.Sprintf("%s/provision/bases/%s.img.gz", LocalStateDir, path.Base(node.Vnfs)) - sendFile(w, vnfsFile, node.Fqdn); + sendFile(w, vnfsFile, node.Fqdn) } } else if url[2] == "overlay" { if node.Overlay!= "" { - overlayFile := fmt.Sprintf("%s/provision/overlays/%s.img", LocalStateDir, node.Fqdn); + overlayFile := fmt.Sprintf("%s/provision/overlays/%s.img", LocalStateDir, node.Fqdn) - sendFile(w, overlayFile, node.Fqdn); + sendFile(w, overlayFile, node.Fqdn) } } return @@ -84,12 +82,12 @@ func files(w http.ResponseWriter, req *http.Request) { func sendFile(w http.ResponseWriter, filename string, sendto string) { - fmt.Printf("SEND: %15s: %s\n", sendto, filename); + fmt.Printf("SEND: %15s: %s\n", sendto, filename) fd, err := os.Open(filename) if err != nil { - fmt.Println("ERROR: %s\n", err); - return; + fmt.Println("ERROR: %s\n", err) + return } FileHeader := make([]byte, 512) diff --git a/cmd/wwbuild/wwbuild.go b/cmd/wwbuild/wwbuild.go index 031c6f98..29f5e316 100644 --- a/cmd/wwbuild/wwbuild.go +++ b/cmd/wwbuild/wwbuild.go @@ -2,10 +2,10 @@ package main -import( +import ( + "fmt" "os" "os/exec" - "fmt" "path" "github.com/hpcng/warewulf/internal/pkg/assets" @@ -14,38 +14,46 @@ import( const LocalStateDir = "/var/warewulf" +func vnfsBuild(vnfsPath string) { + fmt.Printf("BUILDING VNFS: %s\n", vnfsPath) + if _, err := os.Stat(vnfsPath); err == nil { + // TODO: Build VNFS to temporary file and move to real location when complete atomically + // TODO: Check time stamps of sourcedir and build file to see if we need to rebuild or skip + cmd := fmt.Sprintf("cd %s; find . | cpio --quiet -o -H newc | gzip -c > \"%s/provision/bases/%s.img.gz\"", vnfsPath, LocalStateDir, path.Base(vnfsPath)) + err := exec.Command("/bin/sh", "-c", cmd).Run() + if err != nil { + fmt.Printf("%s", err) + } + } else { + fmt.Printf("SKIPPING VNFS: (bad path) %s\n", vnfsPath) + } +} + func main(){ if len(os.Args) < 2 { - fmt.Printf("USAGE: %s [vnfs/kernel/overlays/all]\n", os.Args[0]); + fmt.Printf("USAGE: %s [vnfs/kernel/overlays/all]\n", os.Args[0]) return } if os.Args[1] == "vnfs" { - for _, vnfs := range assets.FindAllVnfs() { - if _, err := os.Stat(vnfs); err == nil { - cmd := fmt.Sprintf("cd %s; find . | cpio --quiet -o -H newc | gzip -c > \"%s/provision/bases/%s.img.gz\"", vnfs, LocalStateDir, path.Base(vnfs)); - fmt.Printf("BUILDING VNFS: %s\n", vnfs); - out, err := exec.Command("/bin/sh", "-c", cmd).Output(); - if err != nil { - fmt.Printf("%s", err) - } - - output := string(out[:]) - fmt.Println(output) - } else { - fmt.Printf("SKIPPING VNFS: (bad path) %s\n", vnfs); + if len(os.Args) >= 3 { + vnfsBuild(os.Args[3]) + } else { + for _, vnfs := range assets.FindAllVnfs() { + vnfsBuild(vnfs) } } } else if os.Args[1] == "kernel" { for _, kernelVers := range assets.FindAllKernels() { 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/kernels/vmlinuz-%s", LocalStateDir, kernelVers); - fmt.Printf("SETUP KERNEL: %s (%s)\n", kernelSource, kernelDestination); + kernelDestination := fmt.Sprintf("%s/provision/kernels/vmlinuz-%s", LocalStateDir, kernelVers) + fmt.Printf("SETUP KERNEL: %s (%s)\n", kernelSource, kernelDestination) err := exec.Command("cp", kernelSource, kernelDestination).Run() if err != nil { fmt.Printf("%s", err) @@ -53,9 +61,9 @@ func main(){ kernelMods := fmt.Sprintf("/lib/modules/%s", kernelVers) if _, err := os.Stat(kernelMods); err == nil { - fmt.Printf("BUILDING MODS: %s\n", kernelMods); - cmd := fmt.Sprintf("find %s | cpio --quiet -o -H newc -F \"%s/provision/kernels/kmods-%s.img\"", kernelMods, LocalStateDir, kernelVers); - err := exec.Command("/bin/sh", "-c", cmd).Run(); + fmt.Printf("BUILDING MODS: %s\n", kernelMods) + cmd := fmt.Sprintf("find %s | cpio --quiet -o -H newc -F \"%s/provision/kernels/kmods-%s.img\"", kernelMods, LocalStateDir, kernelVers) + err := exec.Command("/bin/sh", "-c", cmd).Run() if err != nil { fmt.Printf("OUTPUT: %s", err) } @@ -64,20 +72,20 @@ func main(){ } } } else if os.Args[1] == "overlay" { - fmt.Printf("note: This needs to create an overlay for each node with macro expansions\n"); + 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); + 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(); + 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("SKIPPING OVERLAY: (bad path) %s\n", overlayDir) } } diff --git a/internal/pkg/assets/assets.go b/internal/pkg/assets/assets.go index 0bea0237..edda1587 100644 --- a/internal/pkg/assets/assets.go +++ b/internal/pkg/assets/assets.go @@ -87,7 +87,7 @@ func FindAllNodes() []NodeInfo { n.KernelVersion = group.KernelVersion n.NetDevs = node.NetDevs - if ( group.DomainSuffix != "" ) { + if group.DomainSuffix != "" { n.Fqdn = node.Hostname + "." + group.DomainSuffix } else { n.Fqdn = node.Hostname @@ -134,7 +134,7 @@ func FindAllVnfs() []string { } } - for entry, _ := range set { + for entry := range set { ret = append(ret, entry) } @@ -153,15 +153,14 @@ func FindAllKernels() []string { } } - for entry, _ := range set { + for entry := range set { ret = append(ret, entry) } return ret } - - +//FindAllOverlays func FindAllOverlays() []string { var ret []string set := make(map[string]bool) @@ -172,7 +171,7 @@ func FindAllOverlays() []string { } } - for entry, _ := range set { + for entry := range set { ret = append(ret, entry) } diff --git a/nodes.yaml b/nodes.yaml index 9bcf32e1..1a5e525c 100644 --- a/nodes.yaml +++ b/nodes.yaml @@ -1,52 +1,52 @@ nodegroups: - group_1: - comment: This is the group 1 - vnfs: /var/chroots/test - overlay: generic - domain suffix: group1 - nodes: - n0000: - hostname: n0000 - kernel version: 3.10.0-1127.el7.x86_64 - netdevs: - eth0: - hwaddr: xx:xx:xx:xx:aa - ipaddr: x.x.x.x - netmask: x.x.x.x - gateway: x.x.x.x - group_2: - comment: This is the group 2 - vnfs: /var/chroots/test - overlay: generic - domain suffix: group2 + group_1: + comment: This is the group 1 + vnfs: /var/chroots/test + overlay: generic + domain suffix: group1 + nodes: + n0000: + hostname: n0000 kernel version: 3.10.0-1127.el7.x86_64 - nodes: - n0000: - hostname: n0000 - ipmi ipaddr: x.x.x.x - netdevs: - eth0: - hwaddr: 00-0c-29-c3-bf-42 - ipaddr: x.x.x.x - netmask: x.x.x.x - gateway: x.x.x.x - type: ethernet - ib0: - hwaddr: xx:xx:xx:xx:xx - ipaddr: x.x.x.x - netmask: x.x.x.x - gateway: x.x.x.x - type: infiniband - n0001: - hostname: n0001 - ipmi ipaddr: x.x.x.x - netdevs: - eth0: - hwaddr: xx:xx:xx:xx:xx - ipaddr: x.x.x.x - netmask: x.x.x.x - gateway: x.x.x.x - ib0: - hwaddr: xx:xx:xx:xx:xx - ipaddr: x.x.x.x - netmask: x.x.x.x + netdevs: + eth0: + hwaddr: xx:xx:xx:xx:aa + ipaddr: x.x.x.x + netmask: x.x.x.x + gateway: x.x.x.x + group_2: + comment: This is the group 2 + vnfs: /var/chroots/centos-7 + overlay: generic + domain suffix: group2 + kernel version: 3.10.0-1127.el7.x86_64 + nodes: + n0000: + hostname: n0000 + ipmi ipaddr: x.x.x.x + netdevs: + eth0: + hwaddr: 00-0c-29-c3-bf-42 + ipaddr: x.x.x.x + netmask: x.x.x.x + gateway: x.x.x.x + type: ethernet + ib0: + hwaddr: xx:xx:xx:xx:xx + ipaddr: x.x.x.x + netmask: x.x.x.x + gateway: x.x.x.x + type: infiniband + n0001: + hostname: n0001 + ipmi ipaddr: x.x.x.x + netdevs: + eth0: + hwaddr: xx:xx:xx:xx:xx + ipaddr: x.x.x.x + netmask: x.x.x.x + gateway: x.x.x.x + ib0: + hwaddr: xx:xx:xx:xx:xx + ipaddr: x.x.x.x + netmask: x.x.x.x