c5ad5eedeb
* feat: create tunnel inside NewSession We want to create the tunnel when we create the session. This change allows us to nicely ignore the problem of creating a tunnel when we already have a proxy, as well as the problem of locking. Everything is happening, in fact, inside of the NewSession factory. Modify miniooni such that --tunnel is just syntactic sugar for --proxy, at least for now. We want, in the future, to teach the tunnel to possibly use a socks5 proxy. Because starting a tunnel is a slow operation, we need a context in NewSession. This causes a bunch of places to change. Not really a big deal except we need to propagate the changes. Make sure that the mobile code can create a new session using a proxy for all the APIs we support. Make sure all tests are still green and we don't loose coverage of the various ways in which this code could be used. This change is part of https://github.com/ooni/probe/issues/985. * changes after merge * fix: only keep tests that can hopefully work While there, identify other places where we should add more tests or fix integration tests. Part of https://github.com/ooni/probe/issues/985
120 lines
3.3 KiB
Go
120 lines
3.3 KiB
Go
package nettests
|
|
|
|
import (
|
|
"context"
|
|
"sync"
|
|
"time"
|
|
|
|
"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/pkg/errors"
|
|
)
|
|
|
|
// RunGroupConfig contains the settings for running a nettest group.
|
|
type RunGroupConfig struct {
|
|
GroupName string
|
|
InputFiles []string
|
|
Inputs []string
|
|
Probe *ooni.Probe
|
|
RunType string // hint for check-in API
|
|
}
|
|
|
|
const websitesURLLimitRemoved = `WARNING: CONFIGURATION CHANGE REQUIRED:
|
|
|
|
* Since ooniprobe 3.9.0, websites_url_limit has been replaced
|
|
by websites_max_runtime in the configuration
|
|
|
|
* To silence this warning either set websites_url_limit to zero or
|
|
replace it with websites_max_runtime
|
|
|
|
* For the rest of 2021, we will automatically convert websites_url_limit
|
|
to websites_max_runtime (if the latter is not already set)
|
|
|
|
* We will consider that each URL in websites_url_limit takes five
|
|
seconds to run and thus calculate websites_max_runtime
|
|
|
|
* Since 2022, we will start silently ignoring websites_url_limit
|
|
`
|
|
|
|
var deprecationWarningOnce sync.Once
|
|
|
|
// RunGroup runs a group of nettests according to the specified config.
|
|
func RunGroup(config RunGroupConfig) error {
|
|
if config.Probe.Config().Nettests.WebsitesURLLimit > 0 {
|
|
if config.Probe.Config().Nettests.WebsitesMaxRuntime <= 0 {
|
|
limit := config.Probe.Config().Nettests.WebsitesURLLimit
|
|
maxRuntime := 5 * limit
|
|
config.Probe.Config().Nettests.WebsitesMaxRuntime = maxRuntime
|
|
}
|
|
deprecationWarningOnce.Do(func() {
|
|
log.Warn(websitesURLLimitRemoved)
|
|
time.Sleep(30 * time.Second)
|
|
})
|
|
}
|
|
|
|
if config.Probe.IsTerminated() {
|
|
log.Debugf("context is terminated, stopping runNettestGroup early")
|
|
return nil
|
|
}
|
|
|
|
sess, err := config.Probe.NewSession(context.Background())
|
|
if err != nil {
|
|
log.WithError(err).Error("Failed to create a measurement session")
|
|
return err
|
|
}
|
|
defer sess.Close()
|
|
|
|
err = sess.MaybeLookupLocation()
|
|
if err != nil {
|
|
log.WithError(err).Error("Failed to lookup the location of the probe")
|
|
return err
|
|
}
|
|
network, err := database.CreateNetwork(config.Probe.DB(), sess)
|
|
if err != nil {
|
|
log.WithError(err).Error("Failed to create the network row")
|
|
return err
|
|
}
|
|
if err := sess.MaybeLookupBackends(); err != nil {
|
|
log.WithError(err).Warn("Failed to discover OONI backends")
|
|
return err
|
|
}
|
|
|
|
group, ok := All[config.GroupName]
|
|
if !ok {
|
|
log.Errorf("No test group named %s", config.GroupName)
|
|
return errors.New("invalid test group name")
|
|
}
|
|
log.Debugf("Running test group %s", group.Label)
|
|
|
|
result, err := database.CreateResult(
|
|
config.Probe.DB(), config.Probe.Home(), config.GroupName, network.ID)
|
|
if err != nil {
|
|
log.Errorf("DB result error: %s", err)
|
|
return err
|
|
}
|
|
|
|
config.Probe.ListenForSignals()
|
|
config.Probe.MaybeListenForStdinClosed()
|
|
for i, nt := range group.Nettests {
|
|
if config.Probe.IsTerminated() {
|
|
log.Debugf("context is terminated, stopping group.Nettests early")
|
|
break
|
|
}
|
|
log.Debugf("Running test %T", nt)
|
|
ctl := NewController(nt, config.Probe, result, sess)
|
|
ctl.InputFiles = config.InputFiles
|
|
ctl.Inputs = config.Inputs
|
|
ctl.RunType = config.RunType
|
|
ctl.SetNettestIndex(i, len(group.Nettests))
|
|
if err = nt.Run(ctl); err != nil {
|
|
log.WithError(err).Errorf("Failed to run %s", group.Label)
|
|
}
|
|
}
|
|
|
|
if err = result.Finished(config.Probe.DB()); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|