2017-02-07 21:33:23 +00:00
|
|
|
package dns
|
|
|
|
|
2018-05-31 07:30:04 +00:00
|
|
|
import "encoding/json"
|
2017-02-07 21:33:23 +00:00
|
|
|
import "gopkg.in/ns1/ns1-go.v2/rest/model/data"
|
|
|
|
|
|
|
|
// Zone wraps an NS1 /zone resource
|
|
|
|
type Zone struct {
|
|
|
|
// Zones have metadata tables, but no filters act on 'zone-level' meta.
|
|
|
|
Meta *data.Meta `json:"meta,omitempty"`
|
|
|
|
|
|
|
|
// Read-only fields
|
|
|
|
DNSServers []string `json:"dns_servers,omitempty"`
|
|
|
|
NetworkPools []string `json:"network_pools,omitempty"`
|
|
|
|
Pool string `json:"pool,omitempty"` // Deprecated
|
|
|
|
|
|
|
|
ID string `json:"id,omitempty"`
|
|
|
|
Zone string `json:"zone,omitempty"`
|
|
|
|
|
|
|
|
TTL int `json:"ttl,omitempty"`
|
|
|
|
NxTTL int `json:"nx_ttl,omitempty"`
|
|
|
|
Retry int `json:"retry,omitempty"`
|
|
|
|
Serial int `json:"serial,omitempty"`
|
|
|
|
Refresh int `json:"refresh,omitempty"`
|
|
|
|
Expiry int `json:"expiry,omitempty"`
|
|
|
|
Hostmaster string `json:"hostmaster,omitempty"`
|
|
|
|
|
|
|
|
// If this is a linked zone, Link points to an existing standard zone,
|
|
|
|
// reusing its configuration and records. Link is a zones' domain name.
|
|
|
|
Link *string `json:"link,omitempty"`
|
|
|
|
|
|
|
|
// Networks contains the network ids the zone is available. Most zones
|
|
|
|
// will be in the NSONE Global Network(which is id 0).
|
|
|
|
NetworkIDs []int `json:"networks,omitempty"`
|
|
|
|
Records []*ZoneRecord `json:"records,omitempty"`
|
|
|
|
|
|
|
|
// Primary contains info to enable slaving of the zone by third party dns servers.
|
|
|
|
Primary *ZonePrimary `json:"primary,omitempty"`
|
|
|
|
// Secondary contains info for slaving the zone to a primary dns server.
|
|
|
|
Secondary *ZoneSecondary `json:"secondary,omitempty"`
|
|
|
|
}
|
|
|
|
|
|
|
|
func (z Zone) String() string {
|
|
|
|
return z.Zone
|
|
|
|
}
|
|
|
|
|
|
|
|
// ZoneRecord wraps Zone's "records" attribute
|
|
|
|
type ZoneRecord struct {
|
2018-05-31 07:30:04 +00:00
|
|
|
Domain string `json:"Domain,omitempty"`
|
|
|
|
ID string `json:"id,omitempty"`
|
|
|
|
Link string `json:"link,omitempty"`
|
|
|
|
ShortAns []string `json:"short_answers,omitempty"`
|
|
|
|
Tier json.Number `json:"tier,omitempty"`
|
|
|
|
TTL int `json:"ttl,omitempty"`
|
|
|
|
Type string `json:"type,omitempty"`
|
2017-02-07 21:33:23 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// ZonePrimary wraps a Zone's "primary" attribute
|
|
|
|
type ZonePrimary struct {
|
|
|
|
// Enabled determines whether AXFR queries (and optionally NOTIFY messages)
|
|
|
|
// will be enabled for the zone.
|
|
|
|
Enabled bool `json:"enabled"`
|
|
|
|
Secondaries []ZoneSecondaryServer `json:"secondaries"`
|
|
|
|
}
|
|
|
|
|
|
|
|
// ZoneSecondaryServer wraps elements of a Zone's "primary.secondary" attribute
|
|
|
|
type ZoneSecondaryServer struct {
|
|
|
|
// Read-Only
|
|
|
|
NetworkIDs []int `json:"networks,omitempty"`
|
|
|
|
|
|
|
|
IP string `json:"ip"`
|
|
|
|
Port int `json:"port,omitempty"`
|
|
|
|
Notify bool `json:"notify"`
|
|
|
|
}
|
|
|
|
|
|
|
|
// ZoneSecondary wraps a Zone's "secondary" attribute
|
|
|
|
type ZoneSecondary struct {
|
|
|
|
// Read-Only fields
|
|
|
|
Expired bool `json:"expired,omitempty"`
|
|
|
|
LastXfr int `json:"last_xfr,omitempty"`
|
|
|
|
Status string `json:"status,omitempty"`
|
|
|
|
Error *string `json:"error"`
|
|
|
|
|
|
|
|
PrimaryIP string `json:"primary_ip,omitempty"`
|
|
|
|
PrimaryPort int `json:"primary_port,omitempty"`
|
|
|
|
Enabled bool `json:"enabled"`
|
|
|
|
|
|
|
|
TSIG *TSIG `json:"tsig"`
|
|
|
|
}
|
|
|
|
|
|
|
|
// TSIG is a zones transaction signature.
|
|
|
|
type TSIG struct {
|
|
|
|
// Key is the encrypted TSIG key(read-only)
|
|
|
|
Key string `json:"key,omitempty"`
|
|
|
|
|
|
|
|
// Whether TSIG is enabled for a secondary zone.
|
|
|
|
Enabled bool `json:"enabled,omitempty"`
|
|
|
|
// Which hashing algorithm
|
|
|
|
Hash string `json:"hash,omitempty"`
|
|
|
|
// Name of the TSIG key
|
|
|
|
Name string `json:"name,omitempty"`
|
|
|
|
}
|
|
|
|
|
|
|
|
// NewZone takes a zone domain name and creates a new zone.
|
|
|
|
func NewZone(zone string) *Zone {
|
|
|
|
z := Zone{
|
|
|
|
Zone: zone,
|
|
|
|
}
|
|
|
|
return &z
|
|
|
|
}
|
|
|
|
|
|
|
|
// MakePrimary enables Primary, disables Secondary, and sets primary's
|
|
|
|
// Secondaries to all provided ZoneSecondaryServers
|
|
|
|
func (z *Zone) MakePrimary(secondaries ...ZoneSecondaryServer) {
|
|
|
|
z.Secondary = nil
|
|
|
|
z.Primary = &ZonePrimary{
|
|
|
|
Enabled: true,
|
|
|
|
Secondaries: secondaries,
|
|
|
|
}
|
|
|
|
if z.Primary.Secondaries == nil {
|
|
|
|
z.Primary.Secondaries = make([]ZoneSecondaryServer, 0)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// MakeSecondary enables Secondary, disables Primary, and sets secondary's
|
|
|
|
// Primary_ip to provided ip.
|
|
|
|
func (z *Zone) MakeSecondary(ip string) {
|
|
|
|
z.Secondary = &ZoneSecondary{
|
|
|
|
Enabled: true,
|
|
|
|
PrimaryIP: ip,
|
|
|
|
PrimaryPort: 53,
|
|
|
|
}
|
|
|
|
z.Primary = &ZonePrimary{
|
|
|
|
Enabled: false,
|
|
|
|
Secondaries: make([]ZoneSecondaryServer, 0),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// LinkTo sets Link to a target zone domain name and unsets all other configuration properties.
|
|
|
|
// No other zone configuration properties (such as refresh, retry, etc) may be specified,
|
|
|
|
// since they are all pulled from the target zone. Linked zones, once created, cannot be
|
|
|
|
// configured at all and cannot have records added to them. They may only be deleted, which
|
|
|
|
// does not affect the target zone at all.
|
|
|
|
func (z *Zone) LinkTo(to string) {
|
|
|
|
z.Meta = nil
|
|
|
|
z.TTL = 0
|
|
|
|
z.NxTTL = 0
|
|
|
|
z.Retry = 0
|
|
|
|
z.Refresh = 0
|
|
|
|
z.Expiry = 0
|
|
|
|
z.Primary = nil
|
|
|
|
z.DNSServers = nil
|
|
|
|
z.NetworkIDs = nil
|
|
|
|
z.NetworkPools = nil
|
|
|
|
z.Hostmaster = ""
|
|
|
|
z.Pool = ""
|
|
|
|
z.Secondary = nil
|
|
|
|
z.Link = &to
|
|
|
|
}
|