Validation and taint checking of configuration file inputs
This commit is contained in:
@@ -3,7 +3,9 @@ package assets
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/hpcng/warewulf/internal/pkg/config"
|
"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/vnfs"
|
||||||
|
"github.com/hpcng/warewulf/internal/pkg/wwlog"
|
||||||
"gopkg.in/yaml.v2"
|
"gopkg.in/yaml.v2"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
// "os"
|
// "os"
|
||||||
@@ -30,8 +32,8 @@ type nodeGroup struct {
|
|||||||
Comment string
|
Comment string
|
||||||
Vnfs string
|
Vnfs string
|
||||||
Ipxe string `yaml:"ipxe template"`
|
Ipxe string `yaml:"ipxe template"`
|
||||||
SystemOverlay string `yaml:"system system-overlay""`
|
SystemOverlay string `yaml:"system overlay""`
|
||||||
RuntimeOverlay string `yaml:"runtime system-overlay""`
|
RuntimeOverlay string `yaml:"runtime overlay""`
|
||||||
DomainSuffix string `yaml:"domain suffix"`
|
DomainSuffix string `yaml:"domain suffix"`
|
||||||
KernelVersion string `yaml:"kernel version"`
|
KernelVersion string `yaml:"kernel version"`
|
||||||
KernelArgs string `yaml:"kernel args"`
|
KernelArgs string `yaml:"kernel args"`
|
||||||
@@ -42,8 +44,8 @@ type nodeEntry struct {
|
|||||||
Hostname string
|
Hostname string
|
||||||
Vnfs string
|
Vnfs string
|
||||||
Ipxe string `yaml:"ipxe template"`
|
Ipxe string `yaml:"ipxe template"`
|
||||||
SystemOverlay string `yaml:"system system-overlay"`
|
SystemOverlay string `yaml:"system overlay"`
|
||||||
RuntimeOverlay string `yaml:"runtime system-overlay"`
|
RuntimeOverlay string `yaml:"runtime overlay"`
|
||||||
DomainSuffix string `yaml:"domain suffix"`
|
DomainSuffix string `yaml:"domain suffix"`
|
||||||
KernelVersion string `yaml:"kernel version"`
|
KernelVersion string `yaml:"kernel version"`
|
||||||
KernelArgs string `yaml:"kernel args"`
|
KernelArgs string `yaml:"kernel args"`
|
||||||
@@ -80,6 +82,7 @@ func FindAllNodes() ([]NodeInfo, error) {
|
|||||||
config := config.New()
|
config := config.New()
|
||||||
|
|
||||||
|
|
||||||
|
wwlog.Printf(wwlog.DEBUG, "Opening configuration file: %s\n", ConfigFile)
|
||||||
data, err := ioutil.ReadFile(ConfigFile)
|
data, err := ioutil.ReadFile(ConfigFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("error reading node configuration file\n")
|
fmt.Printf("error reading node configuration file\n")
|
||||||
@@ -145,6 +148,14 @@ func FindAllNodes() ([]NodeInfo, error) {
|
|||||||
n.Fqdn = node.Hostname
|
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)
|
v := vnfs.New(n.Vnfs)
|
||||||
n.VnfsDir = config.VnfsChroot(v.NameClean())
|
n.VnfsDir = config.VnfsChroot(v.NameClean())
|
||||||
|
|
||||||
@@ -155,6 +166,7 @@ func FindAllNodes() ([]NodeInfo, error) {
|
|||||||
return ret, nil
|
return ret, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func FindByHwaddr(hwa string) (NodeInfo, error) {
|
func FindByHwaddr(hwa string) (NodeInfo, error) {
|
||||||
var ret NodeInfo
|
var ret NodeInfo
|
||||||
|
|
||||||
|
|||||||
@@ -2,11 +2,13 @@ package config
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/hpcng/warewulf/internal/pkg/util"
|
||||||
"github.com/hpcng/warewulf/internal/pkg/wwlog"
|
"github.com/hpcng/warewulf/internal/pkg/wwlog"
|
||||||
"github.com/kelseyhightower/envconfig"
|
"github.com/kelseyhightower/envconfig"
|
||||||
"gopkg.in/yaml.v2"
|
"gopkg.in/yaml.v2"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
|
"path"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -50,45 +52,103 @@ func init() {
|
|||||||
if c.LocalStateDir == "" {
|
if c.LocalStateDir == "" {
|
||||||
c.LocalStateDir = "/var/warewulf"
|
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) {
|
func New() (Config) {
|
||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *Config) NodeConfig() (string) {
|
func (self *Config) NodeConfig() string {
|
||||||
return fmt.Sprintf("%s/nodes.conf", self.LocalStateDir)
|
return fmt.Sprintf("%s/nodes.conf", self.LocalStateDir)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *Config) SystemOverlaySource(overlayName string) (string) {
|
func (self *Config) OverlayDir() string {
|
||||||
return fmt.Sprintf("%s/overlays/system/%s", self.LocalStateDir, overlayName)
|
return fmt.Sprintf("%s/overlays/", self.LocalStateDir)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *Config) RuntimeOverlaySource(overlayName string) (string) {
|
func (self *Config) SystemOverlayDir() string {
|
||||||
return fmt.Sprintf("%s/overlays/runtime/%s", self.LocalStateDir, overlayName)
|
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)
|
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)
|
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)
|
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)
|
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)
|
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)
|
return fmt.Sprintf("%s/chroot/%s.img", self.LocalStateDir, vnfsNameClean)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user