netbox-plugin-dns 1.0.6__py3-none-any.whl → 1.1.0__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 (94) hide show
  1. netbox_dns/__init__.py +23 -4
  2. netbox_dns/api/nested_serializers.py +17 -16
  3. netbox_dns/api/serializers.py +2 -1
  4. netbox_dns/api/serializers_/prefix.py +18 -0
  5. netbox_dns/api/serializers_/record.py +1 -0
  6. netbox_dns/api/serializers_/{contact.py → registration_contact.py} +5 -5
  7. netbox_dns/api/serializers_/view.py +34 -2
  8. netbox_dns/api/serializers_/zone.py +5 -5
  9. netbox_dns/api/serializers_/zone_template.py +5 -5
  10. netbox_dns/api/urls.py +5 -2
  11. netbox_dns/api/views.py +17 -35
  12. netbox_dns/fields/__init__.py +1 -0
  13. netbox_dns/fields/ipam.py +15 -0
  14. netbox_dns/filtersets/__init__.py +1 -1
  15. netbox_dns/filtersets/record.py +1 -1
  16. netbox_dns/filtersets/{contact.py → registration_contact.py} +4 -4
  17. netbox_dns/filtersets/view.py +16 -0
  18. netbox_dns/filtersets/zone.py +15 -15
  19. netbox_dns/filtersets/zone_template.py +15 -15
  20. netbox_dns/forms/__init__.py +1 -1
  21. netbox_dns/forms/{contact.py → registration_contact.py} +16 -16
  22. netbox_dns/forms/view.py +204 -4
  23. netbox_dns/forms/zone.py +15 -18
  24. netbox_dns/forms/zone_template.py +13 -13
  25. netbox_dns/graphql/__init__.py +2 -2
  26. netbox_dns/graphql/filters.py +5 -5
  27. netbox_dns/graphql/schema.py +24 -44
  28. netbox_dns/graphql/types.py +41 -12
  29. netbox_dns/management/commands/rebuild_dnssync.py +18 -0
  30. netbox_dns/management/commands/setup_dnssync.py +140 -0
  31. netbox_dns/migrations/0007_alter_ordering_options.py +25 -0
  32. netbox_dns/migrations/0008_view_prefixes.py +18 -0
  33. netbox_dns/migrations/0009_rename_contact_registrationcontact.py +27 -0
  34. netbox_dns/models/__init__.py +1 -3
  35. netbox_dns/models/nameserver.py +8 -3
  36. netbox_dns/models/record.py +154 -24
  37. netbox_dns/models/record_template.py +4 -1
  38. netbox_dns/models/registrar.py +7 -1
  39. netbox_dns/models/{contact.py → registration_contact.py} +15 -9
  40. netbox_dns/models/view.py +14 -2
  41. netbox_dns/models/zone.py +76 -35
  42. netbox_dns/models/zone_template.py +12 -9
  43. netbox_dns/navigation.py +7 -7
  44. netbox_dns/signals/ipam_dnssync.py +224 -0
  45. netbox_dns/tables/__init__.py +1 -1
  46. netbox_dns/tables/ipam_dnssync.py +11 -0
  47. netbox_dns/tables/nameserver.py +1 -7
  48. netbox_dns/tables/record.py +43 -30
  49. netbox_dns/tables/record_template.py +0 -17
  50. netbox_dns/tables/registrar.py +0 -2
  51. netbox_dns/tables/{contact.py → registration_contact.py} +5 -6
  52. netbox_dns/tables/view.py +19 -4
  53. netbox_dns/tables/zone.py +0 -15
  54. netbox_dns/tables/zone_template.py +2 -16
  55. netbox_dns/template_content.py +41 -40
  56. netbox_dns/templates/netbox_dns/record.html +6 -6
  57. netbox_dns/templates/netbox_dns/{contact.html → registrationcontact.html} +1 -1
  58. netbox_dns/templates/netbox_dns/view/button.html +9 -0
  59. netbox_dns/templates/netbox_dns/view/prefix.html +41 -0
  60. netbox_dns/templates/netbox_dns/view/related.html +17 -0
  61. netbox_dns/templates/netbox_dns/view.html +25 -0
  62. netbox_dns/urls/__init__.py +2 -2
  63. netbox_dns/urls/nameserver.py +14 -38
  64. netbox_dns/urls/record.py +7 -19
  65. netbox_dns/urls/record_template.py +18 -27
  66. netbox_dns/urls/registrar.py +11 -35
  67. netbox_dns/urls/registration_contact.py +60 -0
  68. netbox_dns/urls/view.py +12 -20
  69. netbox_dns/urls/zone.py +8 -46
  70. netbox_dns/urls/zone_template.py +16 -26
  71. netbox_dns/utilities/__init__.py +2 -74
  72. netbox_dns/utilities/conversions.py +83 -0
  73. netbox_dns/utilities/ipam_dnssync.py +295 -0
  74. netbox_dns/validators/dns_name.py +9 -0
  75. netbox_dns/views/__init__.py +1 -1
  76. netbox_dns/views/nameserver.py +7 -3
  77. netbox_dns/views/record.py +12 -7
  78. netbox_dns/views/record_template.py +1 -1
  79. netbox_dns/views/registrar.py +0 -1
  80. netbox_dns/views/registration_contact.py +94 -0
  81. netbox_dns/views/view.py +32 -2
  82. netbox_dns/views/zone.py +7 -6
  83. netbox_dns/views/zone_template.py +2 -2
  84. {netbox_plugin_dns-1.0.6.dist-info → netbox_plugin_dns-1.1.0.dist-info}/METADATA +2 -1
  85. netbox_plugin_dns-1.1.0.dist-info/RECORD +146 -0
  86. netbox_dns/management/commands/setup_coupling.py +0 -109
  87. netbox_dns/signals/ipam_coupling.py +0 -168
  88. netbox_dns/templates/netbox_dns/related_dns_objects.html +0 -21
  89. netbox_dns/urls/contact.py +0 -51
  90. netbox_dns/utilities/ipam_coupling.py +0 -112
  91. netbox_dns/views/contact.py +0 -95
  92. netbox_plugin_dns-1.0.6.dist-info/RECORD +0 -136
  93. {netbox_plugin_dns-1.0.6.dist-info → netbox_plugin_dns-1.1.0.dist-info}/LICENSE +0 -0
  94. {netbox_plugin_dns-1.0.6.dist-info → netbox_plugin_dns-1.1.0.dist-info}/WHEEL +0 -0
