Various updates and basic cleanups.

This commit is contained in:
Gregory Kurtzer
2020-10-29 19:23:56 -07:00
parent 920cd5feac
commit d8d22601f4
4 changed files with 109 additions and 104 deletions

View File

@@ -3,22 +3,20 @@ package main
import ( import (
"fmt" "fmt"
"strings"
"os"
"strconv"
"io" "io"
"os"
"path" "path"
"strconv"
"strings"
"net/http"
"github.com/hpcng/warewulf/internal/pkg/assets" "github.com/hpcng/warewulf/internal/pkg/assets"
"net/http"
) )
const LocalStateDir = "/var/warewulf" const LocalStateDir = "/var/warewulf"
const SysConfDir = "/etc/warewulf"
func ipxe(w http.ResponseWriter, req *http.Request) { func ipxe(w http.ResponseWriter, req *http.Request) {
url := strings.Split(req.URL.Path, "/"); url := strings.Split(req.URL.Path, "/")
if url[2] == "" { if url[2] == "" {
fmt.Printf("ERROR: Bad iPXE request from %s\n", req.RemoteAddr) 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]) node := assets.FindByHwaddr(url[2])
if node.HostName != "" { 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, "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, "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/vnfs/%s\n", url[2])
fmt.Fprintf(w, "initrd ${base}/files/kmods/%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, "initrd ${base}/files/overlay/%s\n", url[2])
fmt.Fprintf(w, "boot\n"); fmt.Fprintf(w, "boot\n")
} else { } else {
fmt.Printf("ERROR: iPXE request from unknown Node (hwaddr=%s)\n", url[2]) 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 url[2] == "kernel" {
if node.KernelVersion != "" { 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" { } else if url[2] == "kmods" {
if node.KernelVersion != "" { 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" { } else if url[2] == "vnfs" {
if node.Vnfs != "" { if node.Vnfs != "" {
vnfsFile := fmt.Sprintf("%s/provision/bases/%s.img.gz", LocalStateDir, path.Base(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" { } else if url[2] == "overlay" {
if node.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 return
@@ -84,12 +82,12 @@ func files(w http.ResponseWriter, req *http.Request) {
func sendFile(w http.ResponseWriter, filename string, sendto string) { 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) fd, err := os.Open(filename)
if err != nil { if err != nil {
fmt.Println("ERROR: %s\n", err); fmt.Println("ERROR: %s\n", err)
return; return
} }
FileHeader := make([]byte, 512) FileHeader := make([]byte, 512)

View File

@@ -2,10 +2,10 @@
package main package main
import( import (
"fmt"
"os" "os"
"os/exec" "os/exec"
"fmt"
"path" "path"
"github.com/hpcng/warewulf/internal/pkg/assets" "github.com/hpcng/warewulf/internal/pkg/assets"
@@ -14,38 +14,46 @@ import(
const LocalStateDir = "/var/warewulf" 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(){ func main(){
if len(os.Args) < 2 { 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 return
} }
if os.Args[1] == "vnfs" { if os.Args[1] == "vnfs" {
for _, vnfs := range assets.FindAllVnfs() { if len(os.Args) >= 3 {
if _, err := os.Stat(vnfs); err == nil { vnfsBuild(os.Args[3])
cmd := fmt.Sprintf("cd %s; find . | cpio --quiet -o -H newc | gzip -c > \"%s/provision/bases/%s.img.gz\"", vnfs, LocalStateDir, path.Base(vnfs)); } else {
fmt.Printf("BUILDING VNFS: %s\n", vnfs); for _, vnfs := range assets.FindAllVnfs() {
out, err := exec.Command("/bin/sh", "-c", cmd).Output(); vnfsBuild(vnfs)
if err != nil {
fmt.Printf("%s", err)
}
output := string(out[:])
fmt.Println(output)
} else {
fmt.Printf("SKIPPING VNFS: (bad path) %s\n", vnfs);
} }
} }
} else if os.Args[1] == "kernel" { } else if os.Args[1] == "kernel" {
for _, kernelVers := range assets.FindAllKernels() { for _, kernelVers := range assets.FindAllKernels() {
kernelSource := fmt.Sprintf("/boot/vmlinuz-%s", kernelVers) 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 { if _, err := os.Stat(kernelSource); err == nil {
kernelDestination := fmt.Sprintf("%s/provision/kernels/vmlinuz-%s", LocalStateDir, kernelVers); kernelDestination := fmt.Sprintf("%s/provision/kernels/vmlinuz-%s", LocalStateDir, kernelVers)
fmt.Printf("SETUP KERNEL: %s (%s)\n", kernelSource, kernelDestination); fmt.Printf("SETUP KERNEL: %s (%s)\n", kernelSource, kernelDestination)
err := exec.Command("cp", kernelSource, kernelDestination).Run() err := exec.Command("cp", kernelSource, kernelDestination).Run()
if err != nil { if err != nil {
fmt.Printf("%s", err) fmt.Printf("%s", err)
@@ -53,9 +61,9 @@ func main(){
kernelMods := fmt.Sprintf("/lib/modules/%s", kernelVers) kernelMods := fmt.Sprintf("/lib/modules/%s", kernelVers)
if _, err := os.Stat(kernelMods); err == nil { if _, err := os.Stat(kernelMods); err == nil {
fmt.Printf("BUILDING MODS: %s\n", kernelMods); 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); 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(); err := exec.Command("/bin/sh", "-c", cmd).Run()
if err != nil { if err != nil {
fmt.Printf("OUTPUT: %s", err) fmt.Printf("OUTPUT: %s", err)
} }
@@ -64,20 +72,20 @@ func main(){
} }
} }
} else if os.Args[1] == "overlay" { } 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() { 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 { 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); 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); fmt.Printf("BUILDING OVERLAY: %s\n", node.Fqdn)
err := exec.Command("/bin/sh", "-c", cmd).Run(); err := exec.Command("/bin/sh", "-c", cmd).Run()
if err != nil { if err != nil {
fmt.Printf("%s", err) fmt.Printf("%s", err)
} }
} else { } else {
fmt.Printf("SKIPPING OVERLAY: (bad path) %s\n", overlayDir); fmt.Printf("SKIPPING OVERLAY: (bad path) %s\n", overlayDir)
} }
} }

View File

@@ -87,7 +87,7 @@ func FindAllNodes() []NodeInfo {
n.KernelVersion = group.KernelVersion n.KernelVersion = group.KernelVersion
n.NetDevs = node.NetDevs n.NetDevs = node.NetDevs
if ( group.DomainSuffix != "" ) { if group.DomainSuffix != "" {
n.Fqdn = node.Hostname + "." + group.DomainSuffix n.Fqdn = node.Hostname + "." + group.DomainSuffix
} else { } else {
n.Fqdn = node.Hostname n.Fqdn = node.Hostname
@@ -134,7 +134,7 @@ func FindAllVnfs() []string {
} }
} }
for entry, _ := range set { for entry := range set {
ret = append(ret, entry) ret = append(ret, entry)
} }
@@ -153,15 +153,14 @@ func FindAllKernels() []string {
} }
} }
for entry, _ := range set { for entry := range set {
ret = append(ret, entry) ret = append(ret, entry)
} }
return ret return ret
} }
//FindAllOverlays
func FindAllOverlays() []string { func FindAllOverlays() []string {
var ret []string var ret []string
set := make(map[string]bool) set := make(map[string]bool)
@@ -172,7 +171,7 @@ func FindAllOverlays() []string {
} }
} }
for entry, _ := range set { for entry := range set {
ret = append(ret, entry) ret = append(ret, entry)
} }

View File

@@ -1,52 +1,52 @@
nodegroups: nodegroups:
group_1: group_1:
comment: This is the group 1 comment: This is the group 1
vnfs: /var/chroots/test vnfs: /var/chroots/test
overlay: generic overlay: generic
domain suffix: group1 domain suffix: group1
nodes: nodes:
n0000: n0000:
hostname: 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
kernel version: 3.10.0-1127.el7.x86_64 kernel version: 3.10.0-1127.el7.x86_64
nodes: netdevs:
n0000: eth0:
hostname: n0000 hwaddr: xx:xx:xx:xx:aa
ipmi ipaddr: x.x.x.x ipaddr: x.x.x.x
netdevs: netmask: x.x.x.x
eth0: gateway: x.x.x.x
hwaddr: 00-0c-29-c3-bf-42 group_2:
ipaddr: x.x.x.x comment: This is the group 2
netmask: x.x.x.x vnfs: /var/chroots/centos-7
gateway: x.x.x.x overlay: generic
type: ethernet domain suffix: group2
ib0: kernel version: 3.10.0-1127.el7.x86_64
hwaddr: xx:xx:xx:xx:xx nodes:
ipaddr: x.x.x.x n0000:
netmask: x.x.x.x hostname: n0000
gateway: x.x.x.x ipmi ipaddr: x.x.x.x
type: infiniband netdevs:
n0001: eth0:
hostname: n0001 hwaddr: 00-0c-29-c3-bf-42
ipmi ipaddr: x.x.x.x ipaddr: x.x.x.x
netdevs: netmask: x.x.x.x
eth0: gateway: x.x.x.x
hwaddr: xx:xx:xx:xx:xx type: ethernet
ipaddr: x.x.x.x ib0:
netmask: x.x.x.x hwaddr: xx:xx:xx:xx:xx
gateway: x.x.x.x ipaddr: x.x.x.x
ib0: netmask: x.x.x.x
hwaddr: xx:xx:xx:xx:xx gateway: x.x.x.x
ipaddr: x.x.x.x type: infiniband
netmask: x.x.x.x 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