Cleanups and removing the legacy wwclient program code
This commit is contained in:
@@ -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)
|
||||
// }
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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()
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"`
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user