mirror of
https://github.com/davidallendj/magellan.git
synced 2025-12-20 11:37:01 -07:00
Fixed formatting via gofmt
Signed-off-by: David J. Allen <davidallendj@gmail.com>
This commit is contained in:
parent
ac9556a526
commit
b3368e5264
11 changed files with 94 additions and 103 deletions
|
|
@ -10,9 +10,8 @@ import (
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
var collectCmd = &cobra.Command{
|
var collectCmd = &cobra.Command{
|
||||||
Use: "collect",
|
Use: "collect",
|
||||||
Short: "Query information about BMC",
|
Short: "Query information about BMC",
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
// make application logger
|
// make application logger
|
||||||
|
|
@ -28,14 +27,14 @@ var collectCmd = &cobra.Command{
|
||||||
threads = mathutil.Clamp(len(probeStates), 1, 255)
|
threads = mathutil.Clamp(len(probeStates), 1, 255)
|
||||||
}
|
}
|
||||||
q := &magellan.QueryParams{
|
q := &magellan.QueryParams{
|
||||||
User: user,
|
User: user,
|
||||||
Pass: pass,
|
Pass: pass,
|
||||||
Drivers: drivers,
|
Drivers: drivers,
|
||||||
Preferred: preferredDriver,
|
Preferred: preferredDriver,
|
||||||
Timeout: timeout,
|
Timeout: timeout,
|
||||||
Threads: threads,
|
Threads: threads,
|
||||||
Verbose: verbose,
|
Verbose: verbose,
|
||||||
WithSecureTLS: withSecureTLS,
|
WithSecureTLS: withSecureTLS,
|
||||||
}
|
}
|
||||||
magellan.CollectInfo(&probeStates, l, q)
|
magellan.CollectInfo(&probeStates, l, q)
|
||||||
|
|
||||||
|
|
@ -47,7 +46,7 @@ var collectCmd = &cobra.Command{
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
func init(){
|
func init() {
|
||||||
collectCmd.PersistentFlags().StringSliceVar(&drivers, "driver", []string{"redfish"}, "set the driver(s) and fallback drivers to use")
|
collectCmd.PersistentFlags().StringSliceVar(&drivers, "driver", []string{"redfish"}, "set the driver(s) and fallback drivers to use")
|
||||||
collectCmd.PersistentFlags().StringVar(&smd.Host, "host", smd.Host, "set the host to the smd API")
|
collectCmd.PersistentFlags().StringVar(&smd.Host, "host", smd.Host, "set the host to the smd API")
|
||||||
collectCmd.PersistentFlags().IntVar(&smd.Port, "port", smd.Port, "set the port to the smd API")
|
collectCmd.PersistentFlags().IntVar(&smd.Port, "port", smd.Port, "set the port to the smd API")
|
||||||
|
|
@ -58,4 +57,4 @@ func init(){
|
||||||
collectCmd.PersistentFlags().BoolVar(&withSecureTLS, "secure-tls", false, "enable secure TLS")
|
collectCmd.PersistentFlags().BoolVar(&withSecureTLS, "secure-tls", false, "enable secure TLS")
|
||||||
collectCmd.PersistentFlags().StringVar(&certPoolFile, "cert-pool", "", "path to CA cert. (defaults to system CAs; used with --secure-tls=true)")
|
collectCmd.PersistentFlags().StringVar(&certPoolFile, "cert-pool", "", "path to CA cert. (defaults to system CAs; used with --secure-tls=true)")
|
||||||
rootCmd.AddCommand(collectCmd)
|
rootCmd.AddCommand(collectCmd)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,9 +8,8 @@ import (
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
var listCmd = &cobra.Command{
|
var listCmd = &cobra.Command{
|
||||||
Use: "list",
|
Use: "list",
|
||||||
Short: "List information from scan",
|
Short: "List information from scan",
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
probeResults, err := sqlite.GetProbeResults(dbpath)
|
probeResults, err := sqlite.GetProbeResults(dbpath)
|
||||||
|
|
@ -25,4 +24,4 @@ var listCmd = &cobra.Command{
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
rootCmd.AddCommand(listCmd)
|
rootCmd.AddCommand(listCmd)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
24
cmd/root.go
24
cmd/root.go
|
|
@ -8,19 +8,19 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
timeout int
|
timeout int
|
||||||
threads int
|
threads int
|
||||||
ports []int
|
ports []int
|
||||||
hosts []string
|
hosts []string
|
||||||
withSecureTLS bool
|
withSecureTLS bool
|
||||||
certPoolFile string
|
certPoolFile string
|
||||||
user string
|
user string
|
||||||
pass string
|
pass string
|
||||||
dbpath string
|
dbpath string
|
||||||
drivers []string
|
drivers []string
|
||||||
preferredDriver string
|
preferredDriver string
|
||||||
ipmitoolPath string
|
ipmitoolPath string
|
||||||
verbose bool
|
verbose bool
|
||||||
)
|
)
|
||||||
|
|
||||||
// TODO: discover bmc's on network (dora)
|
// TODO: discover bmc's on network (dora)
|
||||||
|
|
|
||||||
|
|
@ -9,23 +9,23 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
Host = "http://localhost"
|
Host = "http://localhost"
|
||||||
DbType = "sqlite3"
|
DbType = "sqlite3"
|
||||||
DbPath = "../data/assets.db"
|
DbPath = "../data/assets.db"
|
||||||
BaseEndpoint = "/v1"
|
BaseEndpoint = "/v1"
|
||||||
Port = 8000
|
Port = 8000
|
||||||
)
|
)
|
||||||
|
|
||||||
type ScannedResult struct {
|
type ScannedResult struct {
|
||||||
id string
|
id string
|
||||||
site any
|
site any
|
||||||
cidr string
|
cidr string
|
||||||
ip string
|
ip string
|
||||||
port int
|
port int
|
||||||
protocol string
|
protocol string
|
||||||
scanner string
|
scanner string
|
||||||
state string
|
state string
|
||||||
updated string
|
updated string
|
||||||
}
|
}
|
||||||
|
|
||||||
func makeEndpointUrl(endpoint string) string {
|
func makeEndpointUrl(endpoint string) string {
|
||||||
|
|
@ -67,8 +67,8 @@ func LoadScannedPortsFromDB(dbPath string, dbType string) {
|
||||||
for rows.Next() {
|
for rows.Next() {
|
||||||
var r ScannedResult
|
var r ScannedResult
|
||||||
rows.Scan(
|
rows.Scan(
|
||||||
&r.id, &r.site, &r.cidr, &r.ip, &r.port, &r.protocol, &r.scanner,
|
&r.id, &r.site, &r.cidr, &r.ip, &r.port, &r.protocol, &r.scanner,
|
||||||
&r.state, &r.updated,
|
&r.state, &r.updated,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,12 +10,11 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
Host = "http://localhost"
|
Host = "http://localhost"
|
||||||
BaseEndpoint = "/hsm/v2"
|
BaseEndpoint = "/hsm/v2"
|
||||||
Port = 27779
|
Port = 27779
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
func makeEndpointUrl(endpoint string) string {
|
func makeEndpointUrl(endpoint string) string {
|
||||||
return Host + ":" + fmt.Sprint(Port) + BaseEndpoint + endpoint
|
return Host + ":" + fmt.Sprint(Port) + BaseEndpoint + endpoint
|
||||||
}
|
}
|
||||||
|
|
@ -49,7 +48,7 @@ func AddRedfishEndpoint(data []byte, headers map[string]string) error {
|
||||||
|
|
||||||
// var ep hms.RedfishEP
|
// var ep hms.RedfishEP
|
||||||
// _ = ep
|
// _ = ep
|
||||||
// Add redfish endpoint via POST `/hsm/v2/Inventory/RedfishEndpoints` endpoint
|
// Add redfish endpoint via POST `/hsm/v2/Inventory/RedfishEndpoints` endpoint
|
||||||
url := makeEndpointUrl("/Inventory/RedfishEndpoints")
|
url := makeEndpointUrl("/Inventory/RedfishEndpoints")
|
||||||
res, body, _ := api.MakeRequest(url, "POST", data, headers)
|
res, body, _ := api.MakeRequest(url, "POST", data, headers)
|
||||||
fmt.Println("smd url: ", url)
|
fmt.Println("smd url: ", url)
|
||||||
|
|
@ -60,4 +59,4 @@ func AddRedfishEndpoint(data []byte, headers map[string]string) error {
|
||||||
|
|
||||||
func UpdateRedfishEndpoint() {
|
func UpdateRedfishEndpoint() {
|
||||||
// Update redfish endpoint via PUT `/hsm/v2/Inventory/RedfishEndpoints` endpoint
|
// Update redfish endpoint via PUT `/hsm/v2/Inventory/RedfishEndpoints` endpoint
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,6 @@ import (
|
||||||
"net/http"
|
"net/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
func MakeRequest(url string, httpMethod string, body []byte, headers map[string]string) (*http.Response, []byte, error) {
|
func MakeRequest(url string, httpMethod string, body []byte, headers map[string]string) (*http.Response, []byte, error) {
|
||||||
// url := getSmdEndpointUrl(endpoint)
|
// url := getSmdEndpointUrl(endpoint)
|
||||||
req, _ := http.NewRequest(httpMethod, url, bytes.NewBuffer(body))
|
req, _ := http.NewRequest(httpMethod, url, bytes.NewBuffer(body))
|
||||||
|
|
@ -25,4 +24,4 @@ func MakeRequest(url string, httpMethod string, body []byte, headers map[string]
|
||||||
return nil, nil, fmt.Errorf("could not read response body: %v", err)
|
return nil, nil, fmt.Errorf("could not read response body: %v", err)
|
||||||
}
|
}
|
||||||
return res, b, err
|
return res, b, err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -23,9 +23,9 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
IPMI_PORT = 623
|
IPMI_PORT = 623
|
||||||
SSH_PORT = 22
|
SSH_PORT = 22
|
||||||
HTTPS_PORT = 443
|
HTTPS_PORT = 443
|
||||||
)
|
)
|
||||||
|
|
||||||
type BMCProbeResult struct {
|
type BMCProbeResult struct {
|
||||||
|
|
@ -42,13 +42,13 @@ type QueryParams struct {
|
||||||
User string
|
User string
|
||||||
Pass string
|
Pass string
|
||||||
Drivers []string
|
Drivers []string
|
||||||
Threads int
|
Threads int
|
||||||
Preferred string
|
Preferred string
|
||||||
Timeout int
|
Timeout int
|
||||||
WithSecureTLS bool
|
WithSecureTLS bool
|
||||||
CertPoolFile string
|
CertPoolFile string
|
||||||
Verbose bool
|
Verbose bool
|
||||||
IpmitoolPath string
|
IpmitoolPath string
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewClient(l *Logger, q *QueryParams) (*bmclib.Client, error) {
|
func NewClient(l *Logger, q *QueryParams) (*bmclib.Client, error) {
|
||||||
|
|
@ -113,18 +113,18 @@ func CollectInfo(probeStates *[]BMCProbeResult, l *Logger, q *QueryParams) error
|
||||||
if len(*probeStates) <= 0 {
|
if len(*probeStates) <= 0 {
|
||||||
return fmt.Errorf("no probe states found")
|
return fmt.Errorf("no probe states found")
|
||||||
}
|
}
|
||||||
|
|
||||||
// generate custom xnames for bmcs
|
// generate custom xnames for bmcs
|
||||||
node := xnames.Node{
|
node := xnames.Node{
|
||||||
Cabinet: 1000,
|
Cabinet: 1000,
|
||||||
Chassis: 1,
|
Chassis: 1,
|
||||||
ComputeModule: 7,
|
ComputeModule: 7,
|
||||||
NodeBMC: -1,
|
NodeBMC: -1,
|
||||||
}
|
}
|
||||||
|
|
||||||
found := make([]string, 0, len(*probeStates))
|
found := make([]string, 0, len(*probeStates))
|
||||||
done := make(chan struct{}, q.Threads+1)
|
done := make(chan struct{}, q.Threads+1)
|
||||||
chanProbeState := make(chan BMCProbeResult, q.Threads+1)
|
chanProbeState := make(chan BMCProbeResult, q.Threads+1)
|
||||||
|
|
||||||
// collect bmc information asynchronously
|
// collect bmc information asynchronously
|
||||||
var wg sync.WaitGroup
|
var wg sync.WaitGroup
|
||||||
|
|
@ -132,18 +132,18 @@ func CollectInfo(probeStates *[]BMCProbeResult, l *Logger, q *QueryParams) error
|
||||||
for i := 0; i < q.Threads; i++ {
|
for i := 0; i < q.Threads; i++ {
|
||||||
go func() {
|
go func() {
|
||||||
for {
|
for {
|
||||||
ps, ok := <- chanProbeState
|
ps, ok := <-chanProbeState
|
||||||
if !ok {
|
if !ok {
|
||||||
wg.Done()
|
wg.Done()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
q.Host = ps.Host
|
q.Host = ps.Host
|
||||||
q.Port = ps.Port
|
q.Port = ps.Port
|
||||||
|
|
||||||
client, err := NewClient(l, q)
|
client, err := NewClient(l, q)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
l.Log.Errorf("could not make client: %v", err)
|
l.Log.Errorf("could not make client: %v", err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
// metadata
|
// metadata
|
||||||
|
|
@ -155,7 +155,7 @@ func CollectInfo(probeStates *[]BMCProbeResult, l *Logger, q *QueryParams) error
|
||||||
// inventories
|
// inventories
|
||||||
inventory, err := QueryInventory(client, l, q)
|
inventory, err := QueryInventory(client, l, q)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
l.Log.Errorf("could not query inventory (%v:%v): %v", q.Host, q.Port, err)
|
l.Log.Errorf("could not query inventory (%v:%v): %v", q.Host, q.Port, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// chassis
|
// chassis
|
||||||
|
|
@ -171,15 +171,15 @@ func CollectInfo(probeStates *[]BMCProbeResult, l *Logger, q *QueryParams) error
|
||||||
headers["Content-Type"] = "application/json"
|
headers["Content-Type"] = "application/json"
|
||||||
|
|
||||||
data := make(map[string]any)
|
data := make(map[string]any)
|
||||||
data["ID"] = fmt.Sprintf("%v", node.String()[:len(node.String())-2])
|
data["ID"] = fmt.Sprintf("%v", node.String()[:len(node.String())-2])
|
||||||
data["Type"] = ""
|
data["Type"] = ""
|
||||||
data["Name"] = ""
|
data["Name"] = ""
|
||||||
data["FQDN"] = ps.Host
|
data["FQDN"] = ps.Host
|
||||||
data["User"] = q.User
|
data["User"] = q.User
|
||||||
data["Password"] = q.Pass
|
data["Password"] = q.Pass
|
||||||
data["RediscoverOnUpdate"] = false
|
data["RediscoverOnUpdate"] = false
|
||||||
data["Inventory"] = inventory
|
data["Inventory"] = inventory
|
||||||
data["Chassis"] = chassis
|
data["Chassis"] = chassis
|
||||||
|
|
||||||
b, err := json.MarshalIndent(data, "", " ")
|
b, err := json.MarshalIndent(data, "", " ")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -222,7 +222,7 @@ func CollectInfo(probeStates *[]BMCProbeResult, l *Logger, q *QueryParams) error
|
||||||
for _, ps := range *probeStates {
|
for _, ps := range *probeStates {
|
||||||
// skip if found info from host
|
// skip if found info from host
|
||||||
foundHost := slices.Index(found, ps.Host)
|
foundHost := slices.Index(found, ps.Host)
|
||||||
if !ps.State || foundHost >= 0{
|
if !ps.State || foundHost >= 0 {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
chanProbeState <- ps
|
chanProbeState <- ps
|
||||||
|
|
@ -388,11 +388,11 @@ func QueryBios(client *bmclib.Client, l *Logger, q *QueryParams) ([]byte, error)
|
||||||
|
|
||||||
func QueryEthernetInterfaces(client *bmclib.Client, l *Logger, q *QueryParams) ([]byte, error) {
|
func QueryEthernetInterfaces(client *bmclib.Client, l *Logger, q *QueryParams) ([]byte, error) {
|
||||||
config := gofish.ClientConfig{
|
config := gofish.ClientConfig{
|
||||||
Endpoint: fmt.Sprintf("https://%s:%d", q.Host, q.Port),
|
Endpoint: fmt.Sprintf("https://%s:%d", q.Host, q.Port),
|
||||||
Username: q.User,
|
Username: q.User,
|
||||||
Password: q.Pass,
|
Password: q.Pass,
|
||||||
Insecure: !q.WithSecureTLS,
|
Insecure: !q.WithSecureTLS,
|
||||||
TLSHandshakeTimeout: q.Timeout,
|
TLSHandshakeTimeout: q.Timeout,
|
||||||
}
|
}
|
||||||
c, err := gofish.Connect(config)
|
c, err := gofish.Connect(config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -417,12 +417,12 @@ func QueryChassis(q *QueryParams) ([]byte, error) {
|
||||||
url += fmt.Sprintf("%s:%s@", q.User, q.Pass)
|
url += fmt.Sprintf("%s:%s@", q.User, q.Pass)
|
||||||
}
|
}
|
||||||
url += fmt.Sprintf("%s:%d", q.Host, q.Port)
|
url += fmt.Sprintf("%s:%d", q.Host, q.Port)
|
||||||
config := gofish.ClientConfig {
|
config := gofish.ClientConfig{
|
||||||
Endpoint: url,
|
Endpoint: url,
|
||||||
Username: q.User,
|
Username: q.User,
|
||||||
Password: q.Pass,
|
Password: q.Pass,
|
||||||
Insecure: !q.WithSecureTLS,
|
Insecure: !q.WithSecureTLS,
|
||||||
TLSHandshakeTimeout: q.Timeout,
|
TLSHandshakeTimeout: q.Timeout,
|
||||||
}
|
}
|
||||||
c, err := gofish.Connect(config)
|
c, err := gofish.Connect(config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
package postgresql
|
package postgresql
|
||||||
|
|
|
||||||
|
|
@ -58,4 +58,4 @@ func GetProbeResults(path string) ([]magellan.BMCProbeResult, error) {
|
||||||
return nil, fmt.Errorf("could not retrieve probes: %v", err)
|
return nil, fmt.Errorf("could not retrieve probes: %v", err)
|
||||||
}
|
}
|
||||||
return results, nil
|
return results, nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,23 +4,19 @@ import (
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
type Logger struct {
|
type Logger struct {
|
||||||
Log *logrus.Logger
|
Log *logrus.Logger
|
||||||
Path string
|
Path string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func NewLogger(l *logrus.Logger, level logrus.Level) *Logger {
|
func NewLogger(l *logrus.Logger, level logrus.Level) *Logger {
|
||||||
l.SetLevel(level)
|
l.SetLevel(level)
|
||||||
return &Logger{
|
return &Logger{
|
||||||
Log: logrus.New(),
|
Log: logrus.New(),
|
||||||
Path: "",
|
Path: "",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (l *Logger) WriteFile(path string) {
|
||||||
func (l *Logger)WriteFile(path string) {
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,6 @@ import (
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
func rawConnect(host string, ports []int, timeout int, keepOpenOnly bool) []BMCProbeResult {
|
func rawConnect(host string, ports []int, timeout int, keepOpenOnly bool) []BMCProbeResult {
|
||||||
results := []BMCProbeResult{}
|
results := []BMCProbeResult{}
|
||||||
for _, p := range ports {
|
for _, p := range ports {
|
||||||
|
|
@ -52,11 +51,11 @@ func GenerateHosts(subnet string, begin uint8, end uint8) []string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func ScanForAssets(hosts []string, ports []int, threads int, timeout int) []BMCProbeResult {
|
func ScanForAssets(hosts []string, ports []int, threads int, timeout int) []BMCProbeResult {
|
||||||
results := make([]BMCProbeResult, 0, len(hosts))
|
results := make([]BMCProbeResult, 0, len(hosts))
|
||||||
done := make(chan struct{}, threads+1)
|
done := make(chan struct{}, threads+1)
|
||||||
chanHost := make(chan string, threads+1)
|
chanHost := make(chan string, threads+1)
|
||||||
// chanPort := make(chan int, threads+1)
|
// chanPort := make(chan int, threads+1)
|
||||||
|
|
||||||
var wg sync.WaitGroup
|
var wg sync.WaitGroup
|
||||||
wg.Add(threads)
|
wg.Add(threads)
|
||||||
for i := 0; i < threads; i++ {
|
for i := 0; i < threads; i++ {
|
||||||
|
|
@ -93,4 +92,4 @@ func ScanForAssets(hosts []string, ports []int, threads int, timeout int) []BMCP
|
||||||
|
|
||||||
func GetDefaultPorts() []int {
|
func GetDefaultPorts() []int {
|
||||||
return []int{HTTPS_PORT, IPMI_PORT}
|
return []int{HTTPS_PORT, IPMI_PORT}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue