Convert config to *bool

Supports leaving booleans unspecified in YAML.

Boolean methods allow the templates to continue using previous names for
boolean values.

Signed-off-by: Jonathon Anderson <janderson@ciq.com>
This commit is contained in:
Jonathon Anderson
2024-11-06 14:49:23 -07:00
parent 2bae87e244
commit e80c639b11
20 changed files with 157 additions and 84 deletions

View File

@@ -102,7 +102,7 @@ func CobraRunE(cmd *cobra.Command, args []string) (err error) {
if conf.WWClient != nil && conf.WWClient.Port > 0 { if conf.WWClient != nil && conf.WWClient.Port > 0 {
localTCPAddr.Port = int(conf.WWClient.Port) localTCPAddr.Port = int(conf.WWClient.Port)
wwlog.Info("Running from configured port %d", conf.WWClient.Port) wwlog.Info("Running from configured port %d", conf.WWClient.Port)
} else if conf.Warewulf.Secure { } else if conf.Warewulf.Secure() {
// Setup local port to something privileged (<1024) // Setup local port to something privileged (<1024)
localTCPAddr.Port = 987 localTCPAddr.Port = 987
wwlog.Info("Running from trusted port") wwlog.Info("Running from trusted port")

View File

@@ -134,14 +134,14 @@ func CobraRunE(cmd *cobra.Command, args []string) (err error) {
} }
for _, mntPnt := range mountPts { for _, mntPnt := range mountPts {
if mntPnt.Copy { if mntPnt.Copy() {
continue continue
} }
wwlog.Debug("bind mounting: %s -> %s", mntPnt.Source, path.Join(containerPath, mntPnt.Dest)) wwlog.Debug("bind mounting: %s -> %s", mntPnt.Source, path.Join(containerPath, mntPnt.Dest))
err = syscall.Mount(mntPnt.Source, path.Join(containerPath, mntPnt.Dest), "", syscall.MS_BIND, "") err = syscall.Mount(mntPnt.Source, path.Join(containerPath, mntPnt.Dest), "", syscall.MS_BIND, "")
if err != nil { if err != nil {
wwlog.Warn("Couldn't mount %s to %s: %s", mntPnt.Source, mntPnt.Dest, err) wwlog.Warn("Couldn't mount %s to %s: %s", mntPnt.Source, mntPnt.Dest, err)
} else if mntPnt.ReadOnly { } else if mntPnt.ReadOnly() {
err = syscall.Mount(mntPnt.Source, path.Join(containerPath, mntPnt.Dest), "", syscall.MS_REMOUNT|syscall.MS_RDONLY|syscall.MS_BIND, "") err = syscall.Mount(mntPnt.Source, path.Join(containerPath, mntPnt.Dest), "", syscall.MS_REMOUNT|syscall.MS_RDONLY|syscall.MS_BIND, "")
if err != nil { if err != nil {
wwlog.Warn("failed to following mount readonly: %s", mntPnt.Source) wwlog.Warn("failed to following mount readonly: %s", mntPnt.Source)
@@ -191,7 +191,7 @@ the invalid mount points. Directories always have '/' as suffix
func checkMountPoints(containerName string, binds []*warewulfconf.MountEntry) (overlayObjects []string) { func checkMountPoints(containerName string, binds []*warewulfconf.MountEntry) (overlayObjects []string) {
overlayObjects = []string{} overlayObjects = []string{}
for _, b := range binds { for _, b := range binds {
if b.Copy { if b.Copy() {
continue continue
} }
_, err := os.Stat(b.Source) _, err := os.Stat(b.Source)

View File

@@ -229,7 +229,7 @@ Check the objects we want to copy in, instead of mounting
*/ */
func getCopyFiles(binds []*warewulfconf.MountEntry) (copyObjects []*copyFile) { func getCopyFiles(binds []*warewulfconf.MountEntry) (copyObjects []*copyFile) {
for _, bind := range binds { for _, bind := range binds {
if bind.Copy { if bind.Copy() {
copyObjects = append(copyObjects, &copyFile{ copyObjects = append(copyObjects, &copyFile{
fileName: bind.Dest, fileName: bind.Dest,
src: bind.Source, src: bind.Source,

View File

@@ -71,7 +71,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error {
} }
if BuildHost && controller.Warewulf.EnableHostOverlay { if BuildHost && controller.Warewulf.EnableHostOverlay() {
err := overlay.BuildHostOverlay() err := overlay.BuildHostOverlay()
if err != nil { if err != nil {
return fmt.Errorf("host overlay could not be built: %s", err) return fmt.Errorf("host overlay could not be built: %s", err)

View File

@@ -2,6 +2,8 @@ package config
import ( import (
"path" "path"
"github.com/warewulf/warewulf/internal/pkg/util"
) )
var ConfigFile = "@SYSCONFDIR@/warewulf/warewulf.conf" var ConfigFile = "@SYSCONFDIR@/warewulf/warewulf.conf"
@@ -25,24 +27,48 @@ const Version = "@VERSION@"
const Release = "@RELEASE@" const Release = "@RELEASE@"
type TFTPConf struct { type TFTPConf struct {
Enabled bool `yaml:"enabled" default:"true"` EnabledP *bool `yaml:"enabled" default:"true"`
TftpRoot string `yaml:"tftproot,omitempty" default:"@TFTPDIR@"` TftpRoot string `yaml:"tftproot,omitempty" default:"@TFTPDIR@"`
SystemdName string `yaml:"systemd name,omitempty" default:"tftp"` SystemdName string `yaml:"systemd name,omitempty" default:"tftp"`
IpxeBinaries map[string]string `yaml:"ipxe,omitempty" default:"{\"00:09\": \"ipxe-snponly-x86_64.efi\",\"00:00\": \"undionly.kpxe\",\"00:0B\": \"arm64-efi/snponly.efi\",\"00:07\": \"ipxe-snponly-x86_64.efi\"}"` IpxeBinaries map[string]string `yaml:"ipxe,omitempty" default:"{\"00:09\": \"ipxe-snponly-x86_64.efi\",\"00:00\": \"undionly.kpxe\",\"00:0B\": \"arm64-efi/snponly.efi\",\"00:07\": \"ipxe-snponly-x86_64.efi\"}"`
} }
func (this TFTPConf) Enabled() bool {
return util.BoolP(this.EnabledP)
}
// WarewulfConf adds additional Warewulf-specific configuration to // WarewulfConf adds additional Warewulf-specific configuration to
// BaseConf. // BaseConf.
type WarewulfConf struct { type WarewulfConf struct {
Port int `yaml:"port,omitempty" default:"9873"` Port int `yaml:"port,omitempty" default:"9873"`
Secure bool `yaml:"secure" default:"true"` SecureP *bool `yaml:"secure,omitempty" default:"true"`
UpdateInterval int `yaml:"update interval,omitempty" default:"60"` UpdateInterval int `yaml:"update interval,omitempty" default:"60"`
AutobuildOverlays bool `yaml:"autobuild overlays,omitempty" default:"true"` AutobuildOverlaysP *bool `yaml:"autobuild overlays,omitempty" default:"true"`
EnableHostOverlay bool `yaml:"host overlay" default:"true"` EnableHostOverlayP *bool `yaml:"host overlay,omitempty" default:"true"`
Syslog bool `yaml:"syslog,omitempty" default:"false"` SyslogP *bool `yaml:"syslog,omitempty" default:"false"`
DataStore string `yaml:"datastore,omitempty" default:"@DATADIR@"` DataStore string `yaml:"datastore,omitempty" default:"@DATADIR@"`
GrubBoot bool `yaml:"grubboot,omitempty" default:"false"` GrubBootP *bool `yaml:"grubboot,omitempty" default:"false"`
}
func (this WarewulfConf) Secure() bool {
return util.BoolP(this.SecureP)
}
func (this WarewulfConf) AutobuildOverlays() bool {
return util.BoolP(this.AutobuildOverlaysP)
}
func (this WarewulfConf) EnableHostOverlay() bool {
return util.BoolP(this.EnableHostOverlayP)
}
func (this WarewulfConf) Syslog() bool {
return util.BoolP(this.SyslogP)
}
func (this WarewulfConf) GrubBoot() bool {
return util.BoolP(this.GrubBootP)
} }
func (paths BuildConfig) OciBlobCachedir() string { func (paths BuildConfig) OciBlobCachedir() string {

View File

@@ -1,11 +1,19 @@
package config package config
import (
"github.com/warewulf/warewulf/internal/pkg/util"
)
// DHCPConf represents the configuration for the DHCP service that // DHCPConf represents the configuration for the DHCP service that
// Warewulf will configure. // Warewulf will configure.
type DHCPConf struct { type DHCPConf struct {
Enabled bool `yaml:"enabled" default:"true"` EnabledP *bool `yaml:"enabled,omitempty" default:"true"`
Template string `yaml:"template,omitempty" default:"default"` Template string `yaml:"template,omitempty" default:"default"`
RangeStart string `yaml:"range start,omitempty"` RangeStart string `yaml:"range start,omitempty"`
RangeEnd string `yaml:"range end,omitempty"` RangeEnd string `yaml:"range end,omitempty"`
SystemdName string `yaml:"systemd name,omitempty" default:"dhcpd"` SystemdName string `yaml:"systemd name,omitempty" default:"dhcpd"`
} }
func (this DHCPConf) Enabled() bool {
return util.BoolP(this.EnabledP)
}

View File

@@ -1,11 +1,23 @@
package config package config
import (
"github.com/warewulf/warewulf/internal/pkg/util"
)
// A MountEntry represents a bind mount that is applied to a container // A MountEntry represents a bind mount that is applied to a container
// during exec and shell. // during exec and shell.
type MountEntry struct { type MountEntry struct {
Source string `yaml:"source"` Source string `yaml:"source"`
Dest string `yaml:"dest,omitempty"` Dest string `yaml:"dest,omitempty"`
ReadOnly bool `yaml:"readonly,omitempty"` ReadOnlyP *bool `yaml:"readonly,omitempty"`
Options string `yaml:"options,omitempty"` // ignored at the moment Options string `yaml:"options,omitempty"` // ignored at the moment
Copy bool `yaml:"copy,omitempty"` // temporarily copy the file into the container CopyP *bool `yaml:"copy,omitempty"` // temporarily copy the file into the container
}
func (this MountEntry) ReadOnly() bool {
return util.BoolP(this.ReadOnlyP)
}
func (this MountEntry) Copy() bool {
return util.BoolP(this.CopyP)
} }

View File

@@ -2,23 +2,33 @@ package config
import ( import (
"github.com/creasty/defaults" "github.com/creasty/defaults"
"github.com/warewulf/warewulf/internal/pkg/util"
) )
// NFSConf represents the NFS configuration that will be used by // NFSConf represents the NFS configuration that will be used by
// Warewulf to generate exports on the server and mounts on compute // Warewulf to generate exports on the server and mounts on compute
// nodes. // nodes.
type NFSConf struct { type NFSConf struct {
Enabled bool `yaml:"enabled" default:"true"` EnabledP *bool `yaml:"enabled,omitempty" default:"true"`
ExportsExtended []*NFSExportConf `yaml:"export paths,omitempty" default:"[]"` ExportsExtended []*NFSExportConf `yaml:"export paths,omitempty" default:"[]"`
SystemdName string `yaml:"systemd name,omitempty" default:"nfsd"` SystemdName string `yaml:"systemd name,omitempty" default:"nfsd"`
} }
func (this NFSConf) Enabled() bool {
return util.BoolP(this.EnabledP)
}
// An NFSExportConf reprents a single NFS export / mount. // An NFSExportConf reprents a single NFS export / mount.
type NFSExportConf struct { type NFSExportConf struct {
Path string `yaml:"path" default:"/dev/null"` Path string `yaml:"path" default:"/dev/null"`
ExportOptions string `yaml:"export options,omitempty" default:"rw,sync,no_subtree_check"` ExportOptions string `yaml:"export options,omitempty" default:"rw,sync,no_subtree_check"`
MountOptions string `yaml:"mount options,omitempty" default:"defaults"` MountOptions string `yaml:"mount options,omitempty" default:"defaults"`
Mount bool `yaml:"mount" default:"true"` MountP *bool `yaml:"mount,omitempty" default:"true"`
}
func (this NFSExportConf) Mount() bool {
return util.BoolP(this.MountP)
} }
// Implements the Unmarshal interface for NFSConf to set default // Implements the Unmarshal interface for NFSConf to set default

View File

@@ -114,7 +114,6 @@ func (conf *WarewulfYaml) Parse(data []byte) error {
conf.Netmask = fmt.Sprintf("%d.%d.%d.%d", mask[0], mask[1], mask[2], mask[3]) conf.Netmask = fmt.Sprintf("%d.%d.%d.%d", mask[0], mask[1], mask[2], mask[3])
} }
} }
return nil return nil
} }

View File

@@ -11,19 +11,19 @@ func TestDefaultWarewulfYaml(t *testing.T) {
conf := New() conf := New()
assert.Equal(t, 9873, conf.Warewulf.Port) assert.Equal(t, 9873, conf.Warewulf.Port)
assert.True(t, conf.Warewulf.Secure) assert.True(t, conf.Warewulf.Secure())
assert.Equal(t, 60, conf.Warewulf.UpdateInterval) assert.Equal(t, 60, conf.Warewulf.UpdateInterval)
assert.True(t, conf.Warewulf.AutobuildOverlays) assert.True(t, conf.Warewulf.AutobuildOverlays())
assert.True(t, conf.Warewulf.EnableHostOverlay) assert.True(t, conf.Warewulf.EnableHostOverlay())
assert.False(t, conf.Warewulf.Syslog) assert.False(t, conf.Warewulf.Syslog())
assert.True(t, conf.DHCP.Enabled) assert.True(t, conf.DHCP.Enabled())
assert.Equal(t, "default", conf.DHCP.Template) assert.Equal(t, "default", conf.DHCP.Template)
assert.Empty(t, conf.DHCP.RangeStart) assert.Empty(t, conf.DHCP.RangeStart)
assert.Empty(t, conf.DHCP.RangeEnd) assert.Empty(t, conf.DHCP.RangeEnd)
assert.Equal(t, "dhcpd", conf.DHCP.SystemdName) assert.Equal(t, "dhcpd", conf.DHCP.SystemdName)
assert.True(t, conf.TFTP.Enabled) assert.True(t, conf.TFTP.Enabled())
assert.NotEmpty(t, conf.TFTP.TftpRoot) assert.NotEmpty(t, conf.TFTP.TftpRoot)
assert.Equal(t, "tftp", conf.TFTP.SystemdName) assert.Equal(t, "tftp", conf.TFTP.SystemdName)
assert.NotEmpty(t, conf.TFTP.IpxeBinaries["00:00"]) assert.NotEmpty(t, conf.TFTP.IpxeBinaries["00:00"])
@@ -31,13 +31,13 @@ func TestDefaultWarewulfYaml(t *testing.T) {
assert.NotEmpty(t, conf.TFTP.IpxeBinaries["00:09"]) assert.NotEmpty(t, conf.TFTP.IpxeBinaries["00:09"])
assert.NotEmpty(t, conf.TFTP.IpxeBinaries["00:0B"]) assert.NotEmpty(t, conf.TFTP.IpxeBinaries["00:0B"])
assert.True(t, conf.NFS.Enabled) assert.True(t, conf.NFS.Enabled())
assert.Empty(t, conf.NFS.ExportsExtended) assert.Empty(t, conf.NFS.ExportsExtended)
assert.Equal(t, "nfsd", conf.NFS.SystemdName) assert.Equal(t, "nfsd", conf.NFS.SystemdName)
assert.Equal(t, "/etc/resolv.conf", conf.MountsContainer[0].Source) assert.Equal(t, "/etc/resolv.conf", conf.MountsContainer[0].Source)
assert.Equal(t, "/etc/resolv.conf", conf.MountsContainer[0].Dest) assert.Equal(t, "/etc/resolv.conf", conf.MountsContainer[0].Dest)
assert.False(t, conf.MountsContainer[0].ReadOnly) assert.False(t, conf.MountsContainer[0].ReadOnly())
assert.Empty(t, conf.MountsContainer[0].Options) assert.Empty(t, conf.MountsContainer[0].Options)
assert.NotEmpty(t, conf.Paths.Bindir) assert.NotEmpty(t, conf.Paths.Bindir)
@@ -121,34 +121,34 @@ container mounts:
assert.Equal(t, "192.168.200.0", conf.Network) assert.Equal(t, "192.168.200.0", conf.Network)
assert.Equal(t, 9873, conf.Warewulf.Port) assert.Equal(t, 9873, conf.Warewulf.Port)
assert.False(t, conf.Warewulf.Secure) assert.False(t, conf.Warewulf.Secure())
assert.Equal(t, 60, conf.Warewulf.UpdateInterval) assert.Equal(t, 60, conf.Warewulf.UpdateInterval)
assert.True(t, conf.Warewulf.AutobuildOverlays) assert.True(t, conf.Warewulf.AutobuildOverlays())
assert.True(t, conf.Warewulf.EnableHostOverlay) assert.True(t, conf.Warewulf.EnableHostOverlay())
assert.False(t, conf.Warewulf.Syslog) assert.False(t, conf.Warewulf.Syslog())
assert.True(t, conf.DHCP.Enabled) assert.True(t, conf.DHCP.Enabled())
assert.Equal(t, "192.168.200.50", conf.DHCP.RangeStart) assert.Equal(t, "192.168.200.50", conf.DHCP.RangeStart)
assert.Equal(t, "192.168.200.99", conf.DHCP.RangeEnd) assert.Equal(t, "192.168.200.99", conf.DHCP.RangeEnd)
assert.Equal(t, "dhcpd", conf.DHCP.SystemdName) assert.Equal(t, "dhcpd", conf.DHCP.SystemdName)
assert.True(t, conf.TFTP.Enabled) assert.True(t, conf.TFTP.Enabled())
assert.Equal(t, "tftp", conf.TFTP.SystemdName) assert.Equal(t, "tftp", conf.TFTP.SystemdName)
assert.True(t, conf.NFS.Enabled) assert.True(t, conf.NFS.Enabled())
assert.Equal(t, "/home", conf.NFS.ExportsExtended[0].Path) assert.Equal(t, "/home", conf.NFS.ExportsExtended[0].Path)
assert.Equal(t, "rw,sync", conf.NFS.ExportsExtended[0].ExportOptions) assert.Equal(t, "rw,sync", conf.NFS.ExportsExtended[0].ExportOptions)
assert.Equal(t, "defaults", conf.NFS.ExportsExtended[0].MountOptions) assert.Equal(t, "defaults", conf.NFS.ExportsExtended[0].MountOptions)
assert.True(t, conf.NFS.ExportsExtended[0].Mount) assert.True(t, conf.NFS.ExportsExtended[0].Mount())
assert.Equal(t, "/opt", conf.NFS.ExportsExtended[1].Path) assert.Equal(t, "/opt", conf.NFS.ExportsExtended[1].Path)
assert.Equal(t, "ro,sync,no_root_squash", conf.NFS.ExportsExtended[1].ExportOptions) assert.Equal(t, "ro,sync,no_root_squash", conf.NFS.ExportsExtended[1].ExportOptions)
assert.Equal(t, "defaults", conf.NFS.ExportsExtended[1].MountOptions) assert.Equal(t, "defaults", conf.NFS.ExportsExtended[1].MountOptions)
assert.False(t, conf.NFS.ExportsExtended[1].Mount) assert.False(t, conf.NFS.ExportsExtended[1].Mount())
assert.Equal(t, "nfs-server", conf.NFS.SystemdName) assert.Equal(t, "nfs-server", conf.NFS.SystemdName)
assert.Equal(t, "/etc/resolv.conf", conf.MountsContainer[0].Source) assert.Equal(t, "/etc/resolv.conf", conf.MountsContainer[0].Source)
assert.Equal(t, "/etc/resolv.conf", conf.MountsContainer[0].Dest) assert.Equal(t, "/etc/resolv.conf", conf.MountsContainer[0].Dest)
assert.True(t, conf.MountsContainer[0].ReadOnly) assert.True(t, conf.MountsContainer[0].ReadOnly())
} }
func TestCache(t *testing.T) { func TestCache(t *testing.T) {

View File

@@ -17,7 +17,7 @@ func DHCP() (err error) {
controller := warewulfconf.Get() controller := warewulfconf.Get()
if !controller.DHCP.Enabled { if !controller.DHCP.Enabled() {
wwlog.Warn("This system is not configured as a Warewulf DHCP controller") wwlog.Warn("This system is not configured as a Warewulf DHCP controller")
return return
} }
@@ -29,7 +29,7 @@ func DHCP() (err error) {
if controller.DHCP.RangeEnd == "" { if controller.DHCP.RangeEnd == "" {
return fmt.Errorf("configuration is not defined: `dhcpd range end`") return fmt.Errorf("configuration is not defined: `dhcpd range end`")
} }
if controller.Warewulf.EnableHostOverlay { if controller.Warewulf.EnableHostOverlay() {
err = overlay.BuildHostOverlay() err = overlay.BuildHostOverlay()
if err != nil { if err != nil {
wwlog.Warn("host overlay could not be built: %s", err) wwlog.Warn("host overlay could not be built: %s", err)

View File

@@ -17,8 +17,8 @@ func NFS() error {
controller := warewulfconf.Get() controller := warewulfconf.Get()
if controller.NFS.Enabled { if controller.NFS.Enabled() {
if controller.Warewulf.EnableHostOverlay { if controller.Warewulf.EnableHostOverlay() {
err := overlay.BuildHostOverlay() err := overlay.BuildHostOverlay()
if err != nil { if err != nil {
wwlog.Warn("host overlay could not be built: %s", err) wwlog.Warn("host overlay could not be built: %s", err)

View File

@@ -21,7 +21,7 @@ func TFTP() (err error) {
return return
} }
if controller.Warewulf.GrubBoot { if controller.Warewulf.GrubBoot() {
err := warewulfd.CopyShimGrub() err := warewulfd.CopyShimGrub()
if err != nil { if err != nil {
wwlog.Warn("error when copying shim/grub binaries: %s", err) wwlog.Warn("error when copying shim/grub binaries: %s", err)
@@ -43,7 +43,7 @@ func TFTP() (err error) {
} }
} }
} }
if !controller.TFTP.Enabled { if !controller.TFTP.Enabled() {
wwlog.Warn("Warewulf does not auto start TFTP services due to disable by warewulf.conf") wwlog.Warn("Warewulf does not auto start TFTP services due to disable by warewulf.conf")
return nil return nil
} }

View File

@@ -30,10 +30,10 @@ func InitMountPnts(binds []string) (mounts []*warewulfconf.MountEntry) {
} }
} }
mntPnt := warewulfconf.MountEntry{ mntPnt := warewulfconf.MountEntry{
Source: bind[0], Source: bind[0],
Dest: dest, Dest: dest,
ReadOnly: readonly, ReadOnlyP: &readonly,
Copy: copy_, CopyP: &copy_,
} }
mounts = append(mounts, &mntPnt) mounts = append(mounts, &mntPnt)
} }

View File

@@ -75,30 +75,30 @@ func (this *WarewulfYaml) Upgrade() (upgraded *config.WarewulfYaml) {
type WarewulfConf struct { type WarewulfConf struct {
Port int `yaml:"port"` Port int `yaml:"port"`
Secure bool `yaml:"secure"` Secure *bool `yaml:"secure"`
UpdateInterval int `yaml:"update interval"` UpdateInterval int `yaml:"update interval"`
AutobuildOverlays bool `yaml:"autobuild overlays"` AutobuildOverlays *bool `yaml:"autobuild overlays"`
EnableHostOverlay bool `yaml:"host overlay"` EnableHostOverlay *bool `yaml:"host overlay"`
Syslog bool `yaml:"syslog"` Syslog *bool `yaml:"syslog"`
DataStore string `yaml:"datastore"` DataStore string `yaml:"datastore"`
GrubBoot bool `yaml:"grubboot"` GrubBoot *bool `yaml:"grubboot"`
} }
func (this *WarewulfConf) Upgrade() (upgraded *config.WarewulfConf) { func (this *WarewulfConf) Upgrade() (upgraded *config.WarewulfConf) {
upgraded = new(config.WarewulfConf) upgraded = new(config.WarewulfConf)
upgraded.Port = this.Port upgraded.Port = this.Port
upgraded.Secure = this.Secure upgraded.SecureP = this.Secure
upgraded.UpdateInterval = this.UpdateInterval upgraded.UpdateInterval = this.UpdateInterval
upgraded.AutobuildOverlays = this.AutobuildOverlays upgraded.AutobuildOverlaysP = this.AutobuildOverlays
upgraded.EnableHostOverlay = this.EnableHostOverlay upgraded.EnableHostOverlayP = this.EnableHostOverlay
upgraded.Syslog = this.Syslog upgraded.SyslogP = this.Syslog
upgraded.DataStore = this.DataStore upgraded.DataStore = this.DataStore
upgraded.GrubBoot = this.GrubBoot upgraded.GrubBootP = this.GrubBoot
return upgraded return upgraded
} }
type DHCPConf struct { type DHCPConf struct {
Enabled bool `yaml:"enabled"` Enabled *bool `yaml:"enabled"`
Template string `yaml:"template"` Template string `yaml:"template"`
RangeStart string `yaml:"range start"` RangeStart string `yaml:"range start"`
RangeEnd string `yaml:"range end"` RangeEnd string `yaml:"range end"`
@@ -107,7 +107,7 @@ type DHCPConf struct {
func (this *DHCPConf) Upgrade() (upgraded *config.DHCPConf) { func (this *DHCPConf) Upgrade() (upgraded *config.DHCPConf) {
upgraded = new(config.DHCPConf) upgraded = new(config.DHCPConf)
upgraded.Enabled = this.Enabled upgraded.EnabledP = this.Enabled
upgraded.Template = this.Template upgraded.Template = this.Template
upgraded.RangeStart = this.RangeStart upgraded.RangeStart = this.RangeStart
upgraded.RangeEnd = this.RangeEnd upgraded.RangeEnd = this.RangeEnd
@@ -116,7 +116,7 @@ func (this *DHCPConf) Upgrade() (upgraded *config.DHCPConf) {
} }
type TFTPConf struct { type TFTPConf struct {
Enabled bool `yaml:"enabled"` Enabled *bool `yaml:"enabled"`
TftpRoot string `yaml:"tftproot"` TftpRoot string `yaml:"tftproot"`
SystemdName string `yaml:"systemd name"` SystemdName string `yaml:"systemd name"`
IpxeBinaries map[string]string `yaml:"ipxe"` IpxeBinaries map[string]string `yaml:"ipxe"`
@@ -124,7 +124,7 @@ type TFTPConf struct {
func (this *TFTPConf) Upgrade() (upgraded *config.TFTPConf) { func (this *TFTPConf) Upgrade() (upgraded *config.TFTPConf) {
upgraded = new(config.TFTPConf) upgraded = new(config.TFTPConf)
upgraded.Enabled = this.Enabled upgraded.EnabledP = this.Enabled
upgraded.TftpRoot = this.TftpRoot upgraded.TftpRoot = this.TftpRoot
upgraded.SystemdName = this.SystemdName upgraded.SystemdName = this.SystemdName
upgraded.IpxeBinaries = make(map[string]string) upgraded.IpxeBinaries = make(map[string]string)
@@ -135,15 +135,21 @@ func (this *TFTPConf) Upgrade() (upgraded *config.TFTPConf) {
} }
type NFSConf struct { type NFSConf struct {
Enabled bool `yaml:"enabled"` Enabled *bool `yaml:"enabled"`
Exports []string `yaml:"exports"`
ExportsExtended []*NFSExportConf `yaml:"export paths"` ExportsExtended []*NFSExportConf `yaml:"export paths"`
SystemdName string `yaml:"systemd name"` SystemdName string `yaml:"systemd name"`
} }
func (this *NFSConf) Upgrade() (upgraded *config.NFSConf) { func (this *NFSConf) Upgrade() (upgraded *config.NFSConf) {
upgraded = new(config.NFSConf) upgraded = new(config.NFSConf)
upgraded.Enabled = this.Enabled upgraded.EnabledP = this.Enabled
upgraded.ExportsExtended = make([]*config.NFSExportConf, 0) upgraded.ExportsExtended = make([]*config.NFSExportConf, 0)
for _, export := range this.Exports {
extendedExport := new(config.NFSExportConf)
extendedExport.Path = export
upgraded.ExportsExtended = append(upgraded.ExportsExtended, extendedExport)
}
for _, export := range this.ExportsExtended { for _, export := range this.ExportsExtended {
upgraded.ExportsExtended = append(upgraded.ExportsExtended, export.Upgrade()) upgraded.ExportsExtended = append(upgraded.ExportsExtended, export.Upgrade())
} }
@@ -155,7 +161,7 @@ type NFSExportConf struct {
Path string `yaml:"path"` Path string `yaml:"path"`
ExportOptions string `yaml:"export options"` ExportOptions string `yaml:"export options"`
MountOptions string `yaml:"mount options"` MountOptions string `yaml:"mount options"`
Mount bool `yaml:"mount"` Mount *bool `yaml:"mount"`
} }
func (this *NFSExportConf) Upgrade() (upgraded *config.NFSExportConf) { func (this *NFSExportConf) Upgrade() (upgraded *config.NFSExportConf) {
@@ -163,7 +169,7 @@ func (this *NFSExportConf) Upgrade() (upgraded *config.NFSExportConf) {
upgraded.Path = this.Path upgraded.Path = this.Path
upgraded.ExportOptions = this.ExportOptions upgraded.ExportOptions = this.ExportOptions
upgraded.MountOptions = this.MountOptions upgraded.MountOptions = this.MountOptions
upgraded.Mount = this.Mount upgraded.MountP = this.Mount
return upgraded return upgraded
} }
@@ -180,18 +186,18 @@ func (this *SSHConf) Upgrade() (upgraded *config.SSHConf) {
type MountEntry struct { type MountEntry struct {
Source string `yaml:"source"` Source string `yaml:"source"`
Dest string `yaml:"dest"` Dest string `yaml:"dest"`
ReadOnly bool `yaml:"readonly"` ReadOnly *bool `yaml:"readonly"`
Options string `yaml:"options"` Options string `yaml:"options"`
Copy bool `yaml:"copy"` Copy *bool `yaml:"copy"`
} }
func (this *MountEntry) Upgrade() (upgraded *config.MountEntry) { func (this *MountEntry) Upgrade() (upgraded *config.MountEntry) {
upgraded = new(config.MountEntry) upgraded = new(config.MountEntry)
upgraded.Source = this.Source upgraded.Source = this.Source
upgraded.Dest = this.Dest upgraded.Dest = this.Dest
upgraded.ReadOnly = this.ReadOnly upgraded.ReadOnlyP = this.ReadOnly
upgraded.Options = this.Options upgraded.Options = this.Options
upgraded.Copy = this.Copy upgraded.CopyP = this.Copy
return upgraded return upgraded
} }

View File

@@ -49,7 +49,6 @@ warewulf:
port: 9873 port: 9873
secure: true secure: true
update interval: 60 update interval: 60
host overlay: false
dhcp: dhcp:
enabled: true enabled: true
template: default template: default
@@ -61,7 +60,9 @@ tftp:
tftproot: /var/lib/tftpboot tftproot: /var/lib/tftpboot
systemd name: tftp systemd name: tftp
nfs: nfs:
enabled: false export paths:
- path: /home
- path: /var/warewulf
systemd name: nfs-server systemd name: nfs-server
`, `,
}, },
@@ -97,7 +98,6 @@ warewulf:
port: 9873 port: 9873
secure: true secure: true
update interval: 60 update interval: 60
host overlay: false
dhcp: dhcp:
enabled: true enabled: true
template: default template: default
@@ -109,7 +109,9 @@ tftp:
tftproot: /var/lib/tftpboot tftproot: /var/lib/tftpboot
systemd name: tftp systemd name: tftp
nfs: nfs:
enabled: false export paths:
- path: /home
- path: /var/warewulf
systemd name: nfs-server systemd name: nfs-server
`, `,
}, },
@@ -148,7 +150,7 @@ warewulf:
secure: true secure: true
update interval: 60 update interval: 60
autobuild overlays: true autobuild overlays: true
host overlay: false syslog: false
dhcp: dhcp:
enabled: true enabled: true
template: default template: default
@@ -160,7 +162,9 @@ tftp:
tftproot: /var/lib/tftpboot tftproot: /var/lib/tftpboot
systemd name: tftp systemd name: tftp
nfs: nfs:
enabled: false export paths:
- path: /home
- path: /var/warewulf
systemd name: nfs-server systemd name: nfs-server
`, `,
}, },
@@ -212,6 +216,7 @@ warewulf:
update interval: 60 update interval: 60
autobuild overlays: true autobuild overlays: true
host overlay: true host overlay: true
syslog: false
dhcp: dhcp:
enabled: true enabled: true
template: default template: default
@@ -280,6 +285,7 @@ warewulf:
update interval: 60 update interval: 60
autobuild overlays: true autobuild overlays: true
host overlay: true host overlay: true
syslog: false
dhcp: dhcp:
enabled: true enabled: true
range start: 192.168.200.50 range start: 192.168.200.50
@@ -362,6 +368,7 @@ warewulf:
update interval: 60 update interval: 60
autobuild overlays: true autobuild overlays: true
host overlay: true host overlay: true
syslog: false
dhcp: dhcp:
enabled: true enabled: true
range start: 10.0.1.1 range start: 10.0.1.1

View File

@@ -18,6 +18,10 @@ import (
"github.com/warewulf/warewulf/internal/pkg/wwlog" "github.com/warewulf/warewulf/internal/pkg/wwlog"
) )
func BoolP(p *bool) bool {
return p != nil && *p
}
func FirstError(errs ...error) (err error) { func FirstError(errs ...error) (err error) {
for _, e := range errs { for _, e := range errs {
if err == nil { if err == nil {

View File

@@ -57,7 +57,7 @@ func DaemonInitLogging() error {
conf := warewulfconf.Get() conf := warewulfconf.Get()
if conf.Warewulf.Syslog { if conf.Warewulf.Syslog() {
wwlog.Debug("Changing log output to syslog") wwlog.Debug("Changing log output to syslog")

View File

@@ -50,7 +50,7 @@ func ProvisionSend(w http.ResponseWriter, req *http.Request) {
wwlog.Info("request from hwaddr:%s ipaddr:%s | stage:%s", rinfo.hwaddr, req.RemoteAddr, rinfo.stage) wwlog.Info("request from hwaddr:%s ipaddr:%s | stage:%s", rinfo.hwaddr, req.RemoteAddr, rinfo.stage)
if (rinfo.stage == "runtime" || len(rinfo.overlay) > 0) && conf.Warewulf.Secure { if (rinfo.stage == "runtime" || len(rinfo.overlay) > 0) && conf.Warewulf.Secure() {
if rinfo.remoteport >= 1024 { if rinfo.remoteport >= 1024 {
wwlog.Denied("Non-privileged port: %s", req.RemoteAddr) wwlog.Denied("Non-privileged port: %s", req.RemoteAddr)
w.WriteHeader(http.StatusUnauthorized) w.WriteHeader(http.StatusUnauthorized)
@@ -149,7 +149,7 @@ func ProvisionSend(w http.ResponseWriter, req *http.Request) {
remoteNode, remoteNode,
context, context,
request_overlays, request_overlays,
conf.Warewulf.AutobuildOverlays) conf.Warewulf.AutobuildOverlays())
if err != nil { if err != nil {
if errors.Is(err, overlay.ErrDoesNotExist) { if errors.Is(err, overlay.ErrDoesNotExist) {

View File

@@ -101,7 +101,8 @@ nodes:
dbErr := LoadNodeDB() dbErr := LoadNodeDB()
assert.NoError(t, dbErr) assert.NoError(t, dbErr)
conf.Warewulf.Secure = false secureFalse := false
conf.Warewulf.SecureP = &secureFalse
assert.NoError(t, os.MkdirAll(path.Join(conf.Paths.OverlayProvisiondir(), "n1"), 0700)) assert.NoError(t, os.MkdirAll(path.Join(conf.Paths.OverlayProvisiondir(), "n1"), 0700))
assert.NoError(t, os.WriteFile(path.Join(conf.Paths.OverlayProvisiondir(), "n1", "__SYSTEM__.img"), []byte("system overlay"), 0600)) assert.NoError(t, os.WriteFile(path.Join(conf.Paths.OverlayProvisiondir(), "n1", "__SYSTEM__.img"), []byte("system overlay"), 0600))
assert.NoError(t, os.WriteFile(path.Join(conf.Paths.OverlayProvisiondir(), "n1", "__RUNTIME__.img"), []byte("runtime overlay"), 0600)) assert.NoError(t, os.WriteFile(path.Join(conf.Paths.OverlayProvisiondir(), "n1", "__RUNTIME__.img"), []byte("runtime overlay"), 0600))