Merge pull request #10 from OpenObservatory/refactor/paths

Move all directory related functionality into paths utils
This commit is contained in:
Arturo Filastò 2018-05-03 14:50:36 +02:00 committed by GitHub
commit 75c8094738
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 54 additions and 31 deletions

View File

@ -1,13 +1,13 @@
package database
import (
"fmt"
"os"
"path/filepath"
"time"
"github.com/apex/log"
"github.com/jmoiron/sqlx"
"github.com/openobservatory/gooni/utils"
"github.com/pkg/errors"
)
@ -247,29 +247,12 @@ func (r *Result) Finished(db *sqlx.DB, makeSummary ResultSummaryFunc) error {
return nil
}
// MakeResultsPath creates and returns a directory for the result
func MakeResultsPath(home string, r *Result) (string, error) {
p := filepath.Join(home, "msmts",
fmt.Sprintf("%s-%s", r.Name, r.StartTime.Format(time.RFC3339Nano)))
// If the path already exists, this is a problem. It should not clash, because
// we are using nanosecond precision for the starttime.
if _, e := os.Stat(p); e == nil {
return "", errors.New("results path already exists")
}
err := os.MkdirAll(p, 0700)
if err != nil {
return "", err
}
return p, nil
}
// CreateResult writes the Result to the database a returns a pointer
// to the Result
func CreateResult(db *sqlx.DB, homePath string, r Result) (*Result, error) {
log.Debugf("Creating result %v", r)
p, err := MakeResultsPath(homePath, &r)
p, err := utils.MakeResultsDir(homePath, r.Name, r.StartTime)
if err != nil {
return nil, err
}

13
ooni.go
View File

@ -59,9 +59,9 @@ func (c *Context) MaybeLocationLookup() error {
func (c *Context) LocationLookup() error {
var err error
dbPath := filepath.Join(c.Home, "geoip")
geoipDir := utils.GeoIPDir(c.Home)
c.Location, err = utils.GeoIPLookup(dbPath)
c.Location, err = utils.GeoIPLookup(geoipDir)
if err != nil {
return err
}
@ -92,7 +92,7 @@ func (c *Context) Init() error {
return err
}
c.dbPath = filepath.Join(c.Home, "db", "main.sqlite3")
c.dbPath = utils.DBDir(c.Home, "main")
if c.Config.InformedConsent == false {
if err = Onboarding(c.Config); err != nil {
return errors.Wrap(err, "onboarding")
@ -215,11 +215,10 @@ func ParseConfig(b []byte) (*Config, error) {
// MaybeInitializeHome does the setup for a new OONI Home
func MaybeInitializeHome(home string) error {
firstRun := false
requiredDirs := []string{"db", "msmts", "geoip"}
for _, d := range requiredDirs {
if _, e := os.Stat(filepath.Join(home, d)); e != nil {
for _, d := range utils.RequiredDirs(home) {
if _, e := os.Stat(d); e != nil {
firstRun = true
if err := os.MkdirAll(filepath.Join(home, d), 0700); err != nil {
if err := os.MkdirAll(d, 0700); err != nil {
return err
}
}

View File

@ -36,11 +36,6 @@ var legacyGeoipFiles = map[string]string{
"GeoIP.dat": "http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz",
}
// GeoIPDir returns the geoip data dir for the given OONI Home
func GeoIPDir(home string) string {
return filepath.Join(home, "geoip")
}
// Download the file to a temporary location
func downloadToTemp(url string) (string, error) {
out, err := ioutil.TempFile(os.TempDir(), "maxmind")

46
utils/paths.go Normal file
View File

@ -0,0 +1,46 @@
package utils
import (
"errors"
"fmt"
"os"
"path/filepath"
"time"
)
// RequiredDirs returns the required ooni home directories
func RequiredDirs(home string) []string {
requiredDirs := []string{}
requiredSubdirs := []string{"db", "msmts", "geoip"}
for _, d := range requiredSubdirs {
requiredDirs = append(requiredDirs, filepath.Join(home, d))
}
return requiredDirs
}
// GeoIPDir returns the geoip data dir for the given OONI Home
func GeoIPDir(home string) string {
return filepath.Join(home, "geoip")
}
// DBDir returns the database dir for the given name
func DBDir(home string, name string) string {
return filepath.Join(home, "db", fmt.Sprintf("%s.sqlite3", name))
}
// MakeResultsDir creates and returns a directory for the result
func MakeResultsDir(home string, name string, ts time.Time) (string, error) {
p := filepath.Join(home, "msmts",
fmt.Sprintf("%s-%s", name, ts.Format(time.RFC3339Nano)))
// If the path already exists, this is a problem. It should not clash, because
// we are using nanosecond precision for the starttime.
if _, e := os.Stat(p); e == nil {
return "", errors.New("results path already exists")
}
err := os.MkdirAll(p, 0700)
if err != nil {
return "", err
}
return p, nil
}