Files
gluetun/internal/configuration/settings.go

118 lines
3.5 KiB
Go
Raw Normal View History

2021-02-06 11:05:50 -05:00
package configuration
import (
2021-06-20 16:12:39 +00:00
"errors"
"fmt"
2021-02-06 11:05:50 -05:00
"strings"
"github.com/qdm12/golibs/logging"
"github.com/qdm12/golibs/params"
)
// Settings contains all settings for the program to run.
type Settings struct {
VPN VPN
2021-02-06 11:05:50 -05:00
System System
DNS DNS
Firewall Firewall
HTTPProxy HTTPProxy
ShadowSocks ShadowSocks
Updater Updater
PublicIP PublicIP
VersionInformation bool
ControlServer ControlServer
Health Health
2021-02-06 11:05:50 -05:00
}
func (settings *Settings) String() string {
return strings.Join(settings.lines(), "\n")
}
func (settings *Settings) lines() (lines []string) {
lines = append(lines, "Settings summary below:")
lines = append(lines, settings.VPN.lines()...)
2021-02-06 11:05:50 -05:00
lines = append(lines, settings.DNS.lines()...)
lines = append(lines, settings.Firewall.lines()...)
lines = append(lines, settings.System.lines()...)
lines = append(lines, settings.HTTPProxy.lines()...)
lines = append(lines, settings.ShadowSocks.lines()...)
lines = append(lines, settings.Health.lines()...)
2021-02-06 11:05:50 -05:00
lines = append(lines, settings.ControlServer.lines()...)
lines = append(lines, settings.Updater.lines()...)
lines = append(lines, settings.PublicIP.lines()...)
if settings.VersionInformation {
lines = append(lines, lastIndent+"Github version information: enabled")
}
return lines
}
2021-06-20 16:12:39 +00:00
var (
ErrVPN = errors.New("cannot read VPN settings")
2021-06-20 16:12:39 +00:00
ErrSystem = errors.New("cannot read System settings")
ErrDNS = errors.New("cannot read DNS settings")
ErrFirewall = errors.New("cannot read firewall settings")
ErrHTTPProxy = errors.New("cannot read HTTP proxy settings")
ErrShadowsocks = errors.New("cannot read Shadowsocks settings")
ErrControlServer = errors.New("cannot read control server settings")
ErrUpdater = errors.New("cannot read Updater settings")
ErrPublicIP = errors.New("cannot read Public IP getter settings")
ErrHealth = errors.New("cannot read health settings")
2021-06-20 16:12:39 +00:00
)
2021-02-06 11:05:50 -05:00
// Read obtains all configuration options for the program and returns an error as soon
// as an error is encountered reading them.
func (settings *Settings) Read(env params.Env, logger logging.Logger) (err error) {
r := newReader(env, logger)
2021-02-06 11:05:50 -05:00
settings.VersionInformation, err = r.env.OnOff("VERSION_INFORMATION", params.Default("on"))
if err != nil {
return fmt.Errorf("environment variable VERSION_INFORMATION: %w", err)
2021-02-06 11:05:50 -05:00
}
if err := settings.VPN.read(r); err != nil {
return fmt.Errorf("%w: %s", ErrVPN, err)
2021-02-06 11:05:50 -05:00
}
if err := settings.System.read(r); err != nil {
2021-06-20 16:12:39 +00:00
return fmt.Errorf("%w: %s", ErrSystem, err)
2021-02-06 11:05:50 -05:00
}
if err := settings.DNS.read(r); err != nil {
2021-06-20 16:12:39 +00:00
return fmt.Errorf("%w: %s", ErrDNS, err)
2021-02-06 11:05:50 -05:00
}
if err := settings.Firewall.read(r); err != nil {
2021-06-20 16:12:39 +00:00
return fmt.Errorf("%w: %s", ErrFirewall, err)
2021-02-06 11:05:50 -05:00
}
if err := settings.HTTPProxy.read(r); err != nil {
2021-06-20 16:12:39 +00:00
return fmt.Errorf("%w: %s", ErrHTTPProxy, err)
2021-02-06 11:05:50 -05:00
}
if err := settings.ShadowSocks.read(r); err != nil {
2021-06-20 16:12:39 +00:00
return fmt.Errorf("%w: %s", ErrShadowsocks, err)
2021-02-06 11:05:50 -05:00
}
if err := settings.ControlServer.read(r); err != nil {
2021-06-20 16:12:39 +00:00
return fmt.Errorf("%w: %s", ErrControlServer, err)
2021-02-06 11:05:50 -05:00
}
if err := settings.Updater.read(r); err != nil {
2021-06-20 16:12:39 +00:00
return fmt.Errorf("%w: %s", ErrUpdater, err)
2021-02-06 11:05:50 -05:00
}
if ip := settings.DNS.PlaintextAddress; ip != nil {
settings.Updater.DNSAddress = ip.String()
}
2021-02-06 11:05:50 -05:00
if err := settings.PublicIP.read(r); err != nil {
2021-06-20 16:12:39 +00:00
return fmt.Errorf("%w: %s", ErrPublicIP, err)
2021-02-06 11:05:50 -05:00
}
if err := settings.Health.read(r); err != nil {
return fmt.Errorf("%w: %s", ErrHealth, err)
}
2021-02-06 11:05:50 -05:00
return nil
}