netbox-plugin-dns 1.0.4__py3-none-any.whl → 1.0.6__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 (91) hide show
  1. netbox_dns/__init__.py +1 -1
  2. netbox_dns/api/nested_serializers.py +46 -1
  3. netbox_dns/api/serializers.py +2 -0
  4. netbox_dns/api/serializers_/contact.py +3 -0
  5. netbox_dns/api/serializers_/nameserver.py +4 -1
  6. netbox_dns/api/serializers_/record.py +5 -4
  7. netbox_dns/api/serializers_/record_template.py +58 -0
  8. netbox_dns/api/serializers_/registrar.py +3 -0
  9. netbox_dns/api/serializers_/view.py +3 -0
  10. netbox_dns/api/serializers_/zone.py +31 -6
  11. netbox_dns/api/serializers_/zone_template.py +130 -0
  12. netbox_dns/api/urls.py +4 -0
  13. netbox_dns/api/views.py +41 -1
  14. netbox_dns/choices/__init__.py +2 -0
  15. netbox_dns/choices/record.py +49 -0
  16. netbox_dns/choices/zone.py +20 -0
  17. netbox_dns/fields/address.py +6 -0
  18. netbox_dns/fields/network.py +3 -0
  19. netbox_dns/fields/rfc2317.py +6 -0
  20. netbox_dns/filtersets/__init__.py +3 -0
  21. netbox_dns/filtersets/contact.py +3 -0
  22. netbox_dns/filtersets/nameserver.py +3 -0
  23. netbox_dns/filtersets/record.py +5 -1
  24. netbox_dns/filtersets/record_template.py +54 -0
  25. netbox_dns/filtersets/registrar.py +3 -0
  26. netbox_dns/filtersets/view.py +3 -0
  27. netbox_dns/filtersets/zone.py +5 -8
  28. netbox_dns/filtersets/zone_template.py +116 -0
  29. netbox_dns/forms/__init__.py +2 -0
  30. netbox_dns/forms/contact.py +8 -0
  31. netbox_dns/forms/nameserver.py +21 -2
  32. netbox_dns/forms/record.py +24 -10
  33. netbox_dns/forms/record_template.py +220 -0
  34. netbox_dns/forms/registrar.py +8 -0
  35. netbox_dns/forms/view.py +10 -0
  36. netbox_dns/forms/zone.py +125 -41
  37. netbox_dns/forms/zone_template.py +298 -0
  38. netbox_dns/graphql/__init__.py +4 -0
  39. netbox_dns/graphql/filters.py +24 -1
  40. netbox_dns/graphql/schema.py +34 -1
  41. netbox_dns/graphql/types.py +70 -1
  42. netbox_dns/management/commands/cleanup_database.py +2 -6
  43. netbox_dns/management/commands/cleanup_rrset_ttl.py +2 -4
  44. netbox_dns/migrations/0001_squashed_netbox_dns_0_22.py +1 -2
  45. netbox_dns/migrations/0006_templating.py +172 -0
  46. netbox_dns/migrations/0021_record_ip_address.py +1 -1
  47. netbox_dns/mixins/object_modification.py +5 -0
  48. netbox_dns/models/__init__.py +7 -0
  49. netbox_dns/models/contact.py +6 -0
  50. netbox_dns/models/nameserver.py +8 -1
  51. netbox_dns/models/record.py +13 -122
  52. netbox_dns/models/record_template.py +180 -0
  53. netbox_dns/models/registrar.py +6 -0
  54. netbox_dns/models/view.py +7 -1
  55. netbox_dns/models/zone.py +63 -71
  56. netbox_dns/models/zone_template.py +150 -0
  57. netbox_dns/navigation.py +47 -0
  58. netbox_dns/tables/__init__.py +2 -0
  59. netbox_dns/tables/contact.py +3 -0
  60. netbox_dns/tables/nameserver.py +3 -2
  61. netbox_dns/tables/record.py +7 -3
  62. netbox_dns/tables/record_template.py +91 -0
  63. netbox_dns/tables/registrar.py +3 -0
  64. netbox_dns/tables/view.py +3 -0
  65. netbox_dns/tables/zone.py +3 -2
  66. netbox_dns/tables/zone_template.py +70 -0
  67. netbox_dns/template_content.py +2 -8
  68. netbox_dns/templates/netbox_dns/recordtemplate.html +84 -0
  69. netbox_dns/templates/netbox_dns/zonetemplate.html +86 -0
  70. netbox_dns/urls/__init__.py +4 -0
  71. netbox_dns/urls/record_template.py +65 -0
  72. netbox_dns/urls/zone_template.py +57 -0
  73. netbox_dns/utilities/ipam_coupling.py +2 -1
  74. netbox_dns/validators/__init__.py +1 -0
  75. netbox_dns/validators/dns_name.py +14 -9
  76. netbox_dns/validators/dns_value.py +83 -0
  77. netbox_dns/validators/rfc2317.py +7 -0
  78. netbox_dns/views/__init__.py +2 -0
  79. netbox_dns/views/contact.py +12 -0
  80. netbox_dns/views/nameserver.py +13 -0
  81. netbox_dns/views/record.py +14 -1
  82. netbox_dns/views/record_template.py +83 -0
  83. netbox_dns/views/registrar.py +12 -0
  84. netbox_dns/views/view.py +12 -0
  85. netbox_dns/views/zone.py +16 -0
  86. netbox_dns/views/zone_template.py +73 -0
  87. {netbox_plugin_dns-1.0.4.dist-info → netbox_plugin_dns-1.0.6.dist-info}/METADATA +2 -1
  88. netbox_plugin_dns-1.0.6.dist-info/RECORD +136 -0
  89. netbox_plugin_dns-1.0.4.dist-info/RECORD +0 -115
  90. {netbox_plugin_dns-1.0.4.dist-info → netbox_plugin_dns-1.0.6.dist-info}/LICENSE +0 -0
  91. {netbox_plugin_dns-1.0.4.dist-info → netbox_plugin_dns-1.0.6.dist-info}/WHEEL +0 -0
@@ -1,7 +1,8 @@
1
1
  from ipam.choices import IPAddressStatusChoices
2
2
  from utilities.permissions import resolve_permission
3
3
 
4
- from netbox_dns.models import Record, RecordTypeChoices, RecordStatusChoices
4
+ from netbox_dns.models import Record
5
+ from netbox_dns.choices import RecordTypeChoices, RecordStatusChoices
5
6
 
