Files
warewulf/internal/app/wwctl/power/on/power.go
Michael L. Young 13ad67e56e Add IPMI Port Configuration
This commit adds the ability to configure the default IPMI port for a
profile or per node. If the port is not set, we default to 623.

Updated some areas to default to 'lan' for IPMI interface if it has not
been set.
2021-08-24 19:11:39 -04:00

96 lines
1.8 KiB
Go

package poweron
import (
"fmt"
"os"
"github.com/hpcng/warewulf/internal/pkg/batch"
"github.com/hpcng/warewulf/internal/pkg/node"
"github.com/hpcng/warewulf/internal/pkg/power"
"github.com/hpcng/warewulf/internal/pkg/wwlog"
"github.com/spf13/cobra"
)
func CobraRunE(cmd *cobra.Command, args []string) error {
var returnErr error = nil
nodeDB, err := node.New()
if err != nil {
wwlog.Printf(wwlog.ERROR, "Could not open node configuration: %s\n", err)
os.Exit(1)
}
nodes, err := nodeDB.FindAllNodes()
if err != nil {
wwlog.Printf(wwlog.ERROR, "Cloud not get nodeList: %s\n", err)
os.Exit(1)
}
if len(args) > 0 {
nodes = node.FilterByName(nodes, args)
} else {
cmd.Usage()
os.Exit(1)
}
if len(nodes) == 0 {
fmt.Printf("No nodes found\n")
os.Exit(1)
}
batchpool := batch.New(50)
jobcount := len(nodes)
results := make(chan power.IPMI, jobcount)
for _, node := range nodes {
if node.IpmiIpaddr.Get() == "" {
wwlog.Printf(wwlog.ERROR, "%s: No IPMI IP address\n", node.Id.Get())
continue
}
var ipmiInterface = "lan"
if node.IpmiInterface.Get() != "" {
ipmiInterface = node.IpmiInterface.Get()
}
var ipmiPort = "623"
if node.IpmiPort.Get() != "" {
ipmiPort = node.IpmiPort.Get()
}
ipmiCmd := power.IPMI{
NodeName: node.Id.Get(),
HostName: node.IpmiIpaddr.Get(),
Port: ipmiPort,
User: node.IpmiUserName.Get(),
Password: node.IpmiPassword.Get(),
Interface: ipmiInterface,
AuthType: "MD5",
}
batchpool.Submit(func() {
ipmiCmd.PowerOn()
results <- ipmiCmd
})
}
batchpool.Run()
close(results)
for result := range results {
out, err := result.Result()
if err != nil {
wwlog.Printf(wwlog.ERROR, "%s: %s\n", result.NodeName, out)
returnErr = err
continue
}
fmt.Printf("%s: %s\n", result.NodeName, out)
}
return returnErr
}