bind9I have written this python script to change the serial number for all DNS zones. The best practice for a DNS zone serial number is to use this template :
YYYYMMDDxx
with :

  • YYYY : year
  • MM : month
  • DD : day
  • xx : increment from 01 to 99

After running this script as shown below, you have to reload your zone file using one of these lines :
Reload all zones : rndc reload
Reload one specific zone : rndc reload domain.local

The syntax of the script is :

# ./bind_change_serial_allzones.py -h
bind_change_serial_allzones.py -p <zone files path> -s <new serial>

All the zone files are backed up, in the same folder where the dns zone files are located, before the update.

The following modules are required for this script :

  • shutil : used to backup the zone files
  • re : regex module
  • sys, getopt : used to manage the script parameters
  • glob : used to get all dns zone files with the extension .dns
  • os : used to work in the folder specified with the parameter “-p”
  • time : get datetime and include this information in the backup dns zone filename

Code :

#!/usr/bin/python

import shutil
import re
import sys, getopt
import glob
import os
import time

def main(argv):
        pconfpath = ''
        serial = ''
        try:
                opts, args = getopt.getopt(argv,"hp:s:",["pconfpath=","serial="])
        except getopt.GetoptError:
                print 'bind_change_serial_allzones.py -p <zone files path> -s <new serial>'
                sys.exit(2)
        for opt, arg in opts:
                if opt == '-h':
                        print 'bind_change_serial_allzones.py -p <zone files path> -s <new serial>'
                        sys.exit()
                elif opt in ("-p", "--pconfpath"):
                        pconfpath = arg
                elif opt in ("-s", "--serial"):
                        serial = arg

        #Define variables
        timestr = time.strftime("%Y%m%d-%H%M%S")

        os.chdir(pconfpath)
        for dnsfile in glob.glob("*.dns"):
                dnsfilebkp = dnsfile + "_" + timestr + ".bkp"
                shutil.copyfile(dnsfile,dnsfilebkp)

                f = open(dnsfile, 'r')
                lines = f.readlines()
                f.close()

                f = open(dnsfile, 'w')
                for line in lines:
                        if re.search("[0-9]* ; serial",line):
                                line = '\t\t\t\t' + serial + ' ; serial\n'
                        f.write(line)
                f.close()

if __name__ == "__main__":
        main(sys.argv[1:])
Change the serial number for all DNS zones

Leave a Reply

Your email address will not be published. Required fields are marked *