diff --git a/internal/app/wwctl/node/list/main.go b/internal/app/wwctl/node/list/main.go index 4150db2d..40f92d04 100644 --- a/internal/app/wwctl/node/list/main.go +++ b/internal/app/wwctl/node/list/main.go @@ -59,6 +59,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { 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(), "IpmiIpaddr", node.IpmiIpaddr.Source(), node.IpmiIpaddr.Print()) fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "IpmiNetmask", node.IpmiNetmask.Source(), node.IpmiNetmask.Print()) + fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "IpmiGateway", node.IpmiGateway.Source(), node.IpmiGateway.Print()) fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "IpmiUserName", node.IpmiUserName.Source(), node.IpmiUserName.Print()) for name, netdev := range node.NetDevs { diff --git a/internal/app/wwctl/node/set/main.go b/internal/app/wwctl/node/set/main.go index 942620d8..dea2ca07 100644 --- a/internal/app/wwctl/node/set/main.go +++ b/internal/app/wwctl/node/set/main.go @@ -164,6 +164,16 @@ func CobraRunE(cmd *cobra.Command, args []string) error { os.Exit(1) } } + if SetIpmiGateway != "" { + wwlog.Printf(wwlog.VERBOSE, "Node: %s, Setting IPMI gateway to: %s\n", n.Id.Get(), SetIpmiGateway) + + n.IpmiGateway.Set(SetIpmiGateway) + err := nodeDB.NodeUpdate(n) + if err != nil { + wwlog.Printf(wwlog.ERROR, "%s\n", err) + os.Exit(1) + } + } if SetIpmiUsername != "" { wwlog.Printf(wwlog.VERBOSE, "Node: %s, Setting IPMI IP username to: %s\n", n.Id.Get(), SetIpmiUsername) diff --git a/internal/app/wwctl/node/set/root.go b/internal/app/wwctl/node/set/root.go index c0eff8c5..31e9d25d 100644 --- a/internal/app/wwctl/node/set/root.go +++ b/internal/app/wwctl/node/set/root.go @@ -24,6 +24,7 @@ var ( SetSystemOverlay string SetIpmiIpaddr string SetIpmiNetmask string + SetIpmiGateway string SetIpmiUsername string SetIpmiPassword string SetNodeAll bool @@ -45,6 +46,7 @@ func init() { baseCmd.PersistentFlags().StringVarP(&SetSystemOverlay, "system", "S", "", "Set the node's system overlay") baseCmd.PersistentFlags().StringVar(&SetIpmiIpaddr, "ipmi", "", "Set the node's IPMI IP address") baseCmd.PersistentFlags().StringVar(&SetIpmiNetmask, "ipminetmask", "", "Set the node's IPMI netmask") + baseCmd.PersistentFlags().StringVar(&SetIpmiGateway, "ipmigateway", "", "Set the node's IPMI gateway") baseCmd.PersistentFlags().StringVar(&SetIpmiUsername, "ipmiuser", "", "Set the node's IPMI username") baseCmd.PersistentFlags().StringVar(&SetIpmiPassword, "ipmipass", "", "Set the node's IPMI password") diff --git a/internal/app/wwctl/profile/list/main.go b/internal/app/wwctl/profile/list/main.go index e4f2e288..950ca775 100644 --- a/internal/app/wwctl/profile/list/main.go +++ b/internal/app/wwctl/profile/list/main.go @@ -47,6 +47,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { fmt.Printf("%-20s %-18s %s\n", profile.Id.Get(), "Ipxe", profile.Ipxe.Print()) fmt.Printf("%-20s %-18s %s\n", profile.Id.Get(), "IpmiIpaddr", profile.IpmiIpaddr.Print()) fmt.Printf("%-20s %-18s %s\n", profile.Id.Get(), "IpmiNetmask", profile.IpmiNetmask.Print()) + fmt.Printf("%-20s %-18s %s\n", profile.Id.Get(), "IpmiGateway", profile.IpmiGateway.Print()) fmt.Printf("%-20s %-18s %s\n", profile.Id.Get(), "IpmiUserName", profile.IpmiUserName.Print()) for name, netdev := range profile.NetDevs { diff --git a/internal/app/wwctl/profile/set/main.go b/internal/app/wwctl/profile/set/main.go index f0573fe6..af3305d3 100644 --- a/internal/app/wwctl/profile/set/main.go +++ b/internal/app/wwctl/profile/set/main.go @@ -159,6 +159,16 @@ func CobraRunE(cmd *cobra.Command, args []string) error { os.Exit(1) } } + if SetIpmiGateway != "" { + wwlog.Printf(wwlog.VERBOSE, "Profile: %s, Setting IPMI username to: %s\n", p.Id, SetIpmiGateway) + + p.IpmiGateway.Set(SetIpmiGateway) + err := nodeDB.ProfileUpdate(p) + if err != nil { + wwlog.Printf(wwlog.ERROR, "%s\n", err) + os.Exit(1) + } + } if SetIpmiUsername != "" { wwlog.Printf(wwlog.VERBOSE, "Profile: %s, Setting IPMI username to: %s\n", p.Id, SetIpmiUsername) diff --git a/internal/app/wwctl/profile/set/root.go b/internal/app/wwctl/profile/set/root.go index 8fc2f997..aec9a78f 100644 --- a/internal/app/wwctl/profile/set/root.go +++ b/internal/app/wwctl/profile/set/root.go @@ -19,6 +19,7 @@ var ( SetRuntimeOverlay string SetSystemOverlay string SetIpmiNetmask string + SetIpmiGateway string SetIpmiUsername string SetIpmiPassword string SetNetDev string @@ -41,6 +42,7 @@ func init() { baseCmd.PersistentFlags().StringVarP(&SetRuntimeOverlay, "runtime", "R", "", "Set the node's runtime overlay") baseCmd.PersistentFlags().StringVarP(&SetSystemOverlay, "system", "S", "", "Set the node's system overlay") baseCmd.PersistentFlags().StringVar(&SetIpmiNetmask, "ipminetmask", "", "Set the node's IPMI netmask") + baseCmd.PersistentFlags().StringVar(&SetIpmiGateway, "ipmigateway", "", "Set the node's IPMI gateway") baseCmd.PersistentFlags().StringVar(&SetIpmiUsername, "ipmiuser", "", "Set the node's IPMI username") baseCmd.PersistentFlags().StringVar(&SetIpmiPassword, "ipmipass", "", "Set the node's IPMI password") diff --git a/internal/pkg/node/constructors.go b/internal/pkg/node/constructors.go index 1211b384..67fff9b3 100644 --- a/internal/pkg/node/constructors.go +++ b/internal/pkg/node/constructors.go @@ -68,6 +68,7 @@ func (self *nodeYaml) FindAllNodes() ([]NodeInfo, error) { n.Init.Set(node.Init) n.IpmiIpaddr.Set(node.IpmiIpaddr) n.IpmiNetmask.Set(node.IpmiNetmask) + n.IpmiGateway.Set(node.IpmiGateway) n.IpmiUserName.Set(node.IpmiUserName) n.IpmiPassword.Set(node.IpmiPassword) n.SystemOverlay.Set(node.SystemOverlay) @@ -106,6 +107,7 @@ func (self *nodeYaml) FindAllNodes() ([]NodeInfo, error) { n.Init.SetAlt(self.NodeProfiles[p].Init, pstring) n.IpmiIpaddr.SetAlt(self.NodeProfiles[p].IpmiIpaddr, pstring) n.IpmiNetmask.SetAlt(self.NodeProfiles[p].IpmiNetmask, pstring) + n.IpmiGateway.SetAlt(self.NodeProfiles[p].IpmiGateway, pstring) n.IpmiUserName.SetAlt(self.NodeProfiles[p].IpmiUserName, pstring) n.IpmiPassword.SetAlt(self.NodeProfiles[p].IpmiPassword, pstring) n.SystemOverlay.SetAlt(self.NodeProfiles[p].SystemOverlay, pstring) @@ -149,6 +151,7 @@ func (self *nodeYaml) FindAllProfiles() ([]NodeInfo, error) { p.KernelVersion.Set(profile.KernelVersion) p.KernelArgs.Set(profile.KernelArgs) p.IpmiNetmask.Set(profile.IpmiNetmask) + p.IpmiGateway.Set(profile.IpmiGateway) p.IpmiUserName.Set(profile.IpmiUserName) p.IpmiPassword.Set(profile.IpmiPassword) p.RuntimeOverlay.Set(profile.RuntimeOverlay) diff --git a/internal/pkg/node/datastructure.go b/internal/pkg/node/datastructure.go index d4e8077e..2097fef2 100644 --- a/internal/pkg/node/datastructure.go +++ b/internal/pkg/node/datastructure.go @@ -27,6 +27,7 @@ type NodeConf struct { IpmiPassword string `yaml:"ipmi password,omitempty"` IpmiIpaddr string `yaml:"ipmi ipaddr,omitempty"` IpmiNetmask string `yaml:"ipmi netmask,omitempty"` + IpmiGateway string `yaml:"ipmi gateway,omitempty"` RuntimeOverlay string `yaml:"runtime overlay files,omitempty"` SystemOverlay string `yaml:"system overlay files,omitempty"` Init string `yaml:"init,omitempty"` @@ -67,6 +68,7 @@ type NodeInfo struct { KernelArgs Entry IpmiIpaddr Entry IpmiNetmask Entry + IpmiGateway Entry IpmiUserName Entry IpmiPassword Entry RuntimeOverlay Entry diff --git a/internal/pkg/node/modifiers.go b/internal/pkg/node/modifiers.go index 9905f28c..1ba765d9 100644 --- a/internal/pkg/node/modifiers.go +++ b/internal/pkg/node/modifiers.go @@ -62,6 +62,7 @@ func (self *nodeYaml) NodeUpdate(node NodeInfo) error { self.Nodes[nodeID].KernelArgs = node.KernelArgs.GetReal() self.Nodes[nodeID].IpmiIpaddr = node.IpmiIpaddr.GetReal() self.Nodes[nodeID].IpmiNetmask = node.IpmiNetmask.GetReal() + self.Nodes[nodeID].IpmiGateway = node.IpmiGateway.GetReal() self.Nodes[nodeID].IpmiUserName = node.IpmiUserName.GetReal() self.Nodes[nodeID].IpmiPassword = node.IpmiPassword.GetReal() self.Nodes[nodeID].RuntimeOverlay = node.RuntimeOverlay.GetReal() @@ -134,6 +135,7 @@ func (self *nodeYaml) ProfileUpdate(profile NodeInfo) error { self.NodeProfiles[profileID].KernelArgs = profile.KernelArgs.GetReal() self.NodeProfiles[profileID].IpmiIpaddr = profile.IpmiIpaddr.GetReal() self.NodeProfiles[profileID].IpmiNetmask = profile.IpmiNetmask.GetReal() + self.NodeProfiles[profileID].IpmiGateway = profile.IpmiGateway.GetReal() self.NodeProfiles[profileID].IpmiUserName = profile.IpmiUserName.GetReal() self.NodeProfiles[profileID].IpmiPassword = profile.IpmiPassword.GetReal() self.NodeProfiles[profileID].RuntimeOverlay = profile.RuntimeOverlay.GetReal() diff --git a/internal/pkg/overlay/overlay.go b/internal/pkg/overlay/overlay.go index d133aa14..f8e3d253 100644 --- a/internal/pkg/overlay/overlay.go +++ b/internal/pkg/overlay/overlay.go @@ -25,6 +25,7 @@ type TemplateStruct struct { Init string IpmiIpaddr string IpmiNetmask string + IpmiGateway string IpmiUserName string IpmiPassword string NetDevs map[string]*node.NetDevs @@ -136,6 +137,7 @@ func buildOverlay(nodeList []node.NodeInfo, overlayType string) error { t.Init = n.Init.Get() t.IpmiIpaddr = n.IpmiIpaddr.Get() t.IpmiNetmask = n.IpmiNetmask.Get() + t.IpmiGateway = n.IpmiGateway.Get() t.IpmiUserName = n.IpmiUserName.Get() t.IpmiPassword = n.IpmiPassword.Get() t.NetDevs = make(map[string]*node.NetDevs) diff --git a/overlays/system/default/ipmi.ww b/overlays/system/default/ipmi.ww index 26642eb7..6194d26e 100755 --- a/overlays/system/default/ipmi.ww +++ b/overlays/system/default/ipmi.ww @@ -7,9 +7,13 @@ error_exit() { export PATH=/usr/bin:/bin:/usr/sbin:/sbin +set -x + IP="{{$.IpmiIpaddr}}" -NETMASK="{{$.NetDevs.eth0.Netmask}}" -GATEWAY="{{$.NetDevs.eth0.Gateway}}" +NETMASK="{{$.IpmiNetmask}}" +[ -z "$NETMASK" ] && NETMASK="{{$.NetDevs.eth0.Netmask}}" +GATEWAY="{{$.IpmiGateway}}" +[ -z "$GATEWAY" ] && GATEWAY="{{$.NetDevs.eth0.Gateway}}" USER="{{$.IpmiUserName}}" PASS="{{$.IpmiPassword}}"