netbox-plugin-dns 1.4.1__py3-none-any.whl → 1.4.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of netbox-plugin-dns might be problematic. Click here for more details.

Files changed (31) hide show
  1. netbox_dns/__init__.py +1 -1
  2. netbox_dns/api/nested_serializers.py +1 -0
  3. netbox_dns/api/serializers_/dnssec_policy.py +2 -0
  4. netbox_dns/api/serializers_/zone.py +5 -0
  5. netbox_dns/fields/address.py +17 -0
  6. netbox_dns/filtersets/dnssec_policy.py +1 -0
  7. netbox_dns/filtersets/zone.py +22 -1
  8. netbox_dns/forms/dnssec_policy.py +42 -0
  9. netbox_dns/forms/zone.py +8 -15
  10. netbox_dns/graphql/filters/dnssec_policy.py +1 -0
  11. netbox_dns/graphql/filters/zone.py +2 -1
  12. netbox_dns/graphql/types.py +6 -2
  13. netbox_dns/migrations/0025_remove_zone_inline_signing_and_more.py +22 -0
  14. netbox_dns/migrations/0026_alter_dnssecpolicy_nsec3_opt_out.py +18 -0
  15. netbox_dns/migrations/0027_zone_comments.py +18 -0
  16. netbox_dns/models/dnssec_policy.py +7 -3
  17. netbox_dns/models/zone.py +28 -10
  18. netbox_dns/tables/dnssec_policy.py +11 -6
  19. netbox_dns/tables/record.py +6 -4
  20. netbox_dns/tables/record_template.py +10 -4
  21. netbox_dns/tables/view.py +2 -2
  22. netbox_dns/tables/zone.py +3 -1
  23. netbox_dns/template_content.py +26 -6
  24. netbox_dns/templates/netbox_dns/dnssecpolicy.html +9 -1
  25. netbox_dns/templates/netbox_dns/record/related.html +6 -15
  26. netbox_dns/templates/netbox_dns/zone.html +1 -4
  27. {netbox_plugin_dns-1.4.1.dist-info → netbox_plugin_dns-1.4.3.dist-info}/METADATA +1 -1
  28. {netbox_plugin_dns-1.4.1.dist-info → netbox_plugin_dns-1.4.3.dist-info}/RECORD +31 -28
  29. {netbox_plugin_dns-1.4.1.dist-info → netbox_plugin_dns-1.4.3.dist-info}/WHEEL +0 -0
  30. {netbox_plugin_dns-1.4.1.dist-info → netbox_plugin_dns-1.4.3.dist-info}/licenses/LICENSE +0 -0
  31. {netbox_plugin_dns-1.4.1.dist-info → netbox_plugin_dns-1.4.3.dist-info}/top_level.txt +0 -0
netbox_dns/__init__.py CHANGED
@@ -4,7 +4,7 @@ from django.core.exceptions import ImproperlyConfigured
4
4
  from netbox.plugins import PluginConfig
5
5
  from netbox.plugins.utils import get_plugin_config
6
6
 
7
- __version__ = "1.4.1"
7
+ __version__ = "1.4.3"
8
8
 
9
9
 
10
10
  def _check_list(setting):
@@ -145,6 +145,7 @@ class NestedDNSSECPolicySerializer(WritableNestedSerializer):
145
145
  "name",
146
146
  "description",
147
147
  "status",
148
+ "inline_signing",
148
149
  )
149
150
 
150
151
  url = serializers.HyperlinkedIdentityField(
@@ -26,6 +26,7 @@ class DNSSECPolicySerializer(NetBoxModelSerializer):
26
26
  "description",
27
27
  "status",
28
28
  "tags",
29
+ "inline_signing",
29
30
  "key_templates",
30
31
  "zones",
31
32
  "zone_templates",
@@ -60,6 +61,7 @@ class DNSSECPolicySerializer(NetBoxModelSerializer):
60
61
  "name",
61
62
  "description",
62
63
  "status",
64
+ "inline_signing",
63
65
  )
64
66
 
65
67
  url = serializers.HyperlinkedIdentityField(
@@ -61,6 +61,7 @@ class ZoneSerializer(NetBoxModelSerializer):
61
61
  "tech_c",
62
62
  "admin_c",
63
63
  "billing_c",
64
+ "comments",
64
65
  "active",
65
66
  "custom_fields",
66
67
  "tenant",
@@ -195,6 +196,7 @@ class ZoneSerializer(NetBoxModelSerializer):
195
196
  default=None,
196
197
  help_text=_("Template to apply to the zone"),
197
198
  )
199
+ inline_signing = serializers.SerializerMethodField()
198
200
  active = serializers.BooleanField(
199
201
  required=False,
200
202
  read_only=True,
@@ -212,6 +214,9 @@ class ZoneSerializer(NetBoxModelSerializer):
212
214
 
213
215
  return super().validate(data)
214
216
 
217
+ def get_inline_signing(self, instance):
218
+ return instance.inline_signing
219
+
215
220
  def create(self, validated_data):
216
221
  template = validated_data.pop("template", None)
217
222
  nameservers = validated_data.pop("nameservers", None)
@@ -1,4 +1,5 @@
1
1
  from django.db import models
2
+ from django.db.models import Lookup
2
3
  from django.core.exceptions import ValidationError
3
4
  from django.utils.translation import gettext_lazy as _
4
5
 
@@ -50,3 +51,19 @@ class AddressField(models.Field):
50
51
 
51
52
  def db_type(self, connection):
52
53
  return "inet"
54
+
55
+
56
+ class AddressContained(Lookup):
57
+ lookup_name = "contained"
58
+
59
+ def get_prep_lookup(self):
60
+ return str(self.rhs)
61
+
62
+ def as_sql(self, compiler, connection):
63
+ lhs, lhs_params = self.process_lhs(compiler, connection)
64
+ rhs, rhs_params = self.process_rhs(compiler, connection)
65
+ params = lhs_params + rhs_params
66
+ return f"CAST(HOST({lhs}) AS INET) <<= {rhs}", params
67
+
68
+
69
+ AddressField.register_lookup(AddressContained)
@@ -23,6 +23,7 @@ class DNSSECPolicyFilterSet(TenancyFilterSet, NetBoxModelFilterSet):
23
23
  "name",
24
24
  "description",
25
25
  "status",
26
+ "inline_signing",
26
27
  "dnskey_ttl",
27
28
  "purge_keys",
28
29
  "publish_safety",
@@ -41,9 +41,9 @@ class ZoneFilterSet(TenancyFilterSet, NetBoxModelFilterSet):
41
41
  "soa_minimum",
42
42
  "soa_serial_auto",
43
43
  "rfc2317_parent_managed",
44
- "inline_signing",
45
44
  "registry_domain_id",
46
45
  "domain_status",
46
+ "inline_signing",
47
47
  )
48
48
 
49
49
  status = django_filters.MultipleChoiceFilter(
@@ -172,6 +172,10 @@ class ZoneFilterSet(TenancyFilterSet, NetBoxModelFilterSet):
172
172
  active = django_filters.BooleanFilter(
173
173
  label=_("Zone is active"),
174
174
  )
175
+ inline_signing = django_filters.BooleanFilter(
176
+ label=_("Zone is using a DNSSEC policy with inline signing"),
177
+ method="filter_inline_signing",
178
+ )
175
179
 
176
180
  def filter_parental_agents(self, queryset, name, value):
177
181
  if not value:
@@ -214,6 +218,22 @@ class ZoneFilterSet(TenancyFilterSet, NetBoxModelFilterSet):
214
218
  except (netaddr.AddrFormatError, ValueError):
215
219
  return queryset.none()
216
220
 
221
+ def filter_inline_signing(self, queryset, name, value):
222
+ if value is None:
223
+ return queryset
224
+
225
+ if value:
226
+ return queryset.filter(
227
+ dnssec_policy__isnull=False, dnssec_policy__inline_signing=True
228
+ )
229
+ else:
230
+ return queryset.filter(
231
+ Q(
232
+ Q(dnssec_policy__isnull=True)
233
+ | Q(dnssec_policy__inline_signing=False)
234
+ )
235
+ )
236
+
217
237
  def search(self, queryset, name, value):
218
238
  if not value.strip():
219
239
  return queryset
@@ -228,5 +248,6 @@ class ZoneFilterSet(TenancyFilterSet, NetBoxModelFilterSet):
228
248
  | Q(admin_c__name__icontains=value)
229
249
  | Q(tech_c__name__icontains=value)
230
250
  | Q(billing_c__name__icontains=value)
251
+ | Q(comments__icontains=value)
231
252
  )
232
253
  return queryset.filter(qs_filter)
@@ -41,6 +41,7 @@ class DNSSECPolicyForm(TenancyForm, NetBoxModelForm):
41
41
  "name",
42
42
  "description",
43
43
  "status",
44
+ "inline_signing",
44
45
  "key_templates",
45
46
  "dnskey_ttl",
46
47
  "purge_keys",
@@ -71,6 +72,7 @@ class DNSSECPolicyForm(TenancyForm, NetBoxModelForm):
71
72
  "description",
