From eb8ed963fb7849c91ba7c02afb4a0049abcd2e35 Mon Sep 17 00:00:00 2001 From: Cisco Cervellera <16772290+ciscoski@users.noreply.github.com> Date: Thu, 13 May 2021 21:14:39 +0100 Subject: [PATCH 1/2] Added compatibility for cambridge-fibre backend GetIP for speedtest.cambridgefibre.uk retuns * a body which is not empty when queried with empty parameters * Just a string with IP informaiton (no distance) The code will not stop in this case but will printout a debug message. --- defs/server.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/defs/server.go b/defs/server.go index 33417eb..370b826 100644 --- a/defs/server.go +++ b/defs/server.go @@ -60,8 +60,11 @@ func (s *Server) IsUp() bool { } defer resp.Body.Close() b, _ := ioutil.ReadAll(resp.Body) + if len(b) > 0 { + log.Debugf("Failed when parsing get IP result: %s", b) + } // only return online if the ping URL returns nothing and 200 - return len(b) == 0 && resp.StatusCode == http.StatusOK + return resp.StatusCode == http.StatusOK } // ICMPPingAndJitter pings the server via ICMP echos and calculate the average ping and jitter @@ -412,6 +415,7 @@ func (s *Server) GetIPInfo(distanceUnit string) (*GetIPResult, error) { if err := json.Unmarshal(b, &ipInfo); err != nil { log.Debugf("Failed when parsing get IP result: %s", err) log.Debugf("Received payload: %s", b) + ipInfo.ProcessedString = string(b[:]) } } From 8345bac9f1ce26aab7e79152dd2b9fc38331162d Mon Sep 17 00:00:00 2001 From: Cisco Cervellera Date: Fri, 14 May 2021 13:27:27 +0100 Subject: [PATCH 2/2] Improved format for JSON and CSV output for multiple server. The JSON output is now a list of objects one per server. The CSV output has no empty rows. --- speedtest/helper.go | 42 ++++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/speedtest/helper.go b/speedtest/helper.go index a357c66..fa8a408 100644 --- a/speedtest/helper.go +++ b/speedtest/helper.go @@ -32,6 +32,9 @@ func doSpeedTest(c *cli.Context, servers []defs.Server, telemetryServer defs.Tel log.Infof("Testing against %d servers", serverCount) } + var reps_json []report.JSONReport + var reps_csv []report.CSVReport + // fetch current user's IP info for _, currentServer := range servers { // get telemetry level @@ -140,8 +143,6 @@ func doSpeedTest(c *cli.Context, servers []defs.Server, telemetryServer defs.Tel // check for --csv or --json. the program prioritize the --csv before the --json. this is the same behavior as speedtest-cli if c.Bool(defs.OptionCSV) { // print csv if --csv is given - var reps []report.CSVReport - var rep report.CSVReport rep.Timestamp = time.Now() @@ -154,14 +155,7 @@ func doSpeedTest(c *cli.Context, servers []defs.Server, telemetryServer defs.Tel rep.Share = shareLink rep.IP = ispInfo.RawISPInfo.IP - reps = append(reps, rep) - - var buf bytes.Buffer - if err := gocsv.MarshalWithoutHeaders(&reps, &buf); err != nil { - log.Errorf("Error generating CSV report: %s", err) - } else { - log.Warn(buf.String()) - } + reps_csv = append(reps_csv, rep) } else if c.Bool(defs.OptionJSON) { // print json if --json is given var rep report.JSONReport @@ -180,23 +174,35 @@ func doSpeedTest(c *cli.Context, servers []defs.Server, telemetryServer defs.Tel rep.Client = report.Client{ispInfo.RawISPInfo} rep.Client.Readme = "" - - if b, err := json.Marshal(&rep); err != nil { - log.Errorf("Error generating JSON report: %s", err) - } else { - log.Warnf("%s", b) - } + + reps_json = append(reps_json,rep) } } else { log.Infof("Selected server %s (%s) is not responding at the moment, try again later", currentServer.Name, u.Hostname()) } - // add a new line after each test if testing multiple servers - if len(servers) > 1 { + //add a new line after each test if testing multiple servers + if ( len(servers) > 1 && !silent){ log.Warn() } } + // check for --csv or --json. the program prioritize the --csv before the --json. this is the same behavior as speedtest-cli + if c.Bool(defs.OptionCSV) { + var buf bytes.Buffer + if err := gocsv.MarshalWithoutHeaders(&reps_csv, &buf); err != nil { + log.Errorf("Error generating CSV report: %s", err) + } else { + log.Warn(buf.String()) + } + } else if c.Bool(defs.OptionJSON) { + if b, err := json.Marshal(&reps_json); err != nil { + log.Errorf("Error generating JSON report: %s", err) + } else { + log.Warnf("%s", b) + } + } + return nil }