@@ -1,168 +0,0 @@
1
- from django.dispatch import receiver
2
- from django.db.models.signals import pre_save, post_save, pre_delete
3
- from django.core.exceptions import ValidationError, PermissionDenied
4
- from rest_framework.exceptions import PermissionDenied as APIPermissionDenied
5
-
6
- from netbox.signals import post_clean
7
- from netbox.context import current_request
8
- from netbox.plugins.utils import get_plugin_config
9
- from ipam.models import IPAddress
10
-
11
- from netbox_dns.models import Zone
12
- from netbox_dns.utilities.ipam_coupling import (
13
- ipaddress_cf_data,
14
- get_address_record,
15
- new_address_record,
16
- update_address_record,
17
- check_permission,
18
- dns_changed,
19
- DNSPermissionDenied,
20
- )
21
-
22
-
23
- @receiver(post_clean, sender=IPAddress)
24
- def ip_address_check_permissions_save(instance, **kwargs):
25
- if not instance.address:
26
- return
27
-
28
- if not get_plugin_config("netbox_dns", "feature_ipam_coupling"):
29
- return
30
-
31
- request = current_request.get()
32
- if request is None:
33
- return
34
-
35
- try:
36
- if instance.pk is None:
37
- record = new_address_record(instance)
38
- if record is not None:
39
- record.full_clean()
40
- check_permission(request, "netbox_dns.add_record", record)
41
-
42
- else:
43
- if not dns_changed(IPAddress.objects.get(pk=instance.pk), instance):
44
- return
45
-
46
- record = get_address_record(instance)
47
- if record is not None:
48
- name, ttl, disable_ptr, zone_id = ipaddress_cf_data(instance)
49
- if zone_id is not None:
50
- update_address_record(record, instance)
51
- record.full_clean()
52
- check_permission(request, "netbox_dns.change_record", record)
53
- else:
54
- check_permission(request, "netbox_dns.delete_record", record)
55
-
56
- else:
57
- record = new_address_record(instance)
58
- if record is not None:
59
- record.full_clean()
60
- check_permission(request, "netbox_dns.add_record", record)
61
-
62
- except ValidationError as exc:
63
- if hasattr(exc, "error_dict"):
64
- value = exc.error_dict.pop("name", None)
65
- if value is not None:
66
- exc.error_dict["cf_ipaddress_dns_record_name"] = value
67
-
68
- value = exc.error_dict.pop("ttl", None)
69
- if value is not None:
70
- exc.error_dict["cf_ipaddress_dns_record_ttl"] = value
71
-
72
- value = exc.error_dict.pop("value", None)
73
- if value is not None:
74
- exc.error_dict["cf_ipaddress_dns_record_name"] = value
75
-
76
- value = exc.error_dict.pop("type", None)
77
- if value is not None:
78
- exc.error_dict["cf_ipaddress_dns_record_name"] = value
79
-
80
- raise ValidationError(exc)
81
-
82
- except DNSPermissionDenied as exc:
83
- raise ValidationError(exc)
84
-
85
-
86
- @receiver(pre_delete, sender=IPAddress)
87
- def ip_address_delete_address_record(instance, **kwargs):
88
- if not get_plugin_config("netbox_dns", "feature_ipam_coupling"):
89
- return
90
-
91
- request = current_request.get()
92
- if request is not None:
93
- try:
94
- for record in instance.netbox_dns_records.all():
95
- check_permission(request, "netbox_dns.delete_record", record)
96
-
97
- except DNSPermissionDenied as exc:
98
- if request.path_info.startswith("/api/"):
99
- raise APIPermissionDenied(exc) from None
100
-
101
- raise PermissionDenied(exc) from None
102
-
103
- for record in instance.netbox_dns_records.all():
104
- record.delete()
105
-
106
-
107
- #
108
- # Update DNS related fields according to the contents of the IPAM-DNS
109
- # coupling custom fields.
110
- #
111
- @receiver(pre_save, sender=IPAddress)
112
- def ip_address_update_dns_information(instance, **kwargs):
113
- if not get_plugin_config("netbox_dns", "feature_ipam_coupling"):
114
- return
115
-
116
- name, ttl, disable_ptr, zone_id = ipaddress_cf_data(instance)
117
-
118
- previous_zone_id = None
119
- if instance.pk is not None:
120
- try:
121
- old_instance = IPAddress.objects.get(pk=instance.pk)
122
- previous_zone_id = old_instance.custom_field_data.get(
123
- "ipaddress_dns_zone_id"
124
- )
125
- except IPAddress.DoesNotExist:
126
- pass
127
-
128
- if zone_id is not None:
129
- instance.dns_name = f"{name}.{Zone.objects.get(pk=zone_id).name}"
130
- else:
131
- instance.custom_field_data["ipaddress_dns_record_name"] = None
132
- instance.custom_field_data["ipaddress_dns_record_ttl"] = None
133
- instance.custom_field_data["ipaddress_dns_record_disable_ptr"] = False
134
- instance.custom_field_data["ipaddress_dns_zone_id"] = None
135
-
136
- if previous_zone_id is not None:
137
- instance.dns_name = ""
138
-
139
-
140
- #
141
- # Handle DNS record operation after IPAddress has been created or modified
142
- #
143
- @receiver(post_save, sender=IPAddress)
144
- def ip_address_update_address_record(instance, **kwargs):
145
- if not get_plugin_config("netbox_dns", "feature_ipam_coupling"):
146
- return
147
-
148
- name, ttl, disable_ptr, zone_id = ipaddress_cf_data(instance)
149
-
150
- if zone_id is None:
151
- #
152
- # Name/Zone CF data has been removed: Remove the DNS address record
153
- #
154
- for record in instance.netbox_dns_records.all():
155
- record.delete()
156
-
157
- else:
158
- #
159
- # Name/Zone CF data is present: Check for a DNS address record and add
160
- # or modify it as necessary
161
- #
162
- record = get_address_record(instance)
163
- if record is None:
164
- record = new_address_record(instance)
165
- else:
166
- update_address_record(record, instance)
167
-
168
- record.save()
@@ -1,21 +0,0 @@
1
- {% load helpers %}
2
-
3
- <div class="card">
4
- <h5 class="card-header">Related NetBox DNS Objects</h5>
5
- <ul class="list-group list-group-flush">
6
- {% for qs, filter_param in related_dns_models %}
7
- {% with viewname=qs.model|viewname:"list" %}
8
- <a href="{% url viewname %}?{{ filter_param }}={{ object.pk }}" class="list-group-item list-group-item-action d-flex justify-content-between">
9
- {{ qs.model|meta:"verbose_name_plural"|bettertitle }}
10
- {% with count=qs.count %}
11
- {% if count %}
12
- <span class="badge bg-primary rounded-pill">{{ count }}</span>
13
- {% else %}
14
- <span class="badge bg-light rounded-pill">&mdash;</span>
15
- {% endif %}
16
- {% endwith %}
17
- </a>
18
- {% endwith %}
19
- {% endfor %}
20
- </ul>
21
- </div>
@@ -1,51 +0,0 @@
1
- from django.urls import path
2
-
3
- from netbox.views.generic import ObjectChangeLogView, ObjectJournalView
4
-
5
- from netbox_dns.models import Contact
6
- from netbox_dns.views import (
7
- ContactListView,
8
- ContactView,
9
- ContactDeleteView,
10
- ContactEditView,
11
- ContactBulkImportView,
12
- ContactBulkEditView,
13
- ContactBulkDeleteView,
14
- ContactZoneListView,
15
- )
16
-
17
- contact_urlpatterns = [
18
- path("contacts/", ContactListView.as_view(), name="contact_list"),
19
- path("contacts/add/", ContactEditView.as_view(), name="contact_add"),
20
- path("contacts/import/", ContactBulkImportView.as_view(), name="contact_import"),
21
- path("contacts/edit/", ContactBulkEditView.as_view(), name="contact_bulk_edit"),
22
- path(
23
- "contacts/delete/",
24
- ContactBulkDeleteView.as_view(),
25
- name="contact_bulk_delete",
26
- ),
27
- path("contacts/<int:pk>/", ContactView.as_view(), name="contact"),
28
- path("contacts/<int:pk>/edit/", ContactEditView.as_view(), name="contact_edit"),
29
- path(
30
- "contacts/<int:pk>/delete/",
31
- ContactDeleteView.as_view(),
32
- name="contact_delete",
33
- ),
34
- path(
35
- "contacts/<int:pk>/zones/",
36
- ContactZoneListView.as_view(),
37
- name="contact_zones",
38
- ),
39
- path(
40
- "contacts/<int:pk>/journal/",
41
- ObjectJournalView.as_view(),
42
- name="contact_journal",
43
- kwargs={"model": Contact},
44
- ),
45
- path(
46
- "contacts/<int:pk>/changelog/",
47
- ObjectChangeLogView.as_view(),
48
- name="contact_changelog",
49
- kwargs={"model": Contact},
50
- ),
51
- ]
@@ -1,112 +0,0 @@
1
- from ipam.choices import IPAddressStatusChoices
2
- from utilities.permissions import resolve_permission
3
-
4
- from netbox_dns.models import Record
5
- from netbox_dns.choices import RecordTypeChoices, RecordStatusChoices
6
-
7
- from netbox.plugins.utils import get_plugin_config
8
-
9
-
10
- class DNSPermissionDenied(Exception):
11
- pass
12
-
13
-
14
- def ipaddress_cf_data(ip_address):
15
- name = ip_address.custom_field_data.get("ipaddress_dns_record_name")
16
- ttl = ip_address.custom_field_data.get("ipaddress_dns_record_ttl")
17
- disable_ptr = ip_address.custom_field_data.get("ipaddress_dns_record_disable_ptr")
18
- if disable_ptr is None:
19
- disable_ptr = False
20
- zone_id = ip_address.custom_field_data.get("ipaddress_dns_zone_id")
21
-
22
- if name is None or zone_id is None:
23
- return None, None, False, None
24
-
25
- return name, ttl, disable_ptr, zone_id
26
-
27
-
28
- def address_record_type(ip_address):
29
- return RecordTypeChoices.AAAA if ip_address.family == 6 else RecordTypeChoices.A
30
-
31
-
32
- def address_record_status(ip_address):
33
- ip_active_status_list = get_plugin_config(
34
- "netbox_dns",
35
- "ipam_coupling_ip_active_status_list",
36
- (
37
- IPAddressStatusChoices.STATUS_ACTIVE,
38
- IPAddressStatusChoices.STATUS_DHCP,
39
- IPAddressStatusChoices.STATUS_SLAAC,
40
- ),
41
- )
42
-
43
- return (
44
- RecordStatusChoices.STATUS_ACTIVE
45
- if ip_address.status in ip_active_status_list
46
- else RecordStatusChoices.STATUS_INACTIVE
47
- )
48
-
49
-
50
- def get_address_record(ip_address):
51
- return ip_address.netbox_dns_records.first()
52
-
53
-
54
- def new_address_record(instance):
55
- name, ttl, disable_ptr, zone_id = ipaddress_cf_data(instance)
56
-
57
- if zone_id is None:
58
- return None
59
-
60
- return Record(
61
- name=name,
62
- zone_id=zone_id,
63
- ttl=ttl,
64
- disable_ptr=disable_ptr,
65
- status=address_record_status(instance),
66
- type=address_record_type(instance),
67
- value=str(instance.address.ip),
68
- ipam_ip_address_id=instance.pk,
69
- managed=True,
70
- )
71
-
72
-
73
- def update_address_record(record, ip_address):
74
- name, ttl, disable_ptr, zone_id = ipaddress_cf_data(ip_address)
75
-
76
- record.name = name
77
- record.ttl = ttl
78
- record.disable_ptr = disable_ptr
79
- record.zone_id = zone_id
80
- record.status = address_record_status(ip_address)
81
- record.value = str(ip_address.address.ip)
82
-
83
-
84
- def check_permission(request, permission, record=None):
85
- if record is not None and record.pk is None:
86
- check_record = None
87
- else:
88
- check_record = record
89
-
90
- user = request.user
91
-
92
- if not user.has_perm(permission, check_record):
93
- action = resolve_permission(permission)[1]
94
- item = "records" if check_record is None else f"record {check_record}"
95
-
96
- raise DNSPermissionDenied(f"User {user} is not allowed to {action} DNS {item}")
97
-
98
-
99
- def dns_changed(old, new):
100
- return any(
101
- (
102
- old.address.ip != new.address.ip,
103
- old.custom_field_data.get("ipaddress_dns_record_name")
104
- != new.custom_field_data.get("ipaddress_dns_record_name"),
105
- old.custom_field_data.get("ipaddress_dns_record_ttl")
106
- != new.custom_field_data.get("ipaddress_dns_record_ttl"),
107
- old.custom_field_data.get("ipaddress_dns_record_disable_ptr")
108
- != new.custom_field_data.get("ipaddress_dns_record_disable_ptr"),
109
- old.custom_field_data.get("ipaddress_dns_zone_id")
110
- != new.custom_field_data.get("ipaddress_dns_zone_id"),
111
- )
112
- )
@@ -1,95 +0,0 @@
1
- from django.db.models import Q
2
-
3
- from netbox.views import generic
4
-
5
- from utilities.views import ViewTab, register_model_view
6
-
7
- from netbox_dns.models import Contact, Zone
8
- from netbox_dns.filtersets import ContactFilterSet, ZoneFilterSet
9
- from netbox_dns.forms import (
10
- ContactForm,
11
- ContactFilterForm,
12
- ContactImportForm,
13
- ContactBulkEditForm,
14
- )
15
- from netbox_dns.tables import ContactTable, ZoneTable
16
-
17
-
18
- __all__ = (
19
- "ContactView",
20
- "ContactEditView",
21
- "ContactListView",
22
- "ContactDeleteView",
23
- "ContactBulkImportView",
24
- "ContactBulkEditView",
25
- "ContactBulkDeleteView",
26
- "ContactZoneListView",
27
- )
28
-
29
-
30
- class ContactView(generic.ObjectView):
31
- queryset = Contact.objects.all()
32
-
33
-
34
- class ContactListView(generic.ObjectListView):
35
- queryset = Contact.objects.all()
36
- table = ContactTable
37
- filterset = ContactFilterSet
38
- filterset_form = ContactFilterForm
39
-
40
-
41
- class ContactEditView(generic.ObjectEditView):
42
- queryset = Contact.objects.all()
43
- form = ContactForm
44
- default_return_url = "plugins:netbox_dns:contact_list"
45
-
46
-
47
- class ContactDeleteView(generic.ObjectDeleteView):
48
- queryset = Contact.objects.all()
49
- default_return_url = "plugins:netbox_dns:contact_list"
50
-
51
-
52
- class ContactBulkImportView(generic.BulkImportView):
53
- queryset = Contact.objects.all()
54
- model_form = ContactImportForm
55
- table = ContactTable
56
- default_return_url = "plugins:netbox_dns:contact_list"
57
-
58
-
59
- class ContactBulkEditView(generic.BulkEditView):
60
- queryset = Contact.objects.all()
61
- filterset = ContactFilterSet
62
- table = ContactTable
63
- form = ContactBulkEditForm
64
-
65
-
66
- class ContactBulkDeleteView(generic.BulkDeleteView):
67
- queryset = Contact.objects.all()
68
- table = ContactTable
69
-
70
-
71
- @register_model_view(Contact, "zones")
72
- class ContactZoneListView(generic.ObjectChildrenView):
73
- queryset = Contact.objects.all().prefetch_related(
74
- "zone_set", "admin_c_zones", "tech_c_zones", "billing_c_zones"
75
- )
76
- child_model = Zone
77
- table = ZoneTable
78
- filterset = ZoneFilterSet
79
- template_name = "netbox_dns/zone/child.html"
80
- hide_if_empty = True
81
-
82
- tab = ViewTab(
83
- label="Zones",
84
- permission="netbox_dns.view_zone",
85
- badge=lambda obj: len(obj.zones),
86
- hide_if_empty=True,
87
- )
88
-
89
- def get_children(self, request, parent):
90
- return Zone.objects.filter(
91
- Q(registrant=parent)
92
- | Q(admin_c=parent)
93
- | Q(tech_c=parent)
94
- | Q(billing_c=parent)
95
- )
@@ -1,136 +0,0 @@
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,,