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 }