diff --git a/cmd/ooni/main.go b/cmd/ooni/main.go index 748fb31..d6567bc 100644 --- a/cmd/ooni/main.go +++ b/cmd/ooni/main.go @@ -2,7 +2,6 @@ package main import ( // commands - "github.com/apex/log" _ "github.com/ooni/probe-cli/internal/cli/geoip" _ "github.com/ooni/probe-cli/internal/cli/info" @@ -14,17 +13,11 @@ import ( _ "github.com/ooni/probe-cli/internal/cli/show" _ "github.com/ooni/probe-cli/internal/cli/upload" _ "github.com/ooni/probe-cli/internal/cli/version" + "github.com/ooni/probe-cli/internal/crashreport" "github.com/ooni/probe-cli/internal/cli/app" - "github.com/ooni/probe-cli/internal/crashreport" ) func main() { - crashreport.CapturePanicAndWait(func() { - err := app.Run() - if err == nil { - return - } - log.WithError(err).Fatal("main exit") - }, nil) + crashreport.CapturePanicAndWait(app.Run, nil) } diff --git a/internal/cli/app/app.go b/internal/cli/app/app.go index 539874c..c1b4cfb 100644 --- a/internal/cli/app/app.go +++ b/internal/cli/app/app.go @@ -3,13 +3,17 @@ package app import ( "os" + "github.com/apex/log" ooni "github.com/ooni/probe-cli" "github.com/ooni/probe-cli/internal/cli/root" ) // Run the app. This is the main app entry point -func Run() error { +func Run() { root.Cmd.Version(ooni.Version) _, err := root.Cmd.Parse(os.Args[1:]) - return err + if err != nil { + log.WithError(err).Error("failed to parse arguments") + } + return } diff --git a/internal/database/actions.go b/internal/database/actions.go index a002663..0a997ac 100644 --- a/internal/database/actions.go +++ b/internal/database/actions.go @@ -3,6 +3,7 @@ package database import ( "database/sql" "encoding/json" + "reflect" "time" "github.com/apex/log" @@ -221,16 +222,29 @@ func CreateOrUpdateURL(sess sqlbuilder.Database, url string, categoryCode string // AddTestKeys writes the summary to the measurement func AddTestKeys(sess sqlbuilder.Database, msmt *Measurement, tk interface{}) error { + var ( + isAnomaly bool + isAnomalyValid bool + ) tkBytes, err := json.Marshal(tk) if err != nil { log.WithError(err).Error("failed to serialize summary") } - isAnomaly := tk.(struct{ IsAnomaly bool }).IsAnomaly + + // This is necessary so that we can extract from the the opaque testKeys just + // the IsAnomaly field of bool type. + // Maybe generics are not so bad after-all, heh golang? + isAnomalyValue := reflect.ValueOf(tk).FieldByName("IsAnomaly") + if isAnomalyValue.IsValid() == true && isAnomalyValue.Kind() == reflect.Bool { + isAnomaly = isAnomalyValue.Bool() + isAnomalyValid = true + } msmt.TestKeys = string(tkBytes) - msmt.IsAnomaly = sql.NullBool{Bool: isAnomaly, Valid: true} + msmt.IsAnomaly = sql.NullBool{Bool: isAnomaly, Valid: isAnomalyValid} err = sess.Collection("measurements").Find("id", msmt.ID).Update(msmt) if err != nil { + log.WithError(err).Error("failed to update measurement") return errors.Wrap(err, "updating measurement") } return nil diff --git a/nettests/nettests.go b/nettests/nettests.go index 5f4e242..ce9b720 100644 --- a/nettests/nettests.go +++ b/nettests/nettests.go @@ -12,9 +12,11 @@ import ( "github.com/fatih/color" "github.com/measurement-kit/go-measurement-kit" ooni "github.com/ooni/probe-cli" + "github.com/ooni/probe-cli/internal/crashreport" "github.com/ooni/probe-cli/internal/database" "github.com/ooni/probe-cli/internal/output" "github.com/ooni/probe-cli/utils" + "github.com/ooni/probe-cli/utils/strcase" ) // Nettest interface. Every Nettest should implement this. @@ -70,7 +72,7 @@ func (c *Controller) Init(nt *mk.Nettest) error { // These values are shared by every measurement reportID := sql.NullString{String: "", Valid: false} - testName := nt.Name + testName := strcase.ToSnake(nt.Name) resultID := c.res.ID reportFilePath := c.msmtPath @@ -270,7 +272,9 @@ func (c *Controller) Init(nt *mk.Nettest) error { nt.On("measurement", func(e mk.Event) { log.Debugf("status.end") - c.OnEntry(e.Value.Idx, e.Value.JSONStr) + crashreport.CapturePanicAndWait(func() { + c.OnEntry(e.Value.Idx, e.Value.JSONStr) + }, nil) }) nt.On("status.end", func(e mk.Event) {