From 00d8d42e9df83197b5c6105ef84e65b2507db7bf Mon Sep 17 00:00:00 2001 From: Gregory Kurtzer Date: Wed, 29 Dec 2021 16:11:25 -0800 Subject: [PATCH 01/12] First pass at a rework of the overlay subsystem in Warewulf --- Makefile | 7 +- etc/ipxe/default.ipxe | 11 +- etc/warewulf.conf | 2 +- internal/app/wwctl/configure/nfs/main.go | 4 +- internal/app/wwctl/node/list/main.go | 2 +- internal/app/wwctl/node/set/root.go | 15 +- internal/app/wwctl/overlay/build/main.go | 64 +-- internal/app/wwctl/overlay/build/root.go | 12 +- internal/app/wwctl/overlay/chmod/main.go | 18 +- internal/app/wwctl/overlay/chmod/root.go | 13 +- internal/app/wwctl/overlay/chown/main.go | 18 +- internal/app/wwctl/overlay/chown/root.go | 12 +- internal/app/wwctl/overlay/create/main.go | 25 +- internal/app/wwctl/overlay/create/root.go | 10 +- internal/app/wwctl/overlay/delete/main.go | 55 +-- internal/app/wwctl/overlay/delete/root.go | 13 +- internal/app/wwctl/overlay/edit/main.go | 22 +- internal/app/wwctl/overlay/edit/root.go | 12 +- internal/app/wwctl/overlay/imprt/main.go | 40 +- internal/app/wwctl/overlay/imprt/root.go | 13 +- internal/app/wwctl/overlay/list/main.go | 96 +--- internal/app/wwctl/overlay/list/root.go | 15 +- internal/app/wwctl/overlay/mkdir/main.go | 22 +- internal/app/wwctl/overlay/mkdir/root.go | 10 +- internal/app/wwctl/overlay/show/main.go | 18 +- internal/app/wwctl/overlay/show/root.go | 13 +- internal/app/wwctl/profile/list/main.go | 2 +- internal/app/wwctl/profile/set/root.go | 7 +- internal/pkg/node/constructors.go | 6 +- internal/pkg/overlay/funcmap.go | 14 +- internal/pkg/overlay/overlay.go | 445 +++++++++--------- internal/pkg/warewulfd/ipxe.go | 3 +- internal/pkg/warewulfd/runtime.go | 7 +- internal/pkg/warewulfd/system.go | 7 +- .../{runtime/default => generic}/etc/group.ww | 0 .../{runtime/default => generic}/etc/hosts.ww | 0 .../default => generic}/etc/passwd.ww | 0 .../root/.ssh/authorized_keys.ww | 0 .../default => wwinit}/etc/hostname.ww | 0 .../default => wwinit}/etc/network/interfaces | 0 .../etc/network/interfaces.d/default.ww | 0 .../etc/ssh/ssh_host_dsa_key.pub.ww | 0 .../etc/ssh/ssh_host_dsa_key.ww | 0 .../etc/ssh/ssh_host_ecdsa_key.pub.ww | 0 .../etc/ssh/ssh_host_ecdsa_key.ww | 0 .../etc/ssh/ssh_host_ed25519_key.pub.ww | 0 .../etc/ssh/ssh_host_ed25519_key.ww | 0 .../etc/ssh/ssh_host_rsa_key.pub.ww | 0 .../etc/ssh/ssh_host_rsa_key.ww | 0 .../network-scripts/ifcfg-default.ww | 0 .../etc/sysconfig/network.ww | 0 .../systemd/network/10-persistent-net.link.ww | 0 .../etc/warewulf/warewulf.conf.ww | 0 .../etc/wicked/ifconfig/ifcfg-default.xml.ww | 0 overlays/{system/default => wwinit}/init | 0 .../default => wwinit}/warewulf/config.ww | 0 .../warewulf/init.d/20-loopback | 0 .../warewulf/init.d/50-ipmi | 0 .../warewulf/init.d/75-vnfs_fixes | 0 .../warewulf/init.d/80-wwclient | 0 .../warewulf/init.d/90-selinux | 0 .../default => wwinit}/warewulf/wwinit | 0 62 files changed, 405 insertions(+), 628 deletions(-) rename overlays/{runtime/default => generic}/etc/group.ww (100%) rename overlays/{runtime/default => generic}/etc/hosts.ww (100%) rename overlays/{runtime/default => generic}/etc/passwd.ww (100%) rename overlays/{runtime/default => generic}/root/.ssh/authorized_keys.ww (100%) rename overlays/{system/default => wwinit}/etc/hostname.ww (100%) rename overlays/{system/default => wwinit}/etc/network/interfaces (100%) rename overlays/{system/default => wwinit}/etc/network/interfaces.d/default.ww (100%) rename overlays/{system/default => wwinit}/etc/ssh/ssh_host_dsa_key.pub.ww (100%) rename overlays/{system/default => wwinit}/etc/ssh/ssh_host_dsa_key.ww (100%) rename overlays/{system/default => wwinit}/etc/ssh/ssh_host_ecdsa_key.pub.ww (100%) rename overlays/{system/default => wwinit}/etc/ssh/ssh_host_ecdsa_key.ww (100%) rename overlays/{system/default => wwinit}/etc/ssh/ssh_host_ed25519_key.pub.ww (100%) rename overlays/{system/default => wwinit}/etc/ssh/ssh_host_ed25519_key.ww (100%) rename overlays/{system/default => wwinit}/etc/ssh/ssh_host_rsa_key.pub.ww (100%) rename overlays/{system/default => wwinit}/etc/ssh/ssh_host_rsa_key.ww (100%) rename overlays/{system/default => wwinit}/etc/sysconfig/network-scripts/ifcfg-default.ww (100%) rename overlays/{system/default => wwinit}/etc/sysconfig/network.ww (100%) rename overlays/{system/default => wwinit}/etc/systemd/network/10-persistent-net.link.ww (100%) rename overlays/{system/default => wwinit}/etc/warewulf/warewulf.conf.ww (100%) rename overlays/{system/default => wwinit}/etc/wicked/ifconfig/ifcfg-default.xml.ww (100%) rename overlays/{system/default => wwinit}/init (100%) rename overlays/{system/default => wwinit}/warewulf/config.ww (100%) rename overlays/{system/default => wwinit}/warewulf/init.d/20-loopback (100%) rename overlays/{system/default => wwinit}/warewulf/init.d/50-ipmi (100%) rename overlays/{system/default => wwinit}/warewulf/init.d/75-vnfs_fixes (100%) rename overlays/{system/default => wwinit}/warewulf/init.d/80-wwclient (100%) rename overlays/{system/default => wwinit}/warewulf/init.d/90-selinux (100%) rename overlays/{system/default => wwinit}/warewulf/wwinit (100%) diff --git a/Makefile b/Makefile index 6afe24fd..c65e4c9b 100644 --- a/Makefile +++ b/Makefile @@ -29,10 +29,7 @@ export GOPROXY # built tags needed for wwbuild binary WW_BUILD_GO_BUILD_TAGS := containers_image_openpgp containers_image_ostree -# system-overlay directories for install_wwclient -OVERLAY_DIR ?= $(DESTDIR)/var/warewulf/overlays/system/ -overlays = ${dir ${wildcard ${OVERLAY_DIR}*/}} - +# all build targets all: vendor wwctl wwclient bash_completion.d man_pages build: lint test-it vet all @@ -128,7 +125,7 @@ wwclient: cd cmd/wwclient; CGO_ENABLED=0 GOOS=linux go build -mod vendor -a -ldflags '-extldflags -static' -o ../../wwclient install_wwclient: wwclient - $(foreach overlay, ${overlays}, install -D -m 0755 wwclient ${overlay}warewulf/bin/wwclient;) + install -m 0755 wwclient $(DESSTDIR)/var/warewulf/overlays/wwinit/bin/wwclient bash_completion: cd cmd/bash_completion && go build -ldflags="-X 'github.com/hpcng/warewulf/internal/pkg/warewulfconf.ConfigFile=$(CONFIG)/etc/warewulf.conf'\ diff --git a/etc/ipxe/default.ipxe b/etc/ipxe/default.ipxe index 543797f8..137f7da2 100644 --- a/etc/ipxe/default.ipxe +++ b/etc/ipxe/default.ipxe @@ -11,12 +11,13 @@ echo set base http://{{.Ipaddr}}:{{.Port}} -kernel --name kernel ${base}/kernel/{{.Hwaddr}} || goto reboot -initrd --name container ${base}/container/{{.Hwaddr}} || goto reboot -initrd --name kmods ${base}/kmods/{{.Hwaddr}} || goto reboot -initrd --name system ${base}/overlay-system/{{.Hwaddr}} || goto reboot +kernel --name kernel ${base}/kernel/{{.Hwaddr}} || goto reboot +initrd --name container ${base}/container/{{.Hwaddr}} || goto reboot +initrd --name kmods ${base}/kmods/{{.Hwaddr}} || goto reboot +initrd --name system ${base}/overlay-system/{{.Hwaddr}} || goto reboot +initrd --name runtime ${base}/overlay-runtime/{{.Hwaddr}} || goto reboot -boot kernel initrd=container initrd=kmods initrd=system {{.KernelArgs}} || goto reboot +boot kernel initrd=container initrd=kmods initrd=system initrd=runtime {{.KernelArgs}} || goto reboot :reboot echo diff --git a/etc/warewulf.conf b/etc/warewulf.conf index b6e29601..278dde6c 100644 --- a/etc/warewulf.conf +++ b/etc/warewulf.conf @@ -2,7 +2,7 @@ ipaddr: 192.168.200.1 netmask: 255.255.255.0 warewulf: port: 9873 - secure: true + secure: false autobuild overlays: true update interval: 60 syslog: false diff --git a/internal/app/wwctl/configure/nfs/main.go b/internal/app/wwctl/configure/nfs/main.go index 890b0370..ca12c354 100644 --- a/internal/app/wwctl/configure/nfs/main.go +++ b/internal/app/wwctl/configure/nfs/main.go @@ -3,7 +3,9 @@ package nfs import ( "fmt" "os" + "path" + "github.com/hpcng/warewulf/internal/pkg/overlay" "github.com/hpcng/warewulf/internal/pkg/util" "github.com/hpcng/warewulf/internal/pkg/warewulfconf" "github.com/hpcng/warewulf/internal/pkg/wwlog" @@ -33,7 +35,7 @@ func Configure(show bool) error { } if !SetShow { - fstab, err := os.OpenFile("/var/warewulf/overlays/system/default/etc/fstab", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644) + fstab, err := os.OpenFile(path.Join(overlay.OverlaySourceDir("wwinit"), "etc/fstab"), os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) os.Exit(1) diff --git a/internal/app/wwctl/node/list/main.go b/internal/app/wwctl/node/list/main.go index 9dda4a8b..02af04c6 100644 --- a/internal/app/wwctl/node/list/main.go +++ b/internal/app/wwctl/node/list/main.go @@ -43,8 +43,8 @@ func CobraRunE(cmd *cobra.Command, args []string) error { fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "Container", node.ContainerName.Source(), node.ContainerName.Print()) fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "Kernel", node.KernelVersion.Source(), node.KernelVersion.Print()) fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "KernelArgs", node.KernelArgs.Source(), node.KernelArgs.Print()) - fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "RuntimeOverlay", node.RuntimeOverlay.Source(), node.RuntimeOverlay.Print()) fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "SystemOverlay", node.SystemOverlay.Source(), node.SystemOverlay.Print()) + fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "RuntimeOverlay", node.RuntimeOverlay.Source(), node.RuntimeOverlay.Print()) fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "Ipxe", node.Ipxe.Source(), node.Ipxe.Print()) fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "Init", node.Init.Source(), node.Init.Print()) fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "Root", node.Root.Source(), node.Root.Print()) diff --git a/internal/app/wwctl/node/set/root.go b/internal/app/wwctl/node/set/root.go index f8885462..7fe44943 100644 --- a/internal/app/wwctl/node/set/root.go +++ b/internal/app/wwctl/node/set/root.go @@ -15,10 +15,9 @@ var ( DisableFlagsInUseLine: true, Use: "set [OPTIONS] PATTERN [PATTERN ...]", Short: "Configure node properties", - Long: "This command sets configuration properties for nodes matching PATTERN.\n\n" + - "Note: use the string 'UNSET' to remove a configuration", - Args: cobra.MinimumNArgs(1), - RunE: CobraRunE, + Long: "This command sets configuration properties for nodes matching PATTERN.\n\nNote: use the string 'UNSET' to remove a configuration", + Args: cobra.MinimumNArgs(1), + RunE: CobraRunE, ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { if len(args) != 0 { return nil, cobra.ShellCompDirectiveNoFileComp @@ -48,6 +47,7 @@ var ( SetNetDevDel bool SetClusterName string SetIpxe string + SetInitOverlay string SetRuntimeOverlay string SetSystemOverlay string SetIpmiIpaddr string @@ -93,16 +93,17 @@ func init() { baseCmd.PersistentFlags().StringVar(&SetIpxe, "ipxe", "", "Set the node's iPXE template name") baseCmd.PersistentFlags().StringVarP(&SetInit, "init", "i", "", "Define the init process to boot the container") baseCmd.PersistentFlags().StringVar(&SetRoot, "root", "", "Define the rootfs") + baseCmd.PersistentFlags().StringVarP(&SetInitOverlay, "wwinit", "O", "", "Set the node's initialization overlay") baseCmd.PersistentFlags().StringVarP(&SetRuntimeOverlay, "runtime", "R", "", "Set the node's runtime overlay") if err := baseCmd.RegisterFlagCompletionFunc("runtime", func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { - list, _ := overlay.FindRuntimeOverlays() + list, _ := overlay.FindOverlays() return list, cobra.ShellCompDirectiveNoFileComp }); err != nil { log.Println(err) } baseCmd.PersistentFlags().StringVarP(&SetSystemOverlay, "system", "S", "", "Set the node's system overlay") if err := baseCmd.RegisterFlagCompletionFunc("system", func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { - list, _ := overlay.FindSystemOverlays() + list, _ := overlay.FindOverlays() return list, cobra.ShellCompDirectiveNoFileComp }); err != nil { log.Println(err) @@ -136,7 +137,7 @@ func init() { baseCmd.PersistentFlags().StringVarP(&SetGateway, "gateway", "G", "", "Set the node's network device gateway") baseCmd.PersistentFlags().StringVarP(&SetHwaddr, "hwaddr", "H", "", "Set the node's network device HW address") baseCmd.PersistentFlags().StringVarP(&SetType, "type", "T", "", "Set the node's network device type") - baseCmd.PersistentFlags().StringVar(&SetNetOnBoot, "onboot", "yes", "Enable/disable device (yes/no)") + baseCmd.PersistentFlags().StringVar(&SetNetOnBoot, "onboot", "", "Enable/disable device (yes/no)") baseCmd.PersistentFlags().BoolVar(&SetNetDevDel, "netdel", false, "Delete the node's network device") diff --git a/internal/app/wwctl/overlay/build/main.go b/internal/app/wwctl/overlay/build/main.go index aa5111e3..b9f3f05b 100644 --- a/internal/app/wwctl/overlay/build/main.go +++ b/internal/app/wwctl/overlay/build/main.go @@ -6,71 +6,33 @@ import ( "github.com/hpcng/warewulf/internal/pkg/node" "github.com/hpcng/warewulf/internal/pkg/overlay" "github.com/hpcng/warewulf/internal/pkg/wwlog" - "github.com/pkg/errors" + "github.com/hpcng/warewulf/pkg/hostlist" "github.com/spf13/cobra" ) func CobraRunE(cmd *cobra.Command, args []string) error { - var updateNodes []node.NodeInfo - var overlayKind string - var overlayName string - if len(args) == 2 { - overlayKind = args[0] - overlayName = args[1] - } else if len(args) == 1 { - overlayKind = args[0] - } - - if (overlayKind != "system" && overlayKind != "runtime") && !BuildAll { - return errors.New("overlay kind must be of type 'system' or 'runtime'") - } - - n, err := node.New() + nodeDB, err := node.New() if err != nil { wwlog.Printf(wwlog.ERROR, "Could not open node configuration: %s\n", err) os.Exit(1) } - if overlayName != "" { - nodes, err := n.FindAllNodes() - if err != nil { - wwlog.Printf(wwlog.ERROR, "Could not get node list: %s\n", err) - os.Exit(1) - } + nodes, err := nodeDB.FindAllNodes() + if err != nil { + wwlog.Printf(wwlog.ERROR, "Could not get node list: %s\n", err) + os.Exit(1) + } - for _, node := range nodes { - if overlayKind == "system" && node.SystemOverlay.Get() == overlayName { - updateNodes = append(updateNodes, node) - } else if overlayKind == "runtime" && node.RuntimeOverlay.Get() == overlayName { - updateNodes = append(updateNodes, node) - } - } + if len(args) > 0 { + args = hostlist.Expand(args) + err = overlay.BuildAllOverlays(node.FilterByName(nodes, args)) } else { - var err error - updateNodes, err = n.FindAllNodes() - if err != nil { - wwlog.Printf(wwlog.ERROR, "Could not get node list: %s\n", err) - os.Exit(1) - } + err = overlay.BuildAllOverlays(nodes) } - wwlog.Printf(wwlog.DEBUG, "Checking on system overlay update\n") - if overlayKind == "system" || BuildAll { - wwlog.Printf(wwlog.INFO, "Updating System Overlays...\n") - err := overlay.BuildSystemOverlay(updateNodes) - if err != nil { - wwlog.Printf(wwlog.WARN, "Some system overlays failed to be generated: %s\n", err) - } - } - - wwlog.Printf(wwlog.DEBUG, "Checking on runtime overlay update\n") - if overlayKind == "runtime" || BuildAll { - wwlog.Printf(wwlog.INFO, "Updating Runtime Overlays...\n") - err := overlay.BuildRuntimeOverlay(updateNodes) - if err != nil { - wwlog.Printf(wwlog.WARN, "Some runtime overlays failed to be generated\n") - } + if err != nil { + wwlog.Printf(wwlog.WARN, "Some system overlays failed to be generated: %s\n", err) } return nil diff --git a/internal/app/wwctl/overlay/build/root.go b/internal/app/wwctl/overlay/build/root.go index 5b5bb45d..a6f0d922 100644 --- a/internal/app/wwctl/overlay/build/root.go +++ b/internal/app/wwctl/overlay/build/root.go @@ -5,17 +5,15 @@ import "github.com/spf13/cobra" var ( baseCmd = &cobra.Command{ DisableFlagsInUseLine: true, - Use: "build [OPTIONS] {system|runtime} OVERLAY_NAME", - Short: "(Re)build an overlay", - Long: "This command builds a new system or runtime overlay named OVERLAY_NAME.", - RunE: CobraRunE, - Args: cobra.RangeArgs(0, 2), + Use: "build [OPTIONS] NODENAME...", + Short: "(Re)build node overlays", + Long: "This command builds overlays for given nodes.", + RunE: CobraRunE, } - BuildAll bool ) func init() { - baseCmd.PersistentFlags().BoolVarP(&BuildAll, "all", "a", false, "Build all overlays (runtime and system)") + //baseCmd.PersistentFlags().BoolVarP(&BuildAll, "all", "a", false, "Build overlays for all nodes") } // GetRootCommand returns the root cobra.Command for the application. diff --git a/internal/app/wwctl/overlay/chmod/main.go b/internal/app/wwctl/overlay/chmod/main.go index cca88b76..0fb6e888 100644 --- a/internal/app/wwctl/overlay/chmod/main.go +++ b/internal/app/wwctl/overlay/chmod/main.go @@ -5,23 +5,17 @@ import ( "path" "strconv" - "github.com/hpcng/warewulf/internal/pkg/config" + "github.com/hpcng/warewulf/internal/pkg/overlay" "github.com/hpcng/warewulf/internal/pkg/util" "github.com/hpcng/warewulf/internal/pkg/wwlog" - "github.com/pkg/errors" "github.com/spf13/cobra" ) func CobraRunE(cmd *cobra.Command, args []string) error { var overlaySourceDir string - overlayKind := args[0] - overlayName := args[1] - fileName := args[2] - - if overlayKind != "system" && overlayKind != "runtime" { - return errors.New("overlay kind must be of type 'system' or 'runtime'") - } + overlayName := args[0] + fileName := args[1] permissionMode, err := strconv.ParseInt(args[3], 8, 32) if err != nil { @@ -29,11 +23,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { os.Exit(1) } - if overlayKind == "system" { - overlaySourceDir = config.SystemOverlaySource(overlayName) - } else if overlayKind == "runtime" { - overlaySourceDir = config.RuntimeOverlaySource(overlayName) - } + overlaySourceDir = overlay.OverlaySourceDir(overlayName) if !util.IsDir(overlaySourceDir) { wwlog.Printf(wwlog.ERROR, "Overlay does not exist: %s\n", overlayName) diff --git a/internal/app/wwctl/overlay/chmod/root.go b/internal/app/wwctl/overlay/chmod/root.go index 7790c5df..44fabc95 100644 --- a/internal/app/wwctl/overlay/chmod/root.go +++ b/internal/app/wwctl/overlay/chmod/root.go @@ -7,15 +7,12 @@ import ( var ( baseCmd = &cobra.Command{ DisableFlagsInUseLine: true, - Use: "chmod [OPTIONS] {runtime|system} OVERLAY_NAME FILENAME MODE", + Use: "chmod [OPTIONS] OVERLAY_NAME FILENAME MODE", Short: "Change file permissions in an overlay", - Long: `Changes the permissions of a single FILENAME within an overlay specified by -overlay type (system or runtime) and its OVERLAY_NAME. - -You can use any MODE format supported by the chmod command.`, - Example: "wwctl overlay chmod system default /etc/hostname.ww 0660", - RunE: CobraRunE, - Args: cobra.ExactArgs(4), + Long: "Changes the permissions of a single FILENAME within an overlay.\nYou can use any MODE format supported by the chmod command.", + Example: "wwctl overlay chmod default /etc/hostname.ww 0660", + RunE: CobraRunE, + Args: cobra.ExactArgs(3), } ) diff --git a/internal/app/wwctl/overlay/chown/main.go b/internal/app/wwctl/overlay/chown/main.go index 5f122e2b..11a832dd 100644 --- a/internal/app/wwctl/overlay/chown/main.go +++ b/internal/app/wwctl/overlay/chown/main.go @@ -5,11 +5,10 @@ import ( "path" "strconv" - "github.com/hpcng/warewulf/internal/pkg/config" + "github.com/hpcng/warewulf/internal/pkg/overlay" "github.com/hpcng/warewulf/internal/pkg/util" "github.com/hpcng/warewulf/internal/pkg/wwlog" - "github.com/pkg/errors" "github.com/spf13/cobra" ) @@ -19,13 +18,8 @@ func CobraRunE(cmd *cobra.Command, args []string) error { var gid int var err error - overlayKind := args[0] - overlayName := args[1] - fileName := args[2] - - if overlayKind != "system" && overlayKind != "runtime" { - return errors.New("overlay kind must be of type 'system' or 'runtime'") - } + overlayName := args[0] + fileName := args[1] uid, err = strconv.Atoi(args[3]) if err != nil { @@ -43,11 +37,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { gid = 0 } - if overlayKind == "system" { - overlaySourceDir = config.SystemOverlaySource(overlayName) - } else if overlayKind == "runtime" { - overlaySourceDir = config.RuntimeOverlaySource(overlayName) - } + overlaySourceDir = overlay.OverlaySourceDir(overlayName) if !util.IsDir(overlaySourceDir) { wwlog.Printf(wwlog.ERROR, "Overlay does not exist: %s\n", overlayName) diff --git a/internal/app/wwctl/overlay/chown/root.go b/internal/app/wwctl/overlay/chown/root.go index 8d45823e..31b2e40d 100644 --- a/internal/app/wwctl/overlay/chown/root.go +++ b/internal/app/wwctl/overlay/chown/root.go @@ -4,12 +4,12 @@ import "github.com/spf13/cobra" var ( baseCmd = &cobra.Command{ - Use: "chown [OPTIONS] {system|runtime} OVERLAY_NAME FILE UID [GID]", - Short: "Change file ownership within an overlay", - Long: "This command changes the ownership of a FILE within the system or runtime OVERLAY_NAME\n" + - "to the user specified by UID. Optionally, it will also change group ownership to GID.", - RunE: CobraRunE, - Args: cobra.RangeArgs(4, 5), + DisableFlagsInUseLine: true, + Use: "chown [OPTIONS] OVERLAY_NAME FILE UID [GID]", + Short: "Change file ownership within an overlay", + Long: "This command changes the ownership of a FILE within the system or runtime OVERLAY_NAME\nto the user specified by UID. Optionally, it will also change group ownership to GID.", + RunE: CobraRunE, + Args: cobra.RangeArgs(3, 4), } ) diff --git a/internal/app/wwctl/overlay/create/main.go b/internal/app/wwctl/overlay/create/main.go index 97570beb..ad47a0d1 100644 --- a/internal/app/wwctl/overlay/create/main.go +++ b/internal/app/wwctl/overlay/create/main.go @@ -5,32 +5,15 @@ import ( "github.com/hpcng/warewulf/internal/pkg/overlay" "github.com/hpcng/warewulf/internal/pkg/wwlog" - "github.com/pkg/errors" "github.com/spf13/cobra" ) func CobraRunE(cmd *cobra.Command, args []string) error { - overlayKind := args[0] - overlayName := args[1] - - if overlayKind != "system" && overlayKind != "runtime" { - return errors.New("overlay kind must be of type 'system' or 'runtime'") - } - - if overlayKind == "system" { - err := overlay.SystemOverlayInit(overlayName) - if err != nil { - wwlog.Printf(wwlog.ERROR, "%s\n", err) - os.Exit(1) - } - wwlog.Printf(wwlog.INFO, "Created new system overlay: %s\n", overlayName) - } else { - err := overlay.RuntimeOverlayInit(overlayName) - if err != nil { - wwlog.Printf(wwlog.ERROR, "%s\n", err) - os.Exit(1) - } + err := overlay.OverlayInit(args[0]) + if err != nil { + wwlog.Printf(wwlog.ERROR, "%s\n", err) + os.Exit(1) } return nil diff --git a/internal/app/wwctl/overlay/create/root.go b/internal/app/wwctl/overlay/create/root.go index b09b249e..a037d6de 100644 --- a/internal/app/wwctl/overlay/create/root.go +++ b/internal/app/wwctl/overlay/create/root.go @@ -7,11 +7,11 @@ import ( var ( baseCmd = &cobra.Command{ DisableFlagsInUseLine: true, - Use: "create [OPTIONS] {system|runtime} OVERLAY_NAME", - Short: "Initialize a new Overlay", - Long: "This command creates a new empty system or runtime overlay named OVERLAY_NAME.", - RunE: CobraRunE, - Args: cobra.ExactArgs(2), + Use: "create [OPTIONS] OVERLAY_NAME", + Short: "Initialize a new Overlay", + Long: "This command creates a new empty overlay with the given OVERLAY_NAME.", + RunE: CobraRunE, + Args: cobra.ExactArgs(2), } ) diff --git a/internal/app/wwctl/overlay/delete/main.go b/internal/app/wwctl/overlay/delete/main.go index 69d20226..9d008e4f 100644 --- a/internal/app/wwctl/overlay/delete/main.go +++ b/internal/app/wwctl/overlay/delete/main.go @@ -5,8 +5,7 @@ import ( "os" "path" - "github.com/hpcng/warewulf/internal/pkg/config" - "github.com/hpcng/warewulf/internal/pkg/node" + "github.com/hpcng/warewulf/internal/pkg/overlay" "github.com/hpcng/warewulf/internal/pkg/util" "github.com/hpcng/warewulf/internal/pkg/wwlog" "github.com/pkg/errors" @@ -17,22 +16,13 @@ func CobraRunE(cmd *cobra.Command, args []string) error { var overlayPath string var fileName string - overlayKind := args[0] - overlayName := args[1] + overlayName := args[0] - if len(args) == 3 { - fileName = args[2] + if len(args) == 2 { + fileName = args[1] } - if overlayKind != "system" && overlayKind != "runtime" { - return errors.New("overlay kind must be of type 'system' or 'runtime'") - } - - if overlayKind == "system" { - overlayPath = config.SystemOverlaySource(overlayName) - } else if overlayKind == "runtime" { - overlayPath = config.RuntimeOverlaySource(overlayName) - } + overlayPath = overlay.OverlaySourceDir(overlayName) if overlayPath == "" { wwlog.Printf(wwlog.ERROR, "Overlay name did not resolve: '%s'\n", overlayName) @@ -40,13 +30,13 @@ func CobraRunE(cmd *cobra.Command, args []string) error { } if !util.IsDir(overlayPath) { - wwlog.Printf(wwlog.ERROR, "Overlay does not exist: '%s:%s'\n", overlayKind, overlayName) + wwlog.Printf(wwlog.ERROR, "Overlay does not exist: %s\n", overlayName) os.Exit(1) } if fileName == "" { - if overlayName == "default" { - return errors.New("refusing to delete the default overlay") + if overlayName == "wwinit" { + return errors.New("refusing to delete the Warewulf overlay") } if Force { err := os.RemoveAll(overlayPath) @@ -61,31 +51,6 @@ func CobraRunE(cmd *cobra.Command, args []string) error { } fmt.Printf("Deleted overlay: %s\n", args[0]) - n, err := node.New() - if err != nil { - wwlog.Printf(wwlog.ERROR, "Could not open node configuration: %s\n", err) - os.Exit(1) - } - - nodes, err := n.FindAllNodes() - if err != nil { - wwlog.Printf(wwlog.ERROR, "Could not get node list: %s\n", err) - os.Exit(1) - } - - for _, node := range nodes { - if overlayKind == "system" && node.SystemOverlay.Get() == overlayName { - node.SystemOverlay.Set("default") - } else if overlayKind == "runtime" && node.RuntimeOverlay.Get() == overlayName { - node.RuntimeOverlay.Set("default") - } - } - - err = n.Persist() - if err != nil { - return errors.Wrap(err, "failed to persist node updates") - } - } else { removePath := path.Join(overlayPath, fileName) @@ -97,14 +62,14 @@ func CobraRunE(cmd *cobra.Command, args []string) error { if Force { err := os.RemoveAll(removePath) if err != nil { - wwlog.Printf(wwlog.ERROR, "Failed deleting file from overlay: %s:%s:%s\n", overlayKind, overlayName, overlayPath) + wwlog.Printf(wwlog.ERROR, "Failed deleting file from overlay: %s:%s\n", overlayName, overlayPath) wwlog.Printf(wwlog.ERROR, "%s\n", err) os.Exit(1) } } else { err := os.Remove(removePath) if err != nil { - wwlog.Printf(wwlog.ERROR, "Failed deleting overlay: %s:%s:%s\n", overlayKind, overlayName, overlayPath) + wwlog.Printf(wwlog.ERROR, "Failed deleting overlay: %s:%s\n", overlayName, overlayPath) wwlog.Printf(wwlog.ERROR, "%s\n", err) os.Exit(1) } diff --git a/internal/app/wwctl/overlay/delete/root.go b/internal/app/wwctl/overlay/delete/root.go index 875909b3..90ec39fe 100644 --- a/internal/app/wwctl/overlay/delete/root.go +++ b/internal/app/wwctl/overlay/delete/root.go @@ -7,13 +7,12 @@ import ( var ( baseCmd = &cobra.Command{ DisableFlagsInUseLine: true, - Use: "delete [OPTIONS] {runtime|system} OVERLAY_NAME [FILE [FILE ...]]", - Short: "Delete Warewulf Overlay or files", - Long: "This command will delete FILEs within OVERLAY_NAME or the entire OVERLAY_NAME if no\n" + - "files are listed. Use with caution!", - RunE: CobraRunE, - Args: cobra.RangeArgs(2, 3), - Aliases: []string{"rm", "del"}, + Use: "delete [OPTIONS] OVERLAY_NAME [FILE [FILE ...]]", + Short: "Delete Warewulf Overlay or files", + Long: "This command will delete FILEs within OVERLAY_NAME or the entire OVERLAY_NAME if no\nfiles are listed. Use with caution!", + RunE: CobraRunE, + Args: cobra.RangeArgs(1, 2), + Aliases: []string{"rm", "del"}, } Force bool Parents bool diff --git a/internal/app/wwctl/overlay/edit/main.go b/internal/app/wwctl/overlay/edit/main.go index d5e1dbb3..0872ca72 100644 --- a/internal/app/wwctl/overlay/edit/main.go +++ b/internal/app/wwctl/overlay/edit/main.go @@ -6,10 +6,9 @@ import ( "path" "path/filepath" - "github.com/hpcng/warewulf/internal/pkg/config" + "github.com/hpcng/warewulf/internal/pkg/overlay" "github.com/hpcng/warewulf/internal/pkg/util" "github.com/hpcng/warewulf/internal/pkg/wwlog" - "github.com/pkg/errors" "github.com/spf13/cobra" ) @@ -17,26 +16,17 @@ func CobraRunE(cmd *cobra.Command, args []string) error { editor := os.Getenv("EDITOR") var overlaySourceDir string - overlayKind := args[0] - overlayName := args[1] - fileName := args[2] - - if overlayKind != "system" && overlayKind != "runtime" { - return errors.New("overlay kind must be of type 'system' or 'runtime'") - } + overlayName := args[0] + fileName := args[1] if editor == "" { editor = "/bin/vi" } - if overlayKind == "system" { - overlaySourceDir = config.SystemOverlaySource(overlayName) - } else if overlayKind == "runtime" { - overlaySourceDir = config.RuntimeOverlaySource(overlayName) - } + overlaySourceDir = overlay.OverlaySourceDir(overlayName) if !util.IsDir(overlaySourceDir) { - wwlog.Printf(wwlog.ERROR, "Overlay does not exist: %s:%s\n", overlayKind, overlayName) + wwlog.Printf(wwlog.ERROR, "Overlay does not exist: %s\n", overlayName) os.Exit(1) } @@ -59,7 +49,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { } if !util.IsFile(overlayFile) && filepath.Ext(overlayFile) == ".ww" { - wwlog.Printf(wwlog.WARN, "This is a new file, creating some default content\n") + wwlog.Printf(wwlog.VERBOSE, "This is a new file, creating some default content\n") w, err := os.OpenFile(overlayFile, os.O_RDWR|os.O_CREATE, os.FileMode(PermMode)) if err != nil { diff --git a/internal/app/wwctl/overlay/edit/root.go b/internal/app/wwctl/overlay/edit/root.go index 7f981614..b3d7c9f0 100644 --- a/internal/app/wwctl/overlay/edit/root.go +++ b/internal/app/wwctl/overlay/edit/root.go @@ -7,13 +7,11 @@ import ( var ( baseCmd = &cobra.Command{ DisableFlagsInUseLine: true, - Use: "edit [OPTIONS] {system|runtime} OVERLAY_NAME FILE", - Short: "Edit or create a file within a Warewulf Overlay", - Long: "This command will open the FILE for editing or create a new file within the\n" + - "OVERLAY_NAME. Note: files created with a '.ww' suffix will always be\n" + - "parsed as Warewulf template files, and the suffix will be removed automatically.", - RunE: CobraRunE, - Args: cobra.ExactArgs(3), + Use: "edit [OPTIONS] OVERLAY_NAME FILE", + Short: "Edit or create a file within a Warewulf Overlay", + Long: "This command will open the FILE for editing or create a new file within the\nOVERLAY_NAME. Note: files created with a '.ww' suffix will always be\nparsed as Warewulf template files, and the suffix will be removed automatically.", + RunE: CobraRunE, + Args: cobra.ExactArgs(2), } ListFiles bool CreateDirs bool diff --git a/internal/app/wwctl/overlay/imprt/main.go b/internal/app/wwctl/overlay/imprt/main.go index 2c31ab6b..549a7c74 100644 --- a/internal/app/wwctl/overlay/imprt/main.go +++ b/internal/app/wwctl/overlay/imprt/main.go @@ -4,7 +4,6 @@ import ( "os" "path" - "github.com/hpcng/warewulf/internal/pkg/config" "github.com/hpcng/warewulf/internal/pkg/node" "github.com/hpcng/warewulf/internal/pkg/overlay" "github.com/hpcng/warewulf/internal/pkg/util" @@ -17,30 +16,20 @@ func CobraRunE(cmd *cobra.Command, args []string) error { var dest string var overlaySource string - overlayKind := args[0] - overlayName := args[1] - source := args[2] + overlayName := args[0] + source := args[1] - if overlayKind != "system" && overlayKind != "runtime" { - return errors.New("overlay kind must be of type 'system' or 'runtime'") - } - - if len(args) == 4 { - dest = args[3] + if len(args) == 3 { + dest = args[2] } else { dest = source } - if overlayKind == "system" { - wwlog.Printf(wwlog.VERBOSE, "Copying '%s' into system overlay '%s:%s'\n", source, overlayName, dest) - overlaySource = config.SystemOverlaySource(overlayName) - } else if overlayKind == "runtime" { - wwlog.Printf(wwlog.VERBOSE, "Copying '%s' into runtime overlay '%s:%s'\n", source, overlayName, dest) - overlaySource = config.RuntimeOverlaySource(overlayName) - } + wwlog.Printf(wwlog.VERBOSE, "Copying '%s' into overlay '%s:%s'\n", source, overlayName, dest) + overlaySource = overlay.OverlaySourceDir(overlayName) if !util.IsDir(overlaySource) { - wwlog.Printf(wwlog.ERROR, "Overlay does not exist: %s:%s\n", overlayKind, overlayName) + wwlog.Printf(wwlog.ERROR, "Overlay does not exist: %s\n", overlayName) os.Exit(1) } @@ -49,7 +38,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { } if util.IsFile(path.Join(overlaySource, dest)) { - wwlog.Printf(wwlog.ERROR, "A file with that name already exists in the %s overlay %s\n:", overlayKind, overlayName) + wwlog.Printf(wwlog.ERROR, "A file with that name already exists in the overlay %s\n:", overlayName) os.Exit(1) } @@ -74,21 +63,14 @@ func CobraRunE(cmd *cobra.Command, args []string) error { var updateNodes []node.NodeInfo for _, node := range nodes { - if overlayKind == "system" && node.SystemOverlay.Get() == overlayName { + if node.SystemOverlay.Get() == overlayName { updateNodes = append(updateNodes, node) - } else if overlayKind == "runtime" && node.RuntimeOverlay.Get() == overlayName { + } else if node.RuntimeOverlay.Get() == overlayName { updateNodes = append(updateNodes, node) } } - if overlayKind == "system" { - wwlog.Printf(wwlog.INFO, "Updating System Overlays...\n") - return overlay.BuildSystemOverlay(updateNodes) - } else if overlayKind == "runtime" { - wwlog.Printf(wwlog.INFO, "Updating Runtime Overlays...\n") - return overlay.BuildRuntimeOverlay(updateNodes) - } - + return overlay.BuildSpecificOverlays(updateNodes, overlayName) } return nil diff --git a/internal/app/wwctl/overlay/imprt/root.go b/internal/app/wwctl/overlay/imprt/root.go index 0e4c2146..2d41343c 100644 --- a/internal/app/wwctl/overlay/imprt/root.go +++ b/internal/app/wwctl/overlay/imprt/root.go @@ -5,13 +5,12 @@ import "github.com/spf13/cobra" var ( baseCmd = &cobra.Command{ DisableFlagsInUseLine: true, - Use: "import [OPTIONS] {system|runtime} OVERLAY_NAME FILE [NEW_NAME]", - Short: "Import a file into a Warewulf Overlay", - Long: "This command imports the FILE into the Warewulf OVERLAY_NAME.\n" + - "Optionally, the file can be renamed to NEW_NAME", - RunE: CobraRunE, - Args: cobra.RangeArgs(3, 4), - Aliases: []string{"cp"}, + Use: "import [OPTIONS] OVERLAY_NAME FILE [NEW_NAME]", + Short: "Import a file into a Warewulf Overlay", + Long: "This command imports the FILE into the Warewulf OVERLAY_NAME.\nOptionally, the file can be renamed to NEW_NAME", + RunE: CobraRunE, + Args: cobra.RangeArgs(2, 3), + Aliases: []string{"cp"}, } PermMode int32 NoOverlayUpdate bool diff --git a/internal/app/wwctl/overlay/list/main.go b/internal/app/wwctl/overlay/list/main.go index dca311d8..17b9deaf 100644 --- a/internal/app/wwctl/overlay/list/main.go +++ b/internal/app/wwctl/overlay/list/main.go @@ -5,8 +5,6 @@ import ( "os" "syscall" - "github.com/hpcng/warewulf/internal/pkg/config" - "github.com/hpcng/warewulf/internal/pkg/node" "github.com/hpcng/warewulf/internal/pkg/overlay" "github.com/hpcng/warewulf/internal/pkg/util" "github.com/hpcng/warewulf/internal/pkg/wwlog" @@ -15,79 +13,27 @@ import ( ) func CobraRunE(cmd *cobra.Command, args []string) error { - set := make(map[string]int) - var o []string - var err error - var nodeList []node.NodeInfo - var overlayName string + var overlays []string - overlayKind := args[0] - - if len(args) > 1 { - overlayName = args[1] - } - - if overlayKind != "system" && overlayKind != "runtime" { - return errors.New("overlay kind must be of type 'system' or 'runtime'") - } - - n, err := node.New() - if err != nil { - wwlog.Printf(wwlog.ERROR, "Could not open node configuration: %s\n", err) - os.Exit(1) - } - - if overlayKind == "system" { - if !ListLong { - fmt.Printf("%-30s %-12s %-12s\n", "SYSTEM OVERLAY NAME", "NODES", "FILES/DIRS") - } else { - fmt.Printf("%-10s %5s %-5s %-18s %s\n", "PERM MODE", "UID", "GID", "SYSTEM-OVERLAY", "FILE PATH") - } - o, err = overlay.FindSystemOverlays() - } else if overlayKind == "runtime" { - if !ListLong { - fmt.Printf("%-30s %-12s %-12s\n", "RUNTIME OVERLAY NAME", "NODES", "FILES/DIRS") - } else { - fmt.Printf("%-10s %5s %-5s %-18s %s\n", "PERM MODE", "UID", "GID", "RUNTIME-OVERLAY", "FILE PATH") - } - o, err = overlay.FindRuntimeOverlays() - } - if err != nil { - wwlog.Printf(wwlog.ERROR, "Could not get system overlays: %s\n", err) - return err - } - - nodeList, err = n.FindAllNodes() - if err != nil { - wwlog.Printf(wwlog.ERROR, "Could not get node configuration: %s\n", err) - return err - } - - for _, node := range nodeList { - if overlayKind == "system" { - if node.SystemOverlay.Get() != "" { - set[node.SystemOverlay.Get()]++ - } - } else if overlayKind == "runtime" { - if node.RuntimeOverlay.Get() != "" { - set[node.RuntimeOverlay.Get()]++ - } + if len(args) > 0 { + overlays = args + } else { + var err error + overlays, err = overlay.FindOverlays() + if err != nil { + return errors.Wrap(err, "could not obtain list of overlays from system") } } - for overlay := range o { - var path string - name := o[overlay] + if ListLong { + fmt.Printf("%-10s %5s %-5s %-18s %s\n", "PERM MODE", "UID", "GID", "SYSTEM-OVERLAY", "FILE PATH") + } else { + fmt.Printf("%-30s %-12s\n", "OVERLAY NAME", "FILES/DIRS") + } - if overlayName != "" && overlayName != name { - continue - } - - if overlayKind == "system" { - path = config.SystemOverlaySource(o[overlay]) - } else if overlayKind == "runtime" { - path = config.RuntimeOverlaySource(o[overlay]) - } + for o := range overlays { + name := overlays[o] + path := overlay.OverlaySourceDir(name) if util.IsDir(path) { files := util.FindFiles(path) @@ -96,11 +42,11 @@ func CobraRunE(cmd *cobra.Command, args []string) error { if ListContents { var fileCount int for file := range files { - fmt.Printf("%-30s %-12d /%-12s\n", name, set[name], files[file]) + fmt.Printf("%-30s /%-12s\n", name, files[file]) fileCount++ } if fileCount == 0 { - fmt.Printf("%-30s %-12d %-12d\n", name, set[name], 0) + fmt.Printf("%-30s %-12d\n", name, 0) } } else if ListLong { for file := range files { @@ -114,15 +60,15 @@ func CobraRunE(cmd *cobra.Command, args []string) error { sys := s.Sys() - fmt.Printf("%v %5d %-5d %-18s /%s\n", perms, sys.(*syscall.Stat_t).Uid, sys.(*syscall.Stat_t).Gid, o[overlay], files[file]) + fmt.Printf("%v %5d %-5d %-18s /%s\n", perms, sys.(*syscall.Stat_t).Uid, sys.(*syscall.Stat_t).Gid, overlays[o], files[file]) } } else { - fmt.Printf("%-30s %-12d %-12d\n", name, set[name], len(files)) + fmt.Printf("%-30s %-12d\n", name, len(files)) } } else { - wwlog.Printf(wwlog.ERROR, "system/%s (path not found:%s)\n", o[overlay], path) + wwlog.Printf(wwlog.ERROR, "system/%s (path not found:%s)\n", overlays[o], path) } } diff --git a/internal/app/wwctl/overlay/list/root.go b/internal/app/wwctl/overlay/list/root.go index c7b33ce4..0048d7f2 100644 --- a/internal/app/wwctl/overlay/list/root.go +++ b/internal/app/wwctl/overlay/list/root.go @@ -7,14 +7,13 @@ import ( var ( baseCmd = &cobra.Command{ DisableFlagsInUseLine: true, - Use: "list [OPTIONS] {system|runtime} [OVERLAY_NAME]", - Short: "List Warewulf Overlays and files", - Long: "This command displays information about all Warewulf overlays or the specified\n" + - "OVERLAY_NAME. It also supports listing overlay content information.", - RunE: CobraRunE, - Args: cobra.MinimumNArgs(1), - Aliases: []string{"ls"}, - ValidArgs: []string{"system", "runtime"}, + Use: "list [OPTIONS] OVERLAY_NAME", + Short: "List Warewulf Overlays and files", + Long: "This command displays information about all Warewulf overlays or the specified\nOVERLAY_NAME. It also supports listing overlay content information.", + RunE: CobraRunE, + Args: cobra.MinimumNArgs(0), + Aliases: []string{"ls"}, + ValidArgs: []string{"system", "runtime"}, } ListContents bool ListLong bool diff --git a/internal/app/wwctl/overlay/mkdir/main.go b/internal/app/wwctl/overlay/mkdir/main.go index 99d30550..ccff9272 100644 --- a/internal/app/wwctl/overlay/mkdir/main.go +++ b/internal/app/wwctl/overlay/mkdir/main.go @@ -4,38 +4,28 @@ import ( "os" "path" - "github.com/hpcng/warewulf/internal/pkg/config" + "github.com/hpcng/warewulf/internal/pkg/overlay" "github.com/hpcng/warewulf/internal/pkg/util" "github.com/hpcng/warewulf/internal/pkg/wwlog" - "github.com/pkg/errors" "github.com/spf13/cobra" ) func CobraRunE(cmd *cobra.Command, args []string) error { var overlaySourceDir string - overlayKind := args[0] - overlayName := args[1] - dirName := args[2] + overlayName := args[0] + dirName := args[1] - if overlayKind != "system" && overlayKind != "runtime" { - return errors.New("overlay kind must be of type 'system' or 'runtime'") - } - - if overlayKind == "system" { - overlaySourceDir = config.SystemOverlaySource(overlayName) - } else if overlayKind == "runtime" { - overlaySourceDir = config.RuntimeOverlaySource(overlayName) - } + overlaySourceDir = overlay.OverlaySourceDir(overlayName) if !util.IsDir(overlaySourceDir) { - wwlog.Printf(wwlog.ERROR, "Overlay does not exist: %s:%s\n", overlayKind, overlayName) + wwlog.Printf(wwlog.ERROR, "Overlay does not exist: %s\n", overlayName) os.Exit(1) } overlayDir := path.Join(overlaySourceDir, dirName) - wwlog.Printf(wwlog.DEBUG, "Will create directory in overlay: %s:%s:%s\n", overlayKind, overlayName, dirName) + wwlog.Printf(wwlog.DEBUG, "Will create directory in overlay: %s:%s\n", overlayName, dirName) err := os.MkdirAll(overlayDir, os.FileMode(PermMode)) if err != nil { diff --git a/internal/app/wwctl/overlay/mkdir/root.go b/internal/app/wwctl/overlay/mkdir/root.go index e95cba0a..8ebcc7eb 100644 --- a/internal/app/wwctl/overlay/mkdir/root.go +++ b/internal/app/wwctl/overlay/mkdir/root.go @@ -7,11 +7,11 @@ import ( var ( baseCmd = &cobra.Command{ DisableFlagsInUseLine: true, - Use: "mkdir [OPTIONS] {system|runtime} OVERLAY_NAME DIRECTORY", - Short: "Create a new directory within an Overlay", - Long: "This command creates a new directory within the Warewulf OVERLAY_NAME.", - RunE: CobraRunE, - Args: cobra.MinimumNArgs(3), + Use: "mkdir [OPTIONS] OVERLAY_NAME DIRECTORY", + Short: "Create a new directory within an Overlay", + Long: "This command creates a new directory within the Warewulf OVERLAY_NAME.", + RunE: CobraRunE, + Args: cobra.MinimumNArgs(3), } PermMode int32 ) diff --git a/internal/app/wwctl/overlay/show/main.go b/internal/app/wwctl/overlay/show/main.go index b4d09201..dac7c150 100644 --- a/internal/app/wwctl/overlay/show/main.go +++ b/internal/app/wwctl/overlay/show/main.go @@ -6,29 +6,19 @@ import ( "os" "path" - "github.com/hpcng/warewulf/internal/pkg/config" + "github.com/hpcng/warewulf/internal/pkg/overlay" "github.com/hpcng/warewulf/internal/pkg/util" "github.com/hpcng/warewulf/internal/pkg/wwlog" - "github.com/pkg/errors" "github.com/spf13/cobra" ) func CobraRunE(cmd *cobra.Command, args []string) error { var overlaySourceDir string - overlayKind := args[0] - overlayName := args[1] - fileName := args[2] + overlayName := args[0] + fileName := args[1] - if overlayKind != "system" && overlayKind != "runtime" { - return errors.New("overlay kind must be of type 'system' or 'runtime'") - } - - if overlayKind == "system" { - overlaySourceDir = config.SystemOverlaySource(overlayName) - } else if overlayKind == "runtime" { - overlaySourceDir = config.RuntimeOverlaySource(overlayName) - } + overlaySourceDir = overlay.OverlaySourceDir(overlayName) if !util.IsDir(overlaySourceDir) { wwlog.Printf(wwlog.ERROR, "Overlay does not exist: %s\n", overlayName) diff --git a/internal/app/wwctl/overlay/show/root.go b/internal/app/wwctl/overlay/show/root.go index 43c491ce..168c4059 100644 --- a/internal/app/wwctl/overlay/show/root.go +++ b/internal/app/wwctl/overlay/show/root.go @@ -6,12 +6,13 @@ import ( var ( baseCmd = &cobra.Command{ - Use: "show [OPTIONS] {system|runtime} OVERLAY_NAME FILE", - Short: "Show (cat) a file within a Warewulf Overlay", - Long: "This command displays the contents of FILE within OVERLAY_NAME.", - RunE: CobraRunE, - Aliases: []string{"cat"}, - Args: cobra.ExactArgs(3), + DisableFlagsInUseLine: true, + Use: "show [OPTIONS] OVERLAY_NAME FILE", + Short: "Show (cat) a file within a Warewulf Overlay", + Long: "This command displays the contents of FILE within OVERLAY_NAME.", + RunE: CobraRunE, + Aliases: []string{"cat"}, + Args: cobra.ExactArgs(2), } ) diff --git a/internal/app/wwctl/profile/list/main.go b/internal/app/wwctl/profile/list/main.go index 8734ffb0..3f8764f8 100644 --- a/internal/app/wwctl/profile/list/main.go +++ b/internal/app/wwctl/profile/list/main.go @@ -38,8 +38,8 @@ func CobraRunE(cmd *cobra.Command, args []string) error { fmt.Printf("%-20s %-18s %s\n", profile.Id.Get(), "Init", profile.Init.Print()) fmt.Printf("%-20s %-18s %s\n", profile.Id.Get(), "Root", profile.Root.Print()) - fmt.Printf("%-20s %-18s %s\n", profile.Id.Get(), "RuntimeOverlay", profile.RuntimeOverlay.Print()) fmt.Printf("%-20s %-18s %s\n", profile.Id.Get(), "SystemOverlay", profile.SystemOverlay.Print()) + fmt.Printf("%-20s %-18s %s\n", profile.Id.Get(), "RuntimeOverlay", profile.RuntimeOverlay.Print()) fmt.Printf("%-20s %-18s %s\n", profile.Id.Get(), "Ipxe", profile.Ipxe.Print()) fmt.Printf("%-20s %-18s %s\n", profile.Id.Get(), "IpmiNetmask", profile.IpmiNetmask.Print()) fmt.Printf("%-20s %-18s %s\n", profile.Id.Get(), "IpmiPort", profile.IpmiPort.Print()) diff --git a/internal/app/wwctl/profile/set/root.go b/internal/app/wwctl/profile/set/root.go index 270f01a1..7fd5d64c 100644 --- a/internal/app/wwctl/profile/set/root.go +++ b/internal/app/wwctl/profile/set/root.go @@ -41,6 +41,7 @@ var ( SetKernelArgs string SetClusterName string SetIpxe string + SetInitOverlay string SetRuntimeOverlay string SetSystemOverlay string SetIpmiNetmask string @@ -91,7 +92,7 @@ func init() { baseCmd.PersistentFlags().StringVarP(&SetRuntimeOverlay, "runtime", "R", "", "Set the node's runtime overlay") if err := baseCmd.RegisterFlagCompletionFunc("runtime", func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { - list, _ := overlay.FindRuntimeOverlays() + list, _ := overlay.FindOverlays() return list, cobra.ShellCompDirectiveNoFileComp }); err != nil { log.Println(err) @@ -99,7 +100,7 @@ func init() { } baseCmd.PersistentFlags().StringVarP(&SetSystemOverlay, "system", "S", "", "Set the node's system overlay") if err := baseCmd.RegisterFlagCompletionFunc("system", func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { - list, _ := overlay.FindSystemOverlays() + list, _ := overlay.FindOverlays() return list, cobra.ShellCompDirectiveNoFileComp }); err != nil { log.Println(err) @@ -119,7 +120,7 @@ func init() { baseCmd.PersistentFlags().StringVarP(&SetGateway, "gateway", "G", "", "Set the node's network device gateway") baseCmd.PersistentFlags().StringVarP(&SetHwaddr, "hwaddr", "H", "", "Set the node's network device HW address") baseCmd.PersistentFlags().StringVarP(&SetType, "type", "T", "", "Set the node's network device type") - baseCmd.PersistentFlags().StringVar(&SetNetOnBoot, "onboot", "yes", "Enable/disable device (yes/no)") + baseCmd.PersistentFlags().StringVar(&SetNetOnBoot, "onboot", "", "Enable/disable device (yes/no)") baseCmd.PersistentFlags().BoolVar(&SetNetDevDel, "netdel", false, "Delete the node's network device") diff --git a/internal/pkg/node/constructors.go b/internal/pkg/node/constructors.go index 8f2d6e7b..d6323f99 100644 --- a/internal/pkg/node/constructors.go +++ b/internal/pkg/node/constructors.go @@ -42,8 +42,8 @@ func (config *nodeYaml) FindAllNodes() ([]NodeInfo, error) { wwlog.Printf(wwlog.DEBUG, "In node loop: %s\n", nodename) n.NetDevs = make(map[string]*NetDevEntry) n.Keys = make(map[string]*Entry) - n.SystemOverlay.SetDefault("default") - n.RuntimeOverlay.SetDefault("default") + n.SystemOverlay.SetDefault("wwinit") + n.RuntimeOverlay.SetDefault("generic") n.Ipxe.SetDefault("default") n.Init.SetDefault("/sbin/init") n.Root.SetDefault("initramfs") @@ -266,5 +266,5 @@ func (config *nodeYaml) FindDiscoverableNode() (NodeInfo, string, error) { } } - return ret, "", errors.New("No unconfigured nodes found") + return ret, "", errors.New("no unconfigured nodes found") } diff --git a/internal/pkg/overlay/funcmap.go b/internal/pkg/overlay/funcmap.go index f84c0369..4bb4c118 100644 --- a/internal/pkg/overlay/funcmap.go +++ b/internal/pkg/overlay/funcmap.go @@ -6,6 +6,7 @@ import ( "strings" "github.com/hpcng/warewulf/internal/pkg/container" + "github.com/hpcng/warewulf/internal/pkg/util" "github.com/hpcng/warewulf/internal/pkg/wwlog" ) @@ -19,15 +20,15 @@ func templateFileInclude(path string) string { } func templateContainerFileInclude(containername string, filepath string) string { - wwlog.Printf(wwlog.DEBUG, "Including VNFS file into template: %s: %s\n", containername, filepath) + wwlog.Printf(wwlog.VERBOSE, "Including file from Container into template: %s:%s\n", containername, filepath) if containername == "" { - wwlog.Printf(wwlog.WARN, "VNFS not set for template import request: %s: %s\n", containername, filepath) + wwlog.Printf(wwlog.WARN, "Container is not defined for node: %s\n", filepath) return "" } if !container.ValidSource(containername) { - wwlog.Printf(wwlog.WARN, "Template required VNFS does not exist: %s\n", containername) + wwlog.Printf(wwlog.WARN, "Template requires file(s) from non-existant container: %s:%s\n", containername, filepath) return "" } @@ -35,10 +36,15 @@ func templateContainerFileInclude(containername string, filepath string) string wwlog.Printf(wwlog.DEBUG, "Including file from container: %s:%s\n", containerDir, filepath) + if !util.IsFile(path.Join(containerDir, filepath)) { + wwlog.Printf(wwlog.WARN, "Requested file from container does not exist: %s:%s\n", containername, filepath) + return "" + } + content, err := ioutil.ReadFile(path.Join(containerDir, filepath)) if err != nil { - wwlog.Printf(wwlog.ERROR, "Template include: %s\n", err) + wwlog.Printf(wwlog.ERROR, "Template include failed: %s\n", err) } return strings.TrimSuffix(string(content), "\n") } diff --git a/internal/pkg/overlay/overlay.go b/internal/pkg/overlay/overlay.go index b59b5ff1..e4a4c469 100644 --- a/internal/pkg/overlay/overlay.go +++ b/internal/pkg/overlay/overlay.go @@ -8,7 +8,6 @@ import ( "os/exec" "path" "path/filepath" - "regexp" "strconv" "strings" "text/template" @@ -39,14 +38,17 @@ type TemplateStruct struct { AllNodes []node.NodeInfo } +/* + func BuildSystemOverlay(nodeList []node.NodeInfo) error { - return buildOverlay(nodeList, "system") + return nil } func BuildRuntimeOverlay(nodeList []node.NodeInfo) error { - return buildOverlay(nodeList, "runtime") + return nil } + func FindSystemOverlays() ([]string, error) { return findAllOverlays("system") } @@ -54,33 +56,60 @@ func FindSystemOverlays() ([]string, error) { func FindRuntimeOverlays() ([]string, error) { return findAllOverlays("runtime") } +*/ -func SystemOverlayInit(name string) error { - return overlayInit(name, "system") +func OverlaySourceTopDir() string { + return path.Join(config.LocalStateDir, "overlays/") } -func RuntimeOverlayInit(name string) error { - return overlayInit(name, "runtime") +func OverlaySourceDir(overlayName string) string { + return path.Join(OverlaySourceTopDir(), overlayName) } -func findAllOverlays(overlayType string) ([]string, error) { +func OverlayImage(nodename string, overlayname string) string { + return fmt.Sprintf("%s/provision/overlays/%s/%s.img", config.LocalStateDir, nodename, overlayname) +} + +func BuildAllOverlays(nodes []node.NodeInfo) error { + for _, n := range nodes { + var overlays []string + + overlays = append(overlays, "wwinit") + overlays = append(overlays, n.RuntimeOverlay.Get()) + + for _, overlay := range overlays { + wwlog.Printf(wwlog.INFO, "Building overlay for %s: %s\n", n.Id.Get(), overlay) + err := BuildOverlay(n, overlay) + if err != nil { + return errors.Wrap(err, "could not build overlay "+n.Id.Get()+"/"+overlay+".img") + } + } + } + return nil +} + +// TODO: Add an Overlay Delete for both sourcedir and image + +func BuildSpecificOverlays(nodes []node.NodeInfo, overlayName string) error { + for _, n := range nodes { + + wwlog.Printf(wwlog.INFO, "Building overlay for %s: %s\n", n.Id.Get(), overlayName) + err := BuildOverlay(n, overlayName) + if err != nil { + return errors.Wrap(err, "could not build overlay "+n.Id.Get()+"/"+overlayName+".img") + } + + } + return nil +} + +func FindOverlays() ([]string, error) { var ret []string var files []os.FileInfo - var err error - - if overlayType == "system" { - wwlog.Printf(wwlog.DEBUG, "Looking for system overlays...") - files, err = ioutil.ReadDir(config.SystemOverlayDir()) - } else if overlayType == "runtime" { - wwlog.Printf(wwlog.DEBUG, "Looking for runtime overlays...") - files, err = ioutil.ReadDir(config.RuntimeOverlayDir()) - } else { - wwlog.Printf(wwlog.ERROR, "overlayType requested is not supported: %s\n", overlayType) - os.Exit(1) - } + files, err := ioutil.ReadDir(OverlaySourceTopDir()) if err != nil { - return ret, err + return ret, errors.Wrap(err, "could not get list of overlays") } for _, file := range files { @@ -93,22 +122,11 @@ func findAllOverlays(overlayType string) ([]string, error) { return ret, nil } -func overlayInit(name string, overlayType string) error { - var path string - - if overlayType == "system" { - wwlog.Printf(wwlog.DEBUG, "Looking for system overlays...") - path = config.SystemOverlaySource(name) - } else if overlayType == "runtime" { - wwlog.Printf(wwlog.DEBUG, "Looking for runtime overlays...") - path = config.RuntimeOverlaySource(name) - } else { - wwlog.Printf(wwlog.ERROR, "overlayType requested is not supported: %s\n", overlayType) - os.Exit(1) - } +func OverlayInit(overlayName string) error { + path := OverlaySourceDir(overlayName) if util.IsDir(path) { - return errors.New("Overlay already exists: " + name) + return errors.New("Overlay already exists: " + overlayName) } err := os.MkdirAll(path, 0755) @@ -116,208 +134,183 @@ func overlayInit(name string, overlayType string) error { return err } -func buildOverlay(nodeList []node.NodeInfo, overlayType string) error { +func BuildOverlay(nodeInfo node.NodeInfo, overlayName string) error { nodeDB, _ := node.New() allNodes, _ := nodeDB.FindAllNodes() + var tstruct TemplateStruct + OverlaySourceDir := OverlaySourceDir(overlayName) + OverlayImage := OverlayImage(nodeInfo.Id.Get(), overlayName) + OverlayImageDir := path.Dir(OverlayImage) - for _, n := range nodeList { - var t TemplateStruct - var OverlayDir string - var OverlayFile string + if !util.ValidString(overlayName, "^[a-zA-Z0-9-._:]+$") { + return errors.New("overlay name contains illegal characters: " + overlayName) + } - if overlayType == "runtime" { - wwlog.Printf(wwlog.DEBUG, "Building runtime overlay for: %s\n", n.Id.Get()) + wwlog.Printf(wwlog.DEBUG, "Checking to see if overlay directory exists: %s\n", OverlaySourceDir) + if !util.IsDir(OverlaySourceDir) { + return errors.New("overlay does not exist: " + overlayName) + } - OverlayDir = config.RuntimeOverlaySource(n.RuntimeOverlay.Get()) - OverlayFile = config.RuntimeOverlayImage(n.Id.Get()) - } else if overlayType == "system" { - wwlog.Printf(wwlog.DEBUG, "Building system overlay for: %s\n", n.Id.Get()) + err := os.MkdirAll(OverlayImageDir, 0755) + if err == nil { + wwlog.Printf(wwlog.DEBUG, "Created parent directory for Overlay Images: %s\n", OverlayImageDir) + } else { + return errors.Wrap(err, "could not create overlay image directory") + } - OverlayDir = config.SystemOverlaySource(n.SystemOverlay.Get()) - OverlayFile = config.SystemOverlayImage(n.Id.Get()) - } else { - wwlog.Printf(wwlog.ERROR, "overlayType requested is not supported: %s\n", overlayType) - os.Exit(1) - } + tmpDir, err := ioutil.TempDir(os.TempDir(), ".wwctl-overlay-") + if err == nil { + wwlog.Printf(wwlog.DEBUG, "Creating temporary directory for overlay files: %s\n", tmpDir) + } else { + return errors.Wrap(err, "could not create overlay temporary directory") + } - wwlog.Printf(wwlog.DEBUG, "Processing overlay for node: %s\n", n.Id.Get()) + wwlog.Printf(wwlog.VERBOSE, "Processing node/overlay: %s/%s\n", nodeInfo.Id.Get(), overlayName) - t.Id = n.Id.Get() - t.Hostname = n.Id.Get() - t.ClusterName = n.ClusterName.Get() - t.Container = n.ContainerName.Get() - t.Init = n.Init.Get() - t.Root = n.Root.Get() - t.IpmiIpaddr = n.IpmiIpaddr.Get() - t.IpmiNetmask = n.IpmiNetmask.Get() - t.IpmiPort = n.IpmiPort.Get() - t.IpmiGateway = n.IpmiGateway.Get() - t.IpmiUserName = n.IpmiUserName.Get() - t.IpmiPassword = n.IpmiPassword.Get() - t.IpmiInterface = n.IpmiInterface.Get() - t.NetDevs = make(map[string]*node.NetDevs) - t.Keys = make(map[string]string) - for devname, netdev := range n.NetDevs { - var nd node.NetDevs - t.NetDevs[devname] = &nd - t.NetDevs[devname].Name = devname - t.NetDevs[devname].Device = netdev.Device.Get() - t.NetDevs[devname].Hwaddr = netdev.Hwaddr.Get() - t.NetDevs[devname].Ipaddr = netdev.Ipaddr.Get() - t.NetDevs[devname].Netmask = netdev.Netmask.Get() - t.NetDevs[devname].Gateway = netdev.Gateway.Get() - t.NetDevs[devname].Type = netdev.Type.Get() - t.NetDevs[devname].OnBoot = netdev.OnBoot.GetB() + tstruct.Id = nodeInfo.Id.Get() + tstruct.Hostname = nodeInfo.Id.Get() + tstruct.Id = nodeInfo.Id.Get() + tstruct.Hostname = nodeInfo.Id.Get() + tstruct.ClusterName = nodeInfo.ClusterName.Get() + tstruct.Container = nodeInfo.ContainerName.Get() + tstruct.Init = nodeInfo.Init.Get() + tstruct.Root = nodeInfo.Root.Get() + tstruct.IpmiIpaddr = nodeInfo.IpmiIpaddr.Get() + tstruct.IpmiNetmask = nodeInfo.IpmiNetmask.Get() + tstruct.IpmiPort = nodeInfo.IpmiPort.Get() + tstruct.IpmiGateway = nodeInfo.IpmiGateway.Get() + tstruct.IpmiUserName = nodeInfo.IpmiUserName.Get() + tstruct.IpmiPassword = nodeInfo.IpmiPassword.Get() + tstruct.IpmiInterface = nodeInfo.IpmiInterface.Get() + tstruct.NetDevs = make(map[string]*node.NetDevs) + tstruct.Keys = make(map[string]string) + for devname, netdev := range nodeInfo.NetDevs { + var nd node.NetDevs + tstruct.NetDevs[devname] = &nd + tstruct.NetDevs[devname].Name = devname + tstruct.NetDevs[devname].Device = netdev.Device.Get() + tstruct.NetDevs[devname].Hwaddr = netdev.Hwaddr.Get() + tstruct.NetDevs[devname].Ipaddr = netdev.Ipaddr.Get() + tstruct.NetDevs[devname].Netmask = netdev.Netmask.Get() + tstruct.NetDevs[devname].Gateway = netdev.Gateway.Get() + tstruct.NetDevs[devname].Type = netdev.Type.Get() + tstruct.NetDevs[devname].OnBoot = netdev.OnBoot.GetB() - mask := net.IPMask(net.ParseIP(netdev.Netmask.Get()).To4()) - ipaddr := net.ParseIP(netdev.Ipaddr.Get()).To4() - netaddr := net.IPNet{IP: ipaddr, Mask: mask} - netPrefix, _ := net.IPMask(net.ParseIP(netdev.Netmask.Get()).To4()).Size() - t.NetDevs[devname].Prefix = strconv.Itoa(netPrefix) - t.NetDevs[devname].IpCIDR = netaddr.String() - - } - for keyname, key := range n.Keys { - t.Keys[keyname] = key.Get() - } - t.AllNodes = allNodes - - if overlayType == "runtime" && !n.RuntimeOverlay.Defined() { - wwlog.Printf(wwlog.WARN, "Undefined runtime overlay, skipping node: %s\n", n.Id.Get()) - } - if overlayType == "system" && !n.SystemOverlay.Defined() { - wwlog.Printf(wwlog.WARN, "Undefined system overlay, skipping node: %s\n", n.Id.Get()) - } - - wwlog.Printf(wwlog.DEBUG, "Checking to see if overlay directory exists: %s\n", OverlayDir) - if !util.IsDir(OverlayDir) { - wwlog.Printf(wwlog.WARN, "%-35s: Skipped (runtime overlay template not found)\n", n.Id.Get()) - continue - } - - wwlog.Printf(wwlog.DEBUG, "Creating parent directory for OverlayFile: %s\n", path.Dir(OverlayFile)) - err := os.MkdirAll(path.Dir(OverlayFile), 0755) - if err != nil { - return err - } - - wwlog.Printf(wwlog.DEBUG, "Changing directory to OverlayDir: %s\n", OverlayDir) - err = os.Chdir(OverlayDir) - if err != nil { - wwlog.Printf(wwlog.ERROR, "Could not chdir() to OverlayDir: %s\n", OverlayDir) - continue - } - - wwlog.Printf(wwlog.DEBUG, "Creating temporary directory for overlay files\n") - tmpDir, err := ioutil.TempDir(os.TempDir(), ".wwctl-overlay-") - if err != nil { - return err - } - - wwlog.Printf(wwlog.DEBUG, "Walking the file system: %s\n", OverlayDir) - err = filepath.Walk(".", func(location string, info os.FileInfo, err error) error { - if err != nil { - return err - } - - wwlog.Printf(wwlog.DEBUG, "Overlay Walk for '%s': OVERLAY:/%s\n", n.Id.Get(), location) - - if info.IsDir() { - wwlog.Printf(wwlog.DEBUG, "Found directory: %s\n", location) - - err = os.MkdirAll(path.Join(tmpDir, location), info.Mode()) - if err != nil { - wwlog.Printf(wwlog.ERROR, "%s\n", err) - return err - } - err = util.CopyUIDGID(location, path.Join(tmpDir, location)) - if err != nil { - wwlog.Printf(wwlog.ERROR, "%s\n", err) - return err - } - - } else if filepath.Ext(location) == ".ww" { - wwlog.Printf(wwlog.DEBUG, "Found template file: %s\n", location) - - destFile := strings.TrimSuffix(location, ".ww") - - tmpl, err := template.New(path.Base(location)).Funcs(template.FuncMap{ - "Include": templateFileInclude, - "IncludeFrom": templateContainerFileInclude, - "inc": func(i int) int { return i + 1 }, - "dec": func(i int) int { return i - 1 }, - }).ParseGlob(path.Join(OverlayDir, destFile+".ww*")) - if err != nil { - wwlog.Printf(wwlog.ERROR, "template.New %s\n", err) - return nil - } - - w, err := os.OpenFile(path.Join(tmpDir, destFile), os.O_RDWR|os.O_CREATE, info.Mode()) - if err != nil { - wwlog.Printf(wwlog.ERROR, "path.Join %s\n", err) - return err - } - defer w.Close() - - wwlog.Printf(wwlog.DEBUG, "Writing overlay template: OVERLAY:/%s\n", destFile) - err = tmpl.Execute(w, t) - if err != nil { - wwlog.Printf(wwlog.ERROR, "tmpl.Execute %s\n", err) - return nil - } - - err = util.CopyUIDGID(location, path.Join(tmpDir, destFile)) - if err != nil { - return err - } - - } else if b, _ := regexp.MatchString(`\.ww[a-zA-Z0-9\-\._]*$`, location); b { - wwlog.Printf(wwlog.DEBUG, "Ignoring WW template file: %s\n", location) - } else { - wwlog.Printf(wwlog.DEBUG, "Found file: %s\n", location) - - err := util.CopyFile(path.Join(OverlayDir, location), path.Join(tmpDir, location)) - if err != nil { - wwlog.Printf(wwlog.ERROR, "%s\n", err) - return err - } - } - - return nil - }) - if err != nil { - return errors.Wrap(err, "failed to open dir") - } - - if err != nil { - wwlog.Printf(wwlog.ERROR, "Error with filepath walk: %s\n", err) - os.Exit(1) - } - - wwlog.Printf(wwlog.DEBUG, "Finished generating overlay directory for: %s\n", n.Id.Get()) - - compressor, err := exec.LookPath("pigz") - if err != nil { - wwlog.Printf(wwlog.DEBUG, "Could not locate PIGZ, using GZIP\n") - compressor = "gzip" - } else { - wwlog.Printf(wwlog.DEBUG, "Using PIGZ to compress the overlay: %s\n", compressor) - } - - cmd := fmt.Sprintf("cd \"%s\"; find . | cpio --quiet -o -H newc | %s -c > \"%s\"", tmpDir, compressor, OverlayFile) - - wwlog.Printf(wwlog.DEBUG, "RUNNING: %s\n", cmd) - err = exec.Command("/bin/sh", "-c", cmd).Run() - if err != nil { - wwlog.Printf(wwlog.ERROR, "Could not generate runtime image overlay: %s\n", err) - continue - } - wwlog.Printf(wwlog.VERBOSE, "%-35s: Done\n", n.Id.Get()) - - wwlog.Printf(wwlog.DEBUG, "Removing temporary directory: %s\n", tmpDir) - os.RemoveAll(tmpDir) + mask := net.IPMask(net.ParseIP(netdev.Netmask.Get()).To4()) + ipaddr := net.ParseIP(netdev.Ipaddr.Get()).To4() + netaddr := net.IPNet{IP: ipaddr, Mask: mask} + netPrefix, _ := net.IPMask(net.ParseIP(netdev.Netmask.Get()).To4()).Size() + tstruct.NetDevs[devname].Prefix = strconv.Itoa(netPrefix) + tstruct.NetDevs[devname].IpCIDR = netaddr.String() } + for keyname, key := range nodeInfo.Keys { + tstruct.Keys[keyname] = key.Get() + } + tstruct.AllNodes = allNodes + + wwlog.Printf(wwlog.DEBUG, "Changing directory to OverlayDir: %s\n", OverlaySourceDir) + err = os.Chdir(OverlaySourceDir) + if err != nil { + return errors.Wrap(err, "could not change directory to overlay dir") + } + + wwlog.Printf(wwlog.VERBOSE, "Walking the overlay structure: %s\n", OverlaySourceDir) + err = filepath.Walk(".", func(location string, info os.FileInfo, err error) error { + if err != nil { + return err + } + + wwlog.Printf(wwlog.DEBUG, "Found overlay file: %s\n", location) + + if info.IsDir() { + wwlog.Printf(wwlog.DEBUG, "Found directory: %s\n", location) + + err = os.MkdirAll(path.Join(tmpDir, location), info.Mode()) + if err != nil { + return errors.Wrap(err, "could not create directory within overlay") + } + err = util.CopyUIDGID(location, path.Join(tmpDir, location)) + if err != nil { + return errors.Wrap(err, "failed setting permissions on overlay directory") + } + + wwlog.Printf(wwlog.DEBUG, "Created directory in overlay: %s\n", location) + + } else if filepath.Ext(location) == ".ww" { + wwlog.Printf(wwlog.VERBOSE, "Evaluating overlay template file: %s\n", location) + + destFile := strings.TrimSuffix(location, ".ww") + + tmpl, err := template.New(path.Base(location)).Option("missingkey=default").Funcs(template.FuncMap{ + // TODO: Fix for missingkey=zero + "Include": templateFileInclude, + "IncludeFrom": templateContainerFileInclude, + "inc": func(i int) int { return i + 1 }, + "dec": func(i int) int { return i - 1 }, + // }).ParseGlob(path.Join(OverlayDir, destFile+".ww*")) + }).ParseGlob(location) + if err != nil { + return errors.Wrap(err, "could not parse template "+location) + } + + w, err := os.OpenFile(path.Join(tmpDir, destFile), os.O_RDWR|os.O_CREATE, info.Mode()) + if err != nil { + return errors.Wrap(err, "could not open new file for template") + } + defer w.Close() + + err = tmpl.Execute(w, tstruct) + if err != nil { + return errors.Wrap(err, "could not execute template") + } + + err = util.CopyUIDGID(location, path.Join(tmpDir, destFile)) + if err != nil { + return errors.Wrap(err, "failed setting permissions on template output file") + } + + wwlog.Printf(wwlog.DEBUG, "Wrote template file into overlay: %s\n", destFile) + + // } else if b, _ := regexp.MatchString(`\.ww[a-zA-Z0-9\-\._]*$`, location); b { + // wwlog.Printf(wwlog.DEBUG, "Ignoring WW template file: %s\n", location) + } else { + + err := util.CopyFile(location, path.Join(tmpDir, location)) + if err == nil { + wwlog.Printf(wwlog.DEBUG, "Copied file into overlay: %s\n", location) + } else { + return errors.Wrap(err, "could not copy file into overlay") + } + } + + return nil + }) + if err != nil { + return errors.Wrap(err, "failed to build overlay working directory") + } + + wwlog.Printf(wwlog.DEBUG, "Finished generating overlay working directory for: %s/%s\n", nodeInfo.Id.Get(), overlayName) + + compressor, err := exec.LookPath("pigz") + if err != nil { + wwlog.Printf(wwlog.DEBUG, "Could not locate PIGZ, using GZIP\n") + compressor = "gzip" + } else { + wwlog.Printf(wwlog.DEBUG, "Using PIGZ to compress the overlay: %s\n", compressor) + } + + cmd := fmt.Sprintf("cd \"%s\"; find . | cpio --quiet -o -H newc | %s -c > \"%s\"", tmpDir, compressor, OverlayImage) + + wwlog.Printf(wwlog.DEBUG, "RUNNING: %s\n", cmd) + err = exec.Command("/bin/sh", "-c", cmd).Run() + if err != nil { + return errors.Wrap(err, "could not generate compressed runtime image overlay") + } + wwlog.Printf(wwlog.VERBOSE, "Completed building overlay image: %s\n", OverlayImage) + + wwlog.Printf(wwlog.DEBUG, "Removing temporary directory: %s\n", tmpDir) + os.RemoveAll(tmpDir) return nil } diff --git a/internal/pkg/warewulfd/ipxe.go b/internal/pkg/warewulfd/ipxe.go index 2eec83ec..39e26b2f 100644 --- a/internal/pkg/warewulfd/ipxe.go +++ b/internal/pkg/warewulfd/ipxe.go @@ -83,8 +83,7 @@ func IpxeSend(w http.ResponseWriter, req *http.Request) { unconfiguredNode = true } else { nodeobj = n - _ = overlay.BuildSystemOverlay([]node.NodeInfo{n}) - _ = overlay.BuildRuntimeOverlay([]node.NodeInfo{n}) + _ = overlay.BuildAllOverlays([]node.NodeInfo{n}) daemonLogf("IPXEREQ: %s (node automatically configured)\n", hwaddr) diff --git a/internal/pkg/warewulfd/runtime.go b/internal/pkg/warewulfd/runtime.go index eaf17eef..9f15054e 100644 --- a/internal/pkg/warewulfd/runtime.go +++ b/internal/pkg/warewulfd/runtime.go @@ -5,7 +5,6 @@ import ( "strconv" "strings" - "github.com/hpcng/warewulf/internal/pkg/config" "github.com/hpcng/warewulf/internal/pkg/node" "github.com/hpcng/warewulf/internal/pkg/overlay" "github.com/hpcng/warewulf/internal/pkg/util" @@ -64,12 +63,12 @@ func RuntimeOverlaySend(w http.ResponseWriter, req *http.Request) { } if n.RuntimeOverlay.Defined() { - fileName := config.RuntimeOverlayImage(n.Id.Get()) + fileName := overlay.OverlayImage(n.Id.Get(), n.RuntimeOverlay.Get()) if conf.Warewulf.AutobuildOverlays { - if !util.IsFile(fileName) || util.PathIsNewer(fileName, node.ConfigFile) || util.PathIsNewer(fileName, config.RuntimeOverlaySource(n.RuntimeOverlay.Get())) { + if !util.IsFile(fileName) || util.PathIsNewer(fileName, node.ConfigFile) || util.PathIsNewer(fileName, overlay.OverlaySourceDir(n.RuntimeOverlay.Get())) { daemonLogf("BUILD: %15s: Runtime Overlay\n", n.Id.Get()) - _ = overlay.BuildRuntimeOverlay([]node.NodeInfo{n}) + _ = overlay.BuildOverlay(n, n.RuntimeOverlay.Get()) } } diff --git a/internal/pkg/warewulfd/system.go b/internal/pkg/warewulfd/system.go index f63fdac1..7231faa0 100644 --- a/internal/pkg/warewulfd/system.go +++ b/internal/pkg/warewulfd/system.go @@ -3,7 +3,6 @@ package warewulfd import ( "net/http" - "github.com/hpcng/warewulf/internal/pkg/config" "github.com/hpcng/warewulf/internal/pkg/node" "github.com/hpcng/warewulf/internal/pkg/overlay" "github.com/hpcng/warewulf/internal/pkg/util" @@ -26,12 +25,12 @@ func SystemOverlaySend(w http.ResponseWriter, req *http.Request) { } if n.SystemOverlay.Defined() { - fileName := config.SystemOverlayImage(n.Id.Get()) + fileName := overlay.OverlayImage(n.Id.Get(), n.SystemOverlay.Get()) if conf.Warewulf.AutobuildOverlays { - if !util.IsFile(fileName) || util.PathIsNewer(fileName, node.ConfigFile) || util.PathIsNewer(fileName, config.SystemOverlaySource(n.SystemOverlay.Get())) { + if !util.IsFile(fileName) || util.PathIsNewer(fileName, node.ConfigFile) || util.PathIsNewer(fileName, overlay.OverlaySourceDir(n.SystemOverlay.Get())) { daemonLogf("BUILD: %15s: System Overlay\n", n.Id.Get()) - _ = overlay.BuildSystemOverlay([]node.NodeInfo{n}) + _ = overlay.BuildOverlay(n, n.SystemOverlay.Get()) } } diff --git a/overlays/runtime/default/etc/group.ww b/overlays/generic/etc/group.ww similarity index 100% rename from overlays/runtime/default/etc/group.ww rename to overlays/generic/etc/group.ww diff --git a/overlays/runtime/default/etc/hosts.ww b/overlays/generic/etc/hosts.ww similarity index 100% rename from overlays/runtime/default/etc/hosts.ww rename to overlays/generic/etc/hosts.ww diff --git a/overlays/runtime/default/etc/passwd.ww b/overlays/generic/etc/passwd.ww similarity index 100% rename from overlays/runtime/default/etc/passwd.ww rename to overlays/generic/etc/passwd.ww diff --git a/overlays/runtime/default/root/.ssh/authorized_keys.ww b/overlays/generic/root/.ssh/authorized_keys.ww similarity index 100% rename from overlays/runtime/default/root/.ssh/authorized_keys.ww rename to overlays/generic/root/.ssh/authorized_keys.ww diff --git a/overlays/system/default/etc/hostname.ww b/overlays/wwinit/etc/hostname.ww similarity index 100% rename from overlays/system/default/etc/hostname.ww rename to overlays/wwinit/etc/hostname.ww diff --git a/overlays/system/default/etc/network/interfaces b/overlays/wwinit/etc/network/interfaces similarity index 100% rename from overlays/system/default/etc/network/interfaces rename to overlays/wwinit/etc/network/interfaces diff --git a/overlays/system/default/etc/network/interfaces.d/default.ww b/overlays/wwinit/etc/network/interfaces.d/default.ww similarity index 100% rename from overlays/system/default/etc/network/interfaces.d/default.ww rename to overlays/wwinit/etc/network/interfaces.d/default.ww diff --git a/overlays/system/default/etc/ssh/ssh_host_dsa_key.pub.ww b/overlays/wwinit/etc/ssh/ssh_host_dsa_key.pub.ww similarity index 100% rename from overlays/system/default/etc/ssh/ssh_host_dsa_key.pub.ww rename to overlays/wwinit/etc/ssh/ssh_host_dsa_key.pub.ww diff --git a/overlays/system/default/etc/ssh/ssh_host_dsa_key.ww b/overlays/wwinit/etc/ssh/ssh_host_dsa_key.ww similarity index 100% rename from overlays/system/default/etc/ssh/ssh_host_dsa_key.ww rename to overlays/wwinit/etc/ssh/ssh_host_dsa_key.ww diff --git a/overlays/system/default/etc/ssh/ssh_host_ecdsa_key.pub.ww b/overlays/wwinit/etc/ssh/ssh_host_ecdsa_key.pub.ww similarity index 100% rename from overlays/system/default/etc/ssh/ssh_host_ecdsa_key.pub.ww rename to overlays/wwinit/etc/ssh/ssh_host_ecdsa_key.pub.ww diff --git a/overlays/system/default/etc/ssh/ssh_host_ecdsa_key.ww b/overlays/wwinit/etc/ssh/ssh_host_ecdsa_key.ww similarity index 100% rename from overlays/system/default/etc/ssh/ssh_host_ecdsa_key.ww rename to overlays/wwinit/etc/ssh/ssh_host_ecdsa_key.ww diff --git a/overlays/system/default/etc/ssh/ssh_host_ed25519_key.pub.ww b/overlays/wwinit/etc/ssh/ssh_host_ed25519_key.pub.ww similarity index 100% rename from overlays/system/default/etc/ssh/ssh_host_ed25519_key.pub.ww rename to overlays/wwinit/etc/ssh/ssh_host_ed25519_key.pub.ww diff --git a/overlays/system/default/etc/ssh/ssh_host_ed25519_key.ww b/overlays/wwinit/etc/ssh/ssh_host_ed25519_key.ww similarity index 100% rename from overlays/system/default/etc/ssh/ssh_host_ed25519_key.ww rename to overlays/wwinit/etc/ssh/ssh_host_ed25519_key.ww diff --git a/overlays/system/default/etc/ssh/ssh_host_rsa_key.pub.ww b/overlays/wwinit/etc/ssh/ssh_host_rsa_key.pub.ww similarity index 100% rename from overlays/system/default/etc/ssh/ssh_host_rsa_key.pub.ww rename to overlays/wwinit/etc/ssh/ssh_host_rsa_key.pub.ww diff --git a/overlays/system/default/etc/ssh/ssh_host_rsa_key.ww b/overlays/wwinit/etc/ssh/ssh_host_rsa_key.ww similarity index 100% rename from overlays/system/default/etc/ssh/ssh_host_rsa_key.ww rename to overlays/wwinit/etc/ssh/ssh_host_rsa_key.ww diff --git a/overlays/system/default/etc/sysconfig/network-scripts/ifcfg-default.ww b/overlays/wwinit/etc/sysconfig/network-scripts/ifcfg-default.ww similarity index 100% rename from overlays/system/default/etc/sysconfig/network-scripts/ifcfg-default.ww rename to overlays/wwinit/etc/sysconfig/network-scripts/ifcfg-default.ww diff --git a/overlays/system/default/etc/sysconfig/network.ww b/overlays/wwinit/etc/sysconfig/network.ww similarity index 100% rename from overlays/system/default/etc/sysconfig/network.ww rename to overlays/wwinit/etc/sysconfig/network.ww diff --git a/overlays/system/default/etc/systemd/network/10-persistent-net.link.ww b/overlays/wwinit/etc/systemd/network/10-persistent-net.link.ww similarity index 100% rename from overlays/system/default/etc/systemd/network/10-persistent-net.link.ww rename to overlays/wwinit/etc/systemd/network/10-persistent-net.link.ww diff --git a/overlays/system/default/etc/warewulf/warewulf.conf.ww b/overlays/wwinit/etc/warewulf/warewulf.conf.ww similarity index 100% rename from overlays/system/default/etc/warewulf/warewulf.conf.ww rename to overlays/wwinit/etc/warewulf/warewulf.conf.ww diff --git a/overlays/system/default/etc/wicked/ifconfig/ifcfg-default.xml.ww b/overlays/wwinit/etc/wicked/ifconfig/ifcfg-default.xml.ww similarity index 100% rename from overlays/system/default/etc/wicked/ifconfig/ifcfg-default.xml.ww rename to overlays/wwinit/etc/wicked/ifconfig/ifcfg-default.xml.ww diff --git a/overlays/system/default/init b/overlays/wwinit/init similarity index 100% rename from overlays/system/default/init rename to overlays/wwinit/init diff --git a/overlays/system/default/warewulf/config.ww b/overlays/wwinit/warewulf/config.ww similarity index 100% rename from overlays/system/default/warewulf/config.ww rename to overlays/wwinit/warewulf/config.ww diff --git a/overlays/system/default/warewulf/init.d/20-loopback b/overlays/wwinit/warewulf/init.d/20-loopback similarity index 100% rename from overlays/system/default/warewulf/init.d/20-loopback rename to overlays/wwinit/warewulf/init.d/20-loopback diff --git a/overlays/system/default/warewulf/init.d/50-ipmi b/overlays/wwinit/warewulf/init.d/50-ipmi similarity index 100% rename from overlays/system/default/warewulf/init.d/50-ipmi rename to overlays/wwinit/warewulf/init.d/50-ipmi diff --git a/overlays/system/default/warewulf/init.d/75-vnfs_fixes b/overlays/wwinit/warewulf/init.d/75-vnfs_fixes similarity index 100% rename from overlays/system/default/warewulf/init.d/75-vnfs_fixes rename to overlays/wwinit/warewulf/init.d/75-vnfs_fixes diff --git a/overlays/system/default/warewulf/init.d/80-wwclient b/overlays/wwinit/warewulf/init.d/80-wwclient similarity index 100% rename from overlays/system/default/warewulf/init.d/80-wwclient rename to overlays/wwinit/warewulf/init.d/80-wwclient diff --git a/overlays/system/default/warewulf/init.d/90-selinux b/overlays/wwinit/warewulf/init.d/90-selinux similarity index 100% rename from overlays/system/default/warewulf/init.d/90-selinux rename to overlays/wwinit/warewulf/init.d/90-selinux diff --git a/overlays/system/default/warewulf/wwinit b/overlays/wwinit/warewulf/wwinit similarity index 100% rename from overlays/system/default/warewulf/wwinit rename to overlays/wwinit/warewulf/wwinit From 9f53bca1bf5750aea6c5996e01a269bae7d6501b Mon Sep 17 00:00:00 2001 From: Gregory Kurtzer Date: Wed, 29 Dec 2021 17:16:53 -0800 Subject: [PATCH 02/12] Various fixes found in testing --- Makefile | 12 ++++++---- internal/app/wwctl/node/set/main.go | 28 +++++++++++++++++++++- internal/app/wwctl/node/set/root.go | 2 ++ internal/app/wwctl/profile/set/main.go | 32 +++++++++++++++++++++++--- internal/app/wwctl/profile/set/root.go | 2 ++ internal/pkg/node/constructors.go | 5 ++-- internal/pkg/node/datastructure.go | 24 +++++++++---------- internal/pkg/node/modifiers.go | 2 ++ internal/pkg/overlay/overlay.go | 1 - 9 files changed, 84 insertions(+), 24 deletions(-) diff --git a/Makefile b/Makefile index c65e4c9b..910d20e9 100644 --- a/Makefile +++ b/Makefile @@ -94,11 +94,13 @@ files: all cp -r etc/dhcp $(DESTDIR)/etc/warewulf/ cp -r etc/ipxe $(DESTDIR)/etc/warewulf/ cp -r overlays $(DESTDIR)/var/warewulf/ - chmod +x $(DESTDIR)/var/warewulf/overlays/system/default/init - chmod 600 $(DESTDIR)/var/warewulf/overlays/system/default/etc/ssh/ssh* - chmod 644 $(DESTDIR)/var/warewulf/overlays/system/default/etc/ssh/ssh*.pub.ww - mkdir -p $(DESTDIR)/var/warewulf/overlays/system/default/warewulf/bin/ - cp wwctl $(DESTDIR)/usr/bin/ + mkdir -p $(DESTDIR)/var/warewulf/overlays/wwinit/bin/ + mkdir -p $(DESTDIR)/var/warewulf/overlays/wwinit/warewulf/bin/ + chmod +x $(DESTDIR)/var/warewulf/overlays/wwinit/init + chmod 600 $(DESTDIR)/var/warewulf/overlays/wwinit/etc/ssh/ssh* + chmod 644 $(DESTDIR)/var/warewulf/overlays/wwinit/etc/ssh/ssh*.pub.ww + mkdir -p $(DESTDIR)/var/warewulf/overlays/wwinit/warewulf/bin/ + install -m 0755 wwctl $(DESTDIR)/usr/bin/ mkdir -p $(DESTDIR)/usr/lib/firewalld/services install -c -m 0644 include/firewalld/warewulf.xml $(DESTDIR)/usr/lib/firewalld/services mkdir -p $(DESTDIR)/usr/lib/systemd/system diff --git a/internal/app/wwctl/node/set/main.go b/internal/app/wwctl/node/set/main.go index 48675bfe..427bda68 100644 --- a/internal/app/wwctl/node/set/main.go +++ b/internal/app/wwctl/node/set/main.go @@ -168,10 +168,15 @@ func CobraRunE(cmd *cobra.Command, args []string) error { if SetNetName != "" { if _, ok := n.NetDevs[SetNetName]; !ok { var nd node.NetDevEntry - n.NetDevs[SetNetName] = &nd SetNetOnBoot = "yes" + if len(n.NetDevs) == 0 { + SetNetDefault = "yes" + } + + n.NetDevs[SetNetName] = &nd + if SetNetDev == "" { n.NetDevs[SetNetName].Device.Set(SetNetName) } @@ -255,6 +260,27 @@ func CobraRunE(cmd *cobra.Command, args []string) error { } } + if SetNetDefault != "" { + if SetNetName == "" { + wwlog.Printf(wwlog.ERROR, "You must include the '--netname' option\n") + os.Exit(1) + } + + if SetNetDefault == "yes" || SetNetDefault == "y" || SetNetDefault == "1" || SetNetDefault == "true" { + + // Set all other devices to non-default + for _, n := range n.NetDevs { + n.Default.SetB(false) + } + + wwlog.Printf(wwlog.VERBOSE, "Node: %s:%s, Setting DEFAULT\n", n.Id.Get(), SetNetName) + n.NetDevs[SetNetName].Default.SetB(true) + } else { + wwlog.Printf(wwlog.VERBOSE, "Node: %s:%s, Unsetting DEFAULT\n", n.Id.Get(), SetNetName) + n.NetDevs[SetNetName].Default.SetB(false) + } + } + if SetNetDevDel { if SetNetName == "" { wwlog.Printf(wwlog.ERROR, "You must include the '--netname' option\n") diff --git a/internal/app/wwctl/node/set/root.go b/internal/app/wwctl/node/set/root.go index 7fe44943..6dbede5a 100644 --- a/internal/app/wwctl/node/set/root.go +++ b/internal/app/wwctl/node/set/root.go @@ -44,6 +44,7 @@ var ( SetHwaddr string SetType string SetNetOnBoot string + SetNetDefault string SetNetDevDel bool SetClusterName string SetIpxe string @@ -138,6 +139,7 @@ func init() { baseCmd.PersistentFlags().StringVarP(&SetHwaddr, "hwaddr", "H", "", "Set the node's network device HW address") baseCmd.PersistentFlags().StringVarP(&SetType, "type", "T", "", "Set the node's network device type") baseCmd.PersistentFlags().StringVar(&SetNetOnBoot, "onboot", "", "Enable/disable device (yes/no)") + baseCmd.PersistentFlags().StringVar(&SetNetDefault, "default", "", "Enable/disable device as default (yes/no)") baseCmd.PersistentFlags().BoolVar(&SetNetDevDel, "netdel", false, "Delete the node's network device") diff --git a/internal/app/wwctl/profile/set/main.go b/internal/app/wwctl/profile/set/main.go index ddc08f57..cb5a343e 100644 --- a/internal/app/wwctl/profile/set/main.go +++ b/internal/app/wwctl/profile/set/main.go @@ -138,10 +138,15 @@ func CobraRunE(cmd *cobra.Command, args []string) error { if SetNetName != "" { if _, ok := p.NetDevs[SetNetName]; !ok { var nd node.NetDevEntry - p.NetDevs[SetNetName] = &nd SetNetOnBoot = "yes" + if len(p.NetDevs) == 0 { + SetNetDefault = "yes" + } + + p.NetDevs[SetNetName] = &nd + if SetNetDev == "" { p.NetDevs[SetNetName].Device.Set(SetNetName) } @@ -215,14 +220,35 @@ func CobraRunE(cmd *cobra.Command, args []string) error { } if SetNetOnBoot == "yes" || SetNetOnBoot == "y" || SetNetOnBoot == "1" || SetNetOnBoot == "true" { - wwlog.Printf(wwlog.VERBOSE, "Node: %s:%s, Setting ONBOOT\n", p.Id.Get(), SetNetName) + wwlog.Printf(wwlog.VERBOSE, "Profile: %s:%s, Setting ONBOOT\n", p.Id.Get(), SetNetName) p.NetDevs[SetNetName].OnBoot.SetB(true) } else { - wwlog.Printf(wwlog.VERBOSE, "Node: %s:%s, Unsetting ONBOOT\n", p.Id.Get(), SetNetName) + wwlog.Printf(wwlog.VERBOSE, "Profile: %s:%s, Unsetting ONBOOT\n", p.Id.Get(), SetNetName) p.NetDevs[SetNetName].OnBoot.SetB(false) } } + if SetNetDefault != "" { + if SetNetName == "" { + wwlog.Printf(wwlog.ERROR, "You must include the '--netname' option\n") + os.Exit(1) + } + + if SetNetDefault == "yes" || SetNetDefault == "y" || SetNetDefault == "1" || SetNetDefault == "true" { + + // Set all other devices to non-default + for _, n := range p.NetDevs { + n.Default.SetB(false) + } + + wwlog.Printf(wwlog.VERBOSE, "Profile: %s:%s, Setting DEFAULT\n", p.Id.Get(), SetNetName) + p.NetDevs[SetNetName].Default.SetB(true) + } else { + wwlog.Printf(wwlog.VERBOSE, "Profile: %s:%s, Unsetting DEFAULT\n", p.Id.Get(), SetNetName) + p.NetDevs[SetNetName].Default.SetB(false) + } + } + if SetNetDevDel { if SetNetDev == "" { wwlog.Printf(wwlog.ERROR, "You must include the '--netname' option\n") diff --git a/internal/app/wwctl/profile/set/root.go b/internal/app/wwctl/profile/set/root.go index 7fd5d64c..d1b25256 100644 --- a/internal/app/wwctl/profile/set/root.go +++ b/internal/app/wwctl/profile/set/root.go @@ -58,6 +58,7 @@ var ( SetHwaddr string SetType string SetNetOnBoot string + SetNetDefault string SetNetDevDel bool SetDiscoverable bool SetUndiscoverable bool @@ -121,6 +122,7 @@ func init() { baseCmd.PersistentFlags().StringVarP(&SetHwaddr, "hwaddr", "H", "", "Set the node's network device HW address") baseCmd.PersistentFlags().StringVarP(&SetType, "type", "T", "", "Set the node's network device type") baseCmd.PersistentFlags().StringVar(&SetNetOnBoot, "onboot", "", "Enable/disable device (yes/no)") + baseCmd.PersistentFlags().StringVar(&SetNetDefault, "default", "", "Enable/disable device as default (yes/no)") baseCmd.PersistentFlags().BoolVar(&SetNetDevDel, "netdel", false, "Delete the node's network device") diff --git a/internal/pkg/node/constructors.go b/internal/pkg/node/constructors.go index d6323f99..baeaa65d 100644 --- a/internal/pkg/node/constructors.go +++ b/internal/pkg/node/constructors.go @@ -87,7 +87,6 @@ func (config *nodeYaml) FindAllNodes() ([]NodeInfo, error) { n.NetDevs[devname] = &netdev } - n.NetDevs[devname].Name.Set(devname) n.NetDevs[devname].Device.Set(netdev.Device) n.NetDevs[devname].Ipaddr.Set(netdev.Ipaddr) n.NetDevs[devname].Netmask.Set(netdev.Netmask) @@ -95,6 +94,7 @@ func (config *nodeYaml) FindAllNodes() ([]NodeInfo, error) { n.NetDevs[devname].Gateway.Set(netdev.Gateway) n.NetDevs[devname].Type.Set(netdev.Type) n.NetDevs[devname].OnBoot.SetB(netdev.OnBoot) + n.NetDevs[devname].Default.SetB(netdev.Default) } for keyname, key := range node.Keys { @@ -148,6 +148,7 @@ func (config *nodeYaml) FindAllNodes() ([]NodeInfo, error) { n.NetDevs[devname].Gateway.SetAlt(netdev.Gateway, p) n.NetDevs[devname].Type.SetAlt(netdev.Type, p) n.NetDevs[devname].OnBoot.SetAltB(netdev.OnBoot, p) + n.NetDevs[devname].Default.SetAltB(netdev.Default, p) } for keyname, key := range config.NodeProfiles[p].Keys { @@ -213,7 +214,6 @@ func (config *nodeYaml) FindAllProfiles() ([]NodeInfo, error) { wwlog.Printf(wwlog.DEBUG, "Updating profile netdev: %s\n", devname) - p.NetDevs[devname].Name.Set(devname) p.NetDevs[devname].Device.Set(netdev.Device) p.NetDevs[devname].Ipaddr.Set(netdev.Ipaddr) p.NetDevs[devname].Netmask.Set(netdev.Netmask) @@ -221,6 +221,7 @@ func (config *nodeYaml) FindAllProfiles() ([]NodeInfo, error) { p.NetDevs[devname].Gateway.Set(netdev.Gateway) p.NetDevs[devname].Type.Set(netdev.Type) p.NetDevs[devname].OnBoot.SetB(netdev.OnBoot) + p.NetDevs[devname].Default.SetB(netdev.Default) } for keyname, key := range profile.Keys { diff --git a/internal/pkg/node/datastructure.go b/internal/pkg/node/datastructure.go index 94df277c..1d85a5fa 100644 --- a/internal/pkg/node/datastructure.go +++ b/internal/pkg/node/datastructure.go @@ -39,16 +39,16 @@ type NodeConf struct { } type NetDevs struct { - Name string - Type string `yaml:"type,omitempty"` - OnBoot bool `yaml:"onboot"` - Device string `yaml:"device"` + Type string + OnBoot bool + Device string Hwaddr string Ipaddr string - IpCIDR string - Prefix string + IpCIDR string `yaml:"ipcidr,omitempty"` + Prefix string `yaml:"prefix,omitempty"` Netmask string - Gateway string `yaml:"gateway,omitempty"` + Gateway string `yaml:"gateway"` + Default bool } /****** @@ -92,16 +92,16 @@ type NodeInfo struct { } type NetDevEntry struct { - Name Entry - Type Entry `yaml:"type,omitempty"` - OnBoot Entry `yaml:"onboot"` - Device Entry `yaml:"device"` + Type Entry + OnBoot Entry + Device Entry Hwaddr Entry Ipaddr Entry IpCIDR Entry Prefix Entry Netmask Entry - Gateway Entry `yaml:"gateway,omitempty"` + Gateway Entry + Default Entry } func init() { diff --git a/internal/pkg/node/modifiers.go b/internal/pkg/node/modifiers.go index ea238d49..767178eb 100644 --- a/internal/pkg/node/modifiers.go +++ b/internal/pkg/node/modifiers.go @@ -91,6 +91,7 @@ func (config *nodeYaml) NodeUpdate(node NodeInfo) error { config.Nodes[nodeID].NetDevs[devname].Gateway = netdev.Gateway.GetReal() config.Nodes[nodeID].NetDevs[devname].Type = netdev.Type.GetReal() config.Nodes[nodeID].NetDevs[devname].OnBoot = netdev.OnBoot.GetRealB() + config.Nodes[nodeID].NetDevs[devname].Default = netdev.Default.GetRealB() } for keyname, key := range node.Keys { @@ -177,6 +178,7 @@ func (config *nodeYaml) ProfileUpdate(profile NodeInfo) error { config.NodeProfiles[profileID].NetDevs[devname].Gateway = netdev.Gateway.GetReal() config.NodeProfiles[profileID].NetDevs[devname].Type = netdev.Type.GetReal() config.NodeProfiles[profileID].NetDevs[devname].OnBoot = netdev.OnBoot.GetRealB() + config.NodeProfiles[profileID].NetDevs[devname].Default = netdev.Default.GetRealB() } for keyname, key := range profile.Keys { diff --git a/internal/pkg/overlay/overlay.go b/internal/pkg/overlay/overlay.go index e4a4c469..0d36dd90 100644 --- a/internal/pkg/overlay/overlay.go +++ b/internal/pkg/overlay/overlay.go @@ -187,7 +187,6 @@ func BuildOverlay(nodeInfo node.NodeInfo, overlayName string) error { for devname, netdev := range nodeInfo.NetDevs { var nd node.NetDevs tstruct.NetDevs[devname] = &nd - tstruct.NetDevs[devname].Name = devname tstruct.NetDevs[devname].Device = netdev.Device.Get() tstruct.NetDevs[devname].Hwaddr = netdev.Hwaddr.Get() tstruct.NetDevs[devname].Ipaddr = netdev.Ipaddr.Get() From dff5567b11580df3f700f96c46970398f3bf1637 Mon Sep 17 00:00:00 2001 From: Gregory Kurtzer Date: Wed, 29 Dec 2021 17:30:01 -0800 Subject: [PATCH 03/12] More updates/fixes from testing --- internal/pkg/overlay/overlay.go | 3 ++- overlays/generic/etc/hosts.ww | 15 +-------------- .../etc/systemd/network/10-persistent-net.link.ww | 4 +--- 3 files changed, 4 insertions(+), 18 deletions(-) diff --git a/internal/pkg/overlay/overlay.go b/internal/pkg/overlay/overlay.go index 0d36dd90..d882556a 100644 --- a/internal/pkg/overlay/overlay.go +++ b/internal/pkg/overlay/overlay.go @@ -74,7 +74,7 @@ func BuildAllOverlays(nodes []node.NodeInfo) error { for _, n := range nodes { var overlays []string - overlays = append(overlays, "wwinit") + overlays = append(overlays, n.SystemOverlay.Get()) overlays = append(overlays, n.RuntimeOverlay.Get()) for _, overlay := range overlays { @@ -194,6 +194,7 @@ func BuildOverlay(nodeInfo node.NodeInfo, overlayName string) error { tstruct.NetDevs[devname].Gateway = netdev.Gateway.Get() tstruct.NetDevs[devname].Type = netdev.Type.Get() tstruct.NetDevs[devname].OnBoot = netdev.OnBoot.GetB() + tstruct.NetDevs[devname].Default = netdev.Default.GetB() mask := net.IPMask(net.ParseIP(netdev.Netmask.Get()).To4()) ipaddr := net.ParseIP(netdev.Ipaddr.Get()).To4() diff --git a/overlays/generic/etc/hosts.ww b/overlays/generic/etc/hosts.ww index b4641eae..395adfcb 100644 --- a/overlays/generic/etc/hosts.ww +++ b/overlays/generic/etc/hosts.ww @@ -1,14 +1 @@ -127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 -::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 - - -{{range $node := $.AllNodes}} -# Entry for {{$node.Id.Get}} -{{- range $devname, $netdev := $node.NetDevs}} -{{- if eq $netdev.Name.Get "default"}} -{{$netdev.Ipaddr.Get}} {{$node.Id.Get}} -{{- else}} -{{$netdev.Ipaddr.Get}} {{$node.Id.Get}}-{{$devname}} -{{- end}} -{{- end}} -{{end}} +{{Include "/etc/hosts"}} \ No newline at end of file diff --git a/overlays/wwinit/etc/systemd/network/10-persistent-net.link.ww b/overlays/wwinit/etc/systemd/network/10-persistent-net.link.ww index 7dafb682..d335d0bc 100644 --- a/overlays/wwinit/etc/systemd/network/10-persistent-net.link.ww +++ b/overlays/wwinit/etc/systemd/network/10-persistent-net.link.ww @@ -1,11 +1,9 @@ # /etc/systemd/network/10-persistent-net.link - {{range $devname, $netdev := .NetDevs}} -{{- if eq $netdev.Name "default"}} +{{- if $netdev.Default}} [Match] MACAddress={{$netdev.Hwaddr}} [Link] Name={{$devname}} {{- end}} {{end}} - From 50814b785e2c09f557cd3b4a726349f5f3f64c51 Mon Sep 17 00:00:00 2001 From: Gregory Kurtzer Date: Wed, 29 Dec 2021 17:47:06 -0800 Subject: [PATCH 04/12] Minor update of overlay build output wording --- internal/pkg/overlay/overlay.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/internal/pkg/overlay/overlay.go b/internal/pkg/overlay/overlay.go index d882556a..6aae411e 100644 --- a/internal/pkg/overlay/overlay.go +++ b/internal/pkg/overlay/overlay.go @@ -77,8 +77,9 @@ func BuildAllOverlays(nodes []node.NodeInfo) error { overlays = append(overlays, n.SystemOverlay.Get()) overlays = append(overlays, n.RuntimeOverlay.Get()) + wwlog.Printf(wwlog.INFO, "Building overlays for %s: [%s]\n", n.Id.Get(), strings.Join(overlays, ", ")) + for _, overlay := range overlays { - wwlog.Printf(wwlog.INFO, "Building overlay for %s: %s\n", n.Id.Get(), overlay) err := BuildOverlay(n, overlay) if err != nil { return errors.Wrap(err, "could not build overlay "+n.Id.Get()+"/"+overlay+".img") From f0fa6385ebceadc554ff25306ed102b9101c8820 Mon Sep 17 00:00:00 2001 From: Gregory Kurtzer Date: Wed, 29 Dec 2021 17:50:49 -0800 Subject: [PATCH 05/12] Add "DEFAULT" to the node and profile list output --- internal/app/wwctl/node/list/main.go | 1 + internal/app/wwctl/profile/list/main.go | 2 ++ 2 files changed, 3 insertions(+) diff --git a/internal/app/wwctl/node/list/main.go b/internal/app/wwctl/node/list/main.go index 02af04c6..6c7530e6 100644 --- a/internal/app/wwctl/node/list/main.go +++ b/internal/app/wwctl/node/list/main.go @@ -63,6 +63,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), name+":GATEWAY", netdev.Gateway.Source(), netdev.Gateway.Print()) fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), name+":TYPE", netdev.Type.Source(), netdev.Type.Print()) fmt.Printf("%-20s %-18s %-12s %t\n", node.Id.Get(), name+":ONBOOT", netdev.OnBoot.Source(), netdev.OnBoot.PrintB()) + fmt.Printf("%-20s %-18s %-12s %t\n", node.Id.Get(), name+":DEFAULT", netdev.Default.Source(), netdev.Default.PrintB()) } for keyname, key := range node.Keys { diff --git a/internal/app/wwctl/profile/list/main.go b/internal/app/wwctl/profile/list/main.go index 3f8764f8..6831521f 100644 --- a/internal/app/wwctl/profile/list/main.go +++ b/internal/app/wwctl/profile/list/main.go @@ -53,6 +53,8 @@ func CobraRunE(cmd *cobra.Command, args []string) error { fmt.Printf("%-20s %-18s %s\n", profile.Id.Get(), name+":GATEWAY", netdev.Gateway.Print()) fmt.Printf("%-20s %-18s %s\n", profile.Id.Get(), name+":HWADDR", netdev.Hwaddr.Print()) fmt.Printf("%-20s %-18s %s\n", profile.Id.Get(), name+":TYPE", netdev.Hwaddr.Print()) + fmt.Printf("%-20s %-18s %t\n", profile.Id.Get(), name+":ONBOOT", netdev.OnBoot.PrintB()) + fmt.Printf("%-20s %-18s %t\n", profile.Id.Get(), name+":DEFAULT", netdev.Default.PrintB()) } for keyname, key := range profile.Keys { From 2f6a9251cdc18e5f9ac850a603e48926cb6c0ba2 Mon Sep 17 00:00:00 2001 From: Gregory Kurtzer Date: Thu, 30 Dec 2021 03:35:54 +0000 Subject: [PATCH 06/12] Optimized FilterByName() to weed out redundant queries --- internal/pkg/node/methods.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/internal/pkg/node/methods.go b/internal/pkg/node/methods.go index bc5de819..50160b29 100644 --- a/internal/pkg/node/methods.go +++ b/internal/pkg/node/methods.go @@ -10,16 +10,20 @@ import "regexp" func FilterByName(set []NodeInfo, searchList []string) []NodeInfo { var ret []NodeInfo + unique := make(map[string]NodeInfo) if len(searchList) > 0 { for _, search := range searchList { for _, entry := range set { b, _ := regexp.MatchString("^"+search+"$", entry.Id.Get()) if b { - ret = append(ret, entry) + unique[entry.Id.Get()] = entry } } } + for _, n := range unique { + ret = append(ret, n) + } } else { ret = set } From 82b276f8586622e9f2ef06a3323636b8c8e7d863 Mon Sep 17 00:00:00 2001 From: Gregory Kurtzer Date: Thu, 30 Dec 2021 03:44:48 +0000 Subject: [PATCH 07/12] Implement fix for #222 (thanks Griznog!) --- etc/ipxe/default.ipxe | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/etc/ipxe/default.ipxe b/etc/ipxe/default.ipxe index 543797f8..7b419cb3 100644 --- a/etc/ipxe/default.ipxe +++ b/etc/ipxe/default.ipxe @@ -12,9 +12,9 @@ echo set base http://{{.Ipaddr}}:{{.Port}} kernel --name kernel ${base}/kernel/{{.Hwaddr}} || goto reboot -initrd --name container ${base}/container/{{.Hwaddr}} || goto reboot -initrd --name kmods ${base}/kmods/{{.Hwaddr}} || goto reboot -initrd --name system ${base}/overlay-system/{{.Hwaddr}} || goto reboot +imgextract --name container ${base}/container/{{.Hwaddr}} || goto reboot +imgextract --name kmods ${base}/kmods/{{.Hwaddr}} || goto reboot +imgextract --name system ${base}/overlay-system/{{.Hwaddr}} || goto reboot boot kernel initrd=container initrd=kmods initrd=system {{.KernelArgs}} || goto reboot From a0ffc12c9a496e2c300a3583ed399479c7290d01 Mon Sep 17 00:00:00 2001 From: Gregory Kurtzer Date: Thu, 30 Dec 2021 17:22:56 +0000 Subject: [PATCH 08/12] Put `imgextract` into a different PXE file until it is tested on ARM To use this iPXE template do the following: ``` wwctl profile set --ipxe big_image default ``` --- etc/ipxe/big_image.ipxe | 26 ++++++++++++++++++++++++++ etc/ipxe/default.ipxe | 6 +++--- 2 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 etc/ipxe/big_image.ipxe diff --git a/etc/ipxe/big_image.ipxe b/etc/ipxe/big_image.ipxe new file mode 100644 index 00000000..a3f9bda0 --- /dev/null +++ b/etc/ipxe/big_image.ipxe @@ -0,0 +1,26 @@ +#!ipxe + +echo +echo ================================================================================ +echo Warewulf v4 now booting: {{.Fqdn}} +echo +echo Container: {{.ContainerName}} +echo Kernel: {{.KernelVersion}} +echo KernelArgs: {{.KernelArgs}} +echo + +set base http://{{.Ipaddr}}:{{.Port}} + +kernel --name kernel ${base}/kernel/{{.Hwaddr}} || goto reboot +imgextract --name container ${base}/container/{{.Hwaddr}} || goto reboot +imgextract --name kmods ${base}/kmods/{{.Hwaddr}} || goto reboot +imgextract --name system ${base}/overlay-system/{{.Hwaddr}} || goto reboot + +boot kernel initrd=container initrd=kmods initrd=system {{.KernelArgs}} || goto reboot + +:reboot +echo +echo There was an error, rebooting in 15s... +echo +sleep 15 +reboot diff --git a/etc/ipxe/default.ipxe b/etc/ipxe/default.ipxe index 7b419cb3..543797f8 100644 --- a/etc/ipxe/default.ipxe +++ b/etc/ipxe/default.ipxe @@ -12,9 +12,9 @@ echo set base http://{{.Ipaddr}}:{{.Port}} kernel --name kernel ${base}/kernel/{{.Hwaddr}} || goto reboot -imgextract --name container ${base}/container/{{.Hwaddr}} || goto reboot -imgextract --name kmods ${base}/kmods/{{.Hwaddr}} || goto reboot -imgextract --name system ${base}/overlay-system/{{.Hwaddr}} || goto reboot +initrd --name container ${base}/container/{{.Hwaddr}} || goto reboot +initrd --name kmods ${base}/kmods/{{.Hwaddr}} || goto reboot +initrd --name system ${base}/overlay-system/{{.Hwaddr}} || goto reboot boot kernel initrd=container initrd=kmods initrd=system {{.KernelArgs}} || goto reboot From e5edd87b43cdfa8065162e15109b27aa06601bbf Mon Sep 17 00:00:00 2001 From: Gregory Kurtzer Date: Fri, 31 Dec 2021 01:09:37 +0000 Subject: [PATCH 09/12] Fix default permission of config file so users can use it. --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 6afe24fd..2e87364b 100644 --- a/Makefile +++ b/Makefile @@ -93,7 +93,7 @@ files: all install -d -m 0755 $(DESTDIR)/usr/share/man/man1 test -f $(DESTDIR)/etc/warewulf/warewulf.conf || install -m 644 etc/warewulf.conf $(DESTDIR)/etc/warewulf/ test -f $(DESTDIR)/etc/warewulf/hosts.tmpl || install -m 644 etc/hosts.tmpl $(DESTDIR)/etc/warewulf/ - test -f $(DESTDIR)/etc/warewulf/nodes.conf || install -m 640 etc/nodes.conf $(DESTDIR)/etc/warewulf/ + test -f $(DESTDIR)/etc/warewulf/nodes.conf || install -m 644 etc/nodes.conf $(DESTDIR)/etc/warewulf/ cp -r etc/dhcp $(DESTDIR)/etc/warewulf/ cp -r etc/ipxe $(DESTDIR)/etc/warewulf/ cp -r overlays $(DESTDIR)/var/warewulf/ From d406231c10e46de5faa32c08a9c7003d76227a43 Mon Sep 17 00:00:00 2001 From: Gregory Kurtzer Date: Fri, 31 Dec 2021 01:18:35 +0000 Subject: [PATCH 10/12] Clean vendor directory on `make clean` --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index 2e87364b..fbda9cdd 100644 --- a/Makefile +++ b/Makefile @@ -166,6 +166,7 @@ clean: rm -rf bash_completion.d rm -f man_page rm -rf man_pages + rm -rf vendor install: files install_wwclient From b971ff263653bc7c2a03ca46997a298a33b7c94e Mon Sep 17 00:00:00 2001 From: Gregory Kurtzer Date: Tue, 4 Jan 2022 02:15:21 +0000 Subject: [PATCH 11/12] Backwards compatibility fix for network config --- internal/pkg/node/constructors.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/internal/pkg/node/constructors.go b/internal/pkg/node/constructors.go index 8f2d6e7b..e2c12bd5 100644 --- a/internal/pkg/node/constructors.go +++ b/internal/pkg/node/constructors.go @@ -88,7 +88,11 @@ func (config *nodeYaml) FindAllNodes() ([]NodeInfo, error) { } n.NetDevs[devname].Name.Set(devname) - n.NetDevs[devname].Device.Set(netdev.Device) + if netdev.Device != "" { + n.NetDevs[devname].Device.Set(netdev.Device) + } else { + n.NetDevs[devname].Device.Set(devname) + } n.NetDevs[devname].Ipaddr.Set(netdev.Ipaddr) n.NetDevs[devname].Netmask.Set(netdev.Netmask) n.NetDevs[devname].Hwaddr.Set(netdev.Hwaddr) From 5602fb0177a52f6bc51dd3a947b53fb4d0052bc9 Mon Sep 17 00:00:00 2001 From: Gregory Kurtzer Date: Tue, 4 Jan 2022 02:20:06 +0000 Subject: [PATCH 12/12] Minor fixup for not setting onboot to be true via Cobra This is already done more robustly within the code --- internal/app/wwctl/node/set/root.go | 2 +- internal/app/wwctl/profile/set/root.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/app/wwctl/node/set/root.go b/internal/app/wwctl/node/set/root.go index f8885462..c763b84f 100644 --- a/internal/app/wwctl/node/set/root.go +++ b/internal/app/wwctl/node/set/root.go @@ -136,7 +136,7 @@ func init() { baseCmd.PersistentFlags().StringVarP(&SetGateway, "gateway", "G", "", "Set the node's network device gateway") baseCmd.PersistentFlags().StringVarP(&SetHwaddr, "hwaddr", "H", "", "Set the node's network device HW address") baseCmd.PersistentFlags().StringVarP(&SetType, "type", "T", "", "Set the node's network device type") - baseCmd.PersistentFlags().StringVar(&SetNetOnBoot, "onboot", "yes", "Enable/disable device (yes/no)") + baseCmd.PersistentFlags().StringVar(&SetNetOnBoot, "onboot", "", "Enable/disable device (yes/no)") baseCmd.PersistentFlags().BoolVar(&SetNetDevDel, "netdel", false, "Delete the node's network device") diff --git a/internal/app/wwctl/profile/set/root.go b/internal/app/wwctl/profile/set/root.go index 270f01a1..88ae5293 100644 --- a/internal/app/wwctl/profile/set/root.go +++ b/internal/app/wwctl/profile/set/root.go @@ -119,7 +119,7 @@ func init() { baseCmd.PersistentFlags().StringVarP(&SetGateway, "gateway", "G", "", "Set the node's network device gateway") baseCmd.PersistentFlags().StringVarP(&SetHwaddr, "hwaddr", "H", "", "Set the node's network device HW address") baseCmd.PersistentFlags().StringVarP(&SetType, "type", "T", "", "Set the node's network device type") - baseCmd.PersistentFlags().StringVar(&SetNetOnBoot, "onboot", "yes", "Enable/disable device (yes/no)") + baseCmd.PersistentFlags().StringVar(&SetNetOnBoot, "onboot", "", "Enable/disable device (yes/no)") baseCmd.PersistentFlags().BoolVar(&SetNetDevDel, "netdel", false, "Delete the node's network device")