diff --git a/internal/pkg/assets/assets.go b/internal/pkg/assets/assets.go index 7aad5b42..1312465f 100644 --- a/internal/pkg/assets/assets.go +++ b/internal/pkg/assets/assets.go @@ -3,7 +3,9 @@ package assets import ( "fmt" "github.com/hpcng/warewulf/internal/pkg/config" + "github.com/hpcng/warewulf/internal/pkg/util" "github.com/hpcng/warewulf/internal/pkg/vnfs" + "github.com/hpcng/warewulf/internal/pkg/wwlog" "gopkg.in/yaml.v2" "io/ioutil" // "os" @@ -30,8 +32,8 @@ type nodeGroup struct { Comment string Vnfs string Ipxe string `yaml:"ipxe template"` - SystemOverlay string `yaml:"system system-overlay""` - RuntimeOverlay string `yaml:"runtime system-overlay""` + SystemOverlay string `yaml:"system overlay""` + RuntimeOverlay string `yaml:"runtime overlay""` DomainSuffix string `yaml:"domain suffix"` KernelVersion string `yaml:"kernel version"` KernelArgs string `yaml:"kernel args"` @@ -42,8 +44,8 @@ type nodeEntry struct { Hostname string Vnfs string Ipxe string `yaml:"ipxe template"` - SystemOverlay string `yaml:"system system-overlay"` - RuntimeOverlay string `yaml:"runtime system-overlay"` + SystemOverlay string `yaml:"system overlay"` + RuntimeOverlay string `yaml:"runtime overlay"` DomainSuffix string `yaml:"domain suffix"` KernelVersion string `yaml:"kernel version"` KernelArgs string `yaml:"kernel args"` @@ -80,6 +82,7 @@ func FindAllNodes() ([]NodeInfo, error) { config := config.New() + wwlog.Printf(wwlog.DEBUG, "Opening configuration file: %s\n", ConfigFile) data, err := ioutil.ReadFile(ConfigFile) if err != nil { fmt.Printf("error reading node configuration file\n") @@ -145,6 +148,14 @@ func FindAllNodes() ([]NodeInfo, error) { n.Fqdn = node.Hostname } + util.ValidateOrDie(n.Fqdn, "group name", n.GroupName, "^[a-zA-Z0-9-._]+$") + util.ValidateOrDie(n.Fqdn, "vnfs", n.Vnfs, "^[a-zA-Z0-9-._:/]+$") + util.ValidateOrDie(n.Fqdn, "system overlay", n.SystemOverlay, "^[a-zA-Z0-9-._]+$") + util.ValidateOrDie(n.Fqdn, "runtime overlay", n.RuntimeOverlay, "^[a-zA-Z0-9-._]+$") + util.ValidateOrDie(n.Fqdn, "domain suffix", n.DomainName, "^[a-zA-Z0-9-._]+$") + util.ValidateOrDie(n.Fqdn, "hostname", n.HostName, "^[a-zA-Z0-9-_]+$") + util.ValidateOrDie(n.Fqdn, "kernel version", n.KernelVersion, "^[a-zA-Z0-9-._]+$") + v := vnfs.New(n.Vnfs) n.VnfsDir = config.VnfsChroot(v.NameClean()) @@ -155,6 +166,7 @@ func FindAllNodes() ([]NodeInfo, error) { return ret, nil } + func FindByHwaddr(hwa string) (NodeInfo, error) { var ret NodeInfo diff --git a/internal/pkg/config/config.go b/internal/pkg/config/config.go index eca045dc..92426005 100644 --- a/internal/pkg/config/config.go +++ b/internal/pkg/config/config.go @@ -2,11 +2,13 @@ package config import ( "fmt" + "github.com/hpcng/warewulf/internal/pkg/util" "github.com/hpcng/warewulf/internal/pkg/wwlog" "github.com/kelseyhightower/envconfig" "gopkg.in/yaml.v2" "io/ioutil" "os" + "path" ) @@ -50,45 +52,103 @@ func init() { if c.LocalStateDir == "" { c.LocalStateDir = "/var/warewulf" } + + util.ValidateOrDie("warewulf.conf", "warewulfd ipaddr", c.Ipaddr, "^[0-9]+.[0-9]+.[0-9]+.[0-9]+$") + util.ValidateOrDie("warewulf.conf", "system config dir", c.SysConfDir, "^[a-zA-Z0-9-._:/]+$") + util.ValidateOrDie("warewulf.conf", "local state dir", c.LocalStateDir, "^[a-zA-Z0-9-._:/]+$") + } func New() (Config) { return c } -func (self *Config) NodeConfig() (string) { +func (self *Config) NodeConfig() string { return fmt.Sprintf("%s/nodes.conf", self.LocalStateDir) } -func (self *Config) SystemOverlaySource(overlayName string) (string) { - return fmt.Sprintf("%s/overlays/system/%s", self.LocalStateDir, overlayName) +func (self *Config) OverlayDir() string { + return fmt.Sprintf("%s/overlays/", self.LocalStateDir) } -func (self *Config) RuntimeOverlaySource(overlayName string) (string) { - return fmt.Sprintf("%s/overlays/runtime/%s", self.LocalStateDir, overlayName) +func (self *Config) SystemOverlayDir() string { + return path.Join(self.OverlayDir(), "/system") } -func (self *Config) KernelImage(kernelVersion string) (string) { +func (self *Config) RuntimeOverlayDir() string { + return path.Join(self.OverlayDir(), "/runtime") +} + +func (self *Config) SystemOverlaySource(overlayName string) string { + if util.TaintCheck(overlayName, "^[a-zA-Z0-9-._]+$") == false { + wwlog.Printf(wwlog.ERROR, "System overlay name contains illegal characters: %s\n", overlayName) + os.Exit(1) + } + + return path.Join(self.SystemOverlayDir(), overlayName) +} + + +func (self *Config) RuntimeOverlaySource(overlayName string) string { + if util.TaintCheck(overlayName, "^[a-zA-Z0-9-._]+$") == false { + wwlog.Printf(wwlog.ERROR, "Runtime overlay name contains illegal characters: %s\n", overlayName) + os.Exit(1) + } + + return path.Join(self.RuntimeOverlayDir(), overlayName) +} + +func (self *Config) KernelImage(kernelVersion string) string { + if util.TaintCheck(kernelVersion, "^[a-zA-Z0-9-._]+$") == false { + wwlog.Printf(wwlog.ERROR, "Runtime overlay name contains illegal characters: %s\n", kernelVersion) + os.Exit(1) + } + return fmt.Sprintf("%s/provision/kernel/vmlinuz-%s", self.LocalStateDir, kernelVersion) } -func (self *Config) KmodsImage(kernelVersion string) (string) { +func (self *Config) KmodsImage(kernelVersion string) string { + if util.TaintCheck(kernelVersion, "^[a-zA-Z0-9-._]+$") == false { + wwlog.Printf(wwlog.ERROR, "Runtime overlay name contains illegal characters: %s\n", kernelVersion) + os.Exit(1) + } + return fmt.Sprintf("%s/provision/kernel/kmods-%s.img", self.LocalStateDir, kernelVersion) } -func (self *Config) VnfsImage(vnfsNameClean string) (string) { +func (self *Config) VnfsImage(vnfsNameClean string) string { + if util.TaintCheck(vnfsNameClean, "^[a-zA-Z0-9-._:]+$") == false { + wwlog.Printf(wwlog.ERROR, "Runtime overlay name contains illegal characters: %s\n", vnfsNameClean) + os.Exit(1) + } + return fmt.Sprintf("%s/provision/vnfs/%s.img.gz", self.LocalStateDir, vnfsNameClean) } -func (self *Config) SystemOverlayImage(nodeName string) (string) { +func (self *Config) SystemOverlayImage(nodeName string) string { + if util.TaintCheck(nodeName, "^[a-zA-Z0-9-._:]+$") == false { + wwlog.Printf(wwlog.ERROR, "System overlay name contains illegal characters: %s\n", nodeName) + os.Exit(1) + } + return fmt.Sprintf("%s/provision/overlays/system/%s.img", self.LocalStateDir, nodeName) } -func (self *Config) RuntimeOverlayImage(nodeName string) (string) { +func (self *Config) RuntimeOverlayImage(nodeName string) string { + if util.TaintCheck(nodeName, "^[a-zA-Z0-9-._:]+$") == false { + wwlog.Printf(wwlog.ERROR, "System overlay name contains illegal characters: %s\n", nodeName) + os.Exit(1) + } + return fmt.Sprintf("%s/provision/overlays/runtime/%s.img", self.LocalStateDir, nodeName) } -func (self *Config) VnfsChroot(vnfsNameClean string) (string) { +func (self *Config) VnfsChroot(vnfsNameClean string) string { + if util.TaintCheck(vnfsNameClean, "^[a-zA-Z0-9-._:]+$") == false { + wwlog.Printf(wwlog.ERROR, "Runtime overlay name contains illegal characters: %s\n", vnfsNameClean) + os.Exit(1) + } + return fmt.Sprintf("%s/chroot/%s.img", self.LocalStateDir, vnfsNameClean) }