package main import ( "flag" "fmt" "log" "os" "gopkg.in/yaml.v2" ) var debug = os.Getenv("DEBUG") != "" type ( Config struct { Cert Cert Port int Domains map[string]map[string]Endpoint } Cert struct { CRT string Key string } Endpoint struct { To string Redir bool BasicAuth string `yaml:"basicAuth"` } ) func NewConfig() (Config, error) { var c Config fs := flag.NewFlagSet(os.Args[0], flag.ContinueOnError) fs.StringVar(&c.Cert.CRT, "crt", "", "path to .crt") fs.StringVar(&c.Cert.Key, "key", "", "path to .key") fs.IntVar(&c.Port, "p", 56112, "port to listen on") f := fs.String("f", "/dev/null", `file of {domains:{.google.com:{mail:{to: scheme://host:port, basicAuth: u:p, redir: false}}}}`) if err := fs.Parse(os.Args[1:]); err != nil { return c, err } if b, err := os.ReadFile(*f); err != nil { return c, err } else if err := yaml.Unmarshal(b, &c); err != nil { return c, err } else if len(c.Domains) == 0 { return c, fmt.Errorf("no domains configured") } keys := []string{} for k, v := range c.Domains { for k2 := range v { keys = append(keys, fmt.Sprintf("%s.%s", k2, k)) } } log.Printf("redirecting %+v", keys) return c, nil }