mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-27 19:08:38 -06:00
Add 'extra_conf' field to DNS zones and reverse DNS zones (i.e. prefixes)
This commit is contained in:
parent
339fcdc541
commit
c86a74ec30
@ -12,7 +12,7 @@ class ZoneSerializer(serializers.ModelSerializer):
|
||||
|
||||
class Meta:
|
||||
model = Zone
|
||||
fields = ['id', 'name', 'ttl', 'soa_name', 'soa_contact', 'soa_serial', 'soa_refresh', 'soa_retry', 'soa_expire', 'soa_minimum', 'description']
|
||||
fields = ['id', 'name', 'ttl', 'soa_name', 'soa_contact', 'soa_serial', 'soa_refresh', 'soa_retry', 'soa_expire', 'soa_minimum', 'extra_conf', 'description']
|
||||
|
||||
|
||||
class ZoneNestedSerializer(ZoneSerializer):
|
||||
|
@ -3,7 +3,7 @@ from django.db.models import Count
|
||||
|
||||
from ipam.models import IPAddress
|
||||
from utilities.forms import (
|
||||
BootstrapMixin, ConfirmationForm, APISelect, Livesearch, CSVDataField, BulkImportForm,
|
||||
BootstrapMixin, ConfirmationForm, APISelect, Livesearch, CSVDataField, BulkImportForm, SmallTextarea
|
||||
)
|
||||
|
||||
from .models import (
|
||||
@ -22,7 +22,7 @@ class ZoneForm(forms.ModelForm, BootstrapMixin):
|
||||
|
||||
class Meta:
|
||||
model = Zone
|
||||
fields = ['name', 'ttl', 'soa_name', 'soa_contact', 'soa_refresh', 'soa_retry', 'soa_expire', 'soa_minimum', 'description']
|
||||
fields = ['name', 'ttl', 'soa_name', 'soa_contact', 'soa_refresh', 'soa_retry', 'soa_expire', 'soa_minimum', 'extra_conf', 'description']
|
||||
labels = {
|
||||
'soa_name': 'SOA Name',
|
||||
'soa_contact': 'SOA Contact',
|
||||
@ -30,6 +30,7 @@ class ZoneForm(forms.ModelForm, BootstrapMixin):
|
||||
'soa_retry': 'SOA Retry',
|
||||
'soa_expire': 'SOA Expire',
|
||||
'soa_minimum': 'SOA Minimum',
|
||||
'extra_conf': 'Extra Conf',
|
||||
'description': 'Description',
|
||||
}
|
||||
help_texts = {
|
||||
@ -40,6 +41,10 @@ class ZoneForm(forms.ModelForm, BootstrapMixin):
|
||||
'soa_retry': "Retry time, in seconds",
|
||||
'soa_expire': "Expire time, in seconds",
|
||||
'soa_minimum': "Negative result TTL, in seconds",
|
||||
'extra_conf': "Extra conf related to the zone, to put in your DNS server main conf file",
|
||||
}
|
||||
widgets = {
|
||||
'extra_conf': SmallTextarea(attrs={'rows': 3}),
|
||||
}
|
||||
|
||||
|
||||
@ -47,7 +52,7 @@ class ZoneFromCSVForm(forms.ModelForm):
|
||||
|
||||
class Meta:
|
||||
model = Zone
|
||||
fields = ['name', 'ttl', 'soa_name', 'soa_contact', 'soa_refresh', 'soa_retry', 'soa_expire', 'soa_minimum', 'description']
|
||||
fields = ['name', 'ttl', 'soa_name', 'soa_contact', 'soa_refresh', 'soa_retry', 'soa_expire', 'soa_minimum', 'extra_conf', 'description']
|
||||
|
||||
|
||||
class ZoneImportForm(BulkImportForm, BootstrapMixin):
|
||||
@ -64,6 +69,7 @@ class ZoneBulkEditForm(forms.Form, BootstrapMixin):
|
||||
soa_retry = forms.IntegerField(required=False, label='SOA Retry')
|
||||
soa_expire = forms.IntegerField(required=False, label='SOA Expire')
|
||||
soa_minimum = forms.IntegerField(required=False, label='SOA Minimum')
|
||||
extra_conf = forms.CharField(max_length=500, required=False, widget=SmallTextarea(attrs={'rows': 3}), label='Extra Conf')
|
||||
description = forms.CharField(max_length=100, required=False, label='Description')
|
||||
|
||||
|
||||
|
20
netbox/dns/migrations/0006_zone_extra_conf.py
Normal file
20
netbox/dns/migrations/0006_zone_extra_conf.py
Normal file
@ -0,0 +1,20 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.9.7 on 2016-08-18 14:55
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('dns', '0005_auto_20160728_0854'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='zone',
|
||||
name='extra_conf',
|
||||
field=models.CharField(blank=True, max_length=500),
|
||||
),
|
||||
]
|
@ -30,6 +30,7 @@ class Zone(CreatedUpdatedModel):
|
||||
soa_retry = models.PositiveIntegerField()
|
||||
soa_expire = models.PositiveIntegerField()
|
||||
soa_minimum = models.PositiveIntegerField()
|
||||
extra_conf = models.CharField(max_length=500, blank=True)
|
||||
description = models.CharField(max_length=100, blank=True)
|
||||
|
||||
class Meta:
|
||||
@ -82,6 +83,7 @@ class Zone(CreatedUpdatedModel):
|
||||
str(self.soa_retry),
|
||||
str(self.soa_expire),
|
||||
str(self.soa_minimum),
|
||||
'"{}"'.format(self.extra_conf) if self.extra_conf else '',
|
||||
self.description,
|
||||
])
|
||||
|
||||
@ -185,6 +187,7 @@ def export_bind_forward():
|
||||
zones_list.append({
|
||||
'num': len(zones_list),
|
||||
'id': z.name,
|
||||
'extra_conf': z.extra_conf,
|
||||
'content': z.to_bind(records)
|
||||
})
|
||||
|
||||
@ -201,14 +204,15 @@ def export_bind_reverse():
|
||||
z = p.to_bind(child_ip)
|
||||
for zz in z:
|
||||
if not zz['id'] in zones:
|
||||
zones[zz['id']] = zz['content']
|
||||
zones[zz['id']] = (zz['content'], p.extra_conf)
|
||||
|
||||
zones_list = []
|
||||
for zid, zc in zones.items():
|
||||
zones_list.append({
|
||||
'num': len(zones_list),
|
||||
'id': zid,
|
||||
'content': zc,
|
||||
'content': zc[0],
|
||||
'extra_conf': zc[1],
|
||||
})
|
||||
|
||||
return zones_list
|
||||
|
@ -40,8 +40,7 @@ def zone(request, pk):
|
||||
record_count = len(records)
|
||||
|
||||
# DNS records
|
||||
dns_records = Record.objects.filter(zone=zone)
|
||||
dns_records_table = RecordZoneTable(dns_records)
|
||||
dns_records_table = RecordZoneTable(records)
|
||||
|
||||
return render(request, 'dns/zone.html', {
|
||||
'zone': zone,
|
||||
@ -82,7 +81,7 @@ class ZoneBulkEditView(PermissionRequiredMixin, BulkEditView):
|
||||
def update_objects(self, pk_list, form):
|
||||
|
||||
fields_to_update = {}
|
||||
for field in ['name', 'ttl', 'soa_name', 'soa_contact', 'soa_refresh', 'soa_retry', 'soa_expire', 'soa_minimum']:
|
||||
for field in ['name', 'ttl', 'soa_name', 'soa_contact', 'soa_refresh', 'soa_retry', 'soa_expire', 'soa_minimum', 'extra_conf']:
|
||||
if form.cleaned_data[field]:
|
||||
fields_to_update[field] = form.cleaned_data[field]
|
||||
|
||||
@ -184,10 +183,13 @@ def bind_export(request, zones_list, context):
|
||||
zbuf = StringIO.StringIO()
|
||||
zfile = zipfile.ZipFile(zbuf, mode='w')
|
||||
temp = []
|
||||
cf = ''
|
||||
for z in zones_list:
|
||||
temp.append(StringIO.StringIO())
|
||||
temp[len(temp) - 1].write(z['content'])
|
||||
zfile.writestr(z['id'], str(temp[len(temp) - 1].getvalue()))
|
||||
cf += '{}:\n\t{}\n'.format(z['id'], z['extra_conf'] if z['extra_conf'] else '')
|
||||
zfile.writestr('extra_confs.txt', cf)
|
||||
zfile.close()
|
||||
response = HttpResponse(
|
||||
zbuf.getvalue(),
|
||||
|
@ -136,7 +136,7 @@ class PrefixSerializer(serializers.ModelSerializer):
|
||||
|
||||
class Meta:
|
||||
model = Prefix
|
||||
fields = ['id', 'family', 'prefix', 'site', 'vrf', 'tenant', 'vlan', 'status', 'role', 'description', 'ttl', 'soa_name', 'soa_contact', 'soa_serial', 'soa_refresh', 'soa_retry', 'soa_expire', 'soa_minimum']
|
||||
fields = ['id', 'family', 'prefix', 'site', 'vrf', 'tenant', 'vlan', 'status', 'role', 'description', 'ttl', 'soa_name', 'soa_contact', 'soa_serial', 'soa_refresh', 'soa_retry', 'soa_expire', 'soa_minimum', 'extra_conf']
|
||||
|
||||
|
||||
class PrefixNestedSerializer(PrefixSerializer):
|
||||
|
@ -6,7 +6,7 @@ from django.db.models import Count
|
||||
from dcim.models import Site, Device, Interface
|
||||
from tenancy.forms import bulkedit_tenant_choices
|
||||
from tenancy.models import Tenant
|
||||
from utilities.forms import BootstrapMixin, APISelect, Livesearch, CSVDataField, BulkImportForm, SlugField
|
||||
from utilities.forms import BootstrapMixin, APISelect, Livesearch, CSVDataField, BulkImportForm, SlugField, SmallTextarea
|
||||
|
||||
from .models import (
|
||||
Aggregate, IPAddress, Prefix, PREFIX_STATUS_CHOICES, RIR, Role, VLAN, VLANGroup, VLAN_STATUS_CHOICES, VRF,
|
||||
@ -158,7 +158,7 @@ class PrefixForm(forms.ModelForm, BootstrapMixin):
|
||||
|
||||
class Meta:
|
||||
model = Prefix
|
||||
fields = ['prefix', 'vrf', 'tenant', 'site', 'vlan', 'status', 'role', 'description', 'ttl', 'soa_name', 'soa_contact', 'soa_refresh', 'soa_retry', 'soa_expire', 'soa_minimum']
|
||||
fields = ['prefix', 'vrf', 'tenant', 'site', 'vlan', 'status', 'role', 'description', 'ttl', 'soa_name', 'soa_contact', 'soa_refresh', 'soa_retry', 'soa_expire', 'soa_minimum', 'extra_conf']
|
||||
labels = {
|
||||
'ttl': 'Rev. DNS - TTL',
|
||||
'soa_name': 'Rev. DNS - SOA Name',
|
||||
@ -167,6 +167,7 @@ class PrefixForm(forms.ModelForm, BootstrapMixin):
|
||||
'soa_retry': 'Rev. DNS - SOA Retry',
|
||||
'soa_expire': 'Rev. DNS - SOA Expire',
|
||||
'soa_minimum': 'Rev. DNS - SOA Minimum',
|
||||
'extra_conf': 'Rev. DNS - Extra Conf',
|
||||
}
|
||||
help_texts = {
|
||||
'prefix': "IPv4 or IPv6 network",
|
||||
@ -182,6 +183,10 @@ class PrefixForm(forms.ModelForm, BootstrapMixin):
|
||||
'soa_retry': "Retry time, in seconds",
|
||||
'soa_expire': "Expire time, in seconds",
|
||||
'soa_minimum': "Negative result TTL, in seconds",
|
||||
'extra_conf': "Extra conf related to the zone, to put in your DNS server main conf file",
|
||||
}
|
||||
widgets = {
|
||||
'extra_conf': SmallTextarea(attrs={'rows': 3}),
|
||||
}
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
@ -228,7 +233,7 @@ class PrefixFromCSVForm(forms.ModelForm):
|
||||
class Meta:
|
||||
model = Prefix
|
||||
fields = ['prefix', 'vrf', 'tenant', 'site', 'vlan_group_name', 'vlan_vid', 'status_name', 'role',
|
||||
'description', 'ttl', 'soa_name', 'soa_contact', 'soa_refresh', 'soa_retry', 'soa_expire', 'soa_minimum']
|
||||
'description', 'ttl', 'soa_name', 'soa_contact', 'soa_refresh', 'soa_retry', 'soa_expire', 'soa_minimum', 'extra_conf']
|
||||
|
||||
def clean(self):
|
||||
|
||||
@ -287,6 +292,7 @@ class PrefixBulkEditForm(forms.Form, BootstrapMixin):
|
||||
soa_retry = forms.IntegerField(required=False, label='Reverse DNS - SOA Retry')
|
||||
soa_expire = forms.IntegerField(required=False, label='Reverse DNS - SOA Expire')
|
||||
soa_minimum = forms.IntegerField(required=False, label='Reverse DNS - SOA Minimum')
|
||||
extra_conf = forms.CharField(max_length=500, required=False, label='Reverse DNS - Extra Conf', widget=SmallTextarea(attrs={'rows': 3}))
|
||||
|
||||
|
||||
def prefix_vrf_choices():
|
||||
|
20
netbox/ipam/migrations/0011_prefix_extra_conf.py
Normal file
20
netbox/ipam/migrations/0011_prefix_extra_conf.py
Normal file
@ -0,0 +1,20 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.9.7 on 2016-08-18 14:55
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('ipam', '0010_merge'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='prefix',
|
||||
name='extra_conf',
|
||||
field=models.CharField(blank=True, max_length=500),
|
||||
),
|
||||
]
|
@ -259,6 +259,7 @@ class Prefix(CreatedUpdatedModel):
|
||||
soa_expire = models.PositiveIntegerField(blank=True, null=True)
|
||||
soa_minimum = models.PositiveIntegerField(blank=True, null=True)
|
||||
|
||||
extra_conf = models.CharField(max_length=500, blank=True)
|
||||
description = models.CharField(max_length=100, blank=True)
|
||||
|
||||
class Meta:
|
||||
@ -331,6 +332,7 @@ class Prefix(CreatedUpdatedModel):
|
||||
str(self.soa_retry) if self.soa_retry else '',
|
||||
str(self.soa_expire) if self.soa_expire else '',
|
||||
str(self.soa_minimum) if self.soa_minimum else '',
|
||||
'"{}"'.format(self.extra_conf) if self.extra_conf else '',
|
||||
])
|
||||
|
||||
@property
|
||||
|
@ -409,7 +409,7 @@ class PrefixBulkEditView(PermissionRequiredMixin, BulkEditView):
|
||||
fields_to_update[field] = None
|
||||
elif form.cleaned_data[field]:
|
||||
fields_to_update[field] = form.cleaned_data[field]
|
||||
for field in ['site', 'status', 'role', 'description', 'ttl', 'soa_name', 'soa_contact', 'soa_refresh', 'soa_retry', 'soa_expire', 'soa_minimum']:
|
||||
for field in ['site', 'status', 'role', 'description', 'ttl', 'soa_name', 'soa_contact', 'soa_refresh', 'soa_retry', 'soa_expire', 'soa_minimum', 'extra_conf']:
|
||||
if form.cleaned_data[field]:
|
||||
fields_to_update[field] = form.cleaned_data[field]
|
||||
|
||||
|
@ -33,6 +33,7 @@
|
||||
<tr><td>
|
||||
<pre id="bind_export_{{ z.num }}" style="overflow: auto; overflow-x: auto; overflow-y: auto; word-wrap: break-word; white-space: pre;">{{ z.content }}</pre>
|
||||
</td></tr>
|
||||
{% if z.extra_conf %}<tr><td><pre style="overflow: auto; overflow-x: auto; overflow-y: auto; word-wrap: break-word; white-space: pre;">{{ z.extra_conf }}</pre></td></tr>{% endif %}
|
||||
</table>
|
||||
</div>
|
||||
{% endfor %}
|
||||
|
@ -86,6 +86,16 @@
|
||||
<td>SOA Minimum</td>
|
||||
<td>{{ zone.soa_minimum }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Extra Conf</td>
|
||||
<td>
|
||||
{% if zone.extra_conf %}
|
||||
{{ zone.extra_conf }}
|
||||
{% else %}
|
||||
-
|
||||
{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Description</td>
|
||||
<td>
|
||||
|
@ -14,6 +14,7 @@
|
||||
<td>{{ zone.soa_retry }}</td>
|
||||
<td>{{ zone.soa_expire }}</td>
|
||||
<td>{{ zone.soa_minimum }}</td>
|
||||
<td>{{ zone.extra_conf }}</td>
|
||||
<td>{{ zone.description }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
|
@ -68,6 +68,11 @@
|
||||
<td>Negative result TTL, in seconds</td>
|
||||
<td>1800</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Extra Conf</td>
|
||||
<td>Extra conf related to the zone, to put in your DNS server main conf file</td>
|
||||
<td>"notify: 10.120.0.1 NOKEY\nprovide-xfr: 10.120.0.1 NOKEY"</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Description</td>
|
||||
<td>Description (optional)</td>
|
||||
@ -76,7 +81,7 @@
|
||||
</tbody>
|
||||
</table>
|
||||
<h4>Example</h4>
|
||||
<pre>foo.net,10800,@,ns.foo.net. noc.foo.net.,3600,3600,604800,1800,Mail servers zone</pre>
|
||||
<pre>foo.net,10800,@,ns.foo.net. noc.foo.net.,3600,3600,604800,1800,"notify: 10.120.0.1 NOKEY\nprovide-xfr: 10.120.0.1 NOKEY",Mail servers zone</pre>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
@ -131,6 +131,10 @@
|
||||
<td>Reverse DNS - SOA Minimum</td>
|
||||
<td>{{ prefix.soa_minimum }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Reverse DNS - Extra Conf</td>
|
||||
<td>{{ prefix.extra_conf }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Created</td>
|
||||
<td>{{ prefix.created }}</td>
|
||||
|
@ -21,6 +21,7 @@
|
||||
<td>{{ prefix.soa_expire }}</td>
|
||||
<td>{{ prefix.soa_minimum }}</td>
|
||||
<td>{{ prefix.description }}</td>
|
||||
<td>{{ prefix.extra_conf }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
{% endblock %}
|
||||
|
@ -108,10 +108,15 @@
|
||||
<td>Negative result TTL, in seconds</td>
|
||||
<td>1800</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Reverse DNS - Extra Conf</td>
|
||||
<td>Extra conf related to the zone, to put in your DNS server main conf file</td>
|
||||
<td>"notify: 10.120.0.1 NOKEY\nprovide-xfr: 10.120.0.1 NOKEY"</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h4>Example</h4>
|
||||
<pre>192.168.42.0/24,65000:123,ABC01,HQ,Customers,801,Active,Customer,7th floor WiFi,10800,@,ns.foo.net. noc.foo.net.,3600,3600,604800,1800</pre>
|
||||
<pre>192.168.42.0/24,65000:123,ABC01,HQ,Customers,801,Active,Customer,7th floor WiFi,10800,@,ns.foo.net. noc.foo.net.,3600,3600,604800,1800,"notify: 10.120.0.1 NOKEY\nprovide-xfr: 10.120.0.1 NOKEY"</pre>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
Loading…
Reference in New Issue
Block a user