Remove all settings which are not implemented (#73)
* Remove all settings which are not implemented * Add support for migrating config files from version 0 -> 1 Add basic unittests for the config file migration * Update the config file used by travis * Fix typos in console log messages * Improve the comment * Fix type of limit * Set informed consent to true in the travis config
This commit is contained in:
parent
e5248d632b
commit
8a27de6c7d
|
@ -11,6 +11,9 @@ import (
|
|||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
// ConfigVersion is the current version of the config
|
||||
const ConfigVersion = 1
|
||||
|
||||
// ReadConfig reads the configuration from the path
|
||||
func ReadConfig(path string) (*Config, error) {
|
||||
b, err := ioutil.ReadFile(path)
|
||||
|
@ -34,13 +37,12 @@ func ParseConfig(b []byte) (*Config, error) {
|
|||
return nil, errors.Wrap(err, "parsing json")
|
||||
}
|
||||
|
||||
if err := c.Default(); err != nil {
|
||||
return nil, errors.Wrap(err, "defaulting")
|
||||
home, err := utils.GetOONIHome()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
c.path = utils.ConfigPath(home)
|
||||
|
||||
if err := c.Validate(); err != nil {
|
||||
return nil, errors.Wrap(err, "validating")
|
||||
}
|
||||
if c.Advanced.SendCrashReports == false {
|
||||
log.Info("Disabling crash reporting.")
|
||||
crashreport.Disabled = true
|
||||
|
@ -55,13 +57,9 @@ type Config struct {
|
|||
Comment string `json:"_"`
|
||||
Version int64 `json:"_version"`
|
||||
InformedConsent bool `json:"_informed_consent"`
|
||||
IsBeta bool `json:"_is_beta"` // This is a boolean flag used to indicate this installation of OONI Probe was a beta install. These installations will have their data deleted across releases.
|
||||
|
||||
AutoUpdate bool `json:"auto_update"`
|
||||
Sharing Sharing `json:"sharing"`
|
||||
Notifications Notifications `json:"notifications"`
|
||||
AutomatedTesting AutomatedTesting `json:"automated_testing"`
|
||||
NettestGroups NettestGroups `json:"test_settings"`
|
||||
Nettests Nettests `json:"nettests"`
|
||||
Advanced Advanced `json:"advanced"`
|
||||
|
||||
mutex sync.Mutex
|
||||
|
@ -92,18 +90,11 @@ func (c *Config) Unlock() {
|
|||
c.mutex.Unlock()
|
||||
}
|
||||
|
||||
// Default config settings
|
||||
func (c *Config) Default() error {
|
||||
home, err := utils.GetOONIHome()
|
||||
if err != nil {
|
||||
return err
|
||||
// MaybeMigrate checks the current config version and the config file on disk
|
||||
// and if necessary performs and upgrade of the configuration file.
|
||||
func (c *Config) MaybeMigrate() error {
|
||||
if c.Version < ConfigVersion {
|
||||
return c.Write()
|
||||
}
|
||||
|
||||
c.path = utils.ConfigPath(home)
|
||||
return nil
|
||||
}
|
||||
|
||||
// Validate the config file
|
||||
func (c *Config) Validate() error {
|
||||
return nil
|
||||
}
|
||||
|
|
|
@ -1,19 +1,110 @@
|
|||
package config
|
||||
|
||||
import (
|
||||
"crypto/sha256"
|
||||
"encoding/hex"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func getShasum(path string) (string, error) {
|
||||
hasher := sha256.New()
|
||||
|
||||
f, err := os.Open(path)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
defer f.Close()
|
||||
if _, err := io.Copy(hasher, f); err != nil {
|
||||
return "", err
|
||||
}
|
||||
return hex.EncodeToString(hasher.Sum(nil)), nil
|
||||
}
|
||||
|
||||
func TestParseConfig(t *testing.T) {
|
||||
config, err := ReadConfig("testdata/valid-config.json")
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
|
||||
if len(config.NettestGroups.Middlebox.EnabledTests) < 0 {
|
||||
t.Error("at least one middlebox test should be enabled")
|
||||
}
|
||||
if config.Sharing.IncludeCountry == false {
|
||||
t.Error("country should be included")
|
||||
}
|
||||
}
|
||||
|
||||
func TestUpdateConfig(t *testing.T) {
|
||||
tmpFile, err := ioutil.TempFile(os.TempDir(), "ooniconfig-")
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
configPath := tmpFile.Name()
|
||||
defer os.Remove(configPath)
|
||||
|
||||
data, err := ioutil.ReadFile("testdata/config-v0.json")
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
err = ioutil.WriteFile(configPath, data, 0644)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
|
||||
origShasum, err := getShasum(configPath)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
config, err := ReadConfig(configPath)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
origIncludeIP := config.Sharing.IncludeIP
|
||||
origIncludeASN := config.Sharing.IncludeASN
|
||||
origIncludeCountry := config.Sharing.IncludeCountry
|
||||
origUploadResults := config.Sharing.UploadResults
|
||||
origInformedConsent := config.InformedConsent
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
|
||||
config.MaybeMigrate()
|
||||
migratedShasum, err := getShasum(configPath)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
if migratedShasum == origShasum {
|
||||
t.Fatal("the config was not migrated")
|
||||
}
|
||||
|
||||
newConfig, err := ReadConfig(configPath)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
if newConfig.Sharing.IncludeIP != origIncludeIP {
|
||||
t.Error("includeIP differs")
|
||||
}
|
||||
if newConfig.Sharing.IncludeASN != origIncludeASN {
|
||||
t.Error("includeASN differs")
|
||||
}
|
||||
if newConfig.Sharing.IncludeCountry != origIncludeCountry {
|
||||
t.Error("includeCountry differs")
|
||||
}
|
||||
if newConfig.Sharing.UploadResults != origUploadResults {
|
||||
t.Error("UploadResults differs")
|
||||
}
|
||||
if newConfig.InformedConsent != origInformedConsent {
|
||||
t.Error("InformedConsent differs")
|
||||
}
|
||||
|
||||
// Check that the config file stays the same if it's already the most up to
|
||||
// date version
|
||||
config.MaybeMigrate()
|
||||
finalShasum, err := getShasum(configPath)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
if migratedShasum != finalShasum {
|
||||
t.Fatal("the config was migrated again")
|
||||
}
|
||||
}
|
||||
|
|
|
@ -33,102 +33,22 @@ var websiteCategories = []string{
|
|||
"XED",
|
||||
}
|
||||
|
||||
// NettestConfig represents the configuration for a particular nettest
|
||||
type NettestConfig struct {
|
||||
Name string
|
||||
Options string
|
||||
}
|
||||
|
||||
// Websites test group
|
||||
type Websites struct {
|
||||
EnabledCategories []string `json:"enabled_categories"`
|
||||
Limit int `json:"limit"`
|
||||
}
|
||||
|
||||
// NettestConfigs returns a list configured enabled tests for the group
|
||||
func (s *Websites) NettestConfigs() []NettestConfig {
|
||||
var nts []NettestConfig
|
||||
nts = append(nts, NettestConfig{"web_connectivity", "options"})
|
||||
return nts
|
||||
}
|
||||
|
||||
// InstantMessaging nettest group
|
||||
type InstantMessaging struct {
|
||||
EnabledTests []string `json:"enabled_tests"`
|
||||
}
|
||||
|
||||
func (s *InstantMessaging) isEnabled(nt string) bool {
|
||||
for _, v := range s.EnabledTests {
|
||||
if v == nt {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// NettestConfigs returns a list configured enabled tests for the group
|
||||
func (s *InstantMessaging) NettestConfigs() []NettestConfig {
|
||||
var nts []NettestConfig
|
||||
if s.isEnabled("facebook_messenger") {
|
||||
nts = append(nts, NettestConfig{"facebook_messenger", "options"})
|
||||
}
|
||||
if s.isEnabled("telegram") {
|
||||
nts = append(nts, NettestConfig{"telegram", "options"})
|
||||
}
|
||||
if s.isEnabled("whatsapp") {
|
||||
nts = append(nts, NettestConfig{"whatsapp", "options"})
|
||||
}
|
||||
return nts
|
||||
}
|
||||
|
||||
// Performance nettest group
|
||||
type Performance struct {
|
||||
NDTServer string `json:"ndt_server"`
|
||||
NDTServerPort string `json:"ndt_server_port"`
|
||||
DashServer string `json:"dash_server"`
|
||||
DashServerPort string `json:"dash_server_port"`
|
||||
}
|
||||
|
||||
// Middlebox nettest group
|
||||
type Middlebox struct {
|
||||
EnabledTests []string `json:"enabled_tests"`
|
||||
}
|
||||
|
||||
// NettestGroups related settings
|
||||
type NettestGroups struct {
|
||||
Websites Websites `json:"websites"`
|
||||
InstantMessaging InstantMessaging `json:"instant_messaging"`
|
||||
Performance Performance `json:"performance"`
|
||||
Middlebox Middlebox `json:"middlebox"`
|
||||
}
|
||||
|
||||
// Notifications settings
|
||||
type Notifications struct {
|
||||
Enabled bool `json:"enabled"`
|
||||
NotifyOnTestCompletion bool `json:"notify_on_test_completion"`
|
||||
NotifyOnNews bool `json:"notify_on_news"`
|
||||
}
|
||||
|
||||
// Sharing settings
|
||||
type Sharing struct {
|
||||
IncludeIP bool `json:"include_ip"`
|
||||
IncludeASN bool `json:"include_asn"`
|
||||
IncludeCountry bool `json:"include_country"`
|
||||
IncludeGPS bool `json:"include_gps"`
|
||||
UploadResults bool `json:"upload_results"`
|
||||
}
|
||||
|
||||
// Advanced settings
|
||||
type Advanced struct {
|
||||
UseDomainFronting bool `json:"use_domain_fronting"`
|
||||
SendCrashReports bool `json:"send_crash_reports"`
|
||||
CollectorURL string `json:"collector_url"`
|
||||
BouncerURL string `json:"bouncer_url"`
|
||||
}
|
||||
|
||||
// AutomatedTesting settings
|
||||
type AutomatedTesting struct {
|
||||
Enabled bool `json:"enabled"`
|
||||
EnabledTests []string `json:"enabled_tests"`
|
||||
MonthlyAllowance string `json:"monthly_allowance"`
|
||||
// Nettests related settings
|
||||
type Nettests struct {
|
||||
WebsitesURLLimit int64 `json:"websites_url_limit"`
|
||||
}
|
||||
|
|
63
config/testdata/config-v0.json
vendored
Normal file
63
config/testdata/config-v0.json
vendored
Normal file
|
@ -0,0 +1,63 @@
|
|||
{
|
||||
"_": "This is your OONI Probe config file. See https://ooni.io/help/probe-cli for help",
|
||||
"_version": 0,
|
||||
"_informed_consent": true,
|
||||
"_is_beta": true,
|
||||
"auto_update": true,
|
||||
"sharing": {
|
||||
"include_ip": false,
|
||||
"include_asn": true,
|
||||
"include_country": true,
|
||||
"include_gps": true,
|
||||
"upload_results": true
|
||||
},
|
||||
"notifications": {
|
||||
"enabled": true,
|
||||
"notify_on_test_completion": true,
|
||||
"notify_on_news": false
|
||||
},
|
||||
"automated_testing": {
|
||||
"enabled": false,
|
||||
"enabled_tests": [
|
||||
"web-connectivity",
|
||||
"facebook-messenger",
|
||||
"whatsapp",
|
||||
"telegram",
|
||||
"dash",
|
||||
"ndt",
|
||||
"http-invalid-request-line",
|
||||
"http-header-field-manipulation"
|
||||
],
|
||||
"monthly_allowance": "300MB"
|
||||
},
|
||||
"test_settings": {
|
||||
"websites": {
|
||||
"enabled_categories": []
|
||||
},
|
||||
"instant_messaging": {
|
||||
"enabled_tests": [
|
||||
"facebook-messenger",
|
||||
"whatsapp",
|
||||
"telegram"
|
||||
]
|
||||
},
|
||||
"performance": {
|
||||
"ndt_server": "auto",
|
||||
"ndt_server_port": "auto",
|
||||
"dash_server": "auto",
|
||||
"dash_server_port": "auto"
|
||||
},
|
||||
"middlebox": {
|
||||
"enabled_tests": [
|
||||
"http-invalid-request-line",
|
||||
"http-header-field-manipulation"
|
||||
]
|
||||
}
|
||||
},
|
||||
"advanced": {
|
||||
"use_domain_fronting": false,
|
||||
"send_crash_reports": true,
|
||||
"collector_url": "",
|
||||
"bouncer_url": "https://bouncer.ooni.io"
|
||||
}
|
||||
}
|
57
config/testdata/valid-config.json
vendored
57
config/testdata/valid-config.json
vendored
|
@ -1,65 +1,20 @@
|
|||
{
|
||||
"_": "This is your OONI Probe config file. See https://ooni.io/help/probe-cli for help",
|
||||
"_version": 0,
|
||||
"_version": 1,
|
||||
"_informed_consent": false,
|
||||
"auto_update": true,
|
||||
"sharing": {
|
||||
"include_ip": false,
|
||||
"include_country": true,
|
||||
"include_asn": true,
|
||||
"include_gps": true,
|
||||
"include_country": true,
|
||||
"upload_results": true
|
||||
},
|
||||
"notifications": {
|
||||
"enabled": true,
|
||||
"notify_on_test_completion": true,
|
||||
"notify_on_news": false
|
||||
},
|
||||
"automated_testing": {
|
||||
"enabled": false,
|
||||
"enabled_tests": [
|
||||
"web-connectivity",
|
||||
"facebook-messenger",
|
||||
"whatsapp",
|
||||
"telegram",
|
||||
"dash",
|
||||
"ndt",
|
||||
"http-invalid-request-line",
|
||||
"http-header-field-manipulation"
|
||||
],
|
||||
"monthly_allowance": "300MB"
|
||||
},
|
||||
"test_settings": {
|
||||
"websites": {
|
||||
"enabled_categories": []
|
||||
},
|
||||
"instant_messaging": {
|
||||
"enabled_tests": [
|
||||
"facebook-messenger",
|
||||
"whatsapp",
|
||||
"telegram"
|
||||
]
|
||||
},
|
||||
"performance": {
|
||||
"enabled_tests": [
|
||||
"ndt"
|
||||
],
|
||||
"ndt_server": "auto",
|
||||
"ndt_server_port": "auto",
|
||||
"dash_server": "auto",
|
||||
"dash_server_port": "auto"
|
||||
},
|
||||
"middlebox": {
|
||||
"enabled_tests": [
|
||||
"http-invalid-request-line",
|
||||
"http-header-field-manipulation"
|
||||
]
|
||||
}
|
||||
"nettests": {
|
||||
"websites_url_limit": 0
|
||||
},
|
||||
"advanced": {
|
||||
"use_domain_fronting": false,
|
||||
"send_crash_reports": true,
|
||||
"bouncer_url": "https://bouncer.ooni.io",
|
||||
"collector_url": "https://c.collector.ooni.io"
|
||||
"collector_url": "",
|
||||
"bouncer_url": "https://bouncer.ooni.io"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,61 +1,15 @@
|
|||
{
|
||||
"_": "This is your OONI Probe config file. See https://ooni.io/help/probe-cli for help",
|
||||
"_version": 0,
|
||||
"_version": 1,
|
||||
"_informed_consent": false,
|
||||
"_is_beta": true,
|
||||
"auto_update": true,
|
||||
"sharing": {
|
||||
"include_ip": false,
|
||||
"include_asn": true,
|
||||
"include_country": true,
|
||||
"include_gps": true,
|
||||
"upload_results": true
|
||||
},
|
||||
"notifications": {
|
||||
"enabled": true,
|
||||
"notify_on_test_completion": true,
|
||||
"notify_on_news": false
|
||||
},
|
||||
"automated_testing": {
|
||||
"enabled": false,
|
||||
"enabled_tests": [
|
||||
"web-connectivity",
|
||||
"facebook-messenger",
|
||||
"whatsapp",
|
||||
"telegram",
|
||||
"dash",
|
||||
"ndt",
|
||||
"http-invalid-request-line",
|
||||
"http-header-field-manipulation"
|
||||
],
|
||||
"monthly_allowance": "300MB"
|
||||
},
|
||||
"test_settings": {
|
||||
"websites": {
|
||||
"enabled_categories": []
|
||||
},
|
||||
"instant_messaging": {
|
||||
"enabled_tests": [
|
||||
"facebook-messenger",
|
||||
"whatsapp",
|
||||
"telegram"
|
||||
]
|
||||
},
|
||||
"performance": {
|
||||
"enabled_tests": [
|
||||
"ndt"
|
||||
],
|
||||
"ndt_server": "auto",
|
||||
"ndt_server_port": "auto",
|
||||
"dash_server": "auto",
|
||||
"dash_server_port": "auto"
|
||||
},
|
||||
"middlebox": {
|
||||
"enabled_tests": [
|
||||
"http-invalid-request-line",
|
||||
"http-header-field-manipulation"
|
||||
]
|
||||
}
|
||||
"nettests": {
|
||||
"websites_url_limit": 0
|
||||
},
|
||||
"advanced": {
|
||||
"use_domain_fronting": false,
|
||||
|
|
|
@ -6,11 +6,11 @@ import (
|
|||
"github.com/ooni/probe-cli/nettests"
|
||||
)
|
||||
|
||||
func lookupURLs(ctl *nettests.Controller, limit int) ([]string, map[int64]int64, error) {
|
||||
func lookupURLs(ctl *nettests.Controller, limit int64) ([]string, map[int64]int64, error) {
|
||||
var urls []string
|
||||
urlIDMap := make(map[int64]int64)
|
||||
config := ctl.Ctx.Session.NewTestListsConfig()
|
||||
config.Limit = limit
|
||||
config.Limit = int(limit)
|
||||
client := ctl.Ctx.Session.NewTestListsClient()
|
||||
testlist, err := client.Fetch(config)
|
||||
if err != nil {
|
||||
|
@ -38,7 +38,7 @@ type WebConnectivity struct {
|
|||
|
||||
// Run starts the test
|
||||
func (n WebConnectivity) Run(ctl *nettests.Controller) error {
|
||||
urls, urlIDMap, err := lookupURLs(ctl, ctl.Ctx.Config.NettestGroups.Websites.Limit)
|
||||
urls, urlIDMap, err := lookupURLs(ctl, ctl.Ctx.Config.Nettests.WebsitesURLLimit)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
3
ooni.go
3
ooni.go
|
@ -73,6 +73,9 @@ func (c *Context) Init() error {
|
|||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if err = c.Config.MaybeMigrate(); err != nil {
|
||||
return errors.Wrap(err, "migrating config")
|
||||
}
|
||||
|
||||
c.dbPath = utils.DBDir(c.Home, "main")
|
||||
log.Debugf("Connecting to database sqlite3://%s", c.dbPath)
|
||||
|
|
52
testdata/testing-config.json
vendored
52
testdata/testing-config.json
vendored
|
@ -1,59 +1,15 @@
|
|||
{
|
||||
"_": "This is your OONI Probe config file. See https://ooni.io/help/probe-cli for help",
|
||||
"_version": 0,
|
||||
"_version": 1,
|
||||
"_informed_consent": true,
|
||||
"_is_beta": true,
|
||||
"auto_update": true,
|
||||
"sharing": {
|
||||
"include_ip": false,
|
||||
"include_ip": true,
|
||||
"include_asn": true,
|
||||
"include_country": true,
|
||||
"include_gps": true,
|
||||
"upload_results": true
|
||||
},
|
||||
"notifications": {
|
||||
"enabled": true,
|
||||
"notify_on_test_completion": true,
|
||||
"notify_on_news": false
|
||||
},
|
||||
"automated_testing": {
|
||||
"enabled": false,
|
||||
"enabled_tests": [
|
||||
"web-connectivity",
|
||||
"facebook-messenger",
|
||||
"whatsapp",
|
||||
"telegram",
|
||||
"dash",
|
||||
"ndt",
|
||||
"http-invalid-request-line",
|
||||
"http-header-field-manipulation"
|
||||
],
|
||||
"monthly_allowance": "300MB"
|
||||
},
|
||||
"test_settings": {
|
||||
"websites": {
|
||||
"enabled_categories": [],
|
||||
"limit": 10
|
||||
},
|
||||
"instant_messaging": {
|
||||
"enabled_tests": [
|
||||
"facebook-messenger",
|
||||
"whatsapp",
|
||||
"telegram"
|
||||
]
|
||||
},
|
||||
"performance": {
|
||||
"ndt_server": "auto",
|
||||
"ndt_server_port": "auto",
|
||||
"dash_server": "auto",
|
||||
"dash_server_port": "auto"
|
||||
},
|
||||
"middlebox": {
|
||||
"enabled_tests": [
|
||||
"http-invalid-request-line",
|
||||
"http-header-field-manipulation"
|
||||
]
|
||||
}
|
||||
"nettests": {
|
||||
"websites_url_limit": 10
|
||||
},
|
||||
"advanced": {
|
||||
"use_domain_fronting": false,
|
||||
|
|
Loading…
Reference in New Issue
Block a user