72
73
  "status",
73
74
  "key_templates",
75
+ "inline_signing",
74
76
  name=_("Attributes"),
75
77
  ),
76
78
  FieldSet(
@@ -111,6 +113,14 @@ class DNSSECPolicyForm(TenancyForm, NetBoxModelForm):
111
113
  ),
112
114
  )
113
115
 
116
+ def __init__(self, *args, **kwargs):
117
+ super().__init__(*args, **kwargs)
118
+
119
+ if not self.initial.get("use_nsec3"):
120
+ self.initial["nsec3_iterations"] = None
121
+ self.initial["nsec3_opt_out"] = None
122
+ self.initial["nsec3_salt_size"] = None
123
+
114
124
  key_templates = DynamicModelMultipleChoiceField(
115
125
  queryset=DNSSECKeyTemplate.objects.all(),
116
126
  required=False,
@@ -178,6 +188,21 @@ class DNSSECPolicyForm(TenancyForm, NetBoxModelForm):
178
188
  label=_("Parent Propagation Delay"),
179
189
  placeholder=DNSSECPolicy.get_fallback_setting("parent_propagation_delay"),
180
190
  )
191
+ nsec3_opt_out = forms.NullBooleanField(
192
+ required=False,
193
+ widget=forms.Select(choices=BOOLEAN_WITH_BLANK_CHOICES),
194
+ label=_("NSEC3 Opt-Out"),
195
+ )
196
+
197
+ def clean(self, *args, **kwargs):
198
+ super().clean(*args, **kwargs)
199
+
200
+ if not self.cleaned_data.get("use_nsec3"):
201
+ self.cleaned_data["nsec3_iterations"] = None
202
+ self.cleaned_data["nsec3_opt_out"] = None
203
+ self.cleaned_data["nsec3_salt_size"] = None
204
+
205
+ return self.cleaned_data
181
206
 
182
207
 
183
208
  class DNSSECPolicyFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm):
@@ -194,6 +219,7 @@ class DNSSECPolicyFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm):
194
219
  "description",
195
220
  "status",
196
221
  "key_template_id",
222
+ "inline_signing",
197
223
  name=_("Attributes"),
198
224
  ),
199
225
  FieldSet(
@@ -250,6 +276,11 @@ class DNSSECPolicyFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm):
250
276
  required=False,
251
277
  label=_("Status"),
252
278
  )
279
+ inline_signing = forms.NullBooleanField(
280
+ required=False,
281
+ widget=forms.Select(choices=BOOLEAN_WITH_BLANK_CHOICES),
282
+ label=_("Use Inline Signing"),
283
+ )
253
284
  key_template_id = DynamicModelMultipleChoiceField(
254
285
  queryset=DNSSECKeyTemplate.objects.all(),
255
286
  required=False,
@@ -355,6 +386,7 @@ class DNSSECPolicyImportForm(NetBoxModelImportForm):
355
386
  fields = (
356
387
  "name",
357
388
  "description",
389
+ "inline_signing",
358
390
  "key_templates",
359
391
  "dnskey_ttl",
360
392
  "purge_keys",
@@ -383,6 +415,10 @@ class DNSSECPolicyImportForm(NetBoxModelImportForm):
383
415
  required=False,
384
416
  label=_("Status"),
385
417
  )
418
+ inline_signing = forms.BooleanField(
419
+ required=False,
420
+ label=_("Use Inline Signing"),
421
+ )
386
422
  dnskey_ttl = TimePeriodField(
387
423
  required=False,
388
424
  label=_("DNSKEY TTL"),
@@ -446,6 +482,7 @@ class DNSSECPolicyBulkEditForm(NetBoxModelBulkEditForm):
446
482
  FieldSet(
447
483
  "description",
448
484
  "key_templates",
485
+ "inline_signing",
449
486
  name=_("Attributes"),
450
487
  ),
451
488
  FieldSet(
@@ -516,6 +553,11 @@ class DNSSECPolicyBulkEditForm(NetBoxModelBulkEditForm):
516
553
  required=False,
517
554
  label=_("Status"),
518
555
  )
556
+ inline_signing = forms.NullBooleanField(
557
+ required=False,
558
+ widget=BulkEditNullBooleanSelect(),
559
+ label=_("Use Inline Signing"),
560
+ )
519
561
  dnskey_ttl = TimePeriodField(
520
562
  required=False,
521
563
  label=_("DNSKEY TTL"),
netbox_dns/forms/zone.py CHANGED
@@ -20,6 +20,7 @@ from utilities.forms.fields import (
20
20
  CSVModelChoiceField,
21
21
  CSVModelMultipleChoiceField,
22
22
  DynamicModelChoiceField,
23
+ CommentField,
23
24
  )
24
25
  from utilities.forms.widgets import BulkEditNullBooleanSelect, DatePicker, HTMXSelect
25
26
  from utilities.forms.rendering import FieldSet
@@ -183,7 +184,6 @@ class ZoneForm(ZoneTemplateUpdateMixin, TenancyForm, NetBoxModelForm):
183
184
  "rfc2317_prefix",
184
185
  "rfc2317_parent_managed",
185
186
  "dnssec_policy",
186
- "inline_signing",
187
187
  "parental_agents",
188
188
  "registrar",
189
189
  "registry_domain_id",
@@ -195,6 +195,7 @@ class ZoneForm(ZoneTemplateUpdateMixin, TenancyForm, NetBoxModelForm):
195
195
  "billing_c",
196
196
  "tenant_group",
197
197
  "tenant",
198
+ "comments",
198
199
  "tags",
199
200
  )
200
201
 
@@ -241,7 +242,6 @@ class ZoneForm(ZoneTemplateUpdateMixin, TenancyForm, NetBoxModelForm):
241
242
  ),
242
243
  FieldSet(
243
244
  "dnssec_policy",
244
- "inline_signing",
245
245
  "parental_agents",
246
246
  name=_("DNSSEC"),
247
247
  ),
@@ -317,7 +317,6 @@ class ZoneForm(ZoneTemplateUpdateMixin, TenancyForm, NetBoxModelForm):
317
317
  )
318
318
 
319
319
  if not get_field_value(self, "dnssec_policy"):
320
- del self.fields["inline_signing"]
321
320
  del self.fields["parental_agents"]
322
321
 
323
322
  if not get_field_value(self, "registrar"):
@@ -415,6 +414,8 @@ class ZoneForm(ZoneTemplateUpdateMixin, TenancyForm, NetBoxModelForm):
415
414
  label=_("RFC2317 Prefix"),
416
415
  )
417
416
 
417
+ comments = CommentField()
418
+
418
419
  def clean_default_ttl(self):
419
420
  return (
420
421
  self.cleaned_data["default_ttl"]
@@ -552,7 +553,7 @@ class ZoneFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm):
552
553
  inline_signing = forms.NullBooleanField(
553
554
  required=False,
554
555
  widget=forms.Select(choices=BOOLEAN_WITH_BLANK_CHOICES),
555
- label=_("Use Inline Signing"),
556
+ label=_("DNSSEC Policy uses inline signing"),
556
557
  )
557
558
  parental_agents = forms.GenericIPAddressField(
558
559
  required=False,
@@ -632,7 +633,6 @@ class ZoneImportForm(ZoneTemplateUpdateMixin, NetBoxModelImportForm):
632
633
  "soa_expire",
633
634
  "soa_minimum",
634
635
  "dnssec_policy",
635
- "inline_signing",
636
636
  "parental_agents",
637
637
  "rfc2317_prefix",
638
638
  "rfc2317_parent_managed",
@@ -645,6 +645,7 @@ class ZoneImportForm(ZoneTemplateUpdateMixin, NetBoxModelImportForm):
645
645
  "tech_c",
646
646
  "billing_c",
647
647
  "tenant",
648
+ "comments",
648
649
  "tags",
649
650
  )
650
651
 
@@ -741,10 +742,6 @@ class ZoneImportForm(ZoneTemplateUpdateMixin, NetBoxModelImportForm):
741
742
  },
742
743
  label=_("DNSSEC Policy"),
743
744
  )
744
- inline_signing = forms.BooleanField(
745
- required=False,
746
- label=_("Use Inline Signing"),
747
- )
748
745
  registrar = CSVModelChoiceField(
749
746
  queryset=Registrar.objects.all(),
750
747
  required=False,
@@ -860,7 +857,6 @@ class ZoneBulkEditForm(NetBoxModelBulkEditForm):
860
857
  ),
861
858
  FieldSet(
862
859
  "dnssec_policy",
863
- "inline_signing",
864
860
  "parental_agents",
865
861
  name=_("DNSSEC"),
866
862
  ),
@@ -900,6 +896,7 @@ class ZoneBulkEditForm(NetBoxModelBulkEditForm):
900
896
  "tech_c",
901
897
  "billing_c",
902
898
  "tenant",
899
+ "comments",
903
900
  )
904
901
 
905
902
  view = DynamicModelChoiceField(
@@ -990,11 +987,6 @@ class ZoneBulkEditForm(NetBoxModelBulkEditForm):
990
987
  required=False,
991
988
  label=_("DNSSEC Policy"),
992
989
  )
