mirror of
https://github.com/StackExchange/dnscontrol.git
synced 2024-11-10 17:26:10 +08:00
9812ecd9ff
* github.com/miekg/dns * Greatly simplify the logic for handling serial numbers. Related code was all over the place. Now it is abstracted into one testable method makeSoa. This simplifies code in many other places. * Update docs/_providers/bind.md: Edit old text. Add SOA description. * SOA records are now treated like any other record internally. You still can't specify them in dnsconfig.js, but that's by design. * The URL for issue 491 was wrong in many places * BIND: Clarify GENERATE_ZONEFILE message
78 lines
2.1 KiB
Go
78 lines
2.1 KiB
Go
package models
|
|
|
|
import (
|
|
"fmt"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
/*
|
|
|
|
Providers are not expected to support this record.
|
|
|
|
Most providers do not support SOA records. They generate them
|
|
dynamically behind the scenes. Providers like BIND (which is
|
|
software, not SaaS), must handle SOA records and emulate the dynamic
|
|
work that providers do.
|
|
|
|
*/
|
|
|
|
// SetTargetSOA sets the SOA fields.
|
|
func (rc *RecordConfig) SetTargetSOA(ns, mbox string, serial, refresh, retry, expire, minttl uint32) error {
|
|
rc.SetTarget(ns) // The NS field is stored as the .Target
|
|
rc.SoaMbox = mbox
|
|
rc.SoaSerial = serial
|
|
rc.SoaRefresh = refresh
|
|
rc.SoaRetry = retry
|
|
rc.SoaExpire = expire
|
|
rc.SoaMinttl = minttl
|
|
|
|
if rc.Type == "" {
|
|
rc.Type = "SOA"
|
|
}
|
|
if rc.Type != "SOA" {
|
|
panic("assertion failed: SetTargetSOA called when .Type is not SOA")
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// SetTargetSOAStrings is like SetTargetSOA but accepts strings.
|
|
func (rc *RecordConfig) SetTargetSOAStrings(ns, mbox, serial, refresh, retry, expire, minttl string) error {
|
|
|
|
u32serial, err := strconv.ParseUint(serial, 10, 32)
|
|
if err != nil {
|
|
return fmt.Errorf("SOA serial '%v' is invalid: %w", serial, err)
|
|
}
|
|
|
|
u32refresh, err := strconv.ParseUint(refresh, 10, 32)
|
|
if err != nil {
|
|
return fmt.Errorf("SOA refresh '%v' is invalid: %w", refresh, err)
|
|
}
|
|
|
|
u32retry, err := strconv.ParseUint(retry, 10, 32)
|
|
if err != nil {
|
|
return fmt.Errorf("SOA retry '%v' is invalid: %w", retry, err)
|
|
}
|
|
|
|
u32expire, err := strconv.ParseUint(expire, 10, 32)
|
|
if err != nil {
|
|
return fmt.Errorf("SOA expire '%v' is invalid: %w", expire, err)
|
|
}
|
|
|
|
u32minttl, err := strconv.ParseUint(minttl, 10, 32)
|
|
if err != nil {
|
|
return fmt.Errorf("SOA minttl '%v' is invalid: %w", minttl, err)
|
|
}
|
|
|
|
return rc.SetTargetSOA(ns, mbox, uint32(u32serial), uint32(u32refresh), uint32(u32retry), uint32(u32expire), uint32(u32minttl))
|
|
}
|
|
|
|
// SetTargetSOAString is like SetTargetSOA but accepts one big string.
|
|
func (rc *RecordConfig) SetTargetSOAString(s string) error {
|
|
part := strings.Fields(s)
|
|
if len(part) != 7 {
|
|
return fmt.Errorf("SOA value does not contain 7 fields: (%#v)", s)
|
|
}
|
|
return rc.SetTargetSOAStrings(part[0], part[1], part[2], part[3], part[4], part[5], part[6])
|
|
}
|