package acmeserver import ( "io/ioutil" "log" "path/filepath" "gopkg.in/yaml.v2" "git.autistici.org/ai3/go-common/clientutil" ) // Config holds the configuration for an acmeserver instance. type Config struct { Addr string `yaml:"addr"` Email string `yaml:"email"` UseRSA bool `yaml:"use_rsa"` Dir string `yaml:"cert_dir"` ReplDS *clientutil.BackendConfig `yaml:"replds"` } // Definition of a single certificate: the main CN, and optionally a // list of subjectAltName entries. type certConfig struct { CN string `yaml:"cn"` AltNames []string `yaml:"alt_names"` } func decodeCertConfig(data []byte) ([][]string, error) { var cc []certConfig if err := yaml.Unmarshal(data, &cc); err != nil { return nil, err } var domains [][]string for _, c := range cc { d := []string{c.CN} d = append(d, c.AltNames...) domains = append(domains, d) } return domains, nil } func readCertConfig(path string) ([][]string, error) { data, err := ioutil.ReadFile(path) if err != nil { return nil, err } return decodeCertConfig(data) } func readCertConfigsFromDir(dir string) ([][]string, error) { files, err := filepath.Glob(filepath.Join(dir, "*.yml")) if err != nil { return nil, err } var domains [][]string for _, f := range files { d, err := readCertConfig(f) if err != nil { log.Printf("error reading %s: %v", f, err) continue } domains = append(domains, d...) } return domains, nil }