Various updates and basic cleanups.
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
100
nodes.yaml
100
nodes.yaml
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user