From 83bbfbe1a88b52f3794b009b0d379aaf22376077 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Martin=20Sl=C3=A5en?= Date: Sat, 4 Feb 2012 12:28:07 +0100 Subject: [PATCH] Added function for formatting domain serial. Updated domain_serial increment code with a call to this function. Added update of domain_serial when changing host information, eg. hostname. Added function for updating domain_serial when changing the domain itself, eg. adding CNAME records. --- mdb/models.py | 62 ++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 59 insertions(+), 3 deletions(-) diff --git a/mdb/models.py b/mdb/models.py index d819a55..ef43c6e 100644 --- a/mdb/models.py +++ b/mdb/models.py @@ -6,6 +6,7 @@ from validators import validate_hostname import ipaddr import datetime +import re # Create your models here. @@ -502,6 +503,39 @@ class Ip6Address(models.Model): return "%s (%s on %s)" % (self.full_address(), self.interface.name, self.interface.host.hostname) +def format_domain_serial_and_add_one(serial): + today = datetime.datetime.now() + res = re.findall("^%4d%02d%02d(\d\d)$" % + (today.year, today.month, today.day), str(serial), re.DOTALL) + + if len(res) == 0: + """ This probably means that the serial is malformed + or the date is wrong. We assume that if the date is wrong, + it is in the past. Just create a new serial starting from 1.""" + return "%4d%02d%02d%02d" % \ + (today.year, today.month, today.day, 1) + elif len(res) == 1: + """ The serial contains todays date, just update it. """ + try: + number = int(res[0]) + except: + number = 1 + if number >= 99: + """ This is bad... Just keep the number on 99. + We also send a mail to sysadmins telling them that + something is wrong...""" + + else: + number += 1 + return "%4d%02d%02d%02d" % \ + (today.year, today.month, today.day, number ) + else: + """ Just return the first serial for today. """ + return "%4d%02d%02d%02d" % \ + (today.year, today.month, today.day, 1 ) + + + @receiver(post_save, sender=Ip4Subnet) def create_ips_for_subnet(sender, instance, created, **kwargs): if not created: @@ -527,10 +561,15 @@ def set_domain_name_for_subnet(sender, instance, **kwargs): rev = "%s.%s.%s" % (ipspl[2], ipspl[1], ipspl[0]) instance.domain_name = "%s.in-addr.arpa" % rev + # update it's own serial + if instance.domain_serial != None: + instance.domain_serial = format_domain_serial_and_add_one(instance.domain_serial) + # lets update the serial of the dhcp config # when the subnet is changed if instance.dhcp_config: - instance.dhcp_config.serial = instance.dhcp_config.serial + 1 +# instance.dhcp_config.serial = instance.dhcp_config.serial + 1 + instance.dhcp_config.serial = format_domain_serial_and_add_one(instance.dhcp_config.serial) instance.dhcp_config.save() @receiver(pre_save, sender=Ip6Subnet) @@ -545,14 +584,28 @@ def set_domain_name_for_ipv6_subnet(sender, instance, **kwargs): def update_domain_serial_when_change_to_interface(sender, instance, created, **kwargs): if instance.domain != None: domain = instance.domain - domain.domain_serial = domain.domain_serial + 1 + domain.domain_serial = format_domain_serial_and_add_one(domain.domain_serial) domain.save() if instance.ip4address != None: subnet = instance.ip4address.subnet - subnet.domain_serial = subnet.domain_serial + 1 + subnet.domain_serial = format_domain_serial_and_add_one(subnet.domain_serial) subnet.save() +@receiver(post_save, sender=Host) +def update_domain_serial_when_change_to_host(sender, instance, created, **kwargs): + for interface in instance.interface_set.all(): + if interface.domain != None: + domain = interface.domain + domain.domain_serial = \ + format_domain_serial_and_add_one(domain.domain_serial) + domain.save() + if interface.ip4address != None: + subnet = interface.ip4address.subnet + subnet.domain_serial = \ + format_domain_serial_and_add_one(subnet.domain_serial) + subnet.save() + @receiver(pre_delete, sender=Interface) def update_domain_serial_when_interface_deleted(sender, instance, **kwargs): if instance.domain != None: @@ -565,3 +618,6 @@ def update_domain_serial_when_interface_deleted(sender, instance, **kwargs): subnet.domain_serial = subnet.domain_serial + 1 subnet.save() +@receiver(pre_save, sender=Domain) +def update_domain_serial_when_domain_is_saved(sender, instance, **kwargs): + instance.domain_serial = format_domain_serial_and_add_one(instance.domain_serial)