diff --git a/src/meshname/config.go b/src/meshname/config.go new file mode 100644 index 0000000..b021dad --- /dev/null +++ b/src/meshname/config.go @@ -0,0 +1,53 @@ +package meshname + +import ( + "encoding/json" + "errors" + "fmt" + "io/ioutil" + "net" + + "github.com/miekg/dns" +) + + +func GenConf(target, zone string) (string, error) { + ip := net.ParseIP(target) + if ip == nil { + return "", errors.New("Invalid IP address") + } + subDomain := DomainFromIP(&ip) + selfRecord := fmt.Sprintf("\t\t\"%s.%s AAAA %s\"\n", subDomain, zone, target) + confString := fmt.Sprintf("{\n\t\"%s\":[\n%s\t]\n}", subDomain, selfRecord) + + return confString, nil +} + +// Load zoneConfig from a JSON file +func ParseConfigFile(configPath string) (map[string][]dns.RR, error) { + conf, err := ioutil.ReadFile(configPath) + if err != nil { + return nil, err + } + var dat map[string][]string + if err := json.Unmarshal(conf, &dat); err == nil { + return ParseZoneConfigMap(dat) + } else { + return nil, err + } +} + +func ParseZoneConfigMap(zoneConfigMap map[string][]string) (map[string][]dns.RR, error) { + var zoneConfig = make(map[string][]dns.RR) + for subDomain, records := range zoneConfigMap { + for _, r := range records { + if rr, err := dns.NewRR(r); err == nil { + zoneConfig[subDomain] = append(zoneConfig[subDomain], rr) + } else { + return nil, err + } + } + } + return zoneConfig, nil +} + diff --git a/src/meshname/domain.go b/src/meshname/domain.go new file mode 100644 index 0000000..936b22c --- /dev/null +++ b/src/meshname/domain.go @@ -0,0 +1,28 @@ +package meshname + +import ( + "encoding/base32" + "errors" + "net" + "strings" +) + +func DomainFromIP(target *net.IP) string { + return strings.ToLower(base32.StdEncoding.EncodeToString(*target)[0:26]) +} + +func IPFromDomain(domain *string) (net.IP, error) { + name := strings.ToUpper(*domain) + "======" + data, err := base32.StdEncoding.DecodeString(name) + if err != nil { + return net.IP{}, err + } + if len(data) != 16 { + return net.IP{}, errors.New("Invalid subdomain") + } + ipAddr := net.IP(data) + if ipAddr == nil { + return net.IP{}, errors.New("Invalid IP address") + } + return ipAddr, nil +} diff --git a/src/meshname/server.go b/src/meshname/server.go index 3f8b296..ec95356 100644 --- a/src/meshname/server.go +++ b/src/meshname/server.go @@ -1,11 +1,7 @@ package meshname import ( - "encoding/base32" - "encoding/json" "errors" - "fmt" - "io/ioutil" "net" "strings" "sync" @@ -14,66 +10,6 @@ import ( "github.com/miekg/dns" ) -func DomainFromIP(target *net.IP) string { - return strings.ToLower(base32.StdEncoding.EncodeToString(*target)[0:26]) -} - -func IPFromDomain(domain *string) (net.IP, error) { - name := strings.ToUpper(*domain) + "======" - data, err := base32.StdEncoding.DecodeString(name) - if err != nil { - return net.IP{}, err - } - if len(data) != 16 { - return net.IP{}, errors.New("Invalid subdomain") - } - ipAddr := net.IP(data) - if ipAddr == nil { - return net.IP{}, errors.New("Invalid IP address") - } - return ipAddr, nil -} - -func GenConf(target, zone string) (string, error) { - ip := net.ParseIP(target) - if ip == nil { - return "", errors.New("Invalid IP address") - } - subDomain := DomainFromIP(&ip) - selfRecord := fmt.Sprintf("\t\t\"%s.%s AAAA %s\"\n", subDomain, zone, target) - confString := fmt.Sprintf("{\n\t\"%s\":[\n%s\t]\n}", subDomain, selfRecord) - - return confString, nil -} - -// Load zoneConfig from a JSON file -func ParseConfigFile(configPath string) (map[string][]dns.RR, error) { - conf, err := ioutil.ReadFile(configPath) - if err != nil { - return nil, err - } - var dat map[string][]string - if err := json.Unmarshal(conf, &dat); err == nil { - return ParseZoneConfigMap(dat) - } else { - return nil, err - } -} - -func ParseZoneConfigMap(zoneConfigMap map[string][]string) (map[string][]dns.RR, error) { - var zoneConfig = make(map[string][]dns.RR) - for subDomain, records := range zoneConfigMap { - for _, r := range records { - if rr, err := dns.NewRR(r); err == nil { - zoneConfig[subDomain] = append(zoneConfig[subDomain], rr) - } else { - return nil, err - } - } - } - return zoneConfig, nil -} - type MeshnameServer struct { log *log.Logger listenAddr string