Added supplementary error checking (#99)

* Added supplementary errorichecking

* After running util.go through gofmt

* Updated main and util

* Minor updates to main and util

* Slight refactoring

* Add tests
This commit is contained in:
Joona Hoikkala 2018-08-12 18:49:17 +03:00 committed by GitHub
parent 75d4a30c1f
commit 856cc05881
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 56 additions and 13 deletions

19
main.go
View File

@ -16,13 +16,20 @@ import (
func main() { func main() {
// Read global config // Read global config
if fileExists("/etc/acme-dns/config.cfg") { var err error
Config = readConfig("/etc/acme-dns/config.cfg") if fileIsAccessible("/etc/acme-dns/config.cfg") {
log.WithFields(log.Fields{"file": "/etc/acme-dns/config.cfg"}).Info("Using config file") log.WithFields(log.Fields{"file": "/etc/acme-dns/config.cfg"}).Info("Using config file")
Config, err = readConfig("/etc/acme-dns/config.cfg")
} else { } else if fileIsAccessible("./config.cfg") {
log.WithFields(log.Fields{"file": "./config.cfg"}).Info("Using config file") log.WithFields(log.Fields{"file": "./config.cfg"}).Info("Using config file")
Config = readConfig("config.cfg") Config, err = readConfig("./config.cfg")
} else {
log.Errorf("Configuration file not found.")
os.Exit(1)
}
if err != nil {
log.Errorf("Encountered an error while trying to read configuration file: %s", err)
os.Exit(1)
} }
setupLogging(Config.Logconfig.Format, Config.Logconfig.Level) setupLogging(Config.Logconfig.Format, Config.Logconfig.Level)
@ -32,7 +39,7 @@ func main() {
// Open database // Open database
newDB := new(acmedb) newDB := new(acmedb)
err := newDB.Init(Config.Database.Engine, Config.Database.Connection) err = newDB.Init(Config.Database.Engine, Config.Database.Connection)
if err != nil { if err != nil {
log.Errorf("Could not open database [%v]", err) log.Errorf("Could not open database [%v]", err)
os.Exit(1) os.Exit(1)

14
util.go
View File

@ -17,19 +17,23 @@ func jsonError(message string) []byte {
return []byte(fmt.Sprintf("{\"error\": \"%s\"}", message)) return []byte(fmt.Sprintf("{\"error\": \"%s\"}", message))
} }
func fileExists(fname string) bool { func fileIsAccessible(fname string) bool {
_, err := os.Stat(fname) _, err := os.Stat(fname)
if err != nil { if err != nil {
return false return false
} }
f, err := os.Open(fname)
if err != nil {
return false
}
f.Close()
return true return true
} }
func readConfig(fname string) DNSConfig { func readConfig(fname string) (DNSConfig, error) {
var conf DNSConfig var conf DNSConfig
// Practically never errors _, err := toml.DecodeFile(fname, &conf)
_, _ = toml.DecodeFile(fname, &conf) return conf, err
return conf
} }
func sanitizeString(s string) string { func sanitizeString(s string) string {

View File

@ -1,10 +1,12 @@
package main package main
import ( import (
log "github.com/sirupsen/logrus"
"io/ioutil" "io/ioutil"
"os" "os"
"syscall"
"testing" "testing"
log "github.com/sirupsen/logrus"
) )
func TestSetupLogging(t *testing.T) { func TestSetupLogging(t *testing.T) {
@ -62,7 +64,7 @@ func TestReadConfig(t *testing.T) {
if err := tmpfile.Close(); err != nil { if err := tmpfile.Close(); err != nil {
t.Error("Could not close temporary file") t.Error("Could not close temporary file")
} }
ret := readConfig(tmpfile.Name()) ret, _ := readConfig(tmpfile.Name())
if ret.General.Listen != test.output.General.Listen { if ret.General.Listen != test.output.General.Listen {
t.Errorf("Test %d: Expected listen value %s, but got %s", i, test.output.General.Listen, ret.General.Listen) t.Errorf("Test %d: Expected listen value %s, but got %s", i, test.output.General.Listen, ret.General.Listen)
} }
@ -95,3 +97,33 @@ func TestGetIPListFromHeader(t *testing.T) {
} }
} }
} }
func TestFileCheckPermissionDenied(t *testing.T) {
tmpfile, err := ioutil.TempFile("", "acmedns")
if err != nil {
t.Error("Could not create temporary file")
}
defer os.Remove(tmpfile.Name())
syscall.Chmod(tmpfile.Name(), 0000)
if fileIsAccessible(tmpfile.Name()) {
t.Errorf("File should not be accessible")
}
syscall.Chmod(tmpfile.Name(), 0644)
}
func TestFileCheckNotExists(t *testing.T) {
if fileIsAccessible("/path/that/does/not/exist") {
t.Errorf("File should not be accessible")
}
}
func TestFileCheckOK(t *testing.T) {
tmpfile, err := ioutil.TempFile("", "acmedns")
if err != nil {
t.Error("Could not create temporary file")
}
defer os.Remove(tmpfile.Name())
if !fileIsAccessible(tmpfile.Name()) {
t.Errorf("File should be accessible")
}
}