993
- inline_signing = forms.NullBooleanField(
994
- required=False,
995
- widget=BulkEditNullBooleanSelect(),
996
- label=_("Use Inline Signing"),
997
- )
998
990
  parental_agents = SimpleArrayField(
999
991
  required=False,
1000
992
  base_field=forms.GenericIPAddressField(),
@@ -1049,3 +1041,4 @@ class ZoneBulkEditForm(NetBoxModelBulkEditForm):
1049
1041
  required=False,
1050
1042
  label=_("Tenant"),
1051
1043
  )
1044
+ comments = CommentField()
@@ -34,6 +34,7 @@ class NetBoxDNSDNSSECPolicyFilter(
34
34
  ]
35
35
  | None
36
36
  ) = strawberry_django.filter_field()
37
+ inline_signing: FilterLookup[bool] | None = strawberry_django.filter_field()
37
38
  key_templates: (
38
39
  Annotated[
39
40
  "NetBoxDNSDNSSECKeyTemplateFilter",
@@ -91,7 +91,6 @@ class NetBoxDNSZoneFilter(
91
91
  ]
92
92
  | None
93
93
  )
94
- inline_signing: FilterLookup[bool] | None = strawberry_django.filter_field()
95
94
 
96
95
  registrar: (
97
96
  Annotated[
@@ -142,5 +141,7 @@ class NetBoxDNSZoneFilter(
142
141
  rfc2317_parent_zone_id: ID | None = strawberry_django.filter_field()
143
142
  rfc2317_parent_managed: FilterLookup[bool] | None = strawberry_django.filter_field()
144
143
 
144
+ comments: FilterLookup[str] | None = strawberry_django.filter_field()
145
+
145
146
  arpa_network: FilterLookup[str] | None = strawberry_django.filter_field()
146
147
  active: FilterLookup[bool] | None = strawberry_django.filter_field()
@@ -89,7 +89,7 @@ class NetBoxDNSZoneType(NetBoxObjectType):
89
89
  ]
90
90
  | None
91
91
  )
92
- inline_signing: bool
92
+ inline_signing: bool | None
93
93
  parental_agents: List[str]
94
94
  registrar: (
95
95
  Annotated["NetBoxDNSRegistrarType", strawberry.lazy("netbox_dns.graphql.types")]
@@ -136,6 +136,9 @@ class NetBoxDNSZoneType(NetBoxObjectType):
136
136
  rfc2317_child_zones: List[
137
137
  Annotated["NetBoxDNSRecordType", strawberry.lazy("netbox_dns.graphql.types")]
138
138
  ]
139
+
140
+ comments: str | None
141
+
139
142
  arpa_network: str | None
140
143
  tenant: Annotated["TenantType", strawberry.lazy("tenancy.graphql.types")] | None
141
144
 
@@ -194,6 +197,7 @@ class NetBoxDNSDNSSECPolicyType(NetBoxObjectType):
194
197
  description: str | None
195
198
  status: str
196
199
  tenant: Annotated["TenantType", strawberry.lazy("tenancy.graphql.types")] | None
200
+ inline_signing: bool
197
201
  key_templates: List[
198
202
  Annotated[
199
203
  "NetBoxDNSDNSSECKeyTemplateType",
@@ -216,7 +220,7 @@ class NetBoxDNSDNSSECPolicyType(NetBoxObjectType):
216
220
  parent_propagation_delay: BigInt | None
217
221
  use_nsec3: bool
218
222
  nsec3_iterations: BigInt | None
219
- nsec3_opt_out: bool
223
+ nsec3_opt_out: bool | None
220
224
  nsec3_salt_size: BigInt | None
221
225
 
222
226
 
@@ -0,0 +1,22 @@
1
+ # Generated by Django 5.2.6 on 2025-10-05 16:57
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ("netbox_dns", "0024_zonetemplate_parental_agents"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.RemoveField(
14
+ model_name="zone",
15
+ name="inline_signing",
16
+ ),
17
+ migrations.AddField(
18
+ model_name="dnssecpolicy",
19
+ name="inline_signing",
20
+ field=models.BooleanField(default=True),
21
+ ),
22
+ ]
@@ -0,0 +1,18 @@
1
+ # Generated by Django 5.2.6 on 2025-10-08 14:04
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ("netbox_dns", "0025_remove_zone_inline_signing_and_more"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterField(
14
+ model_name="dnssecpolicy",
15
+ name="nsec3_opt_out",
16
+ field=models.BooleanField(blank=True, null=True),
17
+ ),
18
+ ]
@@ -0,0 +1,18 @@
1
+ # Generated by Django 5.2.7 on 2025-10-24 12:10
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ("netbox_dns", "0026_alter_dnssecpolicy_nsec3_opt_out"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AddField(
14
+ model_name="zone",
15
+ name="comments",
16
+ field=models.TextField(blank=True),
17
+ ),
18
+ ]
@@ -51,6 +51,11 @@ class DNSSECPolicy(ContactsMixin, NetBoxModel):
51
51
  null=False,
52
52
  )
53
53
 
54
+ inline_signing = models.BooleanField(
55
+ verbose_name=_("Inline Signing"),
56
+ help_text=_("Use inline signing"),
57
+ default=True,
58
+ )
54
59
  key_templates = models.ManyToManyField(
55
60
  verbose_name=_("Key Templates"),
56
61
  to="DNSSECKeyTemplate",
@@ -145,9 +150,8 @@ class DNSSECPolicy(ContactsMixin, NetBoxModel):
145
150
  )
146
151
  nsec3_opt_out = models.BooleanField(
147
152
  verbose_name=_("NSEC3 Opt-Out"),
148
- blank=False,
149
- null=False,
150
- default=False,
153
+ blank=True,
154
+ null=True,
151
155
  )
152
156
  nsec3_salt_size = models.PositiveIntegerField(
153
157
  verbose_name=_("NSEC3 Salt Size"),
netbox_dns/models/zone.py CHANGED
@@ -25,6 +25,7 @@ from netbox.search import SearchIndex, register_search
25
25
  from netbox.plugins.utils import get_plugin_config
26
26
  from utilities.querysets import RestrictedQuerySet
27
27
  from ipam.models import IPAddress
28
+ from ipam.choices import IPAddressFamilyChoices
28
29
 
29
30
  from netbox_dns.choices import (
30
31
  RecordClassChoices,
@@ -123,7 +124,6 @@ class Zone(ObjectModificationMixin, ContactsMixin, NetBoxModel):
123
124
  "description",
124
125
  "status",
125
126
  "dnssec_policy",
126
- "inline_signing",
127
127
  "parental_agents",
128
128
  "registrar",
129
129
  "registry_domain_id",
@@ -135,6 +135,7 @@ class Zone(ObjectModificationMixin, ContactsMixin, NetBoxModel):
135
135
  "billing_c",
136
136
  "rfc2317_parent_managed",
137
137
  "tenant",
138
+ "comments",
138
139
  }
139
140
 
140
141
  objects = ZoneManager()
@@ -262,11 +263,6 @@ class Zone(ObjectModificationMixin, ContactsMixin, NetBoxModel):
262
263
  blank=True,
263
264
  null=True,
264
265
  )
265
- inline_signing = models.BooleanField(
266
- verbose_name=_("Inline Signing"),
267
- help_text=_("Use inline signing for DNSSEC"),
268
- default=True,
269
- )
270
266
  parental_agents = ArrayField(
271
267
  base_field=models.GenericIPAddressField(
272
268
  protocol="both",
@@ -367,6 +363,10 @@ class Zone(ObjectModificationMixin, ContactsMixin, NetBoxModel):
367
363
  blank=True,
368
364
  null=True,
369
365
  )
366
+ comments = models.TextField(
367
+ verbose_name=_("Comments"),
368
+ blank=True,
369
+ )
370
370
 
371
371
  @property
372
372
  def fqdn(self):
@@ -432,6 +432,13 @@ class Zone(ObjectModificationMixin, ContactsMixin, NetBoxModel):
432
432
  def is_rfc2317_zone(self):
433
433
  return self.rfc2317_prefix is not None
434
434
 
435
+ @property
436
+ def inline_signing(self):
437
+ if self.dnssec_policy is None:
438
+ return None
439
+
440
+ return self.dnssec_policy.inline_signing
441
+
435
442
  def get_rfc2317_parent_zone(self):
436
443
  if not self.is_rfc2317_zone:
437
444
  return None
@@ -801,7 +808,6 @@ class Zone(ObjectModificationMixin, ContactsMixin, NetBoxModel):
801
808
 
802
809
  def clean(self, *args, **kwargs):
803
810
  if not self.dnssec_policy:
804
- self.inline_signing = self._meta.get_field("inline_signing").get_default()
805
811
  self.parental_agents = self._meta.get_field("parental_agents").get_default()
806
812
 
807
813
  if not self.registrar:
@@ -970,9 +976,21 @@ class Zone(ObjectModificationMixin, ContactsMixin, NetBoxModel):
970
976
  zones = self.view.zones.filter(
971
977
  arpa_network__net_contains_or_equals=self.arpa_network
972
978
  )
979
+
980
+ if self.arpa_network.version == IPAddressFamilyChoices.FAMILY_4:
981
+ record_type = RecordTypeChoices.A
982
+ else:
983
+ record_type = RecordTypeChoices.AAAA
984
+
973
985
  address_records = Record.objects.filter(
974
- Q(ptr_record__isnull=True) | Q(ptr_record__zone__in=zones),
975
- type__in=(RecordTypeChoices.A, RecordTypeChoices.AAAA),
986
+ Q(
987
+ ptr_record__isnull=True,
988
+ zone__view=self.view,
989
+ ip_address__isnull=False,
990
+ ip_address__contained=self.arpa_network,
991
+ type=record_type,
992
+ )
993
+ | Q(ptr_record__zone__in=zones),
976
994
  disable_ptr=False,
977
995
  )
978
996
 
@@ -1001,7 +1019,7 @@ class Zone(ObjectModificationMixin, ContactsMixin, NetBoxModel):
1001
1019
  arpa_network__net_contains=self.rfc2317_prefix
1002
1020
  )
1003
1021
  address_records = Record.objects.filter(
1004
- Q(ptr_record__isnull=True)
1022
+ Q(ptr_record__isnull=True, ip_address__contained=self.rfc2317_prefix)
1005
1023
  | Q(ptr_record__zone__in=zones)
1006
1024
  | Q(ptr_record__zone=self),
1007
1025
  type=RecordTypeChoices.A,
@@ -7,6 +7,7 @@ from netbox.tables import (
7
7
  TagColumn,
8
8
  ChoiceFieldColumn,
9
9
  ActionsColumn,
10
+ BooleanColumn,
10
11
  )
11
12
  from tenancy.tables import TenancyColumnsMixin
12
13
 
@@ -23,12 +24,16 @@ class DNSSECPolicyTable(TenancyColumnsMixin, NetBoxTable):
23
24
  class Meta(NetBoxTable.Meta):
24
25
  model = DNSSECPolicy
25
26
 
26
- fields = ("description",)
27
+ fields = (
28
+ "description",
29
+ "inline_signing",
30
+ )
27
31
 
28
32
  default_columns = (
29
33
  "name",
30
34
  "description",
31
35
  "status",
36
+ "inline_signing",
32
37
  "use_nsec3",
33
38
  "tags",
34
39
  )
@@ -73,7 +78,7 @@ class DNSSECPolicyTable(TenancyColumnsMixin, NetBoxTable):
73
78
  zone_propagation_delay = tables.Column(
74
79
  verbose_name=_("Zone Propagation Delay"),
75
80
  )
76
- create_cdnskey = tables.BooleanColumn(
81
+ create_cdnskey = BooleanColumn(
77
82
  verbose_name=_("Create CDNSKEY"),
78
83
  )
79
84
  cds_digest_types = tables.Column(
@@ -85,13 +90,13 @@ class DNSSECPolicyTable(TenancyColumnsMixin, NetBoxTable):
85
90
  parent_propagation_delay = tables.Column(
86
91
  verbose_name=_("Parent Propagation Delay"),
87
92
  )
88
- use_nsec3 = tables.BooleanColumn(
93
+ use_nsec3 = BooleanColumn(
89
94
  verbose_name=_("Use NSEC3"),
90
95
  )
91
96
  nsec3_iterations = tables.Column(
92
97
  verbose_name=_("NSEC3 Iterations"),
93
98
  )
94
- nsec3_opt_out = tables.BooleanColumn(
99
+ nsec3_opt_out = BooleanColumn(
95
100
  verbose_name=_("NSEC3 Opt Out"),
96
101
  )
97
102
  nsec3_salt_size = tables.Column(
@@ -122,10 +127,10 @@ class DNSSECPolicyDisplayTable(TenancyColumnsMixin, NetBoxTable):
122
127
  status = ChoiceFieldColumn(
123
128
  verbose_name=_("Status"),
124
129
  )
125
- create_cdnskey = tables.BooleanColumn(
130
+ create_cdnskey = BooleanColumn(
126
131
  verbose_name=_("Create CDNSKEY"),
127
132
  )
128
- use_nsec3 = tables.BooleanColumn(
133
+ use_nsec3 = BooleanColumn(
129
134
  verbose_name=_("Use NSEC3"),
130
135
  )
131
136
  tags = TagColumn(
@@ -8,6 +8,8 @@ from netbox.tables import (
8
8
  ChoiceFieldColumn,
9
9
  TagColumn,
10
10
  ActionsColumn,
11
+ BooleanColumn,
12
+ TemplateColumn,
11
13
  )
12
14
  from tenancy.tables import TenancyColumnsMixin
13
15
 
@@ -44,11 +46,11 @@ class RecordBaseTable(TenancyColumnsMixin, NetBoxTable):
44
46
  verbose_name=_("FQDN"),
45
47
  linkify=True,
46
48
  )
47
- value = tables.TemplateColumn(
49
+ value = TemplateColumn(
48
50
  verbose_name=_("Value"),
49
51
  template_code="{{ value|truncatechars:64 }}",
50
52
  )
51
- unicode_value = tables.TemplateColumn(
53
+ unicode_value = TemplateColumn(
52
54
  verbose_name=_("Unicode Value"),
53
55
  template_code="{{ value|truncatechars:64 }}",
54
56
  accessor="value",
@@ -56,7 +58,7 @@ class RecordBaseTable(TenancyColumnsMixin, NetBoxTable):
56
58
  ttl = tables.Column(
57
59
  verbose_name=_("TTL"),
58
60
  )
59
- active = tables.BooleanColumn(
61
+ active = BooleanColumn(
60
62
  verbose_name=_("Active"),
61
63
  )
62
64
 
@@ -89,7 +91,7 @@ class RecordTable(RecordBaseTable):
89
91
  status = ChoiceFieldColumn(
90
92
  verbose_name=_("Status"),
91
93
  )
92
- disable_ptr = tables.BooleanColumn(
94
+ disable_ptr = BooleanColumn(
93
95
  verbose_name=_("Disable PTR"),
94
96
  )
95
97
  tags = TagColumn(
@@ -1,7 +1,13 @@
1
1
  import django_tables2 as tables
2
2
  from django.utils.translation import gettext_lazy as _
3
3
 
4
- from netbox.tables import NetBoxTable, TagColumn, ActionsColumn
4
+ from netbox.tables import (
5
+ ActionsColumn,
6
+ BooleanColumn,
7
+ NetBoxTable,
8
+ TagColumn,
9
+ TemplateColumn,
10
+ )
5
11
  from tenancy.tables import TenancyColumnsMixin
6
12
 
7
13
  from netbox_dns.models import RecordTemplate
@@ -42,11 +48,11 @@ class RecordTemplateTable(TenancyColumnsMixin, NetBoxTable):
42
48
  type = tables.Column(
43
49
  verbose_name=_("Type"),
44
50
  )
45
- value = tables.TemplateColumn(
51
+ value = TemplateColumn(
46
52
  verbose_name=_("Value"),
47
53
  template_code="{{ value|truncatechars:64 }}",
48
54
  )
49
- unicode_value = tables.TemplateColumn(
55
+ unicode_value = TemplateColumn(
50
56
  verbose_name=_("Unicode Value"),
51
57
  template_code="{{ value|truncatechars:64 }}",
52
58
  accessor="value",
@@ -54,7 +60,7 @@ class RecordTemplateTable(TenancyColumnsMixin, NetBoxTable):
54
60
  ttl = tables.Column(
55
61
  verbose_name=_("TTL"),
56
62
  )
57
- disable_ptr = tables.BooleanColumn(
63
+ disable_ptr = BooleanColumn(
58
64
  verbose_name=_("Disable PTR"),
59
65
  )
60
66
  tags = TagColumn(
netbox_dns/tables/view.py CHANGED
@@ -1,7 +1,7 @@
1
1
  import django_tables2 as tables
2
2
  from django.utils.translation import gettext_lazy as _
3
3
 
4
- from netbox.tables import NetBoxTable, TagColumn, ActionsColumn
4
+ from netbox.tables import ActionsColumn, BooleanColumn, NetBoxTable, TagColumn
5
5
  from tenancy.tables import TenancyColumnsMixin
6
6
 
7
7
  from netbox_dns.models import View
@@ -31,7 +31,7 @@ class ViewTable(TenancyColumnsMixin, NetBoxTable):
31
31
  verbose_name=_("Name"),
32
32
  linkify=True,
33
33
  )
34
- default_view = tables.BooleanColumn(
34
+ default_view = BooleanColumn(
35
35
  verbose_name=_("Default View"),
36
36
  )
37
37
  tags = TagColumn(url_name="plugins:netbox_dns:view_list")
netbox_dns/tables/zone.py CHANGED
@@ -6,6 +6,7 @@ from netbox.tables import (
6
6
  NetBoxTable,
7
7
  TagColumn,
8
8
  ActionsColumn,
9
+ columns,
9
10
  )
10
11
  from tenancy.tables import TenancyColumnsMixin
11
12
 
@@ -26,11 +27,11 @@ class ZoneTable(TenancyColumnsMixin, NetBoxTable):
26
27
  "description",
27
28
  "soa_rname",
28
29
  "soa_serial",
29
- "inline_signing",
30
30
  "rfc2317_parent_managed",
31
31
  "registry_domain_id",
32
32
  "expiration_date",
33
33
  "domain_status",
34
+ "comments",
34
35
  )
35
36
 
36
37
  default_columns = (
@@ -95,6 +96,7 @@ class ZoneTable(TenancyColumnsMixin, NetBoxTable):
95
96
  verbose_name=_("Billing Contact"),
96
97
  linkify=True,
97
98
  )
99
+ comments = columns.MarkdownColumn()
98
100
 
99
101
  def render_name(self, value, record):
100
102
  return record.display_name
@@ -48,8 +48,18 @@ class RelatedDNSRecords(PluginTemplateExtension):
48
48
  return self.render(
49
49
  "netbox_dns/record/related.html",
50
50
  extra_context={
51
- "related_address_records": address_record_table,
52
- "related_pointer_records": pointer_record_table,
51
+ "address_card_title": (
52
+ _("Synchronized Address Records")
53
+ if len(address_records) > 1
54
+ else _("Synchronized Address Record")
55
+ ),
56
+ "address_record_table": address_record_table,
57
+ "pointer_card_title": (
58
+ _("Synchronized Pointer Records")
59
+ if len(pointer_records) > 1
60
+ else _("Synchronized Pointer Record")
61
+ ),
62
+ "pointer_record_table": pointer_record_table,
53
63
  },
54
64
  )
55
65
 
@@ -99,11 +109,11 @@ class IPRelatedDNSRecords(PluginTemplateExtension):
99
109
  address_records = Record.objects.filter(
100
110
  type__in=(RecordTypeChoices.A, RecordTypeChoices.AAAA),
101
111
  ip_address=ip_address.address.ip,
102
- )
112
+ ).exclude(ipam_ip_address=ip_address)
103
113
  pointer_records = Record.objects.filter(
104
114
  type=RecordTypeChoices.PTR,
105
115
  ip_address=ip_address.address.ip,
106
- )
116
+ ).exclude(address_records__ipam_ip_address__in=[ip_address])
107
117
 
108
118
  if address_records:
109
119
  address_record_table = RelatedRecordTable(
@@ -124,8 +134,18 @@ class IPRelatedDNSRecords(PluginTemplateExtension):
124
134
  return self.render(
125
135
  "netbox_dns/record/related.html",
126
136
  extra_context={
127
- "related_address_records": address_record_table,
128
- "related_pointer_records": pointer_record_table,
137
+ "address_card_title": (
138
+ _("Related Address Records")
139
+ if len(address_records) > 1
140
+ else _("Related Address Record")
141
+ ),
142
+ "address_record_table": address_record_table,
143
+ "pointer_card_title": (
144
+ _("Related Pointer Records")
145
+ if len(pointer_records) > 1
146
+ else _("Related Pointer Record")
147
+ ),
148
+ "pointer_record_table": pointer_record_table,
129
149
  },
130
150
  )
131
151
 
@@ -17,6 +17,10 @@
17
17
  <th scope="row">{% trans "Status" %}</th>
18
18
  <td>{% badge object.get_status_display bg_color=object.get_status_color %}</td>
19
19
  </tr>
20
+ <tr>
21
+ <th scope="row">{% trans "Use Inline Signing" %}</th>
22
+ <td>{% checkmark object.inline_signing %}</td>
23
+ </tr>
20
24
  <tr>
21
25
  <th scope="row">{% trans "Key Templates" %}</th>
22
26
  <td>
@@ -134,7 +138,11 @@
134
138
  </tr>
135
139
  <tr>
136
140
  <th scope="row">{% trans "NSEC3 Opt Out" %}</th>
137
- <td>{% checkmark object.nsec3_opt_out %}</td>
141
+ {% if object.nsec3_opt_out is None %}
142
+ <td>{{ ''|placeholder }}</td>
143
+ {% else %}
144
+ <td>{% checkmark object.nsec3_opt_out %}</td>
145
+ {% endif %}
138
146
  </tr>
139
147
  <tr>
140
148
  <th scope="row">{% trans "NSEC3 Salt Size" %}</th>
@@ -1,29 +1,20 @@
1
1
  {% load render_table from django_tables2 %}
2
2
  {% load perms %}
3
- {% load i18n %}
4
3
 
5
4
  {% if perms.netbox_dns.view_record %}
6
- {% if related_address_records %}
5
+ {% if address_record_table %}
7
6
  <div class="card">
8
- {% if related_address_records.rows|length == 1 %}
9
- <h2 class="card-header">{% trans "Related DNS Address Record" %}</h2>
10
- {% else %}
11
- <h2 class="card-header">{% trans "Related DNS Address Records" %}</h2>
12
- {% endif %}
7
+ <h2 class="card-header">{{ address_card_title }}</h2>
13
8
  <div class="table-responsive">
14
- {% render_table related_address_records 'inc/table.html' %}
9
+ {% render_table address_record_table 'inc/table.html' %}
15
10
  </div>
16
11
  </div>
17
12
  {% endif %}
18
- {% if related_pointer_records %}
13
+ {% if pointer_record_table %}
19
14
  <div class="card">
20
- {% if related_pointer_records.rows|length == 1 %}
21
- <h2 class="card-header">{% trans "Related DNS Pointer Record" %}</h2>
22
- {% else %}
23
- <h2 class="card-header">{% trans "Related DNS Pointer Records" %}</h2>
24
- {% endif %}
15
+ <h2 class="card-header">{{ pointer_card_title }}</h2>
25
16
  <div class="table-responsive">
26
- {% render_table related_pointer_records 'inc/table.html' %}
17
+ {% render_table pointer_record_table 'inc/table.html' %}
27
18
  </div>
28
19
  </div>
29
20
  {% endif %}
@@ -104,10 +104,6 @@
104
104
  <th scope="row">{% trans "Policy" %}</th>
105
105
  <td>{{ object.dnssec_policy|linkify }}</td>
106
106
  </tr>
107
- <tr>
108
- <th scope="row">{% trans "Use Inline Signing" %}</th>
109
- <td>{% checkmark object.inline_signing %}</td>
110
- </tr>
111
107
  <tr>
112
108
  <th scope="row">{% trans "Parental Agents" %}</th>
113
109
  <td>
@@ -122,6 +118,7 @@
122
118
  </div>
123
119
  {% endif %}
124
120
 
121
+ {% include 'inc/panels/comments.html' %}
125
122
  {% include 'inc/panels/tags.html' %}
126
123
  {% include 'inc/panels/custom_fields.html' %}
127
124
  </div>
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: netbox-plugin-dns
3
- Version: 1.4.1
3
+ Version: 1.4.3
4
4
  Summary: NetBox DNS is a NetBox plugin for managing DNS data.
5
5
  Author-email: Peter Eckel <pete@netbox-dns.org>
6
6
  Project-URL: Homepage, https://github.com/peteeckel/netbox-plugin-dns
@@ -1,16 +1,16 @@
1
- netbox_dns/__init__.py,sha256=XRspLVS99IjahpMWpHVZj2p_-qqFem1zwZVuHNXMV8A,4890
1
+ netbox_dns/__init__.py,sha256=FyJUZCg5fyQWrdkfpDH5PwjsSfv20QS0MBnbNWvsIVI,4890
2
2
  netbox_dns/apps.py,sha256=JCW5eS-AQBUubDJve1DjP-IRFKTFGQh1NLGWzJpC5MI,151
3
3
  netbox_dns/navigation.py,sha256=ZF2-bKRfuxXnLArSCvozyRXRd7GME14sVJZdmDEMhBk,7741
4
- netbox_dns/template_content.py,sha256=nwjbWkMc02vpTmcFQdiAA1TdopJiZ0MkRy6qa18_wLI,4848
4
+ netbox_dns/template_content.py,sha256=BCBx7dFZOu429CSyG5jFPnDSF8nJNLzwAsCGpAGF0zI,5787
5
5
  netbox_dns/urls.py,sha256=wrse8l5scD-jz_O7WY0YXRlYPzpkL-0-kyAd-wCPtbQ,2596
6
6
  netbox_dns/api/field_serializers.py,sha256=nVZ6d69DWagONDwbYCP2j3cmL-x9lryitF1wThEJxyI,725
7
- netbox_dns/api/nested_serializers.py,sha256=7ViTZBNMEZ7-NAGn5LXnd7AWxt7TbpFdAq1pcCPtTK8,3695
7
+ netbox_dns/api/nested_serializers.py,sha256=jPFLmZDZawasKBM3OxYecjkV5-ZV67_qmSbStyDah4k,3725
8
8
  netbox_dns/api/serializers.py,sha256=OHrpfJkBn6D1y6b3nIxBEFyE50U5p-Aqv4lBojMEFgk,474
9
9
  netbox_dns/api/urls.py,sha256=-kQaei47yZeGbDpQ9RaFaFlFb682ThuPA5h321_2cgM,1000
10
10
  netbox_dns/api/views.py,sha256=w71SRyZue5zPD1C64TIr496nYFA_ARjHTlpSVFTZ76o,4522
11
11
  netbox_dns/api/serializers_/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
12
  netbox_dns/api/serializers_/dnssec_key_template.py,sha256=gZNv8hdpTc_X0rhfuKfUcsLzV_l6CV_tTzElw6tyEGw,1654
13
- netbox_dns/api/serializers_/dnssec_policy.py,sha256=DOGtQDiLLMmH2TvmVp9w-enZtrXygiSwfiREWk2IjH0,4322
13
+ netbox_dns/api/serializers_/dnssec_policy.py,sha256=ajeNPp6ziC_M2HLtZxCUUOk-aOQ4Mj1Knq6W1Z8EL3M,4382
14
14
  netbox_dns/api/serializers_/nameserver.py,sha256=0ItKFCmDVqMbw9i5LandYMZTpJAGClu6lejaWvpLbBY,1288
15
15
  netbox_dns/api/serializers_/prefix.py,sha256=kZ1DjDly6VFZamXSxGa57YC6MfZZcI5S7jmGBkVB2_I,551
16
16
  netbox_dns/api/serializers_/record.py,sha256=wHs86KwLCgeC_7ORw2b0gvlpAustwfBSfbPva1yPb-k,2570
@@ -18,7 +18,7 @@ netbox_dns/api/serializers_/record_template.py,sha256=imRRPkCXQMCpXUUk58kB2KwXC6
18
18
  netbox_dns/api/serializers_/registrar.py,sha256=ul_6SJVqxvTE2ysXBy52U59oTzwmaD781URH1l1OW9o,927
19
19
  netbox_dns/api/serializers_/registration_contact.py,sha256=P_aoG_1rriHn4KkwTx5Dhw37Rn3VY2whg0vAIm55cjk,1108
20
20
  netbox_dns/api/serializers_/view.py,sha256=ipuL4FVTl5MYt5_ThayBAOBMGu61ZUGnCb8Co1tNQGU,1894
21
- netbox_dns/api/serializers_/zone.py,sha256=JfjhxmfbpJRNzFqnjueFvpJS5ASnbomm1jzJrjYPpqo,6407
21
+ netbox_dns/api/serializers_/zone.py,sha256=_Upe1-xTCXQ-lsiH1bmIjm2zhsGiYYHWBUuzXgjWEVw,6572
22
22
  netbox_dns/api/serializers_/zone_template.py,sha256=sThICHWbQpXRKCFq8I--3PSkad-aPzh7TBdoDm31jzg,4438
23
23
  netbox_dns/choices/__init__.py,sha256=K3JfawICeoUny8O_Dqexr7DOxwyg3QqijZ4DO6j5yP8,106
24
24
  netbox_dns/choices/dnssec_key_template.py,sha256=Xl3y_ScKJmnsqMH1sv6ezLcZI1rruHDGJP5e2IRSC4s,1511
@@ -27,7 +27,7 @@ netbox_dns/choices/record.py,sha256=Ynw1aDASQEovzIPJbRFRM6F-M9u39iHMe0aj9DZsrfk,
27
27
  netbox_dns/choices/utilities.py,sha256=osvDMxOZnvxx9Jc7zKjkMGNFGxtnhM49q71Q-h61lLA,123
28
28
  netbox_dns/choices/zone.py,sha256=KvyNL_TR_2FXCoH6usrXTRJYRzZ9W1PiDvunutAUYhY,4294
29
29
  netbox_dns/fields/__init__.py,sha256=yUVrNQ7BvoeVRGoiRFmrZxXsp1LIwHLRLl0_5mBIyzk,143
30
- netbox_dns/fields/address.py,sha256=qNLHmpwwJ3TevljG1QsUr_f2h6NrPsK6wr-R-Ti8eZI,1262
30
+ netbox_dns/fields/address.py,sha256=t0BLnGKYyqraiHixEtt6FvpqUixaHoIFTN9YgNufWng,1750
31
31
  netbox_dns/fields/choice_array.py,sha256=qECgwzJ9PVGIbpqC_JVzuSUsV7C3FG03ibv1EUrvZr4,850
32
32
  netbox_dns/fields/ipam.py,sha256=wla-kBm77BpD0LNQhgRZS1RYbVois7WDqPpyQkUT02k,481
33
33
  netbox_dns/fields/network.py,sha256=a5nTzjscRufxgMjVsf5juszSYuTujU50pQ9P7q4qMVs,3740
@@ -35,41 +35,41 @@ netbox_dns/fields/rfc2317.py,sha256=y72PZKlXZ8_6P4eeWZ8IF3gqOMjPxW48gk3AB81XboE,
35
35
  netbox_dns/fields/timeperiod.py,sha256=InK3FVc8gHNQjx101a7HsGfrHxvoG1y6drYwuRjRSIE,941
36
36
  netbox_dns/filtersets/__init__.py,sha256=bKppz_w3X2xNNHOcxZZiIO7zSkDaNTrZJ__k1U7rKik,275
37
37
  netbox_dns/filtersets/dnssec_key_template.py,sha256=dFaNGYdGXghe_uDMedOPxrMGxhDu4gHXwSQ6VLSY7gk,1625
38
- netbox_dns/filtersets/dnssec_policy.py,sha256=FRmHulpWmglf89J6bzQYUVFFxvt0mvp29kp7LHA5080,3071
38
+ netbox_dns/filtersets/dnssec_policy.py,sha256=Z0SOfhKYA0GCgbfTqoDnAqcnzt9AmMZLGGkYD3VO7dc,3101
39
39
  netbox_dns/filtersets/nameserver.py,sha256=4hkFsohhvBptFwY9_LJJN8_8KkMhCPsFujzIlDhlnqw,1251
40
40
  netbox_dns/filtersets/record.py,sha256=7asGcd2zePhnIDAvuVE-aKAo_NNM0Pm06epXzEql4y4,3916
41
41
  netbox_dns/filtersets/record_template.py,sha256=Pc4P479MqfgdUMvBK39ic2nsV_gg4GT_tbdVcCL9wSI,1605
42
42
  netbox_dns/filtersets/registrar.py,sha256=6QrsrWXu19bMa99DzwwXqfNqxpvTG0JwGEpybhOSYps,978
43
43
  netbox_dns/filtersets/registration_contact.py,sha256=42j7NkwkbSEfomCDekkIE9ZWNug_qfvmTO_D1e-fFIw,1140
44
44
  netbox_dns/filtersets/view.py,sha256=g8Qz363F9sieNtf4zA2L87mR86HFtkpvHTCkql6TxGk,1107
45
- netbox_dns/filtersets/zone.py,sha256=Uzlgo2dGCQhH_S3tI8gVYHi7tMoNS1YK5agbLRkV7bc,7603
45
+ netbox_dns/filtersets/zone.py,sha256=pg513mVNwlZ0EPEY3v6b8g7-xLKwyZP35cU_FMyWr4E,8289
46
46
  netbox_dns/filtersets/zone_template.py,sha256=W-s-Gm1OhnHRdQaU0sBie7ZAup4CfBMX3xeZfKGgJXc,5358
47
47
  netbox_dns/forms/__init__.py,sha256=tObkTOHw_6kVtEcwdyshN0Ql-8VGhwsgQw7owL_s2lI,273
48
48
  netbox_dns/forms/dnssec_key_template.py,sha256=zWOTdsbfCcjpizOZn6Y8HRewJarFwtlXcW4H0ZyqJVI,6176
49
- netbox_dns/forms/dnssec_policy.py,sha256=_KCGgWZB8yrC2wNFefqaM32cYMFzHsCAdqq83AF9jiw,17139
49
+ netbox_dns/forms/dnssec_policy.py,sha256=aARkERqxU7DugvgvO0cwxpynvGz_YGtlDX6R9My1rHE,18523
50
50
  netbox_dns/forms/nameserver.py,sha256=_iQJXbdFrrtMnRT8yZHnOp1Nj1iwxjHIAH_hrvCkrKU,3848
51
51
  netbox_dns/forms/record.py,sha256=wRl3uRY13VK8cF79u69-DDJmHJnZjwuLR60PsUGJ3p0,8493
52
52
  netbox_dns/forms/record_template.py,sha256=5yuY2ppV2diEOdm_IN3QSLLEdWkOkWZOYRtOh0qPY7A,6796
53
53
  netbox_dns/forms/registrar.py,sha256=oLMcXJOpt0F02a2Aga6A45rja7TvI18nTCZb_Dx_8t0,4038
54
54
  netbox_dns/forms/registration_contact.py,sha256=GtUmHzPmAFNRt81rTgJbmb5TMoEJ-mpmjltkuyppJwc,6157
55
55
  netbox_dns/forms/view.py,sha256=KZ2enzbqAEElt3b5C02kMJwnIDEjdQf_BsgMuMqKP50,10836
56
- netbox_dns/forms/zone.py,sha256=fu3WmQKGknEv9z7vjHqRdnBBfPyYQ3rWJZPRP8a4pkQ,30813
56
+ netbox_dns/forms/zone.py,sha256=mS1kCz57I0SXMLFqR_fPYK4TSKbiknf8Aplo2TnchsU,30541
57
57
  netbox_dns/forms/zone_template.py,sha256=SN4E-DkD1RgUcZhvUNzRFg4-FHbkvdFs1l28eShAx4o,12203
58
58
  netbox_dns/graphql/__init__.py,sha256=0xg_5d1PPFTadBOZo752t5sfZeLFrqs2jM51Rbf8ti4,652
59
59
  netbox_dns/graphql/enums.py,sha256=vC-v24AuNbaGoekLTDu1PBVbnR1aYeX6LmvrZkfd2F4,1453
60
60
  netbox_dns/graphql/filter_lookups.py,sha256=P6wW2JrtkzUiIx6mJz_DvwYg5Sov68IKAx0zVQfuvYY,355
61
61
  netbox_dns/graphql/schema.py,sha256=KlbJmlfQEqZhvb6-cYmq94mrMFcQoCh3MldaUD5eVV4,2904
62
- netbox_dns/graphql/types.py,sha256=97vPzKAGzz9tn8qm-kc_1vZHtwc5QMHq-vLkZ42Regg,10213
62
+ netbox_dns/graphql/types.py,sha256=drw0dQO10QAle8__YBhtK-uZwsGZurfcpXBb3Et35uA,10279
63
63
  netbox_dns/graphql/filters/__init__.py,sha256=bKppz_w3X2xNNHOcxZZiIO7zSkDaNTrZJ__k1U7rKik,275
64
64
  netbox_dns/graphql/filters/dnssec_key_template.py,sha256=hK7KgikQOC-BMp88PR1moHQboWd-DS59GwQ0TJADdLM,2076
65
- netbox_dns/graphql/filters/dnssec_policy.py,sha256=hu2_W74PDxN4QLRQTFd-qh_qf55ztoWtShTiVhOuvD8,4656
65
+ netbox_dns/graphql/filters/dnssec_policy.py,sha256=MAnnCU48UhtETcXJjwLdiikczpb5fR3k6wrfZCQKJTI,4737
66
66
  netbox_dns/graphql/filters/nameserver.py,sha256=sDVIrRXBeyscGfQSost4SqrBnBQ_ZIK13GjaXkKAcCw,1050
67
67
  netbox_dns/graphql/filters/record.py,sha256=v3-8zyVrA0Hl4AC9d4SkYAQLHpQ1StIP-ws8xM_5Qb4,3313
68
68
  netbox_dns/graphql/filters/record_template.py,sha256=sCAm-ct3aXjz9XNtAfUhPXaXRRHIaiXq_oQ4oFzxFY8,1819
69
69
  netbox_dns/graphql/filters/registrar.py,sha256=4tv1nlZU41-sOsNXf3-JyZESpAdktsDj7JTr1hv0aG4,1158
70
70
  netbox_dns/graphql/filters/registration_contact.py,sha256=feCw4zZd2UQ9895Gg0PJ4R-oGm90ss5XB6ve3B9JlVg,1402
71
71
  netbox_dns/graphql/filters/view.py,sha256=ozXGNJ0ELri2FAnQXPHDs3--Hznzx4ZF5mH264nr-DI,934
72
- netbox_dns/graphql/filters/zone.py,sha256=2mqPq4jikCWhbGRbIIcKbCXRtA9QiH6rXb5ufk1DAFE,5253
72
+ netbox_dns/graphql/filters/zone.py,sha256=T-f-2P9v9PqJSSUEs5uz1r9l9ULvVBqwiLNkHecE0vk,5247
73
73
  netbox_dns/graphql/filters/zone_template.py,sha256=6ZxBN_VPXvBDGXXwcYlkX6wJXx_IlMAZIEDX5-ARO_4,3100
74
74
  netbox_dns/locale/de/LC_MESSAGES/django.mo,sha256=Q6edOBPHxBTbVYE-7TM9G_o83ED_9TpGgefOazR6TP0,29831
75
75
  netbox_dns/locale/en/LC_MESSAGES/django.mo,sha256=GDnSZkfHs3yjtTsll7dksEEej4B50F8pc9RGytZNubM,393
@@ -109,8 +109,11 @@ netbox_dns/migrations/0023_disable_ptr_false.py,sha256=Wo-d60QmPCcvdVIVShF8L7z-L
109
109
  netbox_dns/migrations/0024_tenancy.py,sha256=3kc5l5_AyfhOI6g6mbCfReUAbSgb2DAv0MDMZqJ-3YQ,1745
110
110
  netbox_dns/migrations/0024_zonetemplate_parental_agents.py,sha256=e1mQ1NwP8eqqfgc74PFSRmnENL5VCLPIFzInePsZd4w,635
111
111
  netbox_dns/migrations/0025_ipam_coupling_cf.py,sha256=7uHujclWrsYw5QMLWft0Po78Ow5Q8MjPuU7moKyQ2qs,620
112
+ netbox_dns/migrations/0025_remove_zone_inline_signing_and_more.py,sha256=jCubcnlrdTbffK-DpRvmJ5CKcg5drGJg13sUG7OTtdU,522
113
+ netbox_dns/migrations/0026_alter_dnssecpolicy_nsec3_opt_out.py,sha256=bDjqslmVEBOspXmGbhakf8juZdHT9fU_ZY2kSUs7mUI,430
112
114
  netbox_dns/migrations/0026_domain_registration.py,sha256=qUJ1oUGHIGGNWD7QRLnxElbM5eNp7dYNNn_OYIw8Xvo,5796
113
115
  netbox_dns/migrations/0027_alter_registrar_iana_id.py,sha256=QUtRIrqqfkraFmzzeJFZWAEv4PfrOouoHtrV6FRn8Kc,404
116
+ netbox_dns/migrations/0027_zone_comments.py,sha256=brM80qZzY2bsyArrF5Nj6QLStSi3z5r7FhxErVwL5Po,398
114
117
  netbox_dns/migrations/0028_rfc2317_fields.py,sha256=D8r43xxBjYXiL6ycmX8RY5_WG7tRYEDjutOeYM1H56I,1364
115
118
  netbox_dns/migrations/0029_record_fqdn.py,sha256=UAAU38ekKQyiYDOJlcrz6Qbk4bqZfSHZyAHUZFFQrOw,808
116
119
  netbox_dns/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -118,42 +121,42 @@ netbox_dns/mixins/__init__.py,sha256=LxTEfpod_RHCyMtnzDljv0_dwqp2z3Q6tqbXW8LTGD8
118
121
  netbox_dns/mixins/object_modification.py,sha256=AR64fU5f7g-scNAj9b54eSoS9dpjyOpqrxXVXPcOhY8,1807
119
122
  netbox_dns/models/__init__.py,sha256=CuwFENIVUv0FNMDlY18Am-mvN5kBGkPOGavCP0cle7c,273
120
123
  netbox_dns/models/dnssec_key_template.py,sha256=AcyD9PLtg1lLZAFlEJ8TugSlglOSIBVihxgmi39zRm4,2738
121
- netbox_dns/models/dnssec_policy.py,sha256=REsE8p04bgJVF8yJuWuUITXpsZmvVlXWyQuJ9I6dEMs,5268
124
+ netbox_dns/models/dnssec_policy.py,sha256=be-ceOgUS48ACsZcZW51VivkWmuqXAszlAJEKt11gf8,5398
122
125
  netbox_dns/models/nameserver.py,sha256=oVfyc_iWRzxVE2tIhfRb1Vuj2gZmlfFFzEtXj9ZEr6s,3848
123
126
  netbox_dns/models/record.py,sha256=7f4h3ngUvPpQ4IQroTJAWO8wD2fqy1u8j-LuA23PWtM,32761
124
127
  netbox_dns/models/record_template.py,sha256=Qr43_YZm1z3Od1cBdDY9wpNlV-UCzvpn2c6_dDzFzN8,5145
125
128
  netbox_dns/models/registrar.py,sha256=-ozazecvd-oryEoDlOUvTWhEQKKQp3my6YVTEzWlUuI,1747
126
129
  netbox_dns/models/registration_contact.py,sha256=9ehnTjg8KUrUYJKRRu2SaJX-NE5dO4wy90FRPlT2ys4,3620
127
130
  netbox_dns/models/view.py,sha256=pwo7i8gtukIRgAC1A4rm58jcEpIbsSW_IUq6vSv-mRo,4618
128
- netbox_dns/models/zone.py,sha256=zHRCXfRliqhE9lQwfTU5xXHn_8dhd7yOn5L_7NaLhLE,36500
131
+ netbox_dns/models/zone.py,sha256=Oa2myD-YFUTkdzNS0hve9zhL9J1LIJNX7vH3hY3VfW8,36955
129
132
  netbox_dns/models/zone_template.py,sha256=jm7XsBADOWhGYOH-_n9a97CTE6w_BCP3gMEUIO-tfTs,5391
130
133
  netbox_dns/signals/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
131
134
  netbox_dns/signals/dnssec.py,sha256=o4MOEg6ftxoDWFAhDtajkXzb7Nb6KuUHjtx1zNu7C1w,1040
132
135
  netbox_dns/signals/ipam_dnssync.py,sha256=1zhlf4cMcJLlFosX7YzyqVYdFFHV4MFwTz5KCdL8xQc,7730
133
136
  netbox_dns/tables/__init__.py,sha256=tObkTOHw_6kVtEcwdyshN0Ql-8VGhwsgQw7owL_s2lI,273
134
137
  netbox_dns/tables/dnssec_key_template.py,sha256=5Y4S3Q_RtDdUHI4KxY37Trm7uKQCFUcqkC5mrb8Wi_A,1101
135
- netbox_dns/tables/dnssec_policy.py,sha256=6GIhoecku3BjYwx7wsOzzkZ0uEVZk5bA63foJ3_g9sw,3332
138
+ netbox_dns/tables/dnssec_policy.py,sha256=WIzMChFxOsNBydvo2voVYobygpByp7Uw__nBqEw4onU,3398
136
139
  netbox_dns/tables/ipam_dnssync.py,sha256=7IK95XlA2ter6gsHqXjXPd6WubpOxrV-O5-UT6R1CKU,330
137
140
  netbox_dns/tables/nameserver.py,sha256=NFFHwwW174x_XskHF9oBllnI22PGV0J78mklrJF_psw,741
138
- netbox_dns/tables/record.py,sha256=DRe0voUIlqi3Q4CHDp-xgzCqgnSG9ynBhNPO8vnzHQw,4777
139
- netbox_dns/tables/record_template.py,sha256=ueNSya2Zyrm_zU1Z-ZxwhsJIfxBtYXXoi2pSX-l4Bt8,1977
141
+ netbox_dns/tables/record.py,sha256=yaRcdBic9dGmeZGFmGsGWV_ZcmpVKBgxd5CYgI20VWY,4788
142
+ netbox_dns/tables/record_template.py,sha256=Bsjz4yZEQ3Eh-akMMEgPRB1z0ZZ4ysSotb-CwdOFwUI,2012
140
143
  netbox_dns/tables/registrar.py,sha256=yI4n0jq7igYwa-zs6YT6YVV2FxkgpfkSAsA_iPzel7A,776
141
144
  netbox_dns/tables/registration_contact.py,sha256=PeXp5l2WC5qIwctNdk_WP9LRDq_7bnoUlSS3OS6-SDs,980
142
- netbox_dns/tables/view.py,sha256=BFM50EgudRvcB32hqi0I5qA5nLBfXLzHbt_2q4_KeJA,1318
143
- netbox_dns/tables/zone.py,sha256=0lsfI3N9rY11Cxgr-t0PReyNRSnB10JOh-jMVZ4qEBA,2434
145
+ netbox_dns/tables/view.py,sha256=Z3323-796hbpQMCH7CbmcXp3QxaGHEh6_MwJ2UqDpiI,1326
146
+ netbox_dns/tables/zone.py,sha256=Dv8NvUrfepXhba1kMxLrqRUQEy0v4jKq5_5dCAR0iuw,2481
144
147
  netbox_dns/tables/zone_template.py,sha256=90geASGP6jSqKnvx2t-DaSxNZpp7j67lH1t0UzsKZ1Q,1755
145
148
  netbox_dns/templates/netbox_dns/dnsseckeytemplate.html,sha256=dSEyHgUp0k_5JSdR4s4m_7Rom67TqvRIQN0zbQKYfjE,2839
146
- netbox_dns/templates/netbox_dns/dnssecpolicy.html,sha256=dXHAt8ISsSWv-vK_kaJMcAzUBh4TZ2hAmeaYa47u0PU,7694
149
+ netbox_dns/templates/netbox_dns/dnssecpolicy.html,sha256=e1nfrk-VvSY1AC9Vi9LO5Eukck6l10pdtDwW0zKbRjE,8105
147
150
  netbox_dns/templates/netbox_dns/nameserver.html,sha256=MawPiuAmjFrbv0zRi-7xkm8vr-dT1tlEno8EcoQ9peU,1714
148
151
  netbox_dns/templates/netbox_dns/record.html,sha256=aFvbIEhhfp0AH5tRDNSgc2nQIymGgnVilk5Q8lCpKKw,7055
149
152
  netbox_dns/templates/netbox_dns/recordtemplate.html,sha256=a29PAUl-KI_I1lxWpVdPp2loJtzgis9DG9erOWrOZM0,3708
150
153
  netbox_dns/templates/netbox_dns/registrar.html,sha256=4kJuj3biiDxQrIMQEQUEmF4iGRE4psr6Fh0CBP1evz8,2308
151
154
  netbox_dns/templates/netbox_dns/registrationcontact.html,sha256=sljVp_MrPSJRc2vJCPFXq9MiWOw4wjbr1kI_YStBntw,3094
152
155
  netbox_dns/templates/netbox_dns/view.html,sha256=1MuzOYNQezRrryNjlklgxErjGTFoVnwqcxf4qceuglw,3320
153
- netbox_dns/templates/netbox_dns/zone.html,sha256=Hx2SL9gk7IKzBv5q45eESQADBPOCgbsW1yGe96-wlik,8262
156
+ netbox_dns/templates/netbox_dns/zone.html,sha256=zCw33RbcsGO5FhJ_en7olBXWJBArsxUp9Uv5jNS0vTQ,8111
154
157
  netbox_dns/templates/netbox_dns/zonetemplate.html,sha256=juPdeCtpZGcCqM-nJT4IVTmwgOtTOEvDek2iiAJ6aQw,4801
155
158
  netbox_dns/templates/netbox_dns/record/managed.html,sha256=uwpxQTxyfAXkWqThLT-T2ZssKNUhXTDDMnLWJSVuDNU,119
156
- netbox_dns/templates/netbox_dns/record/related.html,sha256=R59aPhE4CyIZtTH0ncwDyS6_wAe_Y-oZjuN_j4qk8iA,1158
159
+ netbox_dns/templates/netbox_dns/record/related.html,sha256=RUQpZN-pox7oVZ3Excxi0ZbqlO2UD4FN_RmB1nNJf-E,699
157
160
  netbox_dns/templates/netbox_dns/view/button.html,sha256=EMOB5x78XpyfN1qi-pY1CKKKLjyHo9rFUa4Uhq6rFMc,322
158
161
  netbox_dns/templates/netbox_dns/view/prefix.html,sha256=Eaur1fd0YHeGttp2vRucz-ix7itxNu6To3NXwliGZco,1560
159
162
  netbox_dns/templates/netbox_dns/view/related.html,sha256=C5P6IuRmQ_S2hAC44ceFyNJn8JVqRxMwIXkS0dEL500,1239
@@ -188,8 +191,8 @@ netbox_dns/views/registration_contact.py,sha256=5bJWjNBisqCkBo6d2TJyyBJlc95WM7Vc
188
191
  netbox_dns/views/view.py,sha256=xLXt7sKrda3FpNXsBSJk8L8P2XhZ1sVb5OOXovCsKEU,3089
189
192
  netbox_dns/views/zone.py,sha256=do8kB6o911D7wCdUbU72SRTaaNhDUG5pCT8WXGhGnWc,7122
190
193
  netbox_dns/views/zone_template.py,sha256=5P9DT3XBRL-TiM5zFhBTMlMusL4bP2jTu3GHxKz5ojc,2553
191
- netbox_plugin_dns-1.4.1.dist-info/licenses/LICENSE,sha256=I3tDu11bZfhFm3EkV4zOD5TmWgLjnUNLEFwrdjniZYs,1112
192
- netbox_plugin_dns-1.4.1.dist-info/METADATA,sha256=Qszj1PDusOulJdpKJsh85YJLZZQ1Hp5k3AuBvHFk0EA,7825
193
- netbox_plugin_dns-1.4.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
194
- netbox_plugin_dns-1.4.1.dist-info/top_level.txt,sha256=sA1Rwl1mRKvMC6XHe2ylZ1GF-Q1NGd08XedK9Y4xZc4,11
195
- netbox_plugin_dns-1.4.1.dist-info/RECORD,,
194
+ netbox_plugin_dns-1.4.3.dist-info/licenses/LICENSE,sha256=I3tDu11bZfhFm3EkV4zOD5TmWgLjnUNLEFwrdjniZYs,1112
195
+ netbox_plugin_dns-1.4.3.dist-info/METADATA,sha256=peOOcIruP6fm-c6eURHRh44g2yGY5p8SYG8oDE50QW0,7825
196
+ netbox_plugin_dns-1.4.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
197
+ netbox_plugin_dns-1.4.3.dist-info/top_level.txt,sha256=sA1Rwl1mRKvMC6XHe2ylZ1GF-Q1NGd08XedK9Y4xZc4,11
198
+ netbox_plugin_dns-1.4.3.dist-info/RECORD,,