From 98281955339604825488a2c7e1c4f83efc213ea3 Mon Sep 17 00:00:00 2001 From: "David J. Allen" Date: Mon, 13 May 2024 15:27:21 -0600 Subject: [PATCH 01/21] Removed the IPMI port from GetDefaultPorts --- internal/scan.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/scan.go b/internal/scan.go index 4ff6fc4..56b064a 100644 --- a/internal/scan.go +++ b/internal/scan.go @@ -160,5 +160,5 @@ func ScanForAssets(hosts []string, ports []int, threads int, timeout int, disabl } func GetDefaultPorts() []int { - return []int{HTTPS_PORT, IPMI_PORT} + return []int{HTTPS_PORT} } From 6e2b68252929d0b8ae00665c7694f6c04a0519e6 Mon Sep 17 00:00:00 2001 From: "David J. Allen" Date: Mon, 13 May 2024 15:28:03 -0600 Subject: [PATCH 02/21] Updated README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4d76d61..ef2b17a 100644 --- a/README.md +++ b/README.md @@ -165,7 +165,7 @@ The `magellan` tool has a `login` subcommand that works with the [`opaal`](https export MAGELLAN_ACCESS_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c ``` -Alternatively, if you are running the OpenCHAMI quickstart, you can run the provided script to generate a token and set the environment variable that way. +Alternatively, if you are running the OpenCHAMI quickstart in the [deployment recipes](https://github.com/OpenCHAMI/deployment-recipes), you can run the provided script to generate a token and set the environment variable that way. ```bash quickstart_dir=path/to/deployment/recipes/quickstart From 66bf6e05571cc60378daaa8e0e7faaebc4ef8688 Mon Sep 17 00:00:00 2001 From: David Allen Date: Thu, 16 May 2024 10:36:53 -0600 Subject: [PATCH 03/21] Fixed viper defaults for certs --- cmd/root.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/cmd/root.go b/cmd/root.go index ef488bc..2d27bee 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -118,10 +118,7 @@ func SetDefaults() { viper.SetDefault("collect.protocol", "https") viper.SetDefault("collect.output", "/tmp/magellan/data/") viper.SetDefault("collect.force-update", false) - viper.SetDefault("collect.preferred-driver", "ipmi") - viper.SetDefault("collect.ipmitool.path", "/usr/bin/ipmitool") - viper.SetDefault("collect.secure-tls", false) - viper.SetDefault("collect.cert-pool", "") + viper.SetDefault("collect.ca-cert", "") viper.SetDefault("bmc-host", "") viper.SetDefault("bmc-port", 443) viper.SetDefault("user", "") From 477bbdeece3056377645f66c05e21dee18b798da Mon Sep 17 00:00:00 2001 From: David Allen Date: Thu, 16 May 2024 10:44:08 -0600 Subject: [PATCH 04/21] Added extra check and work around if system returns nil --- internal/collect.go | 88 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 77 insertions(+), 11 deletions(-) diff --git a/internal/collect.go b/internal/collect.go index 7860228..5c41aba 100644 --- a/internal/collect.go +++ b/internal/collect.go @@ -435,22 +435,88 @@ func CollectSystems(c *gofish.APIClient, q *QueryParams) ([]byte, error) { return nil, fmt.Errorf("failed to query systems (%v:%v): %v", q.Host, q.Port, err) } - // query the system's ethernet interfaces + // do manual requests if systems is empty to only get necessary info as last resort + // /redfish/v1/Systems + // /redfish/v1/Systems/Members + // /redfish/v1/Systems/ var temp []map[string]any - for _, system := range systems { - interfaces, err := CollectEthernetInterfaces(c, q, system.ID) + if systems == nil { + url := baseRedfishUrl(q) + "/Systems" + res, body, err := util.MakeRequest(nil, url, "GET", nil, nil) if err != nil { - continue + return nil, fmt.Errorf("failed to make request: %v", err) + } else if res.StatusCode != http.StatusOK { + return nil, fmt.Errorf("request returned status code %d", res.StatusCode) } - var i map[string]any - err = json.Unmarshal(interfaces, &i) + + // sweet syntatic sugar type aliases + type System = map[string]any + type Member = map[string]string + + // get all the systems + var ( + tempSystems System + interfaces []*redfish.EthernetInterface + errList []error + ) + err = json.Unmarshal(body, &tempSystems) if err != nil { - return nil, fmt.Errorf("failed to unmarshal interface: %v", err) + return nil, fmt.Errorf("failed to unmarshal systems: %v", err) + } + + // then, get all the members within a system + members, ok := tempSystems["Members"] + if ok { + for _, member := range members.([]Member) { + id, ok := member["@odata.id"] + if ok { + // /redfish/v1/Systems/Self (or whatever) + // memberEndpoint := fmt.Sprintf("%s%s", url, id) + // res, body, err := util.MakeRequest(nil, baseRedfishUrl(q)+memberEndpoint, http.MethodGet, nil, nil) + // if err != nil { + // continue + // } else if res.StatusCode != http.StatusOK { + // continue + // } + // TODO: extract EthernetInterfaces from Systems then query + + // get all of the ethernet interfaces in our systems + ethernetInterface, err := redfish.ListReferencedEthernetInterfaces(c, id+"/EthernetInterfaces/") + if err != nil { + errList = append(errList, err) + continue + } + interfaces = append(interfaces, ethernetInterface...) + } + } + i, err := json.Marshal(interfaces) + if err != nil { + return nil, fmt.Errorf("failed to unmarshal interface: %v", err) + } + temp = append(temp, map[string]any{ + "Data": nil, + "EthernetInterfaces": string(i), + }) + } + + } else { + // query the system's ethernet interfaces + // var temp []map[string]any + for _, system := range systems { + interfaces, err := CollectEthernetInterfaces(c, q, system.ID) + if err != nil { + continue + } + var i map[string]any + err = json.Unmarshal(interfaces, &i) + if err != nil { + return nil, fmt.Errorf("failed to unmarshal interface: %v", err) + } + temp = append(temp, map[string]any{ + "Data": system, + "EthernetInterfaces": i["EthernetInterfaces"], + }) } - temp = append(temp, map[string]any{ - "Data": system, - "EthernetInterfaces": i["EthernetInterfaces"], - }) } data := map[string]any{"Systems": temp} From 1aab3796bec0fadd7a4017dcc36c367451d22ecf Mon Sep 17 00:00:00 2001 From: David Allen Date: Thu, 16 May 2024 14:41:17 -0600 Subject: [PATCH 05/21] Added error messages for checks --- internal/collect.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/internal/collect.go b/internal/collect.go index 5c41aba..3a3c702 100644 --- a/internal/collect.go +++ b/internal/collect.go @@ -487,6 +487,8 @@ func CollectSystems(c *gofish.APIClient, q *QueryParams) ([]byte, error) { continue } interfaces = append(interfaces, ethernetInterface...) + } else { + return nil, fmt.Errorf("no ID found for member") } } i, err := json.Marshal(interfaces) @@ -497,6 +499,8 @@ func CollectSystems(c *gofish.APIClient, q *QueryParams) ([]byte, error) { "Data": nil, "EthernetInterfaces": string(i), }) + } else { + return nil, fmt.Errorf("no members found in systems") } } else { From 978790f081429295b3fffdc8c0bedad411d529aa Mon Sep 17 00:00:00 2001 From: David Allen Date: Thu, 16 May 2024 14:48:38 -0600 Subject: [PATCH 06/21] Added print for URL when system is NIL --- internal/collect.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/internal/collect.go b/internal/collect.go index 3a3c702..5ef6641 100644 --- a/internal/collect.go +++ b/internal/collect.go @@ -442,6 +442,9 @@ func CollectSystems(c *gofish.APIClient, q *QueryParams) ([]byte, error) { var temp []map[string]any if systems == nil { url := baseRedfishUrl(q) + "/Systems" + if q.Verbose { + fmt.Printf("%s\n", url) + } res, body, err := util.MakeRequest(nil, url, "GET", nil, nil) if err != nil { return nil, fmt.Errorf("failed to make request: %v", err) From 9c5fd3c142c164bf58b877f22b974e7a3ea31c5a Mon Sep 17 00:00:00 2001 From: David Allen Date: Thu, 16 May 2024 15:16:43 -0600 Subject: [PATCH 07/21] Added more error messages --- internal/collect.go | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/internal/collect.go b/internal/collect.go index 5ef6641..1da8a26 100644 --- a/internal/collect.go +++ b/internal/collect.go @@ -370,13 +370,9 @@ func CollectEthernetInterfaces(c *gofish.APIClient, q *QueryParams, systemID str interfaces = append(interfaces, i...) } - // format the error message for printing - for i, e := range errList { - err = fmt.Errorf("\t[%d] %v\n", i, e) - } - // print any report errors - if len(errList) > 0 { + err = util.FormatErrorList(errList) + if util.HasErrors(errList) { return nil, fmt.Errorf("failed to get ethernet interfaces with %d errors: \n%v", len(errList), err) } @@ -493,6 +489,9 @@ func CollectSystems(c *gofish.APIClient, q *QueryParams) ([]byte, error) { } else { return nil, fmt.Errorf("no ID found for member") } + if util.HasErrors(errList) { + return nil, util.FormatErrorList(errList) + } } i, err := json.Marshal(interfaces) if err != nil { @@ -564,8 +563,14 @@ func CollectProcessors(q *QueryParams) ([]byte, error) { // convert to not get base64 string var procs map[string]json.RawMessage var members []map[string]any - json.Unmarshal(body, &procs) - json.Unmarshal(procs["Members"], &members) + err = json.Unmarshal(body, &procs) + if err != nil { + return nil, fmt.Errorf("failed to unmarshal processors: %v", err) + } + err = json.Unmarshal(procs["Members"], &members) + if err != nil { + return nil, fmt.Errorf("failed to unmarshal processor members: %v", err) + } // request data about each processor member on node for _, member := range members { From b024675e92b205fb7245acafa02d3da8e98c894f Mon Sep 17 00:00:00 2001 From: David Allen Date: Thu, 16 May 2024 15:18:12 -0600 Subject: [PATCH 08/21] Added error related util functions --- internal/util/util.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/internal/util/util.go b/internal/util/util.go index f385746..9c80601 100644 --- a/internal/util/util.go +++ b/internal/util/util.go @@ -98,3 +98,15 @@ func SplitPathForViper(path string) (string, string, string) { ext := filepath.Ext(filename) return filepath.Dir(path), strings.TrimSuffix(filename, ext), strings.TrimPrefix(ext, ".") } + +func FormatErrorList(errList []error) error { + var err error + for i, e := range errList { + err = fmt.Errorf("\t[%d] %v\n", i, e) + } + return err +} + +func HasErrors(errList []error) bool { + return len(errList) > 0 +} From 472735fb9d3241cdcb8028d1ae5f1bf2a4dd9867 Mon Sep 17 00:00:00 2001 From: David Allen Date: Thu, 16 May 2024 15:41:07 -0600 Subject: [PATCH 09/21] Added an error catch for CollectAll in cmd --- cmd/collect.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cmd/collect.go b/cmd/collect.go index fc3454c..2155cbe 100644 --- a/cmd/collect.go +++ b/cmd/collect.go @@ -60,7 +60,10 @@ var collectCmd = &cobra.Command{ ForceUpdate: forceUpdate, AccessToken: accessToken, } - magellan.CollectAll(&probeStates, l, q) + err = magellan.CollectAll(&probeStates, l, q) + if err != nil { + l.Log.Errorf("failed to collect data: %v", err) + } // add necessary headers for final request (like token) headers := make(map[string]string) From 0a3489f575ba5f00a18879b88db19609a40bd4dc Mon Sep 17 00:00:00 2001 From: David Allen Date: Thu, 16 May 2024 15:49:56 -0600 Subject: [PATCH 10/21] Changed systems nil check to check count instead --- internal/collect.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/collect.go b/internal/collect.go index 1da8a26..1c9f077 100644 --- a/internal/collect.go +++ b/internal/collect.go @@ -436,7 +436,7 @@ func CollectSystems(c *gofish.APIClient, q *QueryParams) ([]byte, error) { // /redfish/v1/Systems/Members // /redfish/v1/Systems/ var temp []map[string]any - if systems == nil { + if len(systems) == 0 { url := baseRedfishUrl(q) + "/Systems" if q.Verbose { fmt.Printf("%s\n", url) From 08a2c8ede745611266a6742346f038e50e9d5133 Mon Sep 17 00:00:00 2001 From: David Allen Date: Thu, 16 May 2024 15:52:40 -0600 Subject: [PATCH 11/21] Removed password from data sent and slightly changed error messages --- internal/collect.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/internal/collect.go b/internal/collect.go index 1c9f077..7690928 100644 --- a/internal/collect.go +++ b/internal/collect.go @@ -105,12 +105,12 @@ func CollectAll(probeStates *[]ScannedResult, l *log.Logger, q *QueryParams) err // data to be sent to smd data := map[string]any{ - "ID": fmt.Sprintf("%v", node.String()[:len(node.String())-2]), - "Type": "", - "Name": "", - "FQDN": ps.Host, - "User": q.User, - "Password": q.Pass, + "ID": fmt.Sprintf("%v", node.String()[:len(node.String())-2]), + "Type": "", + "Name": "", + "FQDN": ps.Host, + "User": q.User, + // "Password": q.Pass, "MACRequired": true, "RediscoverOnUpdate": false, } @@ -122,7 +122,7 @@ func CollectAll(probeStates *[]ScannedResult, l *log.Logger, q *QueryParams) err if gofishClient != nil { chassis, err := CollectChassis(gofishClient, q) if err != nil { - l.Log.Errorf("failed to query chassis: %v", err) + l.Log.Errorf("failed to collect chassis: %v", err) continue } err = json.Unmarshal(chassis, &rm) @@ -134,7 +134,7 @@ func CollectAll(probeStates *[]ScannedResult, l *log.Logger, q *QueryParams) err // systems systems, err := CollectSystems(gofishClient, q) if err != nil { - l.Log.Errorf("failed to query systems: %v", err) + l.Log.Errorf("failed to collect systems: %v", err) } err = json.Unmarshal(systems, &rm) if err != nil { From 81dee7f1c9f6e5b7d4a54b00eb7db9d522075d21 Mon Sep 17 00:00:00 2001 From: David Allen Date: Thu, 16 May 2024 15:54:53 -0600 Subject: [PATCH 12/21] Added temp print statement(s) --- internal/collect.go | 1 + 1 file changed, 1 insertion(+) diff --git a/internal/collect.go b/internal/collect.go index 7690928..212a201 100644 --- a/internal/collect.go +++ b/internal/collect.go @@ -435,6 +435,7 @@ func CollectSystems(c *gofish.APIClient, q *QueryParams) ([]byte, error) { // /redfish/v1/Systems // /redfish/v1/Systems/Members // /redfish/v1/Systems/ + fmt.Printf("system count: %d\n", len(systems)) var temp []map[string]any if len(systems) == 0 { url := baseRedfishUrl(q) + "/Systems" From ae33ff1bd8fce6b1d78d31a7a674fc1aad7b5aaf Mon Sep 17 00:00:00 2001 From: David Allen Date: Thu, 16 May 2024 16:00:26 -0600 Subject: [PATCH 13/21] Added more error checks --- internal/collect.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/internal/collect.go b/internal/collect.go index 212a201..8a7c3cf 100644 --- a/internal/collect.go +++ b/internal/collect.go @@ -509,9 +509,11 @@ func CollectSystems(c *gofish.APIClient, q *QueryParams) ([]byte, error) { } else { // query the system's ethernet interfaces // var temp []map[string]any + var errList []error for _, system := range systems { interfaces, err := CollectEthernetInterfaces(c, q, system.ID) if err != nil { + errList = append(errList, fmt.Errorf("failed to collect ethernet interface: %v", err)) continue } var i map[string]any @@ -524,6 +526,13 @@ func CollectSystems(c *gofish.APIClient, q *QueryParams) ([]byte, error) { "EthernetInterfaces": i["EthernetInterfaces"], }) } + if util.HasErrors(errList) { + err = util.FormatErrorList(errList) + if err != nil { + return nil, fmt.Errorf("multiple errors occurred: %v", err) + } + } + } data := map[string]any{"Systems": temp} From 495ee9cc2a99e2e0f0eeec0fa2afd35c803c8396 Mon Sep 17 00:00:00 2001 From: David Allen Date: Mon, 20 May 2024 08:17:06 -0600 Subject: [PATCH 14/21] Added debug print to check for systems --- internal/collect.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/internal/collect.go b/internal/collect.go index 8a7c3cf..9f0b412 100644 --- a/internal/collect.go +++ b/internal/collect.go @@ -352,7 +352,7 @@ func CollectBios(client *bmclib.Client, q *QueryParams) ([]byte, error) { func CollectEthernetInterfaces(c *gofish.APIClient, q *QueryParams, systemID string) ([]byte, error) { systems, err := c.Service.Systems() if err != nil { - return nil, fmt.Errorf("failed to query storage systems (%v:%v): %v", q.Host, q.Port, err) + return nil, fmt.Errorf("failed to collect ethernet interfaces: (%v:%v): %v", q.Host, q.Port, err) } var ( @@ -507,6 +507,12 @@ func CollectSystems(c *gofish.APIClient, q *QueryParams) ([]byte, error) { } } else { + b, err := json.Marshal(systems) + if err != nil { + fmt.Printf("failed to marshal systems: %v", err) + } + fmt.Printf("systems: %v\n", string(b)) + // query the system's ethernet interfaces // var temp []map[string]any var errList []error From 63669ad369274dade8cbf5c2e5aa6d669208a150 Mon Sep 17 00:00:00 2001 From: David Allen Date: Wed, 22 May 2024 14:44:32 -0600 Subject: [PATCH 15/21] Changed how CollectSystem fetches system data --- internal/collect.go | 257 +++++++++++++++++++++++++----------------- internal/util/util.go | 1 + 2 files changed, 153 insertions(+), 105 deletions(-) diff --git a/internal/collect.go b/internal/collect.go index 9f0b412..c8b442b 100644 --- a/internal/collect.go +++ b/internal/collect.go @@ -350,9 +350,14 @@ func CollectBios(client *bmclib.Client, q *QueryParams) ([]byte, error) { } func CollectEthernetInterfaces(c *gofish.APIClient, q *QueryParams, systemID string) ([]byte, error) { + // TODO: add more endpoints to test for ethernet interfaces + // /redfish/v1/Chassis/{ChassisID}/NetworkAdapters/{NetworkAdapterId}/NetworkDeviceFunctions/{NetworkDeviceFunctionId}/EthernetInterfaces/{EthernetInterfaceId} + // /redfish/v1/Managers/{ManagerId}/EthernetInterfaces/{EthernetInterfaceId} + // /redfish/v1/Systems/{ComputerSystemId}/EthernetInterfaces/{EthernetInterfaceId} + // /redfish/v1/Systems/{ComputerSystemId}/OperatingSystem/Containers/EthernetInterfaces/{EthernetInterfaceId} systems, err := c.Service.Systems() if err != nil { - return nil, fmt.Errorf("failed to collect ethernet interfaces: (%v:%v): %v", q.Host, q.Port, err) + return nil, fmt.Errorf("failed to get systems: (%v:%v): %v", q.Host, q.Port, err) } var ( @@ -362,18 +367,19 @@ func CollectEthernetInterfaces(c *gofish.APIClient, q *QueryParams, systemID str // get all of the ethernet interfaces in our systems for _, system := range systems { - i, err := redfish.ListReferencedEthernetInterfaces(c, "/redfish/v1/Systems/"+system.ID+"/EthernetInterfaces/") + system.EthernetInterfaces() + eth, err := redfish.ListReferencedEthernetInterfaces(c, "/redfish/v1/Systems/"+system.ID+"/EthernetInterfaces") if err != nil { errList = append(errList, err) - continue } - interfaces = append(interfaces, i...) + + interfaces = append(interfaces, eth...) } // print any report errors err = util.FormatErrorList(errList) if util.HasErrors(errList) { - return nil, fmt.Errorf("failed to get ethernet interfaces with %d errors: \n%v", len(errList), err) + return nil, fmt.Errorf("failed to get ethernet interfaces with %d error(s): \n%v", len(errList), err) } data := map[string]any{"EthernetInterfaces": interfaces} @@ -428,118 +434,159 @@ func CollectStorage(c *gofish.APIClient, q *QueryParams) ([]byte, error) { func CollectSystems(c *gofish.APIClient, q *QueryParams) ([]byte, error) { systems, err := c.Service.Systems() if err != nil { - return nil, fmt.Errorf("failed to query systems (%v:%v): %v", q.Host, q.Port, err) + return nil, fmt.Errorf("failed to get systems (%v:%v): %v", q.Host, q.Port, err) + } + + // 1. check if system has ethernet interfaces + // 1.a. if yes, create system data and ethernet interfaces JSON + // 1.b. if no, try to get data using manager instead + // 2. check if manager has "ManagerForServices" and "EthernetInterfaces" properties + // 2.a. if yes, query both properties to use in next step + // 2.b. for each service, query its data and add the ethernet interfaces + // 2.c. add the system to list of systems to marshal and return + var ( + temp []map[string]any + eths []*redfish.EthernetInterface + ) + + for _, system := range systems { + eths, err = system.EthernetInterfaces() + if err != nil { + return nil, fmt.Errorf("failed to get system ethernet interfaces: %v", err) + } + + // try and get ethernet interfaces through manager if empty + if len(eths) <= 0 { + for _, managerLink := range system.ManagedBy { + managers, err := redfish.ListReferencedManagers(c, managerLink) + if err != nil { + return nil, fmt.Errorf("failed to get system manager references: %v", err) + } + if len(managers) <= 0 { + manager := managers[0] + eths, err = manager.EthernetInterfaces() + if err != nil { + return nil, fmt.Errorf("failed to get system manager ethernet interfaces: %v", err) + } + } + } + } + + // add system to collection of systems + temp = append(temp, map[string]any{ + "Data": system, + "EthernetInterfaces": eths, + }) } // do manual requests if systems is empty to only get necessary info as last resort // /redfish/v1/Systems + // /redfish/v1/Systems/Members // /redfish/v1/Systems/ - fmt.Printf("system count: %d\n", len(systems)) - var temp []map[string]any - if len(systems) == 0 { - url := baseRedfishUrl(q) + "/Systems" - if q.Verbose { - fmt.Printf("%s\n", url) - } - res, body, err := util.MakeRequest(nil, url, "GET", nil, nil) - if err != nil { - return nil, fmt.Errorf("failed to make request: %v", err) - } else if res.StatusCode != http.StatusOK { - return nil, fmt.Errorf("request returned status code %d", res.StatusCode) - } + // fmt.Printf("system count: %d\n", len(systems)) + // if len(systems) == 0 { + // url := baseRedfishUrl(q) + "/Systems" + // if q.Verbose { + // fmt.Printf("%s\n", url) + // } + // res, body, err := util.MakeRequest(nil, url, "GET", nil, nil) + // if err != nil { + // return nil, fmt.Errorf("failed to make request: %v", err) + // } else if res.StatusCode != http.StatusOK { + // return nil, fmt.Errorf("request returned status code %d", res.StatusCode) + // } - // sweet syntatic sugar type aliases - type System = map[string]any - type Member = map[string]string + // // sweet syntatic sugar type aliases + // type System = map[string]any + // type Member = map[string]string - // get all the systems - var ( - tempSystems System - interfaces []*redfish.EthernetInterface - errList []error - ) - err = json.Unmarshal(body, &tempSystems) - if err != nil { - return nil, fmt.Errorf("failed to unmarshal systems: %v", err) - } + // // get all the systems + // var ( + // tempSystems System + // interfaces []*redfish.EthernetInterface + // errList []error + // ) + // err = json.Unmarshal(body, &tempSystems) + // if err != nil { + // return nil, fmt.Errorf("failed to unmarshal systems: %v", err) + // } - // then, get all the members within a system - members, ok := tempSystems["Members"] - if ok { - for _, member := range members.([]Member) { - id, ok := member["@odata.id"] - if ok { - // /redfish/v1/Systems/Self (or whatever) - // memberEndpoint := fmt.Sprintf("%s%s", url, id) - // res, body, err := util.MakeRequest(nil, baseRedfishUrl(q)+memberEndpoint, http.MethodGet, nil, nil) - // if err != nil { - // continue - // } else if res.StatusCode != http.StatusOK { - // continue - // } - // TODO: extract EthernetInterfaces from Systems then query + // // then, get all the members within a system + // members, ok := tempSystems["Members"] + // if ok { + // for _, member := range members.([]Member) { + // id, ok := member["@odata.id"] + // if ok { + // // /redfish/v1/Systems/Self (or whatever) + // // memberEndpoint := fmt.Sprintf("%s%s", url, id) + // // res, body, err := util.MakeRequest(nil, baseRedfishUrl(q)+memberEndpoint, http.MethodGet, nil, nil) + // // if err != nil { + // // continue + // // } else if res.StatusCode != http.StatusOK { + // // continue + // // } + // // TODO: extract EthernetInterfaces from Systems then query - // get all of the ethernet interfaces in our systems - ethernetInterface, err := redfish.ListReferencedEthernetInterfaces(c, id+"/EthernetInterfaces/") - if err != nil { - errList = append(errList, err) - continue - } - interfaces = append(interfaces, ethernetInterface...) - } else { - return nil, fmt.Errorf("no ID found for member") - } - if util.HasErrors(errList) { - return nil, util.FormatErrorList(errList) - } - } - i, err := json.Marshal(interfaces) - if err != nil { - return nil, fmt.Errorf("failed to unmarshal interface: %v", err) - } - temp = append(temp, map[string]any{ - "Data": nil, - "EthernetInterfaces": string(i), - }) - } else { - return nil, fmt.Errorf("no members found in systems") - } + // // get all of the ethernet interfaces in our systems + // ethernetInterface, err := redfish.ListReferencedEthernetInterfaces(c, id+"/EthernetInterfaces/") + // if err != nil { + // errList = append(errList, err) + // continue + // } + // interfaces = append(interfaces, ethernetInterface...) + // } else { + // return nil, fmt.Errorf("no ID found for member") + // } + // if util.HasErrors(errList) { + // return nil, util.FormatErrorList(errList) + // } + // } + // i, err := json.Marshal(interfaces) + // if err != nil { + // return nil, fmt.Errorf("failed to unmarshal interface: %v", err) + // } + // temp = append(temp, map[string]any{ + // "Data": nil, + // "EthernetInterfaces": string(i), + // }) + // } else { + // return nil, fmt.Errorf("no members found in systems") + // } - } else { - b, err := json.Marshal(systems) - if err != nil { - fmt.Printf("failed to marshal systems: %v", err) - } - fmt.Printf("systems: %v\n", string(b)) + // } else { + // b, err := json.Marshal(systems) + // if err != nil { + // fmt.Printf("failed to marshal systems: %v", err) + // } + // fmt.Printf("systems: %v\n", string(b)) - // query the system's ethernet interfaces - // var temp []map[string]any - var errList []error - for _, system := range systems { - interfaces, err := CollectEthernetInterfaces(c, q, system.ID) - if err != nil { - errList = append(errList, fmt.Errorf("failed to collect ethernet interface: %v", err)) - continue - } - var i map[string]any - err = json.Unmarshal(interfaces, &i) - if err != nil { - return nil, fmt.Errorf("failed to unmarshal interface: %v", err) - } - temp = append(temp, map[string]any{ - "Data": system, - "EthernetInterfaces": i["EthernetInterfaces"], - }) - } - if util.HasErrors(errList) { - err = util.FormatErrorList(errList) - if err != nil { - return nil, fmt.Errorf("multiple errors occurred: %v", err) - } - } - - } + // // query the system's ethernet interfaces + // // var temp []map[string]any + // var errList []error + // for _, system := range systems { + // interfaces, err := CollectEthernetInterfaces(c, q, system.ID) + // if err != nil { + // errList = append(errList, fmt.Errorf("failed to collect ethernet interface: %v", err)) + // continue + // } + // var i map[string]any + // err = json.Unmarshal(interfaces, &i) + // if err != nil { + // return nil, fmt.Errorf("failed to unmarshal interface: %v", err) + // } + // temp = append(temp, map[string]any{ + // "Data": system, + // "EthernetInterfaces": i["EthernetInterfaces"], + // }) + // } + // if util.HasErrors(errList) { + // err = util.FormatErrorList(errList) + // if err != nil { + // return nil, fmt.Errorf("multiple errors occurred: %v", err) + // } + // } + // } data := map[string]any{"Systems": temp} b, err := json.MarshalIndent(data, "", " ") diff --git a/internal/util/util.go b/internal/util/util.go index 9c80601..a0ba641 100644 --- a/internal/util/util.go +++ b/internal/util/util.go @@ -103,6 +103,7 @@ func FormatErrorList(errList []error) error { var err error for i, e := range errList { err = fmt.Errorf("\t[%d] %v\n", i, e) + i += 1 } return err } From 8436d8923ebdd92f241487bb712c2c33fb456a1a Mon Sep 17 00:00:00 2001 From: David Allen Date: Tue, 28 May 2024 17:20:17 -0600 Subject: [PATCH 16/21] Fixed comparison for managers --- internal/collect.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/collect.go b/internal/collect.go index c8b442b..11a1f71 100644 --- a/internal/collect.go +++ b/internal/collect.go @@ -462,7 +462,7 @@ func CollectSystems(c *gofish.APIClient, q *QueryParams) ([]byte, error) { if err != nil { return nil, fmt.Errorf("failed to get system manager references: %v", err) } - if len(managers) <= 0 { + if len(managers) >= 0 { manager := managers[0] eths, err = manager.EthernetInterfaces() if err != nil { From a5644476f35abd6aad25db81827b158961cffb5e Mon Sep 17 00:00:00 2001 From: David Allen Date: Tue, 28 May 2024 17:27:00 -0600 Subject: [PATCH 17/21] Fixed comparison again... --- internal/collect.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/collect.go b/internal/collect.go index 11a1f71..060de59 100644 --- a/internal/collect.go +++ b/internal/collect.go @@ -462,7 +462,7 @@ func CollectSystems(c *gofish.APIClient, q *QueryParams) ([]byte, error) { if err != nil { return nil, fmt.Errorf("failed to get system manager references: %v", err) } - if len(managers) >= 0 { + if len(managers) > 0 { manager := managers[0] eths, err = manager.EthernetInterfaces() if err != nil { From 389a61be1b5b5190784f9ae03100f1d83ab8a530 Mon Sep 17 00:00:00 2001 From: David Allen Date: Wed, 29 May 2024 13:58:44 -0600 Subject: [PATCH 18/21] Changed how ethernet interfaces are retrieved via managers --- internal/collect.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/internal/collect.go b/internal/collect.go index 060de59..ad08cbd 100644 --- a/internal/collect.go +++ b/internal/collect.go @@ -457,17 +457,17 @@ func CollectSystems(c *gofish.APIClient, q *QueryParams) ([]byte, error) { // try and get ethernet interfaces through manager if empty if len(eths) <= 0 { + if q.Verbose { + fmt.Printf("no system ethernet interfaces found...trying to get from managers interface") + } for _, managerLink := range system.ManagedBy { - managers, err := redfish.ListReferencedManagers(c, managerLink) + // try getting ethernet interface from all managers until one is found + eths, err = redfish.ListReferencedEthernetInterfaces(c, managerLink) if err != nil { - return nil, fmt.Errorf("failed to get system manager references: %v", err) + return nil, fmt.Errorf("failed to get system manager ethernet interfaces: %v", err) } - if len(managers) > 0 { - manager := managers[0] - eths, err = manager.EthernetInterfaces() - if err != nil { - return nil, fmt.Errorf("failed to get system manager ethernet interfaces: %v", err) - } + if len(eths) > 0 { + break } } } From 804342783ad8f0f0dae75ca66c6e5a47cd2b7816 Mon Sep 17 00:00:00 2001 From: David Allen Date: Wed, 29 May 2024 14:07:58 -0600 Subject: [PATCH 19/21] Appended EthernetInterfaces to manager link string --- internal/collect.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/collect.go b/internal/collect.go index ad08cbd..9475050 100644 --- a/internal/collect.go +++ b/internal/collect.go @@ -462,7 +462,7 @@ func CollectSystems(c *gofish.APIClient, q *QueryParams) ([]byte, error) { } for _, managerLink := range system.ManagedBy { // try getting ethernet interface from all managers until one is found - eths, err = redfish.ListReferencedEthernetInterfaces(c, managerLink) + eths, err = redfish.ListReferencedEthernetInterfaces(c, managerLink+"/EthernetInterfaces") if err != nil { return nil, fmt.Errorf("failed to get system manager ethernet interfaces: %v", err) } From 00ead8954a05542793af2c1cfe049f6dec5ae074 Mon Sep 17 00:00:00 2001 From: David Allen Date: Tue, 4 Jun 2024 12:14:42 -0600 Subject: [PATCH 20/21] Added small improvements to some print messages --- internal/collect.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/internal/collect.go b/internal/collect.go index 9475050..7e8419f 100644 --- a/internal/collect.go +++ b/internal/collect.go @@ -138,7 +138,7 @@ func CollectAll(probeStates *[]ScannedResult, l *log.Logger, q *QueryParams) err } err = json.Unmarshal(systems, &rm) if err != nil { - l.Log.Errorf("failed to unmarshal system JSON: %v", err) + l.Log.Errorf("failed to unmarshal system JSON after collect: %v", err) } data["Systems"] = rm["Systems"] @@ -166,7 +166,7 @@ func CollectAll(probeStates *[]ScannedResult, l *log.Logger, q *QueryParams) err body, err := json.MarshalIndent(data, "", " ") if err != nil { - l.Log.Errorf("failed to marshal JSON: %v", err) + l.Log.Errorf("failed to marshal output to JSON: %v", err) } if q.Verbose { @@ -458,7 +458,7 @@ func CollectSystems(c *gofish.APIClient, q *QueryParams) ([]byte, error) { // try and get ethernet interfaces through manager if empty if len(eths) <= 0 { if q.Verbose { - fmt.Printf("no system ethernet interfaces found...trying to get from managers interface") + fmt.Printf("no system ethernet interfaces found...trying to get from managers interface\n") } for _, managerLink := range system.ManagedBy { // try getting ethernet interface from all managers until one is found From 68069558ee038d3d2006687cd9a05c11ea7e946b Mon Sep 17 00:00:00 2001 From: David Allen Date: Wed, 5 Jun 2024 08:35:13 -0600 Subject: [PATCH 21/21] Added print for systems before unmarshaling --- internal/collect.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/internal/collect.go b/internal/collect.go index 7e8419f..74cbc13 100644 --- a/internal/collect.go +++ b/internal/collect.go @@ -144,7 +144,8 @@ func CollectAll(probeStates *[]ScannedResult, l *log.Logger, q *QueryParams) err // add other fields from systems if len(rm["Systems"]) > 0 { - var s map[string][]interface{} + var s map[string][]any + fmt.Printf("Systems before unmarshaling: %v\n", string(rm["Systems"])) err = json.Unmarshal(rm["Systems"], &s) if err != nil { l.Log.Errorf("failed to unmarshal systems JSON: %v", err)