Add functions to handling migration from legacy OONI Probe
This commit is contained in:
parent
7327e1ff7f
commit
602a5dc952
42
Gopkg.lock
generated
42
Gopkg.lock
generated
|
@ -28,15 +28,55 @@
|
||||||
packages = ["."]
|
packages = ["."]
|
||||||
revision = "cc83f3b3ce5911279513a46d6d3316d67bedaa54"
|
revision = "cc83f3b3ce5911279513a46d6d3316d67bedaa54"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/mattn/go-colorable"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "167de6bfdfba052fa6b2d3664c8f5272e23c9072"
|
||||||
|
version = "v0.0.9"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "github.com/mattn/go-isatty"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "0360b2af4f38e8d38c7fce2a9f4e702702d73a39"
|
||||||
|
version = "v0.0.3"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
name = "github.com/mgutz/ansi"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "9520e82c474b0a04dd04f8a40959027271bab992"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
name = "github.com/mitchellh/go-homedir"
|
||||||
|
packages = ["."]
|
||||||
|
revision = "b8bc1bf767474819792c23f32d8286a45736f1c6"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
name = "github.com/pkg/errors"
|
name = "github.com/pkg/errors"
|
||||||
packages = ["."]
|
packages = ["."]
|
||||||
revision = "645ef00459ed84a119197bfb8d8205042c6df63d"
|
revision = "645ef00459ed84a119197bfb8d8205042c6df63d"
|
||||||
version = "v0.8.0"
|
version = "v0.8.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
name = "golang.org/x/sys"
|
||||||
|
packages = ["unix"]
|
||||||
|
revision = "37707fdb30a5b38865cfb95e5aab41707daec7fd"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
name = "gopkg.in/AlecAivazis/survey.v1"
|
||||||
|
packages = [
|
||||||
|
".",
|
||||||
|
"core",
|
||||||
|
"terminal"
|
||||||
|
]
|
||||||
|
revision = "0aa8b6a162b391fe2d95648b7677d1d6ac2090a6"
|
||||||
|
version = "v1.4.1"
|
||||||
|
|
||||||
[solve-meta]
|
[solve-meta]
|
||||||
analyzer-name = "dep"
|
analyzer-name = "dep"
|
||||||
analyzer-version = 1
|
analyzer-version = 1
|
||||||
inputs-digest = "4ed0a29997f4d8f197233e4ba7aa66ed7033443a893a795ed2b4a9a5ec4350bd"
|
inputs-digest = "8ca4591e7aeb614acd312b2f95a425fe4def8100bbfc56f9c9147ae8e8b3575a"
|
||||||
solver-name = "gps-cdcl"
|
solver-name = "gps-cdcl"
|
||||||
solver-version = 1
|
solver-version = 1
|
||||||
|
|
|
@ -40,3 +40,11 @@
|
||||||
[[constraint]]
|
[[constraint]]
|
||||||
name = "github.com/pkg/errors"
|
name = "github.com/pkg/errors"
|
||||||
version = "0.8.0"
|
version = "0.8.0"
|
||||||
|
|
||||||
|
[[constraint]]
|
||||||
|
branch = "master"
|
||||||
|
name = "github.com/mitchellh/go-homedir"
|
||||||
|
|
||||||
|
[[constraint]]
|
||||||
|
name = "gopkg.in/AlecAivazis/survey.v1"
|
||||||
|
version = "1.4.1"
|
||||||
|
|
|
@ -1,14 +1,87 @@
|
||||||
package config
|
package config
|
||||||
|
|
||||||
type websiteSettings struct {
|
var websiteCategories = []string{
|
||||||
|
"ALDR",
|
||||||
|
"ANON",
|
||||||
|
"COMM",
|
||||||
|
"COMT",
|
||||||
|
"CTRL",
|
||||||
|
"CULTR",
|
||||||
|
"DATE",
|
||||||
|
"ECON",
|
||||||
|
"ENV",
|
||||||
|
"FILE",
|
||||||
|
"GAME",
|
||||||
|
"GMB",
|
||||||
|
"GOVT",
|
||||||
|
"GRP",
|
||||||
|
"HACK",
|
||||||
|
"HATE",
|
||||||
|
"HOST",
|
||||||
|
"HUMR",
|
||||||
|
"IGO",
|
||||||
|
"LGBT",
|
||||||
|
"MILX",
|
||||||
|
"MMED",
|
||||||
|
"NEWS",
|
||||||
|
"POLR",
|
||||||
|
"PORN",
|
||||||
|
"PROV",
|
||||||
|
"PUBH",
|
||||||
|
"REL",
|
||||||
|
"SRCH",
|
||||||
|
"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"`
|
EnabledCategories []string `json:"enabled_categories"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type instantMessagingSettings struct {
|
// 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"`
|
EnabledTests []string `json:"enabled_tests"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type performanceSettings struct {
|
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 {
|
||||||
EnabledTests []string `json:"enabled_tests"`
|
EnabledTests []string `json:"enabled_tests"`
|
||||||
NDTServer string `json:"ndt_server"`
|
NDTServer string `json:"ndt_server"`
|
||||||
NDTServerPort string `json:"ndt_server_port"`
|
NDTServerPort string `json:"ndt_server_port"`
|
||||||
|
@ -16,14 +89,15 @@ type performanceSettings struct {
|
||||||
DashServerPort string `json:"dash_server_port"`
|
DashServerPort string `json:"dash_server_port"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type middleboxSettings struct {
|
// Middlebox nettest group
|
||||||
|
type Middlebox struct {
|
||||||
EnabledTests []string `json:"enabled_tests"`
|
EnabledTests []string `json:"enabled_tests"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// NettestGroups related settings
|
// NettestGroups related settings
|
||||||
type NettestGroups struct {
|
type NettestGroups struct {
|
||||||
Websites websiteSettings `json:"websites"`
|
Websites Websites `json:"websites"`
|
||||||
InstantMessaging instantMessagingSettings `json:"instant_messaging"`
|
InstantMessaging InstantMessaging `json:"instant_messaging"`
|
||||||
Performance performanceSettings `json:"performance"`
|
Performance Performance `json:"performance"`
|
||||||
Middlebox middleboxSettings `json:"middlebox"`
|
Middlebox Middlebox `json:"middlebox"`
|
||||||
}
|
}
|
||||||
|
|
63
data/default-config.json
Normal file
63
data/default-config.json
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
{
|
||||||
|
"_": "This is your OONI Probe config file. See https://ooni.io/help/ooniprobe-cli for help",
|
||||||
|
"auto_update": true,
|
||||||
|
"sharing": {
|
||||||
|
"include_ip": false,
|
||||||
|
"include_asn": true,
|
||||||
|
"include_gps": true,
|
||||||
|
"upload_results": true,
|
||||||
|
"send_crash_reports": 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"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"advanced": {
|
||||||
|
"include_country": true,
|
||||||
|
"use_domain_fronting": true
|
||||||
|
},
|
||||||
|
"_config_version": "0.0.1",
|
||||||
|
"_informed_consent": true
|
||||||
|
}
|
83
internal/legacy/legacy.go
Normal file
83
internal/legacy/legacy.go
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
package legacy
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
|
||||||
|
homedir "github.com/mitchellh/go-homedir"
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
"gopkg.in/AlecAivazis/survey.v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
func HomePath() (string, error) {
|
||||||
|
home, err := homedir.Dir()
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return filepath.Join(home, ".ooni"), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// HomeExists returns true if a legacy home exists
|
||||||
|
func HomeExists() (bool, error) {
|
||||||
|
home, err := HomePath()
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
path := filepath.Join(home, "ooniprobe.conf")
|
||||||
|
if _, err := os.Stat(path); os.IsNotExist(err) {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// BackupHome the legacy home directory
|
||||||
|
func BackupHome() error {
|
||||||
|
home, err := homedir.Dir()
|
||||||
|
if err != nil {
|
||||||
|
return errors.Wrap(err, "backing up home")
|
||||||
|
}
|
||||||
|
oldPath := filepath.Join(home, ".ooni")
|
||||||
|
newPath := filepath.Join(home, ".ooni-legacy")
|
||||||
|
if err := os.Rename(oldPath, newPath); err != nil {
|
||||||
|
return errors.Wrap(err, "backing up home")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// MaybeMigrateHome prompts the user if we should backup the legacy home
|
||||||
|
func MaybeMigrateHome() error {
|
||||||
|
exists, err := HomeExists()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if !exists {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
home, err := HomePath()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
logf("We found an existing OONI Probe installation")
|
||||||
|
chosen := ""
|
||||||
|
prompt := &survey.Select{
|
||||||
|
Message: "Should we:",
|
||||||
|
Options: []string{"delete it", "back it up"},
|
||||||
|
}
|
||||||
|
survey.AskOne(prompt, &chosen, nil)
|
||||||
|
if chosen == "delete it" {
|
||||||
|
if err := os.RemoveAll(home); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
logf("Backing up ~/.ooni to ~/.ooni-legacy")
|
||||||
|
if err := BackupHome(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func logf(s string, v ...interface{}) {
|
||||||
|
fmt.Printf("%s\n", fmt.Sprintf(s, v...))
|
||||||
|
}
|
77
ooni.go
77
ooni.go
|
@ -4,11 +4,24 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
|
||||||
|
homedir "github.com/mitchellh/go-homedir"
|
||||||
"github.com/openobservatory/gooni/config"
|
"github.com/openobservatory/gooni/config"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// GetOONIHome returns the path to the OONI Home
|
||||||
|
func GetOONIHome() (string, error) {
|
||||||
|
home, err := homedir.Dir()
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
path := filepath.Join(home, ".ooni")
|
||||||
|
return path, nil
|
||||||
|
}
|
||||||
|
|
||||||
// Config for the OONI Probe installation
|
// Config for the OONI Probe installation
|
||||||
type Config struct {
|
type Config struct {
|
||||||
// Private settings
|
// Private settings
|
||||||
|
@ -26,70 +39,6 @@ type Config struct {
|
||||||
|
|
||||||
// Default config settings
|
// Default config settings
|
||||||
func (c *Config) Default() error {
|
func (c *Config) Default() error {
|
||||||
// This is the default configuration:
|
|
||||||
/*
|
|
||||||
_: 'This is your OONI Probe config file. See https://ooni.io/help/ooniprobe-cli for help',
|
|
||||||
auto_update: true,
|
|
||||||
sharing: {
|
|
||||||
include_ip: false,
|
|
||||||
include_asn: true,
|
|
||||||
include_gps: true,
|
|
||||||
upload_results: true,
|
|
||||||
send_crash_reports: 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'
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
advanced: {
|
|
||||||
include_country: true,
|
|
||||||
use_domain_fronting: true
|
|
||||||
},
|
|
||||||
_config_version: CONFIG_VERSION,
|
|
||||||
_informed_consent: false
|
|
||||||
*/
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user