package web import ( "encoding/json" "io/ioutil" "strings" "code.crute.me/mcrute/go_ddns_manager/bind" "code.crute.me/mcrute/go_ddns_manager/dns" ) type ServerConfig struct { BindConfig *bind.BINDConfig DNSClient *dns.DNSClient AcmeView string DynamicDnsView string DDNSSecrets map[string]string `json:"DDNS"` AcmeSecrets map[string]map[string]int `json:"ACME"` } func LoadServerConfig(zonesFile, secretsFile, server, view string) (*ServerConfig, error) { scfg := &ServerConfig{ DNSClient: &dns.DNSClient{Server: server}, AcmeView: view, DynamicDnsView: view, } cfg, err := bind.ParseBINDConfig(zonesFile) if err != nil { return nil, err } scfg.BindConfig = cfg fd, err := ioutil.ReadFile(secretsFile) if err != nil { return nil, err } if err = json.Unmarshal(fd, scfg); err != nil { return nil, err } return scfg, nil } func (s *ServerConfig) GetDDNSZoneName(k string) string { v, _ := s.DDNSSecrets[k] return v } func (s *ServerConfig) AcmeSecretExists(k string) bool { _, ok := s.AcmeSecrets[k] return ok } func (s *ServerConfig) IsAcmeClientAllowed(key, zone string) bool { u, ok := s.AcmeSecrets[key] if !ok { return false } p, ok := u[zone] if ok && p == 1 { return true } p, ok = u[strings.TrimRight(zone, ".")] if ok && p == 1 { return true } return false }