Skip to content
Snippets Groups Projects
config.go 1.47 KiB
Newer Older
  • Learn to ignore specific revisions
  • ale's avatar
    ale committed
    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
    }