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

     1  package bind
     2  
     3  import (
     4  	"log"
     5  	"strconv"
     6  	"time"
     7  )
     8  
     9  var nowFunc = time.Now
    10  
    11  // generateSerial takes an old SOA serial number and increments it.
    12  func generateSerial(oldSerial uint32) uint32 {
    13  	// Serial numbers are in the format yyyymmddvv
    14  	// where vv is a version count that starts at 01 each day.
    15  	// Multiple serial numbers generated on the same day increase vv.
    16  	// If the old serial number is not in this format, it gets replaced
    17  	// with the new format. However if that would mean a new serial number
    18  	// that is smaller than the old one, we punt and increment the old number.
    19  	// At no time will a serial number == 0 be returned.
    20  
    21  	original := oldSerial
    22  	var newSerial uint32
    23  
    24  	// Make draft new serial number:
    25  	today := nowFunc().UTC()
    26  	todayStr := today.Format("20060102")
    27  	todayNum, err := strconv.ParseUint(todayStr, 10, 32)
    28  	if err != nil {
    29  		log.Fatalf("new serial won't fit in 32 bits: %v", err)
    30  	}
    31  	draft := uint32(todayNum * 100)
    32  
    33  	method := "none" // Used only in debugging.
    34  	if oldSerial >= draft {
    35  		method = "o>=d"
    36  		newSerial = oldSerial + 1
    37  	} else {
    38  		// First serial number to be requested today:
    39  		method = "default"
    40  		newSerial = draft
    41  	}
    42  
    43  	if newSerial == 0 {
    44  		// We never return 0 as the serial number.
    45  		newSerial = 1
    46  	}
    47  
    48  	// Assertions that should never happen.
    49  	if oldSerial == newSerial {
    50  		log.Fatalf("%v: old_serial == new_serial (%v == %v) draft=%v method=%v", original, oldSerial, newSerial, draft, method)
    51  	}
    52  	if oldSerial > newSerial {
    53  		log.Fatalf("%v: old_serial > new_serial (%v > %v) draft=%v method=%v", original, oldSerial, newSerial, draft, method)
    54  	}
    55  
    56  	return newSerial
    57  }