6
7
  from netbox.plugins.utils import get_plugin_config
7
8
 
@@ -1,2 +1,3 @@
1
1
  from .dns_name import *
2
+ from .dns_value import *
2
3
  from .rfc2317 import *
@@ -4,7 +4,12 @@ from django.core.exceptions import ValidationError
4
4
 
5
5
  from netbox.plugins.utils import get_plugin_config
6
6
 
7
- import logging
7
+
8
+ __all__ = (
9
+ "validate_fqdn",
10
+ "validate_generic_name",
11
+ "validate_domain_name",
12
+ )
8
13
 
9
14
 
10
15
  def _get_label(tolerate_leading_underscores=False, always_tolerant=False):
@@ -14,7 +19,7 @@ def _get_label(tolerate_leading_underscores=False, always_tolerant=False):
14
19
  label_characters = rf"a-z0-9{tolerate_characters}"
15
20
 
16
21
  if always_tolerant:
17
- label = rf"[a-z0-9_][a-z0-9_-]*(?<![-_])"
22
+ label = r"[a-z0-9_][a-z0-9_-]*(?<![-_])"
18
23
  zone_label = rf"[{label_characters}_][{label_characters}_-]*(?<![-_])"
19
24
 
20
25
  return label, zone_label
@@ -28,19 +33,19 @@ def _get_label(tolerate_leading_underscores=False, always_tolerant=False):
28
33
  label = r"[a-z0-9_][a-z0-9_-]*(?<![-_])"
29
34
  zone_label = rf"[{label_characters}_][{label_characters}_-]*(?<![-_])"
30
35
  else:
31
- label = rf"[a-z0-9_][a-z0-9-]*(?<!-)"
36
+ label = r"[a-z0-9_][a-z0-9-]*(?<!-)"
32
37
  zone_label = rf"[{label_characters}_][{label_characters}-]*(?<!-)"
33
38
  elif tolerate_underscores:
34
- label = rf"[a-z0-9][a-z0-9_-]*(?<![-_])"
39
+ label = r"[a-z0-9][a-z0-9_-]*(?<![-_])"
35
40
  zone_label = rf"[{label_characters}][{label_characters}_-]*(?<![-_])"
36
41
  else:
37
- label = rf"[a-z0-9][a-z0-9-]*(?<!-)"
42
+ label = r"[a-z0-9][a-z0-9-]*(?<!-)"
38
43
  zone_label = rf"[{label_characters}][{label_characters}-]*(?<!-)"
39
44
 
40
45
  return label, zone_label
41
46
 
42
47
 
43
- def has_invalid_double_dash(name):
48
+ def _has_invalid_double_dash(name):
44
49
  return bool(re.findall(r"\b(?!xn)..--", name, re.IGNORECASE))
45
50
 
46
51
 
@@ -48,7 +53,7 @@ def validate_fqdn(name, always_tolerant=False):
48
53
  label, zone_label = _get_label(always_tolerant=always_tolerant)
49
54
  regex = rf"^(\*|{label})(\.{zone_label})+\.?$"
50
55
 
51
- if not re.match(regex, name, flags=re.IGNORECASE) or has_invalid_double_dash(name):
56
+ if not re.match(regex, name, flags=re.IGNORECASE) or _has_invalid_double_dash(name):
52
57
  raise ValidationError(f"{name} is not a valid fully qualified DNS host name")
53
58
 
54
59
 
@@ -61,7 +66,7 @@ def validate_generic_name(
61
66
  )
62
67
  regex = rf"^([*@]|(\*\.)?{label}(\.{zone_label})*\.?)$"
63
68
 
64
- if not re.match(regex, name, flags=re.IGNORECASE) or has_invalid_double_dash(name):
69
+ if not re.match(regex, name, flags=re.IGNORECASE) or _has_invalid_double_dash(name):
65
70
  raise ValidationError(f"{name} is not a valid DNS host name")
66
71
 
67
72
 
