From 8e626e9a62af21bc37e5ab24b1e76bc984aab4eb Mon Sep 17 00:00:00 2001 From: jcsiadal Date: Tue, 14 Dec 2021 04:37:39 +0000 Subject: [PATCH] Add config option for shared state dir Signed-off-by: jcsiadal Changes default share to /srv/warewulf Update specfile Some changes to match Golang standards --- Makefile | 70 +++++++++++++++------- cmd/config_defaults/config_defaults.go | 26 ++++++++ etc/{warewulf.conf => warewulf.conf.in} | 5 +- internal/app/wwctl/configure/nfs/main.go | 2 + internal/app/wwctl/node/ready/main.go | 10 ++-- internal/app/wwctl/overlay/list/main.go | 24 ++++++++ internal/pkg/container/imprt.go | 4 +- internal/pkg/container/util.go | 6 +- internal/pkg/kernel/kernel.go | 6 +- internal/pkg/oci/cache.go | 6 -- internal/pkg/oci/defaults.go | 11 ++++ internal/pkg/{config => overlay}/config.go | 14 ++--- internal/pkg/overlay/overlay.go | 1 - internal/pkg/warewulfconf/constructors.go | 29 +++++---- internal/pkg/warewulfconf/datastructure.go | 31 ++++++---- internal/pkg/warewulfconf/defaults.go | 47 +++++++++++++++ internal/pkg/warewulfconf/modifiers.go | 3 +- warewulf.spec.in | 14 +++-- 18 files changed, 229 insertions(+), 80 deletions(-) create mode 100644 cmd/config_defaults/config_defaults.go rename etc/{warewulf.conf => warewulf.conf.in} (87%) create mode 100644 internal/pkg/oci/defaults.go rename internal/pkg/{config => overlay}/config.go (85%) create mode 100644 internal/pkg/warewulfconf/defaults.go diff --git a/Makefile b/Makefile index dc9e508d..941c98a7 100644 --- a/Makefile +++ b/Makefile @@ -10,6 +10,13 @@ ifeq ($(VERSION_FULL),) VERSION_FULL := $(VERSION) endif +WWROOT ?= /var/lib +# warewulf subdir automatcally added to TFTPROOT +TFTPROOT ?= /var/lib/tftpboot +# SUSE: TFTPROOT ?= /srv/tftpboot +# Ubuntu: TFTPROOT ?= /srv/tftp +FIREWALLDIR ?= /usr/lib/firewalld/services +OVERLAYDIR ?= $(WWROOT)/warewulf/overlays # auto installed tooling TOOLS_DIR := .tools @@ -29,8 +36,7 @@ export GOPROXY # built tags needed for wwbuild binary WW_BUILD_GO_BUILD_TAGS := containers_image_openpgp containers_image_ostree -# all build targets -all: vendor wwctl wwclient bash_completion.d man_pages +all: config vendor wwctl wwclient bash_completion.d man_pages build: lint test-it vet all @@ -46,7 +52,7 @@ $(GOLANGCI_LINT): @curl -qq -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(TOOLS_BIN) $(GOLANGCI_LINT_VERSION) -setup: vendor $(TOOLS_DIR) setup_tools +setup: vendor $(TOOLS_DIR) setup_tools config # vendor vendor: @@ -56,8 +62,13 @@ vendor: $(TOOLS_DIR): @mkdir -p $@ +# Pre-build steps for source, such as "go generate" +config: + sed -e 's,@WWROOT@,$(WWROOT),g; s,@VERSION@,$(VERSION),g; s,@RELEASE@,$(RELEASE),g' warewulf.spec.in > warewulf.spec + sed -e 's,@WWROOT@,$(WWROOT),g; s,@TFTPROOT@,$(TFTPROOT),g' etc/warewulf.conf.in > etc/warewulf.conf + # Lint -lint: setup_tools +lint: setup_tools config @echo Running golangci-lint... @$(GOLANGCI_LINT) run --build-tags "$(WW_BUILD_GO_BUILD_TAGS)" --skip-dirs internal/pkg/staticfiles ./... @@ -81,11 +92,12 @@ debian: all files: all install -d -m 0755 $(DESTDIR)/usr/bin/ - install -d -m 0755 $(DESTDIR)/var/warewulf/ - install -d -m 0755 $(DESTDIR)/var/warewulf/chroots + install -d -m 0755 $(DESTDIR)$(WWROOT)/warewulf/ + install -d -m 0755 $(DESTDIR)$(WWROOT)/warewulf/chroots + install -d -m 0755 $(DESTDIR)$(WWROOT)/warewulf/provision install -d -m 0755 $(DESTDIR)/etc/warewulf/ install -d -m 0755 $(DESTDIR)/etc/warewulf/ipxe - install -d -m 0755 $(DESTDIR)/var/lib/tftpboot/warewulf/ipxe/ + install -d -m 0755 $(DESTDIR)$(TFTPROOT)/warewulf/ipxe/ install -d -m 0755 $(DESTDIR)/etc/bash_completion.d/ 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/ @@ -94,15 +106,25 @@ files: all cp -r etc/dhcp $(DESTDIR)/etc/warewulf/ cp -r etc/ipxe $(DESTDIR)/etc/warewulf/ cp -r overlays $(DESTDIR)/var/warewulf/ - 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/ + mkdir -p $(DESTDIR)$(OVERLAYIR)/wwinit/bin/ + mkdir -p $(DESTDIR)$(OVERLAYIR)/wwinit/warewulf/bin/ + chmod +x $(DESTDIR)$(OVERLAYIR)/wwinit/init + chmod 600 $(DESTDIR)$(OVERLAYIR)/wwinit/etc/ssh/ssh* + chmod 644 $(DESTDIR)$(OVERLAYIR)/wwinit/etc/ssh/ssh*.pub.ww + mkdir -p $(DESTDIR)$(OVERLAYIR)/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 + cp -r overlays $(DESTDIR)$(WWROOT)/warewulf/ + mkdir -p $(DESTDIR)$(OVERLAYIR)/wwinit/bin/ + mkdir -p $(DESTDIR)$(OVERLAYIR)/wwinit/warewulf/bin/ + chmod +x $(DESTDIR)$(OVERLAYIR)/wwinit/init + chmod 600 $(DESTDIR)$(OVERLAYIR)/wwinit/etc/ssh/ssh* + chmod 644 $(DESTDIR)$(OVERLAYIR)/wwinit/etc/ssh/ssh*.pub.ww + mkdir -p $(DESTDIR)$(OVERLAYIR)/wwinit/warewulf/bin/ + install -m 0755 wwctl $(DESTDIR)/usr/bin/ + mkdir -p $(DESTDIR)$(FIREWALLDIR) + install -c -m 0644 include/firewalld/warewulf.xml $(DESTDIR)$(FIREWALLDIR) mkdir -p $(DESTDIR)/usr/lib/systemd/system install -c -m 0644 include/systemd/warewulfd.service $(DESTDIR)/usr/lib/systemd/system cp bash_completion.d/warewulf $(DESTDIR)/etc/bash_completion.d/ @@ -110,15 +132,15 @@ files: all init: systemctl daemon-reload - cp -r tftpboot/* /var/lib/tftpboot/warewulf/ipxe/ - restorecon -r /var/lib/tftpboot/warewulf + cp -r tftpboot/* $(TFTPROOT)/warewulf/ipxe/ + restorecon -r $(TFTPROOT)/warewulf debfiles: debian - chmod +x $(DESTDIR)/var/warewulf/overlays/system/debian/init - chmod 600 $(DESTDIR)/var/warewulf/overlays/system/debian/etc/ssh/ssh* - chmod 644 $(DESTDIR)/var/warewulf/overlays/system/debian/etc/ssh/ssh*.pub.ww - mkdir -p $(DESTDIR)/var/warewulf/overlays/system/debian/warewulf/bin/ - cp wwclient $(DESTDIR)/var/warewulf/overlays/system/debian/warewulf/bin/ + chmod +x $(DESTDIR)$(WWROOT)/warewulf/overlays/system/debian/init + chmod 600 $(DESTDIR)$(WWROOT)/warewulf/overlays/system/debian/etc/ssh/ssh* + chmod 644 $(DESTDIR)$(WWROOT)/warewulf/overlays/system/debian/etc/ssh/ssh*.pub.ww + mkdir -p $(DESTDIR)$(WWROOT)/warewulf/overlays/system/debian/warewulf/bin/ + cp wwclient $(DESTDIR)$(WWROOT)/warewulf/overlays/system/debian/warewulf/bin/ wwctl: cd cmd/wwctl; GOOS=linux go build -ldflags="-X 'github.com/hpcng/warewulf/internal/pkg/version.Version=$(VERSION_FULL)'" -mod vendor -tags "$(WW_BUILD_GO_BUILD_TAGS)" -o ../../wwctl @@ -148,12 +170,17 @@ man_pages: man_page ./man_page ./man_pages cd man_pages; for i in wwctl*1; do echo "Compressing manpage: $$i"; gzip --force $$i; done +config_defaults: + cd cmd/config_defaults && go build -ldflags="-X 'github.com/hpcng/warewulf/internal/pkg/warewulfconf.ConfigFile=$(CONFIG)/etc/warewulf.conf'\ + -X 'github.com/hpcng/warewulf/internal/pkg/node.ConfigFile=$(CONFIG)/etc/nodes.conf'"\ + -mod vendor -tags "$(WW_BUILD_GO_BUILD_TAGS)" -o ../../config_defaults + dist: vendor rm -rf _dist/warewulf-$(VERSION) mkdir -p _dist/warewulf-$(VERSION) git archive --format=tar $(SRC) | tar -xf - -C _dist/warewulf-$(VERSION) cp -r vendor _dist/warewulf-$(VERSION)/ - sed -e 's/@VERSION@/$(VERSION)/g; s/@RELEASE@/$(RELEASE)/g' warewulf.spec.in > _dist/warewulf-$(VERSION)/warewulf.spec + cp warewulf.spec _dist/warewulf-$(VERSION)/ cd _dist; tar -czf ../warewulf-$(VERSION).tar.gz warewulf-$(VERSION) clean: @@ -166,6 +193,7 @@ clean: rm -f man_page rm -rf man_pages rm -rf vendor + rm -f config_defaults install: files install_wwclient diff --git a/cmd/config_defaults/config_defaults.go b/cmd/config_defaults/config_defaults.go new file mode 100644 index 00000000..70068c90 --- /dev/null +++ b/cmd/config_defaults/config_defaults.go @@ -0,0 +1,26 @@ +package main + +// Regenerates the default configuration files +// Keeps the current content and adds missing default values +// Won't create a new file, but will update a blank file + +//TODO: Add nodes.conf + +import ( + "fmt" + "github.com/hpcng/warewulf/internal/pkg/warewulfconf" +) + +func main() { + tmpConf, err := warewulfconf.New() + if err != nil { + fmt.Println(err) + return + } + + err = tmpConf.Persist() + if err != nil { + fmt.Println(err) + return + } +} diff --git a/etc/warewulf.conf b/etc/warewulf.conf.in similarity index 87% rename from etc/warewulf.conf rename to etc/warewulf.conf.in index 278dde6c..b0b9e564 100644 --- a/etc/warewulf.conf +++ b/etc/warewulf.conf.in @@ -6,6 +6,7 @@ warewulf: autobuild overlays: true update interval: 60 syslog: false + datastore: @WWROOT@/warewulf dhcp: enabled: true range start: 192.168.200.50 @@ -14,7 +15,7 @@ dhcp: systemd name: dhcpd tftp: enabled: true - tftproot: /var/lib/tftpboot + tftproot: @TFTPROOT@ systemd name: tftp nfs: systemd name: nfs-server @@ -25,4 +26,4 @@ nfs: mount: true - path: /opt export options: ro,sync,no_root_squash - mount: false \ No newline at end of file + mount: false diff --git a/internal/app/wwctl/configure/nfs/main.go b/internal/app/wwctl/configure/nfs/main.go index ca12c354..265d7f00 100644 --- a/internal/app/wwctl/configure/nfs/main.go +++ b/internal/app/wwctl/configure/nfs/main.go @@ -9,6 +9,8 @@ import ( "github.com/hpcng/warewulf/internal/pkg/util" "github.com/hpcng/warewulf/internal/pkg/warewulfconf" "github.com/hpcng/warewulf/internal/pkg/wwlog" + "github.com/hpcng/warewulf/internal/pkg/overlay" + "github.com/pkg/errors" "github.com/spf13/cobra" ) diff --git a/internal/app/wwctl/node/ready/main.go b/internal/app/wwctl/node/ready/main.go index 6786cc11..661d7c54 100644 --- a/internal/app/wwctl/node/ready/main.go +++ b/internal/app/wwctl/node/ready/main.go @@ -4,7 +4,7 @@ import ( "fmt" "os" - "github.com/hpcng/warewulf/internal/pkg/config" + "github.com/hpcng/warewulf/internal/pkg/overlay" "github.com/hpcng/warewulf/internal/pkg/container" "github.com/hpcng/warewulf/internal/pkg/kernel" "github.com/hpcng/warewulf/internal/pkg/node" @@ -70,11 +70,11 @@ func CobraRunE(cmd *cobra.Command, args []string) error { } if node.SystemOverlay.Get() != "" { - if util.IsFile(config.SystemOverlayImage(node.Id.Get())) { + if util.IsFile(overlay.SystemOverlayImage(node.Id.Get())) { systemo_good = true } else { status = false - wwlog.Printf(wwlog.VERBOSE, "System Overlay not found: %s\n", config.SystemOverlayImage(node.Id.Get())) + wwlog.Printf(wwlog.VERBOSE, "System Overlay not found: %s\n", overlay.SystemOverlayImage(node.Id.Get())) } } else { status = false @@ -82,11 +82,11 @@ func CobraRunE(cmd *cobra.Command, args []string) error { } if node.RuntimeOverlay.Get() != "" { - if util.IsFile(config.RuntimeOverlayImage(node.Id.Get())) { + if util.IsFile(overlay.RuntimeOverlayImage(node.Id.Get())) { runtimeo_good = true } else { status = false - wwlog.Printf(wwlog.VERBOSE, "Runtime Overlay not found: %s\n", config.RuntimeOverlaySource(node.Id.Get())) + wwlog.Printf(wwlog.VERBOSE, "Runtime Overlay not found: %s\n", overlay.RuntimeOverlaySource(node.Id.Get())) } } else { status = false diff --git a/internal/app/wwctl/overlay/list/main.go b/internal/app/wwctl/overlay/list/main.go index 17b9deaf..f8ac3cdd 100644 --- a/internal/app/wwctl/overlay/list/main.go +++ b/internal/app/wwctl/overlay/list/main.go @@ -31,9 +31,25 @@ func CobraRunE(cmd *cobra.Command, args []string) error { fmt.Printf("%-30s %-12s\n", "OVERLAY NAME", "FILES/DIRS") } +<<<<<<< HEAD for o := range overlays { name := overlays[o] path := overlay.OverlaySourceDir(name) +======= + for o := range overlayList { + var path string + name := overlayList[o] + + if overlayName != "" && overlayName != name { + continue + } + + if overlayKind == "system" { + path = overlay.SystemOverlaySource(overlayList[o]) + } else if overlayKind == "runtime" { + path = overlay.RuntimeOverlaySource(overlayList[o]) + } +>>>>>>> eb32d41... Add config option for shared state dir if util.IsDir(path) { files := util.FindFiles(path) @@ -60,7 +76,11 @@ func CobraRunE(cmd *cobra.Command, args []string) error { sys := s.Sys() +<<<<<<< HEAD fmt.Printf("%v %5d %-5d %-18s /%s\n", perms, sys.(*syscall.Stat_t).Uid, sys.(*syscall.Stat_t).Gid, overlays[o], files[file]) +======= + fmt.Printf("%v %5d %-5d %-18s /%s\n", perms, sys.(*syscall.Stat_t).Uid, sys.(*syscall.Stat_t).Gid, overlayList[o], files[file]) +>>>>>>> eb32d41... Add config option for shared state dir } } else { @@ -68,7 +88,11 @@ func CobraRunE(cmd *cobra.Command, args []string) error { } } else { +<<<<<<< HEAD wwlog.Printf(wwlog.ERROR, "system/%s (path not found:%s)\n", overlays[o], path) +======= + wwlog.Printf(wwlog.ERROR, "system/%s (path not found:%s)\n", overlayList[o], path) +>>>>>>> eb32d41... Add config option for shared state dir } } diff --git a/internal/pkg/container/imprt.go b/internal/pkg/container/imprt.go index 92093220..04876703 100644 --- a/internal/pkg/container/imprt.go +++ b/internal/pkg/container/imprt.go @@ -9,13 +9,13 @@ import ( "github.com/containers/storage/drivers/copy" "github.com/pkg/errors" - "github.com/hpcng/warewulf/internal/pkg/config" + "github.com/hpcng/warewulf/internal/pkg/warewulfconf" "github.com/hpcng/warewulf/internal/pkg/oci" "github.com/hpcng/warewulf/internal/pkg/util" ) func ImportDocker(uri string, name string, sCtx *types.SystemContext) error { - OciBlobCacheDir := config.LocalStateDir + "/oci/blobs" + OciBlobCacheDir := warewulfconf.DataStore() + "/oci/blobs" err := os.MkdirAll(OciBlobCacheDir, 0755) if err != nil { diff --git a/internal/pkg/container/util.go b/internal/pkg/container/util.go index a9e0a4ce..d83847cf 100644 --- a/internal/pkg/container/util.go +++ b/internal/pkg/container/util.go @@ -7,7 +7,7 @@ import ( "github.com/pkg/errors" - "github.com/hpcng/warewulf/internal/pkg/config" + "github.com/hpcng/warewulf/internal/pkg/warewulfconf" "github.com/hpcng/warewulf/internal/pkg/util" "github.com/hpcng/warewulf/internal/pkg/wwlog" ) @@ -21,7 +21,7 @@ func ValidName(name string) bool { } func SourceParentDir() string { - return path.Join(config.LocalStateDir, "chroots") + return path.Join(warewulfconf.DataStore(), "chroots") } func SourceDir(name string) string { @@ -33,7 +33,7 @@ func RootFsDir(name string) string { } func ImageParentDir() string { - return path.Join(config.LocalStateDir, "provision/container/") + return path.Join(warewulfconf.DataStore(), "provision/container/") } func ImageFile(name string) string { diff --git a/internal/pkg/kernel/kernel.go b/internal/pkg/kernel/kernel.go index ced5f791..c3b0e2ee 100644 --- a/internal/pkg/kernel/kernel.go +++ b/internal/pkg/kernel/kernel.go @@ -11,7 +11,7 @@ import ( "github.com/pkg/errors" - "github.com/hpcng/warewulf/internal/pkg/config" + "github.com/hpcng/warewulf/internal/pkg/warewulfconf" "github.com/hpcng/warewulf/internal/pkg/util" "github.com/hpcng/warewulf/internal/pkg/wwlog" ) @@ -27,7 +27,7 @@ var ( ) func ParentDir() string { - return path.Join(config.LocalStateDir, "provision/kernel") + return path.Join(warewulfconf.DataStore(), "provision/kernel") } func KernelImage(kernelName string) string { @@ -111,7 +111,7 @@ func ListKernels() ([]string, error) { func Build(kernelVersion string, kernelName string, root string) (string, error) { kernelDrivers := path.Join(root, "/lib/modules/"+kernelVersion) - kernelDriversRelative := path.Join("/lib/modules/"+kernelVersion) + kernelDriversRelative := path.Join("/lib/modules/"+kernelVersion) kernelDestination := KernelImage(kernelName) driversDestination := KmodsImage(kernelName) versionDestination := KernelVersion(kernelName) diff --git a/internal/pkg/oci/cache.go b/internal/pkg/oci/cache.go index 227fd439..7cf2ac68 100644 --- a/internal/pkg/oci/cache.go +++ b/internal/pkg/oci/cache.go @@ -9,12 +9,6 @@ import ( "github.com/containers/image/v5/types" ) -const ( - defaultCachePath = "/var/warewulf/container-cache/oci/" - blobPrefix = "blobs" - rootfsPrefix = "rootfs" -) - type CacheOpt func(*Cache) error func OptSetCachePath(path string) CacheOpt { diff --git a/internal/pkg/oci/defaults.go b/internal/pkg/oci/defaults.go new file mode 100644 index 00000000..ee6dc0e6 --- /dev/null +++ b/internal/pkg/oci/defaults.go @@ -0,0 +1,11 @@ +package oci + +import "github.com/hpcng/warewulf/internal/pkg/warewulfconf" +import "path/filepath" + +var defaultCachePath = filepath.Join(warewulfconf.DataStore(), "/container-cache/oci/") + +const ( + blobPrefix = "blobs" + rootfsPrefix = "rootfs" +) \ No newline at end of file diff --git a/internal/pkg/config/config.go b/internal/pkg/overlay/config.go similarity index 85% rename from internal/pkg/config/config.go rename to internal/pkg/overlay/config.go index 34a9f006..f99ba0f0 100644 --- a/internal/pkg/config/config.go +++ b/internal/pkg/overlay/config.go @@ -1,19 +1,15 @@ -package config +package overlay import ( - "fmt" "path" "github.com/hpcng/warewulf/internal/pkg/util" "github.com/hpcng/warewulf/internal/pkg/wwlog" -) - -const ( - LocalStateDir = "/var/warewulf" + "github.com/hpcng/warewulf/internal/pkg/warewulfconf" ) func OverlayDir() string { - return fmt.Sprintf("%s/overlays/", LocalStateDir) + return path.Join(warewulfconf.DataStore(), "provision/overlays") } func SystemOverlayDir() string { @@ -63,7 +59,7 @@ func SystemOverlayImage(nodeName string) string { return "" } - return fmt.Sprintf("%s/provision/overlays/system/%s.img", LocalStateDir, nodeName) + return path.Join(SystemOverlayDir(), nodeName+".img") } func RuntimeOverlayImage(nodeName string) string { @@ -77,5 +73,5 @@ func RuntimeOverlayImage(nodeName string) string { return "" } - return fmt.Sprintf("%s/provision/overlays/runtime/%s.img", LocalStateDir, nodeName) + return path.Join(RuntimeOverlayDir(), nodeName+".img") } diff --git a/internal/pkg/overlay/overlay.go b/internal/pkg/overlay/overlay.go index 6aae411e..ecb2c4cd 100644 --- a/internal/pkg/overlay/overlay.go +++ b/internal/pkg/overlay/overlay.go @@ -12,7 +12,6 @@ import ( "strings" "text/template" - "github.com/hpcng/warewulf/internal/pkg/config" "github.com/hpcng/warewulf/internal/pkg/node" "github.com/hpcng/warewulf/internal/pkg/util" "github.com/hpcng/warewulf/internal/pkg/wwlog" diff --git a/internal/pkg/warewulfconf/constructors.go b/internal/pkg/warewulfconf/constructors.go index 76cefbe6..d3dcc92d 100644 --- a/internal/pkg/warewulfconf/constructors.go +++ b/internal/pkg/warewulfconf/constructors.go @@ -4,22 +4,25 @@ import ( "fmt" "io/ioutil" "net" + "errors" "github.com/brotherpowers/ipsubnet" "github.com/hpcng/warewulf/internal/pkg/wwlog" + "gopkg.in/yaml.v2" ) -var singleton ControllerConf +var cachedConf ControllerConf func New() (ControllerConf, error) { - var ret ControllerConf + var ret ControllerConf = *defaultConfig() - if (ControllerConf{}) == singleton { + // Check if cached config is old before re-reading config file + if !cachedConf.current { wwlog.Printf(wwlog.DEBUG, "Opening Warewulf configuration file: %s\n", ConfigFile) data, err := ioutil.ReadFile(ConfigFile) if err != nil { - fmt.Printf("error reading Warewulf configuration file\n") + fmt.Printf("Error reading Warewulf configuration file\n") return ret, err } @@ -29,11 +32,16 @@ func New() (ControllerConf, error) { return ret, err } +// TODO: Need to add comprehensive config file validator +// TODO: Change function to guess default IP address and/or mask from local system if ret.Ipaddr == "" { - wwlog.Printf(wwlog.WARN, "IP address is not configured in warewulfd.conf\n") + wwlog.Printf(wwlog.ERROR, "IP address is not configured in warewulfd.conf\n") + return ret, errors.New("no IP Address") } + if ret.Netmask == "" { - wwlog.Printf(wwlog.WARN, "Netmask is not configured in warewulfd.conf\n") + wwlog.Printf(wwlog.ERROR, "Netmask is not configured in warewulfd.conf\n") + return ret, errors.New("no netmask") } if ret.Network == "" { @@ -46,16 +54,17 @@ func New() (ControllerConf, error) { } if ret.Warewulf.Port == 0 { - ret.Warewulf.Port = 9873 + ret.Warewulf.Port = defaultPort } wwlog.Printf(wwlog.DEBUG, "Returning warewulf config object\n") - singleton = ret + cachedConf = ret + cachedConf.current = true } else { wwlog.Printf(wwlog.DEBUG, "Returning cached warewulf config object\n") - - ret = singleton + // If cached struct isn't empty, use it as the return value + ret = cachedConf } return ret, nil diff --git a/internal/pkg/warewulfconf/datastructure.go b/internal/pkg/warewulfconf/datastructure.go index f1405baa..c1e32626 100644 --- a/internal/pkg/warewulfconf/datastructure.go +++ b/internal/pkg/warewulfconf/datastructure.go @@ -6,10 +6,8 @@ import ( "github.com/hpcng/warewulf/internal/pkg/wwlog" ) -var ConfigFile = "/etc/warewulf/warewulf.conf" - type ControllerConf struct { - Comment string `yaml:"comment"` + Comment string `yaml:"comment,omitempty"` Ipaddr string `yaml:"ipaddr"` Netmask string `yaml:"netmask"` Network string `yaml:"network,omitempty"` @@ -18,14 +16,16 @@ type ControllerConf struct { Dhcp *DhcpConf `yaml:"dhcp"` Tftp *TftpConf `yaml:"tftp"` Nfs *NfsConf `yaml:"nfs"` + current bool } type WarewulfConf struct { - Port int `yaml:"port"` - Secure bool `yaml:"secure"` - UpdateInterval int `yaml:"update interval"` - AutobuildOverlays bool `yaml:"autobuild overlays"` - Syslog bool `yaml:"syslog"` + Port int `yaml:"port"` + Secure bool `yaml:"secure"` + UpdateInterval int `yaml:"update interval"` + AutobuildOverlays bool `yaml:"autobuild overlays"` + Syslog bool `yaml:"syslog"` + DataStore string `yaml:"datastore"` } type DhcpConf struct { @@ -34,7 +34,7 @@ type DhcpConf struct { RangeStart string `yaml:"range start"` RangeEnd string `yaml:"range end"` SystemdName string `yaml:"systemd name"` - ConfigFile string `yaml:"config file"` + ConfigFile string `yaml:"config file,omitempty"` } type TftpConf struct { @@ -70,11 +70,20 @@ func (s *NfsConf) UnmarshalYAML(unmarshal func(interface{}) error) error { return nil } + func init() { - //TODO: Check to make sure nodes.conf is found if !util.IsFile(ConfigFile) { wwlog.Printf(wwlog.ERROR, "Configuration file not found: %s\n", ConfigFile) // fail silently as this also called by bash_completion - return + } + _, err := New() + if err != nil { + wwlog.Printf(wwlog.ERROR, "Could not read Warewulf configuration file: %s\n", err) } } + +// Waste processor cycles to make code more readable + +func DataStore() string { + return cachedConf.Warewulf.DataStore +} \ No newline at end of file diff --git a/internal/pkg/warewulfconf/defaults.go b/internal/pkg/warewulfconf/defaults.go new file mode 100644 index 00000000..8fe4aeff --- /dev/null +++ b/internal/pkg/warewulfconf/defaults.go @@ -0,0 +1,47 @@ +package warewulfconf + +const ( + defaultDataStore string = "/srv/warewulf" + defaultPort int = 9983 +) + +var ConfigFile string = "/etc/warewulf/warewulf.conf" + +func defaultConfig() *ControllerConf { + Warewulf := &WarewulfConf{ + Port: defaultPort, + Secure: true, + UpdateInterval: 60, + AutobuildOverlays: true, + Syslog: false, + DataStore: defaultDataStore, + } + Dhcp := &DhcpConf{ + Enabled: true, + Template: "default", + RangeStart: "192.168.200.50", + RangeEnd: "192.168.200.99", + SystemdName: "dhcpd", + ConfigFile: "/etc/dhcp/dhcpd.conf", + } + Tftp := &TftpConf{ + Enabled: true, + TftpRoot: "/var/lib/tftpboot", + SystemdName: "tftp", + } + Nfs := &NfsConf{ + Enabled: true, + Exports: []string{"/home", + defaultDataStore, + }, + SystemdName: "nfs-server", + } + + return &ControllerConf{ + Warewulf: Warewulf, + Dhcp: Dhcp, + Tftp: Tftp, + Nfs: Nfs, + current: false, + } +} \ No newline at end of file diff --git a/internal/pkg/warewulfconf/modifiers.go b/internal/pkg/warewulfconf/modifiers.go index 7e87a9ca..c489125c 100644 --- a/internal/pkg/warewulfconf/modifiers.go +++ b/internal/pkg/warewulfconf/modifiers.go @@ -22,8 +22,9 @@ func (controller *ControllerConf) Persist() error { defer file.Close() - _, err = file.WriteString(string(out)) + _, err = file.WriteString(string(out)+"\n") if err != nil { + wwlog.Printf(wwlog.ERROR, "Unable to write to warewulf.conf\n") return err } diff --git a/warewulf.spec.in b/warewulf.spec.in index 19c4a637..17338da2 100644 --- a/warewulf.spec.in +++ b/warewulf.spec.in @@ -1,5 +1,5 @@ %global wwgroup warewulf -%{!?wwshared: %global wwshared %{_localstatedir}} +%global wwshared @WWROOT@/warewulf %define debug_package %{nil} Name: warewulf @@ -51,6 +51,9 @@ system for large clusters of bare metal and/or virtual systems. %build +%if 0%{?sle_version} +make all TFTPROOT="/srv/tftpboot" +%else make all @@ -86,16 +89,15 @@ getent group %{wwgroup} >/dev/null || groupadd -r %{wwgroup} %{wwshared}/%{name}/overlays/system/* %attr(-, root, root) %{_bindir}/wwctl -%if 0%{?rhel} %attr(-, root, root) %{_prefix}/lib/firewalld/services/warewulf.xml -%else -# sle_version -%attr(-, root, root) %{_libexecdir}/firewalld/services/warewulf.xml -%endif %attr(-, root, root) %{_unitdir}/warewulfd.service %attr(-, root, root) %{_mandir}/man1/wwctl* %changelog +* Wed Dec 15 2021 Jeremy Siadal - 4.2.0-1 +- Relocate tftpboot for OpenSUSE +- Remove libexecdir macro; changing in OpenSUSE 15.4 + * Mon Nov 1 2021 Jeremy Siadal - 4.2.0-1 - Add support for OpenSUSE - Update file attribs