fix(ooniprobe): use ooniprobe-cli-unattended for unattended runs (#714)
This diff changes the software name used by unattended runs for which we did not override the default software name (`ooniprobe-cli`). It will become `ooniprobe-cli-unattended`. This software name is in line with the one we use for Android, iOS, and desktop unattended runs. While working in this diff, I introduced string constants for the run types and a string constant for the default software name. See https://github.com/ooni/probe/issues/2081.
This commit is contained in:
parent
596bdf6e57
commit
d3c5196474
|
@ -8,6 +8,7 @@ import (
|
|||
"github.com/ooni/probe-cli/v3/cmd/ooniprobe/internal/cli/root"
|
||||
"github.com/ooni/probe-cli/v3/cmd/ooniprobe/internal/ooni"
|
||||
"github.com/ooni/probe-cli/v3/cmd/ooniprobe/internal/output"
|
||||
"github.com/ooni/probe-cli/v3/internal/model"
|
||||
)
|
||||
|
||||
func init() {
|
||||
|
@ -36,7 +37,7 @@ func dogeoip(config dogeoipconfig) error {
|
|||
return err
|
||||
}
|
||||
|
||||
engine, err := probeCLI.NewProbeEngine(context.Background())
|
||||
engine, err := probeCLI.NewProbeEngine(context.Background(), model.RunTypeManual)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
|
@ -40,7 +40,7 @@ func init() {
|
|||
|
||||
softwareName := Cmd.Flag(
|
||||
"software-name", "Override application name",
|
||||
).Default("ooniprobe-cli").String()
|
||||
).Default(ooni.DefaultSoftwareName).String()
|
||||
softwareVersion := Cmd.Flag(
|
||||
"software-version", "Override the application version",
|
||||
).Default(version.Version).String()
|
||||
|
|
|
@ -8,6 +8,7 @@ import (
|
|||
"github.com/ooni/probe-cli/v3/cmd/ooniprobe/internal/cli/root"
|
||||
"github.com/ooni/probe-cli/v3/cmd/ooniprobe/internal/nettests"
|
||||
"github.com/ooni/probe-cli/v3/cmd/ooniprobe/internal/ooni"
|
||||
"github.com/ooni/probe-cli/v3/internal/model"
|
||||
)
|
||||
|
||||
func init() {
|
||||
|
@ -32,7 +33,7 @@ func init() {
|
|||
return nil
|
||||
})
|
||||
|
||||
functionalRun := func(runType string, pred func(name string, gr nettests.Group) bool) error {
|
||||
functionalRun := func(runType model.RunType, pred func(name string, gr nettests.Group) bool) error {
|
||||
for name, group := range nettests.All {
|
||||
if !pred(name, group) {
|
||||
continue
|
||||
|
@ -52,7 +53,7 @@ func init() {
|
|||
|
||||
genRunWithGroupName := func(targetName string) func(*kingpin.ParseContext) error {
|
||||
return func(*kingpin.ParseContext) error {
|
||||
return functionalRun("manual", func(groupName string, gr nettests.Group) bool {
|
||||
return functionalRun(model.RunTypeManual, func(groupName string, gr nettests.Group) bool {
|
||||
return groupName == targetName
|
||||
})
|
||||
}
|
||||
|
@ -68,7 +69,7 @@ func init() {
|
|||
Probe: probe,
|
||||
InputFiles: *inputFile,
|
||||
Inputs: *input,
|
||||
RunType: "manual",
|
||||
RunType: model.RunTypeManual,
|
||||
})
|
||||
})
|
||||
|
||||
|
@ -80,14 +81,14 @@ func init() {
|
|||
|
||||
unattendedCmd := cmd.Command("unattended", "")
|
||||
unattendedCmd.Action(func(_ *kingpin.ParseContext) error {
|
||||
return functionalRun("timed", func(name string, gr nettests.Group) bool {
|
||||
return functionalRun(model.RunTypeTimed, func(name string, gr nettests.Group) bool {
|
||||
return gr.UnattendedOK
|
||||
})
|
||||
})
|
||||
|
||||
allCmd := cmd.Command("all", "").Default()
|
||||
allCmd.Action(func(_ *kingpin.ParseContext) error {
|
||||
return functionalRun("manual", func(name string, gr nettests.Group) bool {
|
||||
return functionalRun(model.RunTypeManual, func(name string, gr nettests.Group) bool {
|
||||
return true
|
||||
})
|
||||
})
|
||||
|
|
|
@ -55,8 +55,8 @@ type Controller struct {
|
|||
Inputs []string
|
||||
|
||||
// RunType contains the run_type hint for the CheckIn API. If
|
||||
// not set, the underlying code defaults to "timed".
|
||||
RunType string
|
||||
// not set, the underlying code defaults to model.RunTypeTimed.
|
||||
RunType model.RunType
|
||||
|
||||
// numInputs is the total number of inputs
|
||||
numInputs int
|
||||
|
@ -154,7 +154,7 @@ func (c *Controller) Run(builder *engine.ExperimentBuilder, inputs []string) err
|
|||
}
|
||||
|
||||
maxRuntime := time.Duration(c.Probe.Config().Nettests.WebsitesMaxRuntime) * time.Second
|
||||
if c.RunType == "timed" && maxRuntime > 0 {
|
||||
if c.RunType == model.RunTypeTimed && maxRuntime > 0 {
|
||||
log.Debug("disabling maxRuntime when running in the background")
|
||||
maxRuntime = 0
|
||||
}
|
||||
|
@ -267,7 +267,7 @@ func (c *Controller) OnProgress(perc float64, msg string) {
|
|||
maxRuntime := time.Duration(c.Probe.Config().Nettests.WebsitesMaxRuntime) * time.Second
|
||||
_, isWebConnectivity := c.nt.(WebConnectivity)
|
||||
userProvidedInput := len(c.Inputs) > 0 || len(c.InputFiles) > 0
|
||||
if c.RunType == "manual" && maxRuntime > 0 && isWebConnectivity && !userProvidedInput {
|
||||
if c.RunType == model.RunTypeManual && maxRuntime > 0 && isWebConnectivity && !userProvidedInput {
|
||||
elapsed := time.Since(c.ntStartTime)
|
||||
perc = float64(elapsed) / float64(maxRuntime)
|
||||
eta := maxRuntime.Seconds() - elapsed.Seconds()
|
||||
|
|
|
@ -9,6 +9,7 @@ import (
|
|||
|
||||
"github.com/ooni/probe-cli/v3/cmd/ooniprobe/internal/database"
|
||||
"github.com/ooni/probe-cli/v3/cmd/ooniprobe/internal/ooni"
|
||||
"github.com/ooni/probe-cli/v3/internal/model"
|
||||
)
|
||||
|
||||
func copyfile(source, dest string) error {
|
||||
|
@ -45,7 +46,7 @@ func TestCreateContext(t *testing.T) {
|
|||
|
||||
func TestRun(t *testing.T) {
|
||||
probe := newOONIProbe(t)
|
||||
sess, err := probe.NewSession(context.Background())
|
||||
sess, err := probe.NewSession(context.Background(), model.RunTypeManual)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
|
|
@ -8,6 +8,7 @@ import (
|
|||
"github.com/apex/log"
|
||||
"github.com/ooni/probe-cli/v3/cmd/ooniprobe/internal/database"
|
||||
"github.com/ooni/probe-cli/v3/cmd/ooniprobe/internal/ooni"
|
||||
"github.com/ooni/probe-cli/v3/internal/model"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
|
@ -17,7 +18,7 @@ type RunGroupConfig struct {
|
|||
InputFiles []string
|
||||
Inputs []string
|
||||
Probe *ooni.Probe
|
||||
RunType string // hint for check-in API
|
||||
RunType model.RunType // hint for check-in API
|
||||
}
|
||||
|
||||
const websitesURLLimitRemoved = `WARNING: CONFIGURATION CHANGE REQUIRED:
|
||||
|
@ -58,7 +59,7 @@ func RunGroup(config RunGroupConfig) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
sess, err := config.Probe.NewSession(context.Background())
|
||||
sess, err := config.Probe.NewSession(context.Background(), config.RunType)
|
||||
if err != nil {
|
||||
log.WithError(err).Error("Failed to create a measurement session")
|
||||
return err
|
||||
|
|
|
@ -17,10 +17,14 @@ import (
|
|||
"github.com/ooni/probe-cli/v3/internal/engine"
|
||||
"github.com/ooni/probe-cli/v3/internal/engine/legacy/assetsdir"
|
||||
"github.com/ooni/probe-cli/v3/internal/kvstore"
|
||||
"github.com/ooni/probe-cli/v3/internal/model"
|
||||
"github.com/pkg/errors"
|
||||
"upper.io/db.v3/lib/sqlbuilder"
|
||||
)
|
||||
|
||||
// DefaultSoftwareName is the default software name.
|
||||
const DefaultSoftwareName = "ooniprobe-cli"
|
||||
|
||||
// ProbeCLI is the OONI Probe CLI context.
|
||||
type ProbeCLI interface {
|
||||
Config() *config.Config
|
||||
|
@ -28,7 +32,7 @@ type ProbeCLI interface {
|
|||
IsBatch() bool
|
||||
Home() string
|
||||
TempDir() string
|
||||
NewProbeEngine(ctx context.Context) (ProbeEngine, error)
|
||||
NewProbeEngine(ctx context.Context, runType model.RunType) (ProbeEngine, error)
|
||||
}
|
||||
|
||||
// ProbeEngine is an instance of the OONI Probe engine.
|
||||
|
@ -199,7 +203,7 @@ func (p *Probe) Init(softwareName, softwareVersion string) error {
|
|||
// NewSession creates a new ooni/probe-engine session using the
|
||||
// current configuration inside the context. The caller must close
|
||||
// the session when done using it, by calling sess.Close().
|
||||
func (p *Probe) NewSession(ctx context.Context) (*engine.Session, error) {
|
||||
func (p *Probe) NewSession(ctx context.Context, runType model.RunType) (*engine.Session, error) {
|
||||
kvstore, err := kvstore.NewFS(
|
||||
utils.EngineDir(p.home),
|
||||
)
|
||||
|
@ -209,10 +213,18 @@ func (p *Probe) NewSession(ctx context.Context) (*engine.Session, error) {
|
|||
if err := os.MkdirAll(p.tunnelDir, 0700); err != nil {
|
||||
return nil, errors.Wrap(err, "creating tunnel dir")
|
||||
}
|
||||
// When the software name is the default software name and we're running
|
||||
// in unattended mode, adjust the software name accordingly.
|
||||
//
|
||||
// See https://github.com/ooni/probe/issues/2081.
|
||||
softwareName := p.softwareName
|
||||
if runType == model.RunTypeTimed && softwareName == DefaultSoftwareName {
|
||||
softwareName = DefaultSoftwareName + "-unattended"
|
||||
}
|
||||
return engine.NewSession(ctx, engine.SessionConfig{
|
||||
KVStore: kvstore,
|
||||
Logger: enginex.Logger,
|
||||
SoftwareName: p.softwareName,
|
||||
SoftwareName: softwareName,
|
||||
SoftwareVersion: p.softwareVersion,
|
||||
TempDir: p.tempDir,
|
||||
TunnelDir: p.tunnelDir,
|
||||
|
@ -220,8 +232,8 @@ func (p *Probe) NewSession(ctx context.Context) (*engine.Session, error) {
|
|||
}
|
||||
|
||||
// NewProbeEngine creates a new ProbeEngine instance.
|
||||
func (p *Probe) NewProbeEngine(ctx context.Context) (ProbeEngine, error) {
|
||||
sess, err := p.NewSession(ctx)
|
||||
func (p *Probe) NewProbeEngine(ctx context.Context, runType model.RunType) (ProbeEngine, error) {
|
||||
sess, err := p.NewSession(ctx, runType)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
|
|
@ -8,6 +8,7 @@ import (
|
|||
"github.com/apex/log"
|
||||
"github.com/ooni/probe-cli/v3/cmd/ooniprobe/internal/config"
|
||||
"github.com/ooni/probe-cli/v3/cmd/ooniprobe/internal/ooni"
|
||||
"github.com/ooni/probe-cli/v3/internal/model"
|
||||
"upper.io/db.v3/lib/sqlbuilder"
|
||||
)
|
||||
|
||||
|
@ -61,7 +62,7 @@ func (cli *FakeProbeCLI) TempDir() string {
|
|||
}
|
||||
|
||||
// NewProbeEngine implements ProbeCLI.NewProbeEngine
|
||||
func (cli *FakeProbeCLI) NewProbeEngine(ctx context.Context) (ooni.ProbeEngine, error) {
|
||||
func (cli *FakeProbeCLI) NewProbeEngine(ctx context.Context, runType model.RunType) (ooni.ProbeEngine, error) {
|
||||
return cli.FakeProbeEnginePtr, cli.FakeProbeEngineErr
|
||||
}
|
||||
|
||||
|
|
|
@ -412,7 +412,7 @@ func MainWithConfiguration(experimentName string, currentOptions Options) {
|
|||
|
||||
inputLoader := &engine.InputLoader{
|
||||
CheckInConfig: &model.OOAPICheckInConfig{
|
||||
RunType: "manual",
|
||||
RunType: model.RunTypeManual,
|
||||
OnWiFi: true, // meaning: not on 4G
|
||||
Charging: true,
|
||||
},
|
||||
|
|
|
@ -17,7 +17,7 @@ func TestCheckInSuccess(t *testing.T) {
|
|||
Platform: "android",
|
||||
ProbeASN: "AS12353",
|
||||
ProbeCC: "PT",
|
||||
RunType: "timed",
|
||||
RunType: model.RunTypeTimed,
|
||||
SoftwareName: "ooniprobe-android",
|
||||
SoftwareVersion: "2.7.1",
|
||||
WebConnectivity: model.OOAPICheckInConfigWebConnectivity{
|
||||
|
@ -54,7 +54,7 @@ func TestCheckInFailure(t *testing.T) {
|
|||
Platform: "android",
|
||||
ProbeASN: "AS12353",
|
||||
ProbeCC: "PT",
|
||||
RunType: "timed",
|
||||
RunType: model.RunTypeTimed,
|
||||
SoftwareName: "ooniprobe-android",
|
||||
SoftwareVersion: "2.7.1",
|
||||
WebConnectivity: model.OOAPICheckInConfigWebConnectivity{
|
||||
|
|
|
@ -238,7 +238,7 @@ func (s *Session) KibiBytesSent() float64 {
|
|||
//
|
||||
// - ProbeCC: if empty, set to Session.ProbeCC();
|
||||
//
|
||||
// - RunType: if empty, set to "timed";
|
||||
// - RunType: if empty, set to model.RunTypeTimed;
|
||||
//
|
||||
// - SoftwareName: if empty, set to Session.SoftwareName();
|
||||
//
|
||||
|
@ -270,7 +270,7 @@ func (s *Session) CheckIn(
|
|||
config.ProbeCC = s.ProbeCC()
|
||||
}
|
||||
if config.RunType == "" {
|
||||
config.RunType = "timed" // most conservative choice
|
||||
config.RunType = model.RunTypeTimed // most conservative choice
|
||||
}
|
||||
if config.SoftwareName == "" {
|
||||
config.SoftwareName = s.SoftwareName()
|
||||
|
|
|
@ -107,7 +107,7 @@ func TestSessionCheckInSuccessful(t *testing.T) {
|
|||
if mockedClnt.Config.ProbeCC != "IT" {
|
||||
t.Fatal("invalid Config.ProbeCC")
|
||||
}
|
||||
if mockedClnt.Config.RunType != "timed" {
|
||||
if mockedClnt.Config.RunType != model.RunTypeTimed {
|
||||
t.Fatal("invalid Config.RunType")
|
||||
}
|
||||
if mockedClnt.Config.SoftwareName != "miniooni" {
|
||||
|
|
|
@ -16,7 +16,7 @@ type OOAPICheckInConfig struct {
|
|||
Platform string `json:"platform"` // Platform of the probe
|
||||
ProbeASN string `json:"probe_asn"` // ProbeASN is the probe country code
|
||||
ProbeCC string `json:"probe_cc"` // ProbeCC is the probe country code
|
||||
RunType string `json:"run_type"` // RunType
|
||||
RunType RunType `json:"run_type"` // RunType
|
||||
SoftwareName string `json:"software_name"` // SoftwareName of the probe
|
||||
SoftwareVersion string `json:"software_version"` // SoftwareVersion of the probe
|
||||
WebConnectivity OOAPICheckInConfigWebConnectivity `json:"web_connectivity"` // WebConnectivity class contain an array of categories
|
||||
|
|
14
internal/model/runtype.go
Normal file
14
internal/model/runtype.go
Normal file
|
@ -0,0 +1,14 @@
|
|||
package model
|
||||
|
||||
// RunType describes the type of a ooniprobe run.
|
||||
type RunType string
|
||||
|
||||
const (
|
||||
// RunTypeManual indicates that the user manually run `ooniprobe run`. Command
|
||||
// line tools such as miniooni should always use this run type.
|
||||
RunTypeManual = RunType("manual")
|
||||
|
||||
// RunTypeTimed indicates that the user run `ooniprobe run unattended`, which
|
||||
// is the correct way to run ooniprobe from scripts and cronjobs.
|
||||
RunTypeTimed = RunType("timed")
|
||||
)
|
|
@ -1,5 +1,7 @@
|
|||
package apimodel
|
||||
|
||||
import "github.com/ooni/probe-cli/v3/internal/model"
|
||||
|
||||
// CheckInRequestWebConnectivity contains WebConnectivity
|
||||
// specific parameters to include into CheckInRequest
|
||||
type CheckInRequestWebConnectivity struct {
|
||||
|
@ -13,7 +15,7 @@ type CheckInRequest struct {
|
|||
Platform string `json:"platform"`
|
||||
ProbeASN string `json:"probe_asn"`
|
||||
ProbeCC string `json:"probe_cc"`
|
||||
RunType string `json:"run_type"`
|
||||
RunType model.RunType `json:"run_type"`
|
||||
SoftwareName string `json:"software_name"`
|
||||
SoftwareVersion string `json:"software_version"`
|
||||
WebConnectivity CheckInRequestWebConnectivity `json:"web_connectivity"`
|
||||
|
|
|
@ -6,6 +6,7 @@ import (
|
|||
"log"
|
||||
|
||||
"github.com/ooni/probe-cli/v3/internal/kvstore"
|
||||
"github.com/ooni/probe-cli/v3/internal/model"
|
||||
"github.com/ooni/probe-cli/v3/internal/ooapi"
|
||||
"github.com/ooni/probe-cli/v3/internal/ooapi/apimodel"
|
||||
)
|
||||
|
@ -21,7 +22,7 @@ func ExampleClient() {
|
|||
Platform: "linux",
|
||||
ProbeASN: "AS30722",
|
||||
ProbeCC: "IT",
|
||||
RunType: "timed",
|
||||
RunType: model.RunTypeTimed,
|
||||
SoftwareName: "miniooni",
|
||||
SoftwareVersion: "0.1.0-dev",
|
||||
WebConnectivity: apimodel.CheckInRequestWebConnectivity{
|
||||
|
|
|
@ -5,6 +5,7 @@ import (
|
|||
"testing"
|
||||
|
||||
"github.com/ooni/probe-cli/v3/internal/kvstore"
|
||||
"github.com/ooni/probe-cli/v3/internal/model"
|
||||
"github.com/ooni/probe-cli/v3/internal/ooapi"
|
||||
"github.com/ooni/probe-cli/v3/internal/ooapi/apimodel"
|
||||
)
|
||||
|
@ -19,7 +20,7 @@ func TestWithRealServerDoCheckIn(t *testing.T) {
|
|||
Platform: "android",
|
||||
ProbeASN: "AS12353",
|
||||
ProbeCC: "IT",
|
||||
RunType: "timed",
|
||||
RunType: model.RunTypeTimed,
|
||||
SoftwareName: "ooniprobe-android",
|
||||
SoftwareVersion: "2.7.1",
|
||||
WebConnectivity: apimodel.CheckInRequestWebConnectivity{
|
||||
|
|
|
@ -364,9 +364,9 @@ type CheckInConfig struct {
|
|||
// Platform is the mobile platform (e.g. "android")
|
||||
Platform string
|
||||
|
||||
// RunType indicates whether this is an automated ("timed") run
|
||||
// RunType indicates whether this is an automated (model.RunTypeTimed) run
|
||||
// or otherwise a manual run initiated by the user.
|
||||
RunType string
|
||||
RunType model.RunType
|
||||
|
||||
// SoftwareName is the name of the application.
|
||||
SoftwareName string
|
||||
|
|
|
@ -259,7 +259,7 @@ func TestCheckInSuccess(t *testing.T) {
|
|||
Charging: true,
|
||||
OnWiFi: true,
|
||||
Platform: "android",
|
||||
RunType: "timed",
|
||||
RunType: model.RunTypeTimed,
|
||||
SoftwareName: "ooniprobe-android",
|
||||
SoftwareVersion: "2.7.1",
|
||||
WebConnectivity: &oonimkall.CheckInConfigWebConnectivity{},
|
||||
|
@ -307,7 +307,7 @@ func TestCheckInLookupLocationFailure(t *testing.T) {
|
|||
Charging: true,
|
||||
OnWiFi: true,
|
||||
Platform: "android",
|
||||
RunType: "timed",
|
||||
RunType: model.RunTypeTimed,
|
||||
SoftwareName: "ooniprobe-android",
|
||||
SoftwareVersion: "2.7.1",
|
||||
WebConnectivity: &oonimkall.CheckInConfigWebConnectivity{},
|
||||
|
@ -337,7 +337,7 @@ func TestCheckInNewProbeServicesFailure(t *testing.T) {
|
|||
Charging: true,
|
||||
OnWiFi: true,
|
||||
Platform: "android",
|
||||
RunType: "timed",
|
||||
RunType: model.RunTypeTimed,
|
||||
SoftwareName: "ooniprobe-android",
|
||||
SoftwareVersion: "2.7.1",
|
||||
WebConnectivity: &oonimkall.CheckInConfigWebConnectivity{},
|
||||
|
@ -366,7 +366,7 @@ func TestCheckInCheckInFailure(t *testing.T) {
|
|||
Charging: true,
|
||||
OnWiFi: true,
|
||||
Platform: "android",
|
||||
RunType: "timed",
|
||||
RunType: model.RunTypeTimed,
|
||||
SoftwareName: "ooniprobe-android",
|
||||
SoftwareVersion: "2.7.1",
|
||||
WebConnectivity: &oonimkall.CheckInConfigWebConnectivity{},
|
||||
|
@ -392,7 +392,7 @@ func TestCheckInNoParams(t *testing.T) {
|
|||
Charging: true,
|
||||
OnWiFi: true,
|
||||
Platform: "android",
|
||||
RunType: "timed",
|
||||
RunType: model.RunTypeTimed,
|
||||
SoftwareName: "ooniprobe-android",
|
||||
SoftwareVersion: "2.7.1",
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user