@@ -82,5 +87,5 @@ def validate_domain_name(
82
87
  else:
83
88
  regex = rf"^{label}(\.{zone_label})*\.?$"
84
89
 
85
- if not re.match(regex, name, flags=re.IGNORECASE) or has_invalid_double_dash(name):
90
+ if not re.match(regex, name, flags=re.IGNORECASE) or _has_invalid_double_dash(name):
86
91
  raise ValidationError(f"{name} is not a valid DNS domain name")
@@ -0,0 +1,83 @@
1
+ import dns
2
+ from dns import rdata, name as dns_name
3
+
4
+ from django.core.exceptions import ValidationError
5
+
6
+ from netbox_dns.choices import RecordClassChoices, RecordTypeChoices
7
+ from netbox_dns.validators import (
8
+ validate_fqdn,
9
+ validate_domain_name,
10
+ validate_generic_name,
11
+ )
12
+
13
+
14
+ __all__ = ("validate_record_value",)
15
+
16
+
17
+ def validate_record_value(record_type, value):
18
+ def _validate_idn(name):
19
+ try:
20
+ name.to_unicode()
21
+ except dns_name.IDNAException as exc:
22
+ raise ValidationError(
23
+ f"{name.to_text()} is not a valid IDN: {exc}."
24
+ ) from None
25
+
26
+ try:
27
+ rr = rdata.from_text(RecordClassChoices.IN, record_type, value)
28
+ except dns.exception.SyntaxError as exc:
29
+ raise ValidationError(
30
+ f"Record value {value} is not a valid value for a {record_type} record: {exc}."
31
+ ) from None
32
+
33
+ match record_type:
34
+ case RecordTypeChoices.CNAME:
35
+ _validate_idn(rr.target)
36
+ validate_domain_name(
37
+ rr.target.to_text(),
38
+ always_tolerant=True,
39
+ allow_empty_label=True,
40
+ )
41
+
42
+ case (
43
+ RecordTypeChoices.NS
44
+ | RecordTypeChoices.HTTPS
45
+ | RecordTypeChoices.SRV
46
+ | RecordTypeChoices.SVCB
47
+ ):
48
+ _validate_idn(rr.target)
49
+ validate_domain_name(rr.target.to_text(), always_tolerant=True)
50
+
51
+ case RecordTypeChoices.DNAME:
52
+ _validate_idn(rr.target)
53
+ validate_domain_name(
54
+ rr.target.to_text(), always_tolerant=True, zone_name=True
55
+ )
56
+
57
+ case RecordTypeChoices.PTR | RecordTypeChoices.NSAP_PTR:
58
+ _validate_idn(rr.target)
59
+ validate_fqdn(rr.target.to_text(), always_tolerant=True)
60
+
61
+ case RecordTypeChoices.MX | RecordTypeChoices.RT | RecordTypeChoices.KX:
62
+ _validate_idn(rr.exchange)
63
+ validate_domain_name(rr.exchange.to_text(), always_tolerant=True)
64
+
65
+ case RecordTypeChoices.NSEC:
66
+ _validate_idn(rr.next)
67
+ validate_domain_name(rr.next.to_text(), always_tolerant=True)
68
+
69
+ case RecordTypeChoices.RP:
70
+ _validate_idn(rr.mbox)
71
+ validate_domain_name(rr.mbox.to_text(), always_tolerant=True)
72
+ _validate_idn(rr.txt)
73
+ validate_domain_name(rr.txt.to_text(), always_tolerant=True)
74
+
75
+ case RecordTypeChoices.NAPTR:
76
+ _validate_idn(rr.replacement)
77
+ validate_generic_name(rr.replacement.to_text(), always_tolerant=True)
78
+
79
+ case RecordTypeChoices.PX:
80
+ _validate_idn(rr.map822)
81
+ validate_domain_name(rr.map822.to_text(), always_tolerant=True)
82
+ _validate_idn(rr.mapx400)
83
+ validate_domain_name(rr.mapx400.to_text(), always_tolerant=True)
@@ -1,6 +1,13 @@
1
1
  from django.core.exceptions import ValidationError
2
2
 
3
3
 
4
+ __all__ = (
5
+ "validate_prefix",
6
+ "validate_ipv4",
7
+ "validate_rfc2317",
8
+ )
9
+
10
+
4
11
  def validate_prefix(prefix):
5
12
  if prefix.ip != prefix.cidr.ip:
6
13
  raise ValidationError(
@@ -4,3 +4,5 @@ from .nameserver import *
4
4
  from .record import *
5
5
  from .contact import *
6
6
  from .registrar import *
7
+ from .zone_template import *
8
+ from .record_template import *
@@ -15,6 +15,18 @@ from netbox_dns.forms import (
15
15
  from netbox_dns.tables import ContactTable, ZoneTable
16
16
 
17
17
 
18
+ __all__ = (
19
+ "ContactView",
20
+ "ContactEditView",
21
+ "ContactListView",
22
+ "ContactDeleteView",
23
+ "ContactBulkImportView",
24
+ "ContactBulkEditView",
25
+ "ContactBulkDeleteView",
26
+ "ContactZoneListView",
27
+ )
28
+
29
+
18
30
  class ContactView(generic.ObjectView):
19
31
  queryset = Contact.objects.all()
20
32
 
@@ -14,6 +14,19 @@ from netbox_dns.models import Zone, NameServer
14
14
  from netbox_dns.tables import NameServerTable, ZoneTable
15
15
 
16
16
 
17
+ __all__ = (
18
+ "NameServerListView",
19
+ "NameServerView",
20
+ "NameServerEditView",
21
+ "NameServerDeleteView",
22
+ "NameServerBulkEditView",
23
+ "NameServerBulkImportView",
24
+ "NameServerBulkDeleteView",
25
+ "NameServerZoneListView",
26
+ "NameServerSOAZoneListView",
27
+ )
28
+
29
+
17
30
  class NameServerListView(generic.ObjectListView):
18
31
  queryset = NameServer.objects.all()
19
32
  filterset = NameServerFilterSet
@@ -9,11 +9,24 @@ from netbox_dns.forms import (
9
9
  RecordForm,
10
10
  RecordBulkEditForm,
11
11
  )
12
- from netbox_dns.models import Record, RecordTypeChoices, Zone
12
+ from netbox_dns.models import Record, Zone
13
+ from netbox_dns.choices import RecordTypeChoices
13
14
  from netbox_dns.tables import RecordTable, ManagedRecordTable, RelatedRecordTable
14
15
  from netbox_dns.utilities import value_to_unicode
15
16
 
16
17
 
18
+ __all__ = (
19
+ "RecordListView",
20
+ "ManagedRecordListView",
21
+ "RecordView",
22
+ "RecordEditView",
23
+ "RecordDeleteView",
24
+ "RecordBulkImportView",
25
+ "RecordBulkEditView",
26
+ "RecordBulkDeleteView",
27
+ )
28
+
29
+
17
30
  class RecordListView(generic.ObjectListView):
18
31
  queryset = Record.objects.filter(managed=False).prefetch_related(
19
32
  "zone", "ptr_record"
@@ -0,0 +1,83 @@
1
+ from dns import name as dns_name
2
+
3
+ from netbox.views import generic
4
+
5
+ from netbox_dns.filtersets import RecordTemplateFilterSet
6
+ from netbox_dns.forms import (
7
+ RecordTemplateImportForm,
8
+ RecordTemplateFilterForm,
9
+ RecordTemplateForm,
10
+ RecordTemplateBulkEditForm,
11
+ )
12
+ from netbox_dns.models import RecordTemplate
13
+ from netbox_dns.tables import RecordTemplateTable, ZoneTemplateDisplayTable
14
+ from netbox_dns.utilities import value_to_unicode
15
+
16
+
17
+ __all__ = (
18
+ "RecordTemplateListView",
19
+ "RecordTemplateView",
20
+ "RecordTemplateEditView",
21
+ "RecordTemplateDeleteView",
22
+ "RecordTemplateBulkImportView",
23
+ "RecordTemplateBulkEditView",
24
+ "RecordTemplateBulkDeleteView",
25
+ )
26
+
27
+
28
+ class RecordTemplateListView(generic.ObjectListView):
29
+ queryset = RecordTemplate.objects.all()
30
+ filterset = RecordTemplateFilterSet
31
+ filterset_form = RecordTemplateFilterForm
32
+ table = RecordTemplateTable
33
+
34
+
35
+ class RecordTemplateView(generic.ObjectView):
36
+ queryset = RecordTemplate.objects.all()
37
+
38
+ def get_extra_context(self, request, instance):
39
+ context = {}
40
+
41
+ name = dns_name.from_text(instance.record_name, origin=None)
42
+ if name.to_text() != name.to_unicode():
43
+ context["unicode_name"] = name.to_unicode()
44
+
45
+ unicode_value = value_to_unicode(instance.value)
46
+ if instance.value != unicode_value:
47
+ context["unicode_value"] = unicode_value
48
+
49
+ context["zone_template_table"] = ZoneTemplateDisplayTable(
50
+ data=instance.zone_templates.all()
51
+ )
52
+
53
+ return context
54
+
55
+
56
+ class RecordTemplateEditView(generic.ObjectEditView):
57
+ queryset = RecordTemplate.objects.all()
58
+ form = RecordTemplateForm
59
+ default_return_url = "plugins:netbox_dns:recordtemplate_list"
60
+
61
+
62
+ class RecordTemplateDeleteView(generic.ObjectDeleteView):
63
+ queryset = RecordTemplate.objects.all()
64
+ default_return_url = "plugins:netbox_dns:recordtemplate_list"
65
+
66
+
67
+ class RecordTemplateBulkImportView(generic.BulkImportView):
68
+ queryset = RecordTemplate.objects.all()
69
+ model_form = RecordTemplateImportForm
70
+ table = RecordTemplateTable
71
+ default_return_url = "plugins:netbox_dns:recordtemplate_list"
72
+
73
+
74
+ class RecordTemplateBulkEditView(generic.BulkEditView):
75
+ queryset = RecordTemplate.objects.all()
76
+ filterset = RecordTemplateFilterSet
77
+ table = RecordTemplateTable
78
+ form = RecordTemplateBulkEditForm
79
+
80
+
81
+ class RecordTemplateBulkDeleteView(generic.BulkDeleteView):
82
+ queryset = RecordTemplate.objects.all()
83
+ table = RecordTemplateTable
@@ -13,6 +13,18 @@ from netbox_dns.forms import (
13
13
  from netbox_dns.tables import RegistrarTable, ZoneTable
14
14
 
15
15
 
16
+ __all__ = (
17
+ "RegistrarView",
18
+ "RegistrarListView",
19
+ "RegistrarEditView",
20
+ "RegistrarDeleteView",
21
+ "RegistrarBulkImportView",
22
+ "RegistrarBulkEditView",
23
+ "RegistrarBulkDeleteView",
24
+ "RegistrarZoneListView",
25
+ )
26
+
27
+
16
28
  class RegistrarView(generic.ObjectView):
17
29
  queryset = Registrar.objects.all()
18
30
 
netbox_dns/views/view.py CHANGED
@@ -8,6 +8,18 @@ from netbox_dns.forms import ViewForm, ViewFilterForm, ViewImportForm, ViewBulkE
8
8
  from netbox_dns.tables import ViewTable, ZoneTable
9
9
 
10
10
 
11
+ __all__ = (
12
+ "ViewView",
13
+ "ViewListView",
14
+ "ViewEditView",
15
+ "ViewDeleteView",
16
+ "ViewBulkImportView",
17
+ "ViewBulkEditView",
18
+ "ViewBulkDeleteView",
19
+ "ViewZoneListView",
20
+ )
21
+
22
+
11
23
  class ViewView(generic.ObjectView):
12
24
  queryset = View.objects.all().prefetch_related("zone_set")
13
25
 
netbox_dns/views/zone.py CHANGED
@@ -18,6 +18,22 @@ from netbox_dns.tables import (
18
18
  )
19
19
 
20
20
 
21
+ __all__ = (
22
+ "ZoneListView",
23
+ "ZoneView",
24
+ "ZoneEditView",
25
+ "ZoneDeleteView",
26
+ "ZoneBulkImportView",
27
+ "ZoneBulkEditView",
28
+ "ZoneBulkDeleteView",
29
+ "ZoneRegistrationView",
30
+ "ZoneRecordListView",
31
+ "ZoneManagedRecordListView",
32
+ "ZoneRFC2317ChildZoneListView",
33
+ "ZoneChildZoneListView",
34
+ )
35
+
36
+
21
37
  class ZoneListView(generic.ObjectListView):
22
38
  queryset = Zone.objects.all().prefetch_related("view", "tags")
23
39
  filterset = ZoneFilterSet
@@ -0,0 +1,73 @@
1
+ from netbox.views import generic
2
+
3
+ from netbox_dns.filtersets import ZoneTemplateFilterSet
4
+ from netbox_dns.forms import (
5
+ ZoneTemplateImportForm,
6
+ ZoneTemplateForm,
7
+ ZoneTemplateFilterForm,
8
+ ZoneTemplateBulkEditForm,
9
+ )
10
+ from netbox_dns.models import ZoneTemplate
11
+ from netbox_dns.tables import ZoneTemplateTable, RecordTemplateDisplayTable
12
+
13
+
14
+ __all__ = (
15
+ "ZoneTemplateListView",
16
+ "ZoneTemplateView",
17
+ "ZoneTemplateEditView",
18
+ "ZoneTemplateDeleteView",
19
+ "ZoneTemplateBulkImportView",
20
+ "ZoneTemplateBulkEditView",
21
+ "ZoneTemplateBulkDeleteView",
22
+ )
23
+
24
+
25
+ class ZoneTemplateListView(generic.ObjectListView):
26
+ queryset = ZoneTemplate.objects.all()
27
+ filterset = ZoneTemplateFilterSet
28
+ filterset_form = ZoneTemplateFilterForm
29
+ table = ZoneTemplateTable
30
+
31
+
32
+ class ZoneTemplateView(generic.ObjectView):
33
+ queryset = ZoneTemplate.objects.all()
34
+
35
+ def get_extra_context(self, request, instance):
36
+ record_template_table = RecordTemplateDisplayTable(
37
+ data=instance.record_templates.all()
38
+ )
39
+
40
+ return {
41
+ "record_template_table": record_template_table,
42
+ }
43
+
44
+
45
+ class ZoneTemplateEditView(generic.ObjectEditView):
46
+ queryset = ZoneTemplate.objects.all()
47
+ form = ZoneTemplateForm
48
+ default_return_url = "plugins:netbox_dns:zonetemplate_list"
49
+
50
+
51
+ class ZoneTemplateDeleteView(generic.ObjectDeleteView):
52
+ queryset = ZoneTemplate.objects.all()
53
+ default_return_url = "plugins:netbox_dns:zonetemplate_list"
54
+
55
+
56
+ class ZoneTemplateBulkImportView(generic.BulkImportView):
57
+ queryset = ZoneTemplate.objects.all()
58
+ model_form = ZoneTemplateImportForm
59
+ table = ZoneTemplateTable
60
+ default_return_url = "plugins:netbox_dns:zonetemplate_list"
61
+
62
+
63
+ class ZoneTemplateBulkEditView(generic.BulkEditView):
64
+ queryset = ZoneTemplate.objects.all()
65
+ filterset = ZoneTemplateFilterSet
66
+ table = ZoneTemplateTable
67
+ form = ZoneTemplateBulkEditForm
68
+ default_return_url = "plugins:netbox_dns:zonetemplate_list"
69
+
70
+
71
+ class ZoneTemplateBulkDeleteView(generic.BulkDeleteView):
72
+ queryset = ZoneTemplate.objects.all()
73
+ table = ZoneTemplateTable
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: netbox-plugin-dns
3
- Version: 1.0.4
3
+ Version: 1.0.6
4
4
  Summary: NetBox DNS is a NetBox plugin for managing DNS data.
5
5
  Home-page: https://github.com/peteeckel/netbox-plugin-dns
6
6
  License: MIT
@@ -47,6 +47,7 @@ The main focus of the plugin is to ensure the quality of the data stored in it.
47
47
  * Validation of changes to the SOA SERIAL number, whether they are done automatically or manually
48
48
  * Validation of record types such as CNAME and singletons, to ensure DNS zone validity
49
49
  * Support for [RFC 2317](https://datatracker.ietf.org/doc/html/rfc2317) delegation of PTR zones for IPv4 subnets longer than 24 bits
50
+ * Templating for zones and records enables faster creations of zones with given boilerplate object relations, such as name servers, tags, tenants or registration information, or records like standard SPF or MX records that are the same for a subset of zones
50
51
 
51
52
  Other main features include:
52
53
 
@@ -0,0 +1,136 @@
1
+ netbox_dns/__init__.py,sha256=R7EsMEVSGjdhYRLMjQwatM9b_7KzSMAu5M9nHN7-FTA,1244
2
+ netbox_dns/api/nested_serializers.py,sha256=-ZhAiyf-8UHlkcBomBp1J7ci1dSwrxWRbbfskD-D_yQ,3172
3
+ netbox_dns/api/serializers.py,sha256=WNs7_Inr4veHXUHXmORBjHilrVIzSUi5zPiOCtzQZSU,335
4
+ netbox_dns/api/serializers_/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
+ netbox_dns/api/serializers_/contact.py,sha256=5fAdHfjBGIh4686tvgPejhW5Di46LNzIYVvAGeFDq0c,964
6
+ netbox_dns/api/serializers_/nameserver.py,sha256=PlpVsai24O73B-ZQ4wSaSC0_m_LCtQETDRSUYDb1xGw,1118
7
+ netbox_dns/api/serializers_/record.py,sha256=QAUzU5GXDadOgfug9ApYQ4fw-pztAZSG02LH1UoBNgY,2293
8
+ netbox_dns/api/serializers_/record_template.py,sha256=qh-g-_f6M-eU4GzN-l0nPxiNBpZyYBgib26HwfOMtUc,1466
9
+ netbox_dns/api/serializers_/registrar.py,sha256=xLIaeBJ5ckV1Jf-uyCTFcvsLlsRMlpDtIg6q79vXZic,842
10
+ netbox_dns/api/serializers_/view.py,sha256=tkv7KD6FJH1_AwPljx2vVJThO0Xb4OcCmlc9E8E4bhQ,950
11
+ netbox_dns/api/serializers_/zone.py,sha256=ZOCNHNufPK8T9UKKjT4NcIyfb1zwG7gD6TpPTlMHi0k,4862
12
+ netbox_dns/api/serializers_/zone_template.py,sha256=usx0vRsqRqHP6sqB92fQy3VTjIfjYflULTtQhQksSpk,3709
13
+ netbox_dns/api/urls.py,sha256=hrqu6VnN6313DjYIOuZih-afSnedIPsSaqjcva45DiI,739
14
+ netbox_dns/api/views.py,sha256=esRLAeMJ-y0oNRNC8NJ2SgGzj3qdoAAY6zYm_Z0t5TM,4632
15
+ netbox_dns/apps.py,sha256=JCW5eS-AQBUubDJve1DjP-IRFKTFGQh1NLGWzJpC5MI,151
16
+ netbox_dns/choices/__init__.py,sha256=jOVs2VGV5SVADRlqVnrFeAy26i8BIeEAbGpiX7K8bL8,42
17
+ netbox_dns/choices/record.py,sha256=IYW_g1ZvuNX2ZlRLOkurcrdfWgcXNpi2gQzRfX5C0lY,1113
18
+ netbox_dns/choices/zone.py,sha256=u0zt03gTkeo_und0VxaTTCh3GIFv6UxtUIhoe3VJ00A,472
19
+ netbox_dns/fields/__init__.py,sha256=egA6gLQ4SPYacECcYU4Vl_P7TbzLOMRfaX6rw3k26YA,69
20
+ netbox_dns/fields/address.py,sha256=DJwc-z5Lg6US85gNIB_Chx7ahs1GYNswdhaXkLiK3jA,1554
21
+ netbox_dns/fields/network.py,sha256=FgKEm5DAe_4D7Fubtj8B4SwfU3-Z9KV7kDIzRNpBBnQ,3682
22
+ netbox_dns/fields/rfc2317.py,sha256=24qNNLbI-SGlsKqGaLNaVk8EHFrju65YTET3O-8XgTc,2571
23
+ netbox_dns/filtersets/__init__.py,sha256=zvHYWy23FFmK4vxLpoMo-OD5OQBtcTUV_HG-5LCtvQE,197
24
+ netbox_dns/filtersets/contact.py,sha256=VnlNX6dyUlEbj7tz9cgRKSWQOdg7OqP32cD2IyD5hu8,1091
25
+ netbox_dns/filtersets/nameserver.py,sha256=I7RoIUcgXyIoMrhuS0dJr8uPi0AdNj6D3G6t2oSiQ7s,1147
26
+ netbox_dns/filtersets/record.py,sha256=nr-oLCnaceiQua5tL-_teYj54X-VMXQeYihbCjykaJY,3750
27
+ netbox_dns/filtersets/record_template.py,sha256=jGSjGFEnNSoxtUd7diV8wEhw8qZclz2dKLSqyVC7Djo,1548
28
+ netbox_dns/filtersets/registrar.py,sha256=Wh_l-IXRHnJhW7Pyokp3czQZISDKzXnWeSQKp512Drc,977
29
+ netbox_dns/filtersets/view.py,sha256=IbQ6ceeUHoXKTczDhLTiwwUMNrFBNhgDzEr9zHRZT7k,552
30
+ netbox_dns/filtersets/zone.py,sha256=lKEHNkg7v_y7gb07swwaUTSfx7MPKvpEl4VcxEVazYY,6594
31
+ netbox_dns/filtersets/zone_template.py,sha256=P1G3NG3NFzw5lSaJErZltSSKNcC_WztTNXpU7PtS4SI,3670
32
+ netbox_dns/forms/__init__.py,sha256=s41w4o77tIwmhnLjsOsg08R9m3wrlomkkfCLTVQuPzc,196
33
+ netbox_dns/forms/contact.py,sha256=7BdDDqusswGolzrKpOdWvlvy_UPmm-_EN_F46fNnt9E,5332
34
+ netbox_dns/forms/nameserver.py,sha256=LHomCHmFcASobaD3Z7yhAyA24h-LrYImVMz-EUXbwK4,2836
35
+ netbox_dns/forms/record.py,sha256=svBVAFy-egDEPLcRWkxNi_1bkabKmWgJ87pmdNt6dh4,7155
36
+ netbox_dns/forms/record_template.py,sha256=Q77p9sExJ8Xbl-Co2Px2R0At5O3naQJwx4pnino6i2o,5573
37
+ netbox_dns/forms/registrar.py,sha256=FMnvrcq62R3wNp_2ZUEk3v_PIav0KrWPATaJ7_9KFAo,3758
38
+ netbox_dns/forms/view.py,sha256=4Uuh514WPb-9M8XOCsdqSm0ayzD2ZymnLSqFn8obSLw,2273
39
+ netbox_dns/forms/zone.py,sha256=17Ii2csnYquuz7HGgaK36ZgOzWnFXFeh1IQYvWnBKC0,23537
40
+ netbox_dns/forms/zone_template.py,sha256=UNykid5pRB_ydy40j2DzRlBXp3_QAOqdqxdUojKYTd4,8161
41
+ netbox_dns/graphql/__init__.py,sha256=ZZSsx-VM108tB_FrcVy3uGGhtmePpkXnY5U1ytnoTvE,490
42
+ netbox_dns/graphql/filters.py,sha256=6Ot_d1e7h5lVXVVBB3hyWUql94K3zsK9Tjb3RVJqluw,1706
43
+ netbox_dns/graphql/schema.py,sha256=P-oQ8ei3sC6XLhgCa_riRbRTrMkPCVTJXkGv0U2rPYw,2682
44
+ netbox_dns/graphql/types.py,sha256=q0gtXhhM_MzBb1zBzXA5gopnuL4szuzXRTTAvOhPz-Y,6025
45
+ netbox_dns/management/commands/cleanup_database.py,sha256=kfnyybudwKGigjJmrOwafPWSUasZr9jQsxN4eWAgMvY,5969
46
+ netbox_dns/management/commands/cleanup_rrset_ttl.py,sha256=UFRURLBcFeGHUS2lrYFv7UWIebjI72aG1EUQJt0XsXw,2046
47
+ netbox_dns/management/commands/setup_coupling.py,sha256=1cUxDvHoX1UebgyCsbrLqIccuXhE8tkvyhW8dofIyr4,4556
48
+ netbox_dns/management/commands/update_soa.py,sha256=Rj_Xk-qpwkAVRubVnM5OqSTwgzi93E0PqjwGb3rYjf0,660
49
+ netbox_dns/migrations/0001_squashed_netbox_dns_0_15.py,sha256=3U0810NWSHPu2dTSHpfzlleDgwMS04FhJ_CkO76SDaw,10283
50
+ netbox_dns/migrations/0001_squashed_netbox_dns_0_22.py,sha256=ML6Hp17lrXiaG0eUlBjKMm6HUNhw0AHPnKrb9AN-F6E,20279
51
+ netbox_dns/migrations/0002_contact_description_registrar_description.py,sha256=ZrI-L3jJ5GzdVx21pomgM4waE-njixHQjl_grjsGr0I,583
52
+ netbox_dns/migrations/0003_default_view.py,sha256=NByVlAyiiK6WCfJ014BiFPkoNcHeqr1IpkgNdHiwbWw,367
53
+ netbox_dns/migrations/0004_create_and_assign_default_view.py,sha256=npBFxWuJCZeMhbZLEH9C_sZcQZRaa3IOlyn4p_GULyk,627
54
+ netbox_dns/migrations/0005_alter_zone_view_not_null.py,sha256=vUfCFD-qeh5M1WCqtE1eYHXZwQVCcf841Z2-0CdcMRI,463
55
+ netbox_dns/migrations/0006_templating.py,sha256=7MOZ2bLwkjK1BQCBPBaFWJ-mS_JNrok1XUSh4rriq9Y,6271
56
+ netbox_dns/migrations/0020_netbox_3_4.py,sha256=UMcHdn8ZAuQjUaM_3rEGpktYrM0TuvhccD7Jt7WQnPs,1271
57
+ netbox_dns/migrations/0021_record_ip_address.py,sha256=EqdhWXmq7aiK4X79xTRUZng3zFncCl-8JoO65HqlJKw,3244
58
+ netbox_dns/migrations/0022_search.py,sha256=KW1ffEZ4-0dppGQ_KD1EN7iw8eQJOnDco-xfJFRZqKQ,172
59
+ netbox_dns/migrations/0023_alter_record_value.py,sha256=4_4v8YZzU8_jadJqIUUjH6SIhNTeALWhclozTqYDmv0,378
60
+ netbox_dns/migrations/0024_tenancy.py,sha256=3kc5l5_AyfhOI6g6mbCfReUAbSgb2DAv0MDMZqJ-3YQ,1745
61
+ netbox_dns/migrations/0025_ipam_coupling_cf.py,sha256=7uHujclWrsYw5QMLWft0Po78Ow5Q8MjPuU7moKyQ2qs,620
62
+ netbox_dns/migrations/0026_domain_registration.py,sha256=qUJ1oUGHIGGNWD7QRLnxElbM5eNp7dYNNn_OYIw8Xvo,5796
63
+ netbox_dns/migrations/0027_alter_registrar_iana_id.py,sha256=QUtRIrqqfkraFmzzeJFZWAEv4PfrOouoHtrV6FRn8Kc,404
64
+ netbox_dns/migrations/0028_rfc2317_fields.py,sha256=D8r43xxBjYXiL6ycmX8RY5_WG7tRYEDjutOeYM1H56I,1364
65
+ netbox_dns/migrations/0029_record_fqdn.py,sha256=UAAU38ekKQyiYDOJlcrz6Qbk4bqZfSHZyAHUZFFQrOw,808
66
+ netbox_dns/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
67
+ netbox_dns/mixins/__init__.py,sha256=LxTEfpod_RHCyMtnzDljv0_dwqp2z3Q6tqbXW8LTGD8,35
68
+ netbox_dns/mixins/object_modification.py,sha256=JbGi8a52wkZ3fFBlfat590CfqRJcEWxBsxSeTIx3Qtg,833
69
+ netbox_dns/models/__init__.py,sha256=0JSjJ_F0KR66DDV8emCPlHMQwgghi9tWo_0PuvyWpQQ,346
70
+ netbox_dns/models/contact.py,sha256=oNLyD_6TOTNQQTcCvv6TAC7OkzPTMIRy2NP5nwNKaNg,3009
71
+ netbox_dns/models/nameserver.py,sha256=yKo4Fwqnv5VtTndU2px7tRS3voF3Cal7OWQ6AImLwl0,3208
72
+ netbox_dns/models/record.py,sha256=MWQLys8wNGnQq5L74R_YhKfQeYWhxjVMB7T1V8qYKrE,22763
73
+ netbox_dns/models/record_template.py,sha256=3t9VceviX3kNIo5o0VPVFupLFDqPxpHIVLp5U3pBKB4,4661
74
+ netbox_dns/models/registrar.py,sha256=T_oMUlTWTDixOVlIbEZGvOBdvUrKxRkkS41xgM2Oee8,1557
75
+ netbox_dns/models/view.py,sha256=XKa6FE0AMIR-LhN6HcHWJaY_xohObfTEXCQXH68S2B4,2741
76
+ netbox_dns/models/zone.py,sha256=6LjjmQM_7OND1Ii-Mu9Chc03fkWChuQEac_Bc_CLFZc,28255
77
+ netbox_dns/models/zone_template.py,sha256=lkiSIfx8KM0Cs3Mb3dLBxKbSpcssVUzQiSmD5W46was,3753
78
+ netbox_dns/navigation.py,sha256=EITDZkbpu4KCC9u4Noj7OORWnkL3EYT2RIRvYlTw34Q,5961
79
+ netbox_dns/signals/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
80
+ netbox_dns/signals/ipam_coupling.py,sha256=kJUKHUgq5XgWMhxB-312SPaZAYTLIYGgKO0lz2-z_rg,5594
81
+ netbox_dns/tables/__init__.py,sha256=s41w4o77tIwmhnLjsOsg08R9m3wrlomkkfCLTVQuPzc,196
82
+ netbox_dns/tables/contact.py,sha256=sPs7d1ZhVC5dOS37dPYFqebNd7WGvsV_eYzX_TMcbzY,804
83
+ netbox_dns/tables/nameserver.py,sha256=fFiE-yH-_GyRDaV4SVw094r6uH58Kx56NSWDGaMR58g,764
84
+ netbox_dns/tables/record.py,sha256=0Yg0qwZ8Vjz6pkZnmof4ZK1Hsvk9DNEzmJwoIwJZJFQ,3189
85
+ netbox_dns/tables/record_template.py,sha256=16Lu-WDjs2m9Uxx6WkURL39NlyJ8lWzj5Kl6C6lz3E8,2159
86
+ netbox_dns/tables/registrar.py,sha256=M-ckyQUs6dqjTCPf7bAr6UuLEA-q9f9CxKW7yp3rGoM,680
87
+ netbox_dns/tables/view.py,sha256=TK5PM0jkKqgifJ17EYCazAbsTvXsZzTNUp0AX3RhUok,726
88
+ netbox_dns/tables/zone.py,sha256=IeCiflrQBn1INV_PxoTySWQrDalykY4mDSG76VXC5WM,1877
89
+ netbox_dns/tables/zone_template.py,sha256=70hvS-xpeaLkcM6y0R9xsUMQVKgTgZJaWWNd99BfmzI,1479
90
+ netbox_dns/template_content.py,sha256=jPOnKC8rbDEm169PoIys5NKCN36uUPH4_6NwR0oZ7N8,3654
91
+ netbox_dns/templates/netbox_dns/contact.html,sha256=fMHAQyLXIxohKoCTxFEnKetl9UVXeQgjasfpv_JONaw,2855
92
+ netbox_dns/templates/netbox_dns/nameserver.html,sha256=DpTdetQVV_jKThDbi62LvbhiCay-1QxR-yiJEiPFm4w,1554
93
+ netbox_dns/templates/netbox_dns/record/managed.html,sha256=G6LPG1koUGuzUiwYdv1okdVa4sKaofiQegDBnsFL0kA,89
94
+ netbox_dns/templates/netbox_dns/record/related.html,sha256=Aqor8uGcuHQTHjlX-Xmni2Yp4N7lOBrMOqQiszrQOC0,742
95
+ netbox_dns/templates/netbox_dns/record.html,sha256=WtEkWy_CstGWE9UDFsATxz0bNpP_Gx9joZusAYGHDFQ,5235
96
+ netbox_dns/templates/netbox_dns/recordtemplate.html,sha256=9tkXtKqa5p3LdOU9REm99WSFwGJaH8OczpIqXZuXMcg,3099
97
+ netbox_dns/templates/netbox_dns/registrar.html,sha256=O5veGmW59Pf5yN25ihPLvRIkA2P7xmSGv0G3NrRG8vI,2152
98
+ netbox_dns/templates/netbox_dns/related_dns_objects.html,sha256=KSzlnw1cStrJa3poKkwrt_ycIH0oH0STWIHRNy3ks4g,806
99
+ netbox_dns/templates/netbox_dns/view.html,sha256=XCa7Sg8fjSkhVqjLvw652FINQdWURLWdQqw8is82iaI,1499
100
+ netbox_dns/templates/netbox_dns/zone/base.html,sha256=n_E4aVYdGeZZl-ARE8sb4DgAAgPs92X1UEFepX3xIlM,495
101
+ netbox_dns/templates/netbox_dns/zone/child.html,sha256=kH56PJFBGCjiRdIh7zCtClnZdfOChqN_sYslsyoz5gU,2147
102
+ netbox_dns/templates/netbox_dns/zone/child_zone.html,sha256=b9CSGWEfWT7hLQ80gApMnu7mXM8w2LT-3UaOYe6HIRQ,510
103
+ netbox_dns/templates/netbox_dns/zone/managed_record.html,sha256=LOchMAJyfMZIICE6q0pX1eorRbtgUtOQ1u0VvJKCDZ8,514
104
+ netbox_dns/templates/netbox_dns/zone/record.html,sha256=tu5RFm2eYJ3fjeUxZYDJqJ9qK8tGslXl1iGs60DlRyM,2194
105
+ netbox_dns/templates/netbox_dns/zone/registration.html,sha256=de2Kph-G8Gv5LD_Wf294SLfO0UKPS9NmHeQYRfJf-Ck,1151
106
+ netbox_dns/templates/netbox_dns/zone/rfc2317_child_zone.html,sha256=rWlmb3zRQbLYQ_1dsa0twwu6y1dRj2tfFVEERH07p-s,517
107
+ netbox_dns/templates/netbox_dns/zone.html,sha256=zPi1sLFnya-ytx8-Pcf_ujc1sKllCRuz48x2E-S1HSo,6285
108
+ netbox_dns/templates/netbox_dns/zonetemplate.html,sha256=qjUWqrg4uDaIFt9-g0OBxTi86i_ctf2Ps4qHh11djQE,3081
109
+ netbox_dns/urls/__init__.py,sha256=FDauSMt7a01YJR8_RWkk0-kSmIL2lr1bHF0OU5ROuQ8,610
110
+ netbox_dns/urls/contact.py,sha256=OSQO-AkAhTaBruAdzVgcC7ip_OuiacvFI_ozgkWlNFU,1549
111
+ netbox_dns/urls/nameserver.py,sha256=BBbY-wqPqCquvLLv1_JhqToj7oDHhPNGCWHt0IfjBNM,1941
112
+ netbox_dns/urls/record.py,sha256=bDprohTso1N0GtPXH4X3TNHnkxopiOSQFXWItifEZ_k,1432
113
+ netbox_dns/urls/record_template.py,sha256=Z-7aA-rPIxRBCmXNUiQcHIgjYfai28Tf_sLtkl2ihDk,1827
114
+ netbox_dns/urls/registrar.py,sha256=u6B0zGGYNUJIKTo9uGiUeZLPD0QMGaQOAPShGEy4NaA,1728
115
+ netbox_dns/urls/view.py,sha256=8AeBnOHWusXXQs4JXpNfMSHqszXAY1GDXGWmNsMulQ8,1327
116
+ netbox_dns/urls/zone.py,sha256=rmB1BkzmWNG06ILUf-39Aj6-SBFkwQouyixMQiamqPc,2005
117
+ netbox_dns/urls/zone_template.py,sha256=w3Gu8qfLCWyHofeLkGZd1HpYSlcslomVlBQJZyqh8kk,1690
118
+ netbox_dns/utilities/__init__.py,sha256=-6-qmb1yTAt9QEtGtokNFBQV_TSheobkLjbWFKEYpfw,1849
119
+ netbox_dns/utilities/ipam_coupling.py,sha256=0XA5kmh2CzbhuhZmQuquNh4vPXBh20TVCA2RlM4pQdQ,3471
120
+ netbox_dns/validators/__init__.py,sha256=Mr8TvmcJTa8Pubj8TzbFBKfbHhEmGcr5JdQvczEJ39A,72
121
+ netbox_dns/validators/dns_name.py,sha256=B4A0BOW5pKDjjukvksriRtnLzkYTx_pFjh7eqKo6PBE,3069
122
+ netbox_dns/validators/dns_value.py,sha256=y2Zga4hmywqDrTBXcMC-sWaFbw4eoY8pySq7cWnMP8Y,2822
123
+ netbox_dns/validators/rfc2317.py,sha256=ivylEiNKlmX2x41rwqDrFkD5CFf9FtpNEfsKHX_prbE,585
124
+ netbox_dns/views/__init__.py,sha256=s41w4o77tIwmhnLjsOsg08R9m3wrlomkkfCLTVQuPzc,196
125
+ netbox_dns/views/contact.py,sha256=qM9F6MQBvO8ERR7quGLdQ5kW4roNLJ61As8m0qQTapg,2471
126
+ netbox_dns/views/nameserver.py,sha256=DFr0eybMshc1FW06g4cy9Nk4VRMxRqakI5KtHFiAVRc,3286
127
+ netbox_dns/views/record.py,sha256=fHMafCC14C7d6oXbXc2vN-T70OAOaTY77_m3Dct-oiQ,4590
128
+ netbox_dns/views/record_template.py,sha256=BkemTBEramLhYqB6HrA80sNgtduW1ZOJwbYs3i7srik,2510
129
+ netbox_dns/views/registrar.py,sha256=yRQgFm3vgBD21ZQex9asjs0QWegvSHlcyHXLnjvc5xs,2324
130
+ netbox_dns/views/view.py,sha256=I_hVZYFJF8GTnlUKPrTgBk_x9UDCbZXM8R7U5Bhizjs,2107
131
+ netbox_dns/views/zone.py,sha256=SKhf_WHcFVpKqFTuUMf-Dmxu1AwFHBeo_DtD8UGFrJ8,5483
132
+ netbox_dns/views/zone_template.py,sha256=qvXl-bpc1fMc1WFngynj4-Q3-JJDgKdT-r54s4M1D0s,2118
133
+ netbox_plugin_dns-1.0.6.dist-info/LICENSE,sha256=I3tDu11bZfhFm3EkV4zOD5TmWgLjnUNLEFwrdjniZYs,1112
134
+ netbox_plugin_dns-1.0.6.dist-info/METADATA,sha256=JCexnIPddX5RP4vsP6UDlRnFlCCrxqxbFXa48oTiGaU,6404
135
+ netbox_plugin_dns-1.0.6.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
136
+ netbox_plugin_dns-1.0.6.dist-info/RECORD,,