transdep/messages/nameresolver/entry.go
2018-01-23 21:25:00 +01:00

82 lines
1.9 KiB
Go

package nameresolver
import (
"github.com/miekg/dns"
"net"
"strings"
"encoding/json"
)
// serializedEntry is used as a proxy to generate a JSON representation of an entry, using the json go module.
type serializedEntry struct {
Name string `json:"name"`
Alias *string `json:"alias,omitempty"`
Addrs *[]net.IP `json:"addrs,omitempty"`
}
// Entry represents the resolution of a name, either into an alias (CNAME) or a list of IP addresses (both v4 and v6).
type Entry struct {
owner string
cNAMETarget string
addrs []net.IP
}
// NewAliasEntry is the constructor of an entry whose content symbolizes a domain name owning just a CNAME.
func NewAliasEntry(owner, CNAMETarget string) *Entry {
e := new(Entry)
e.owner = strings.ToLower(dns.Fqdn(owner))
e.cNAMETarget = strings.ToLower(dns.Fqdn(CNAMETarget))
return e
}
// NewIPEntry is the constructor of an entry whose content is a domain name and its associated IP addresses.
func NewIPEntry(name string, addrs []net.IP) *Entry {
e := new(Entry)
e.owner = strings.ToLower(dns.Fqdn(name))
e.cNAMETarget = ""
e.addrs = addrs
return e
}
// Implements json.Marshaler
func (e *Entry) MarshalJSON() ([]byte, error) {
sre := new(serializedEntry)
sre.Name = e.owner
if e.cNAMETarget != "" {
sre.Alias = new(string)
*sre.Alias = e.cNAMETarget
} else if len(e.addrs) > 0 {
sre.Addrs = new([]net.IP)
*sre.Addrs = e.addrs
}
return json.Marshal(sre)
}
// Implements json.Unmarshaler
func (e *Entry) UnmarshalJSON(bstr []byte) error {
sre := new(serializedEntry)
err := json.Unmarshal(bstr, sre)
if err != nil {
return err
}
e.owner = sre.Name
if sre.Alias != nil {
e.cNAMETarget = *sre.Alias
}
if sre.Addrs != nil {
e.addrs = *sre.Addrs
}
return nil
}
func (e *Entry) Owner() string {
return e.owner
}
func (e *Entry) CNAMETarget() string {
return e.cNAMETarget
}
func (e *Entry) Addrs() []net.IP {
return e.addrs
}