netoik-home/back/pkg/conf/conf.go

109 lines
3.2 KiB
Go

package conf
import (
"fmt"
"github.com/pelletier/go-toml"
"net"
"os"
"time"
)
type conf struct {
BindHost string `toml:"bind_host"`
BindPort int `toml:"bind_port"`
SMTPHost string `toml:"smtp_host"`
SMTPPort int `toml:"smtp_port"`
SMTPUsername string `toml:"smtp_username"`
SMTPPassword string `toml:"smtp_password"`
SMTPReceiver string `toml:"smtp_receiver"`
CaptchaDirectory string `toml:"captcha_directory"`
CaptchaLength int `toml:"captcha_length"`
CaptchaWidth int `toml:"captcha_width"`
CaptchaHeight int `toml:"captcha_height"`
CaptchaExpiration time.Duration `toml:"captcha_expiration"`
}
var Conf = conf{
BindHost: "127.0.0.1",
BindPort: 8000,
CaptchaLength: 6,
CaptchaWidth: 240,
CaptchaHeight: 80,
CaptchaExpiration: time.Hour,
}
func ParseFile(path string) bool {
var failure bool
// Open config file
file, err := os.Open(path)
if err != nil {
fmt.Fprintf(os.Stderr, "ERROR: cannot open config file %q: %s\n", path, err.Error())
return false
}
// Read data from config file
var data = make([]byte, 10000)
n, err := file.Read(data)
if err != nil {
fmt.Fprintf(os.Stderr, "ERROR: cannot read config file %q: %s\n", path, err.Error())
return false
}
// Parse toml from config file
if err = toml.Unmarshal(data[:n], &Conf); err != nil {
fmt.Fprintf(os.Stderr, "ERROR: cannot load toml config from file %q: %s\n", path, err.Error())
return false
}
// Check arguments in config file
if net.ParseIP(Conf.BindHost) == nil {
fmt.Fprintf(os.Stderr, "ERROR: bad value for 'bind_host' in config file %q: should be a valid IP address\n", path)
failure = true
}
if Conf.BindPort < 1 || Conf.BindPort > 65535 {
fmt.Fprintf(os.Stderr, "ERROR: bad value for 'bind_port' in config file %q: should be an integer in 1-65535\n", path)
failure = true
}
if Conf.SMTPHost == "" {
fmt.Fprintf(os.Stderr, "ERROR: missing value for 'smtp_host' in config file %q\n", path)
failure = true
}
if Conf.SMTPPort < 1 || Conf.SMTPPort > 65535 {
fmt.Fprintf(os.Stderr, "ERROR: bad value for 'smtp_port' in config file %q: should be an integer in 1-65535\n", path)
failure = true
}
if Conf.SMTPUsername == "" {
fmt.Fprintf(os.Stderr, "ERROR: missing value for 'smtp_username' in config file %q\n", path)
failure = true
}
if Conf.SMTPPassword == "" {
fmt.Fprintf(os.Stderr, "ERROR: missing value for 'smtp_password' in config file %q\n", path)
failure = true
}
if Conf.SMTPReceiver == "" {
fmt.Fprintf(os.Stderr, "ERROR: missing value for 'smtp_receiver' in config file %q\n", path)
failure = true
}
if Conf.CaptchaDirectory == "" {
fmt.Fprintf(os.Stderr, "ERROR: missing value for 'captcha_directory' in config file %q\n", path)
failure = true
}
if Conf.CaptchaLength == 0 {
fmt.Fprintf(os.Stderr, "ERROR: missing value for 'captcha_length' in config file %q\n", path)
failure = true
}
if Conf.CaptchaWidth == 0 {
fmt.Fprintf(os.Stderr, "ERROR: missing value for 'captcha_width' in config file %q\n", path)
failure = true
}
if Conf.CaptchaHeight == 0 {
fmt.Fprintf(os.Stderr, "ERROR: missing value for 'captcha_height' in config file %q\n", path)
failure = true
}
return !failure
}