diff --git a/netbox/dns/migrations/0005_auto_20160728_0854.py b/netbox/dns/migrations/0005_auto_20160728_0854.py new file mode 100644 index 000000000..2138a6b38 --- /dev/null +++ b/netbox/dns/migrations/0005_auto_20160728_0854.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-07-28 08:54 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('dns', '0004_auto_20160722_0820'), + ] + + operations = [ + migrations.AddField( + model_name='zone', + name='bind_changed', + field=models.BooleanField(default=True), + ), + migrations.AlterField( + model_name='zone', + name='soa_serial', + field=models.CharField(max_length=10), + ), + ] diff --git a/netbox/dns/models.py b/netbox/dns/models.py index dff771c1d..df4cd3815 100644 --- a/netbox/dns/models.py +++ b/netbox/dns/models.py @@ -20,7 +20,10 @@ class Zone(CreatedUpdatedModel): ttl = models.PositiveIntegerField() soa_name = models.CharField(max_length=100) soa_contact = models.CharField(max_length=100) - soa_serial = models.CharField(max_length=100) + + soa_serial = models.CharField(max_length=10) + bind_changed = models.BooleanField(default=True) + soa_refresh = models.PositiveIntegerField() soa_retry = models.PositiveIntegerField() soa_expire = models.PositiveIntegerField() @@ -37,26 +40,34 @@ class Zone(CreatedUpdatedModel): return reverse('dns:zone', args=[self.pk]) def save(self, *args, **kwargs): - self.update_serial() + self.bind_changed = True super(Zone, self).save(*args, **kwargs) + def set_bind_changed(self, value): + self.bind_changed = value + super(Zone, self).save() + def update_serial(self): """ Each time a record or the zone is modified, the serial is incremented. """ current_date = time.strftime('%Y%m%d',time.localtime()) if not self.soa_serial: - self.soa_serial = current_date+'1' + self.soa_serial = current_date+'01' else: serial_date = self.soa_serial[:8] serial_num = self.soa_serial[8:] if serial_date!=current_date: - self.soa_serial = current_date+'1' + self.soa_serial = current_date+'01' else: serial_num = int(serial_num) serial_num += 1 - self.soa_serial = current_date + str(serial_num) + if serial_num<10: + self.soa_serial = current_date + '0' + str(serial_num) + else: + self.soa_serial = current_date + str(serial_num) + self.set_bind_changed(False) def to_csv(self): @@ -74,6 +85,8 @@ class Zone(CreatedUpdatedModel): ]) def to_bind(self,records): + if self.bind_changed: + self.update_serial() bind_records = '' for r in records: bind_records += r.to_bind()+'\n' diff --git a/netbox/dns/views.py b/netbox/dns/views.py index 55aa0bf10..ca4442ee1 100644 --- a/netbox/dns/views.py +++ b/netbox/dns/views.py @@ -91,7 +91,7 @@ class ZoneBulkEditView(PermissionRequiredMixin, BulkEditView): zlist = self.cls.objects.filter(pk__in=pk_list) for z in zlist: - z.save() + z.set_bind_changed(True) return zlist.update(**fields_to_update) diff --git a/netbox/ipam/migrations/0009_auto_20160728_0854.py b/netbox/ipam/migrations/0009_auto_20160728_0854.py new file mode 100644 index 000000000..218c95989 --- /dev/null +++ b/netbox/ipam/migrations/0009_auto_20160728_0854.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-07-28 08:54 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ipam', '0008_auto_20160727_1307'), + ] + + operations = [ + migrations.AddField( + model_name='prefix', + name='bind_changed', + field=models.BooleanField(default=True), + ), + migrations.AlterField( + model_name='prefix', + name='soa_serial', + field=models.CharField(blank=True, max_length=10), + ), + ] diff --git a/netbox/ipam/models.py b/netbox/ipam/models.py index c4a731ad5..0557bd628 100644 --- a/netbox/ipam/models.py +++ b/netbox/ipam/models.py @@ -244,7 +244,10 @@ class Prefix(CreatedUpdatedModel): ttl = models.PositiveIntegerField(blank=True, null=True) soa_name = models.CharField(max_length=100, blank=True) soa_contact = models.CharField(max_length=100, blank=True) - soa_serial = models.CharField(max_length=100, blank=True) + + soa_serial = models.CharField(max_length=10, blank=True) + bind_changed = models.BooleanField(default=True) + soa_refresh = models.PositiveIntegerField(blank=True, null=True) soa_retry = models.PositiveIntegerField(blank=True, null=True) soa_expire = models.PositiveIntegerField(blank=True, null=True) @@ -272,7 +275,7 @@ class Prefix(CreatedUpdatedModel): "instead.") def save(self, *args, **kwargs): - self.update_serial() + self.bind_changed = True if self.prefix: # Clear host bits from prefix self.prefix = self.prefix.cidr @@ -280,23 +283,31 @@ class Prefix(CreatedUpdatedModel): self.family = self.prefix.version super(Prefix, self).save(*args, **kwargs) + def set_bind_changed(self, value): + self.bind_changed = value + super(Prefix, self).save() + def update_serial(self): """ Each time a record or the zone is modified, the serial is incremented. """ current_date = time.strftime('%Y%m%d',time.localtime()) if not self.soa_serial: - self.soa_serial = current_date+'1' + self.soa_serial = current_date+'01' else: serial_date = self.soa_serial[:8] serial_num = self.soa_serial[8:] if serial_date!=current_date: - self.soa_serial = current_date+'1' + self.soa_serial = current_date+'01' else: serial_num = int(serial_num) serial_num += 1 - self.soa_serial = current_date + str(serial_num) + if serial_num < 10: + self.soa_serial = current_date + '0' + str(serial_num) + else: + self.soa_serial = current_date + str(serial_num) + self.set_bind_changed(False) def to_csv(self): return ','.join([ @@ -331,6 +342,8 @@ class Prefix(CreatedUpdatedModel): return STATUS_CHOICE_CLASSES[self.status] def to_bind(self,ipaddresses): + if self.bind_changed: + self.update_serial() zones = {} diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index 84ff20c19..e7ecf0ba6 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -360,7 +360,7 @@ class PrefixBulkEditView(PermissionRequiredMixin, BulkEditView): plist = self.cls.objects.filter(pk__in=pk_list) for p in plist: - p.save() + p.set_bind_changed(True) return plist.update(**fields_to_update)