From e0390992638f5fb7ffa2e5c8b853fc268d7a1169 Mon Sep 17 00:00:00 2001 From: "David J. Allen" Date: Tue, 24 Oct 2023 14:33:32 -0600 Subject: [PATCH 1/3] Changed how arguments are passed to `magellan.sh` script --- bin/magellan.sh | 54 ++++++++++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/bin/magellan.sh b/bin/magellan.sh index 3482337..98b3a37 100755 --- a/bin/magellan.sh +++ b/bin/magellan.sh @@ -11,6 +11,8 @@ THREADS="1" TIMEOUT="30" ARGS="" FORCE_UPDATE=false +SCAN_PARAMS="" +COLLECT_PARAMS="" function build(){ @@ -19,11 +21,11 @@ function build(){ function scan() { # ./magellan scan --subnet 172.16.0.0 --port 443 - ${EXE} scan \ - --subnet ${SUBNETS} \ - --port ${PORTS} \ - --timeout ${TIMEOUT} \ - --threads ${THREADS} + ${EXE} scan ${SCAN_PARAMS} + # --subnet ${SUBNETS} \ + # --port ${PORTS} \ + # --timeout ${TIMEOUT} \ + # --threads ${THREADS} } function list(){ @@ -33,20 +35,30 @@ function list(){ function collect() { # ./magellan collect --user admin --pass password - ${EXE} collect \ - --user ${USER} \ - --pass ${PASS} \ - --timeout ${TIMEOUT} \ - --threads ${THREADS} \ - --host ${SMD_HOST} \ - --port ${SMD_PORT} \ - --force-update ${FORCE_UPDATE} + ${EXE} collect ${COLLECT_PARAMS} + # --user ${USER} \ + # --pass ${PASS} \ + # --timeout ${TIMEOUT} \ + # --threads ${THREADS} \ + # --host ${SMD_HOST} \ + # --port ${SMD_PORT} \ + # --force-update ${FORCE_UPDATE} } # parse incoming arguments to set variables while [[ $# -gt 0 ]]; do case $1 in + --scan) + SCAN_PARAMS="$2" + shift + shift + ;; + --collect) + COLLECT_PARAMS="$2" + shift + shift + ;; --subnet) SUBNETS="$2" shift # past argument @@ -100,19 +112,15 @@ done set -- "${POSITIONAL_ARGS[@]}" # restore positional parameters -echo "SMD host = ${SMD_HOST}" -echo "SMD port = ${SMD_PORT}" -echo "subnets = ${SUBNETS}" -echo "ports = ${PORTS}" -echo "user = ${USER}" -echo "threads = ${THREADS}" -echo "timeout = ${TIMEOUT}" -echo "pass = ..." - if [[ -n $1 ]]; then echo "Last line of file specified as non-opt/last argument:" tail -1 "$1" fi scan -collect \ No newline at end of file +collect + +# run with docker +# docker run magellan:latest magellan.sh \ +# --scan "--subnet 127.16.0.0 --port 443" \ +# --collect "--user admin --pass password --timeout 300 --threads 1 --smd-host host --smd-port port" \ No newline at end of file From 47f773df2a6ca0977c383adec5465be3894ecc64 Mon Sep 17 00:00:00 2001 From: "David J. Allen" Date: Wed, 25 Oct 2023 12:13:21 -0600 Subject: [PATCH 2/3] Changed how the data is outputted to stdout and fixed xname issue --- internal/collect.go | 93 +++++++++++++++------------------------------ 1 file changed, 31 insertions(+), 62 deletions(-) diff --git a/internal/collect.go b/internal/collect.go index a8fb815..5c7ffb7 100644 --- a/internal/collect.go +++ b/internal/collect.go @@ -121,17 +121,9 @@ func CollectAll(probeStates *[]ScannedResult, l *log.Logger, q *QueryParams) err found := make([]string, 0, len(*probeStates)) done := make(chan struct{}, q.Threads+1) chanProbeState := make(chan ScannedResult, q.Threads+1) - - // generate custom xnames for bmcs - node := xnames.Node{ - Cabinet: 1000, - Chassis: 1, - ComputeModule: 7, - NodeBMC: -1, - } - - + // collect bmc information asynchronously + var offset = 0 var wg sync.WaitGroup wg.Add(q.Threads) for i := 0; i < q.Threads; i++ { @@ -144,13 +136,20 @@ func CollectAll(probeStates *[]ScannedResult, l *log.Logger, q *QueryParams) err } q.Host = ps.Host q.Port = ps.Port - - node.NodeBMC += 1 - - bmclibClient, err := NewClient(l, q) - if err != nil { - l.Log.Errorf("could not make client: %v", err) + + // generate custom xnames for bmcs + node := xnames.Node{ + Cabinet: 1000, + Chassis: 1, + ComputeModule: 7, + NodeBMC: offset, } + offset += 1 + + // bmclibClient, err := NewClient(l, q) + // if err != nil { + // l.Log.Errorf("could not make client: %v", err) + // } gofishClient, err := connectGofish(q) if err != nil { @@ -173,14 +172,14 @@ func CollectAll(probeStates *[]ScannedResult, l *log.Logger, q *QueryParams) err var rm map[string]json.RawMessage // inventories - if bmclibClient != nil { - inventory, err := CollectInventory(bmclibClient, q) - if err != nil { - l.Log.Errorf("could not query inventory (%v:%v): %v", q.Host, q.Port, err) - } - json.Unmarshal(inventory, &rm) - data["Inventory"] = rm["Inventory"] - } + // if bmclibClient != nil { + // inventory, err := CollectInventory(bmclibClient, q) + // if err != nil { + // l.Log.Errorf("could not query inventory (%v:%v): %v", q.Host, q.Port, err) + // } + // json.Unmarshal(inventory, &rm) + // data["Inventory"] = rm["Inventory"] + // } // chassis if gofishClient != nil { @@ -211,25 +210,29 @@ func CollectAll(probeStates *[]ScannedResult, l *log.Logger, q *QueryParams) err headers := make(map[string]string) headers["Content-Type"] = "application/json" - b, err := json.MarshalIndent(data, "", " ") + body, err := json.MarshalIndent(data, "", " ") if err != nil { l.Log.Errorf("could not marshal JSON: %v", err) } + if q.Verbose { + fmt.Printf("%v\n", string(body)) + } + // write JSON data to file - err = os.WriteFile(path.Clean(outputPath + "/" + q.Host + ".json"), b, os.ModePerm) + err = os.WriteFile(path.Clean(outputPath + "/" + q.Host + ".json"), body, os.ModePerm) if err != nil { l.Log.Errorf("could not write data to file: %v", err) } // add all endpoints to smd - err = smd.AddRedfishEndpoint(b, headers) + err = smd.AddRedfishEndpoint(body, headers) if err != nil { l.Log.Error(err) // try updating instead if q.ForceUpdate { - err = smd.UpdateRedfishEndpoint(data["ID"].(string), b, headers) + err = smd.UpdateRedfishEndpoint(data["ID"].(string), body, headers) if err != nil { l.Log.Error(err) } @@ -296,9 +299,6 @@ func CollectMetadata(client *bmclib.Client, q *QueryParams) ([]byte, error) { return nil, fmt.Errorf("could not marshal JSON: %v", err) } - if q.Verbose { - fmt.Printf("Metadata: %v\n", string(b)) - } ctxCancel() return b, nil } @@ -328,9 +328,6 @@ func CollectInventory(client *bmclib.Client, q *QueryParams) ([]byte, error) { return nil, fmt.Errorf("could not marshal JSON: %v", err) } - if q.Verbose { - fmt.Printf("%v\n", string(b)) - } ctxCancel() return b, nil } @@ -358,9 +355,6 @@ func CollectPowerState(client *bmclib.Client, q *QueryParams) ([]byte, error) { return nil, fmt.Errorf("could not marshal JSON: %v", err) } - if q.Verbose { - fmt.Printf("%v\n", string(b)) - } ctxCancel() return b, nil @@ -392,11 +386,7 @@ func CollectUsers(client *bmclib.Client, q *QueryParams) ([]byte, error) { return nil, fmt.Errorf("could not marshal JSON: %v", err) } - // return b, nil ctxCancel() - if q.Verbose { - fmt.Printf("%v\n", string(b)) - } return b, nil } @@ -406,9 +396,6 @@ func CollectBios(client *bmclib.Client, q *QueryParams) ([]byte, error) { // return nil, fmt.Errorf("could not make query: %v", err) // } b, err := makeRequest(client, client.GetBiosConfiguration, q.Timeout) - if q.Verbose { - fmt.Printf("%v\n", string(b)) - } return b, err } @@ -437,9 +424,6 @@ func CollectEthernetInterfaces(c *gofish.APIClient, q *QueryParams, systemID str return nil, fmt.Errorf("could not marshal JSON: %v", err) } - // if q.Verbose { - // fmt.Printf("%v\n", string(b)) - // } return b, nil } @@ -455,9 +439,6 @@ func CollectChassis(c *gofish.APIClient, q *QueryParams) ([]byte, error) { return nil, fmt.Errorf("could not marshal JSON: %v", err) } - if q.Verbose { - fmt.Printf("%v\n", string(b)) - } return b, nil } @@ -483,9 +464,6 @@ func CollectStorage(c *gofish.APIClient, q *QueryParams) ([]byte, error) { return nil, fmt.Errorf("could not marshal JSON: %v", err) } - if q.Verbose { - fmt.Printf("%v\n", string(b)) - } return b, nil } @@ -516,9 +494,6 @@ func CollectSystems(c *gofish.APIClient, q *QueryParams) ([]byte, error) { return nil, fmt.Errorf("could not marshal JSON: %v", err) } - if q.Verbose { - fmt.Printf("%v\n", string(b)) - } return b, nil } @@ -534,9 +509,6 @@ func CollectRegisteries(c *gofish.APIClient, q *QueryParams) ([]byte, error) { return nil, fmt.Errorf("could not marshal JSON: %v", err) } - if q.Verbose { - fmt.Printf("%v\n", string(b)) - } return b, nil } @@ -577,9 +549,6 @@ func CollectProcessors(q *QueryParams) ([]byte, error) { return nil, fmt.Errorf("could not marshal JSON: %v", err) } - if q.Verbose { - fmt.Printf("%v\n", string(b)) - } return b, nil } From c5611f598f63dfb085ead7978d713fa22eaf3829 Mon Sep 17 00:00:00 2001 From: "David J. Allen" Date: Wed, 25 Oct 2023 12:13:53 -0600 Subject: [PATCH 3/3] Changed the error message when attempting to add redfish endpoint --- internal/api/smd/smd.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/api/smd/smd.go b/internal/api/smd/smd.go index 291ea79..40bcdec 100644 --- a/internal/api/smd/smd.go +++ b/internal/api/smd/smd.go @@ -53,7 +53,7 @@ func AddRedfishEndpoint(data []byte, headers map[string]string) error { if res != nil { statusOk := res.StatusCode >= 200 && res.StatusCode < 300 if !statusOk { - return fmt.Errorf("could not add redfish endpoint") + return fmt.Errorf("returned status code %d when adding endpoint", res.StatusCode) } fmt.Printf("%v (%v)\n%s\n", url, res.Status, string(body)) }