github.com/teknogeek/dnscontrol/v2@v2.10.1-0.20200227202244-ae299b55ba42/providers/bind/soa.go (about)

     1  package bind
     2  
     3  import (
     4  	"github.com/StackExchange/dnscontrol/v2/models"
     5  )
     6  
     7  func makeSoa(origin string, defSoa *SoaInfo, existing, desired *models.RecordConfig) (*models.RecordConfig, uint32) {
     8  	// Create a SOA record.  Take data from desired, existing, default,
     9  	// or hardcoded defaults.
    10  	soaRec := models.RecordConfig{}
    11  	soaRec.SetLabel("@", origin)
    12  	soaRec.TTL = models.DefaultTTL
    13  
    14  	if defSoa == nil {
    15  		defSoa = &SoaInfo{}
    16  	}
    17  	if existing == nil {
    18  		existing = &models.RecordConfig{}
    19  	}
    20  
    21  	if desired == nil {
    22  		desired = &models.RecordConfig{}
    23  	}
    24  
    25  	soaRec.SetTargetSOA(
    26  		firstNonNull(desired.GetTargetField(), existing.GetTargetField(), defSoa.Ns, "DEFAULT_NOT_SET."),
    27  		firstNonNull(desired.SoaMbox, existing.SoaMbox, defSoa.Mbox, "DEFAULT_NOT_SET."),
    28  		firstNonZero(desired.SoaSerial, existing.SoaSerial, defSoa.Serial, 1),
    29  		firstNonZero(desired.SoaRefresh, existing.SoaRefresh, defSoa.Refresh, 3600),
    30  		firstNonZero(desired.SoaRetry, existing.SoaRetry, defSoa.Retry, 600),
    31  		firstNonZero(desired.SoaExpire, existing.SoaExpire, defSoa.Expire, 604800),
    32  		firstNonZero(desired.SoaMinttl, existing.SoaMinttl, defSoa.Minttl, 1440),
    33  	)
    34  
    35  	return &soaRec, generateSerial(soaRec.SoaSerial)
    36  }
    37  
    38  func firstNonNull(items ...string) string {
    39  	for _, item := range items {
    40  		if item != "" {
    41  			return item
    42  		}
    43  	}
    44  	return "FAIL"
    45  }
    46  
    47  func firstNonZero(items ...uint32) uint32 {
    48  	for _, item := range items {
    49  		if item != 0 {
    50  			return item
    51  		}
    52  	}
    53  	return 999
    54  }