package config import ( "io" "io/ioutil" "time" "github.com/caarlos0/env/v6" "github.com/pkg/errors" "gopkg.in/yaml.v2" ) type Config struct { HTTP HTTPConfig `yaml:"http"` SMTP SMTPConfig `yaml:"smtp"` Data DataConfig `yaml:"data"` Relay RelayConfig `yaml:"relay"` } type HTTPConfig struct { Address string `yaml:"address" env:"FAKESMTP_HTTP_ADDRESS"` TemplateDir string `yaml:"templateDir" env:"FAKESMTP_HTTP_TEMPLATEDIR"` PublicDir string `yaml:"publicDir" env:"FAKESMTP_HTTP_PUBLICDIR"` BaseURL string `yaml:"baseUrl" env:"FAKESMTP_HTTP_BASEURL"` } type SMTPConfig struct { Address string `yaml:"address" env:"FAKESMTP_SMTP_ADDRESS"` Username string `yaml:"username" env:"FAKESMTP_SMTP_USERNAME"` Password string `yaml:"password" env:"FAKESMTP_SMTP_PASSWORD"` Domain string `yaml:"domain" env:"FAKESMTP_SMTP_DOMAIN"` ReadTimeout time.Duration `yaml:"readTimeout" env:"FAKESMTP_SMTP_READTIMEOUT"` WriteTimeout time.Duration `yaml:"writeTimeout" env:"FAKESMTP_SMTP_WRITETIMEOUT"` MaxMessageBytes int `yaml:"maxMessageBytes" env:"FAKESMTP_SMTP_MAXMESSAGEBYTES"` MaxRecipients int `yaml:"maxRecipients" env:"FAKESMTP_SMTP_MAXRECIPIENTS"` AllowInsecureAuth bool `yaml:"allowInsecureAuth" env:"FAKESMTP_SMTP_ALLOWINSECUREAUTH"` Debug bool `yaml:"debug" env:"FAKESMTP_SMTP_DEBUG"` } type RelayConfig struct { Enabled bool `yaml:"enabled" env:"FAKESMTP_RELAY_ENABLED"` Address string `yaml:"address" env:"FAKESMTP_RELAY_ADDRESS"` Identity string `yaml:"identity" env:"FAKESMTP_RELAY_IDENTITY"` Username string `yaml:"username" env:"FAKESMTP_RELAY_USERNAME"` Password string `yaml:"password" env:"FAKESMTP_RELAY_PASSWORD"` Anonymous bool `yaml:"anonymous" env:"FAKESMTP_RELAY_ANONYMOUS"` UseTLS bool `yaml:"useTLS" env:"FAKESMTP_RELAY_USE_TLS"` InsecureSkipVerify bool `yaml:"insecureSkipVerify" env:"FAKESMTP_RELAY_INSECURE_SKIP_VERIFY"` FromOverride string `yaml:"fromOverride" env:"FAKESMTP_RELAY_FROM_OVERRIDE"` } type DataConfig struct { Path string `yaml:"path" env:"FAKESMTP_DATA_PATH"` } // NewFromFile retrieves the configuration from the given file func NewFromFile(filepath string) (*Config, error) { config := NewDefault() data, err := ioutil.ReadFile(filepath) if err != nil { return nil, errors.Wrapf(err, "could not read file '%s'", filepath) } if err := yaml.Unmarshal(data, config); err != nil { return nil, errors.Wrapf(err, "could not unmarshal configuration") } return config, nil } func WithEnvironment(conf *Config) error { if err := env.Parse(conf); err != nil { return err } return nil } func NewDumpDefault() *Config { config := NewDefault() return config } func NewDefault() *Config { return &Config{ HTTP: HTTPConfig{ Address: ":8080", TemplateDir: "template", PublicDir: "public", }, SMTP: SMTPConfig{ Address: ":2525", Username: "", Password: "", Domain: "localhost", ReadTimeout: 30 * time.Second, WriteTimeout: 30 * time.Second, MaxMessageBytes: 1024 * 1024, MaxRecipients: 50, AllowInsecureAuth: true, Debug: true, }, Data: DataConfig{ Path: "fakesmtp.db", }, Relay: RelayConfig{ Enabled: false, }, } } func Dump(config *Config, w io.Writer) error { data, err := yaml.Marshal(config) if err != nil { return errors.Wrap(err, "could not dump config") } if _, err := w.Write(data); err != nil { return err } return nil }