netbox-ddns 1.4.0__py3-none-any.whl → 1.7.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.
Files changed (34) hide show
  1. netbox_ddns/__init__.py +3 -3
  2. netbox_ddns/admin.py +0 -156
  3. netbox_ddns/api/serializers.py +20 -2
  4. netbox_ddns/api/views.py +1 -0
  5. netbox_ddns/background_tasks.py +28 -5
  6. netbox_ddns/filtersets.py +23 -1
  7. netbox_ddns/forms.py +54 -3
  8. netbox_ddns/migrations/0011_server_created_server_custom_field_data_and_more.py +36 -0
  9. netbox_ddns/migrations/0012_zone_created_zone_custom_field_data_and_more.py +36 -0
  10. netbox_ddns/migrations/0013_reversezone_created_reversezone_custom_field_data_and_more.py +36 -0
  11. netbox_ddns/migrations/0014_alter_extradnsname_name.py +19 -0
  12. netbox_ddns/migrations/0015_server_protocol.py +18 -0
  13. netbox_ddns/models.py +61 -9
  14. netbox_ddns/navigation.py +62 -0
  15. netbox_ddns/tables.py +78 -32
  16. netbox_ddns/template_content.py +40 -3
  17. netbox_ddns/templates/netbox_ddns/extradnsname.html +23 -131
  18. netbox_ddns/templates/netbox_ddns/ipaddress/dns_extra.html +1 -1
  19. netbox_ddns/templates/netbox_ddns/managed_dns_names.html +17 -0
  20. netbox_ddns/templates/netbox_ddns/reversezone.html +51 -0
  21. netbox_ddns/templates/netbox_ddns/server.html +74 -0
  22. netbox_ddns/templates/netbox_ddns/update_reverse_zone.html +11 -0
  23. netbox_ddns/templates/netbox_ddns/update_zone.html +11 -0
  24. netbox_ddns/templates/netbox_ddns/zone.html +53 -0
  25. netbox_ddns/urls.py +32 -14
  26. netbox_ddns/utils.py +95 -0
  27. netbox_ddns/validators.py +6 -0
  28. netbox_ddns/views.py +268 -84
  29. {netbox_ddns-1.4.0.dist-info → netbox_ddns-1.7.0.dist-info}/METADATA +7 -5
  30. netbox_ddns-1.7.0.dist-info/RECORD +50 -0
  31. {netbox_ddns-1.4.0.dist-info → netbox_ddns-1.7.0.dist-info}/WHEEL +1 -1
  32. netbox_ddns-1.4.0.dist-info/RECORD +0 -38
  33. {netbox_ddns-1.4.0.dist-info → netbox_ddns-1.7.0.dist-info/licenses}/LICENSE.txt +0 -0
  34. {netbox_ddns-1.4.0.dist-info → netbox_ddns-1.7.0.dist-info}/top_level.txt +0 -0
netbox_ddns/views.py CHANGED
@@ -1,116 +1,221 @@
1
1
  from django.contrib import messages
2
2
  from django.contrib.auth.mixins import PermissionRequiredMixin
3
- from django.http import Http404
4
3
  from django.shortcuts import get_object_or_404, redirect, render
5
- from django.urls import reverse
6
4
  from django.utils.translation import gettext as _
7
- from django.views import View
8
5
 
9
6
  from ipam.models import IPAddress
7
+ from ipam.tables import IPAddressTable
10
8
  from netbox_ddns.background_tasks import dns_create
11
- from netbox_ddns.forms import ExtraDNSNameEditForm
12
- from netbox_ddns.models import DNSStatus, ExtraDNSName
13
- from netbox_ddns.utils import normalize_fqdn
9
+ from netbox_ddns.filtersets import ServerFilterSet, ZoneFilterSet, ReverseZoneFilterSet, ExtraDNSNameFilterSet
10
+ from netbox_ddns.forms import ServerForm, ZoneForm, ReverseZoneForm, ExtraDNSNameIPAddressForm, ExtraDNSNameForm
11
+ from netbox_ddns.models import DNSStatus, ExtraDNSName, Server, Zone, ReverseZone
12
+ from netbox_ddns.tables import ManagedDNSNameTable, ServerTable, ZoneTable, ReverseZoneTable, ExtraDNSNameTable
13
+ from netbox_ddns.utils import get_managed_dns_names, normalize_fqdn
14
14
 
15
- from utilities.forms import ConfirmationForm
16
- from utilities.htmx import htmx_partial
17
- from utilities.views import get_viewname
15
+ from netbox.views.generic import ObjectDeleteView, ObjectEditView, ObjectView, ObjectListView, BulkDeleteView
18
16
 
19
- try:
20
- # NetBox <= 2.9
21
- from utilities.views import ObjectDeleteView, ObjectEditView
22
- except ImportError:
23
- # NetBox >= 2.10
24
- from netbox.views.generic import ObjectDeleteView, ObjectEditView, ObjectView
17
+ from django_tables2 import RequestConfig
18
+ from django.views.generic import View
25
19
 
20
+ from utilities.views import register_model_view, GetRelatedModelsMixin
26
21
 
27
- # noinspection PyMethodMayBeStatic
28
- class ExtraDNSNameObjectMixin:
29
- def get_object(self, *args, **kwargs):
30
- # NetBox < 3.2.0
31
- if not kwargs and len(args) == 1:
32
- kwargs = args[0]
33
- elif len(args) > 1:
34
- raise TypeError('Method takes 1 positional argument but more were given')
35
22
 
36
- if 'ipaddress_pk' not in kwargs:
37
- raise Http404
23
+ # Managed DNS Names (primary DNS names from IP addresses)
24
+ class ManagedDNSNameListView(PermissionRequiredMixin, View):
25
+ """List of all primary DNS names (from IPAddress.dns_name). Extra DNS names have a separate view."""
26
+ permission_required = 'netbox_ddns.view_zone'
38
27
 
39
- ip_address = get_object_or_404(IPAddress, pk=kwargs['ipaddress_pk'])
28
+ def get(self, request):
29
+ rows = get_managed_dns_names(request.user)
30
+ table = ManagedDNSNameTable(rows)
31
+ RequestConfig(request).configure(table)
40
32
 
41
- if 'pk' in kwargs:
42
- return get_object_or_404(ExtraDNSName, ip_address=ip_address, pk=kwargs['pk'])
33
+ return render(
34
+ request,
35
+ 'netbox_ddns/managed_dns_names.html',
36
+ {'table': table},
37
+ )
43
38
 
44
- return ExtraDNSName(ip_address=ip_address)
45
39
 
46
- def get_return_url(self, request, obj=None):
47
- # First, see if `return_url` was specified as a query parameter or form data. Use this URL only if it's
48
- # considered safe.
49
- return_url = request.GET.get('return_url') or request.POST.get('return_url')
50
- if return_url and return_url.startswith('/'):
51
- return return_url
52
-
53
- # Otherwise check we have an object and can return to its ip-address
54
- elif obj is not None and obj.ip_address is not None:
55
- return obj.ip_address.get_absolute_url()
40
+ # ReverseZone
41
+ @register_model_view(ReverseZone)
42
+ class ReverseZoneView(ObjectView):
43
+ queryset = ReverseZone.objects.all()
56
44
 
57
- # If all else fails, return home. Ideally this should never happen.
58
- return reverse('home')
45
+ def get_extra_context(self, request, instance):
46
+ ip_address_table = IPAddressTable(instance.get_managed_ip_address().restrict(request.user, 'view'))
47
+ ip_address_table.configure(request)
48
+ return {
49
+ 'ip_address_table': ip_address_table,
50
+ }
59
51
 
60
52
 
61
- class ExtraDNSNameCreateView(PermissionRequiredMixin, ExtraDNSNameObjectMixin, ObjectEditView):
62
- permission_required = 'netbox_ddns.add_extradnsname'
53
+ @register_model_view(ReverseZone, 'list', path='', detail=False)
54
+ class ReverseZoneListView(ObjectListView):
55
+ queryset = ReverseZone.objects.all()
56
+ table = ReverseZoneTable
57
+
58
+
59
+ @register_model_view(ReverseZone, 'add', detail=False)
60
+ @register_model_view(ReverseZone, 'edit')
61
+ class ReverseZoneEditView(ObjectEditView):
62
+ queryset = ReverseZone.objects.all()
63
+ form = ReverseZoneForm
64
+
65
+
66
+ @register_model_view(ReverseZone, 'delete')
67
+ class ReverseZoneDeleteView(ObjectDeleteView):
68
+ queryset = ReverseZone.objects.all()
69
+
70
+
71
+ @register_model_view(ReverseZone, 'bulk_delete', path='delete', detail=False)
72
+ class ReverseZoneBulkDeleteView(BulkDeleteView):
73
+ queryset = ReverseZone.objects.all()
74
+ filterset = ReverseZoneFilterSet
75
+ table = ReverseZoneTable
76
+
77
+
78
+ # Zone
79
+ @register_model_view(Zone)
80
+ class ZoneView(ObjectView):
81
+ queryset = Zone.objects.all()
82
+
83
+ def get_extra_context(self, request, instance):
84
+ ip_address_table = IPAddressTable(instance.get_managed_ip_address().restrict(request.user, 'view'))
85
+ ip_address_table.configure(request)
86
+
87
+ extra_dns_name_table = ExtraDNSNameTable(instance.get_managed_extra_dns_name().restrict(request.user, 'view'))
88
+ extra_dns_name_table.configure(request)
89
+ return {
90
+ 'ip_address_table': ip_address_table,
91
+ 'extra_dns_name_table': extra_dns_name_table,
92
+ }
93
+
94
+
95
+ @register_model_view(Zone, 'list', path='', detail=False)
96
+ class ZoneListView(ObjectListView):
97
+ queryset = Zone.objects.all()
98
+ table = ZoneTable
99
+ filterset = ZoneFilterSet
100
+
101
+
102
+ @register_model_view(Zone, 'add', detail=False)
103
+ @register_model_view(Zone, 'edit')
104
+ class ZoneEditView(ObjectEditView):
105
+ queryset = Zone.objects.all()
106
+ form = ZoneForm
107
+
108
+
109
+ @register_model_view(Zone, 'delete')
110
+ class ZoneDeleteView(ObjectDeleteView):
111
+ queryset = Zone.objects.all()
112
+
113
+
114
+ @register_model_view(Zone, 'bulk_delete', path='delete', detail=False)
115
+ class ZoneBulkDeleteView(BulkDeleteView):
116
+ queryset = Zone.objects.all()
117
+ filterset = ZoneFilterSet
118
+ table = ZoneTable
119
+
120
+
121
+ # Server
122
+ @register_model_view(Server)
123
+ class ServerView(ObjectView):
124
+ queryset = Server.objects.all()
125
+
126
+ def get_extra_context(self, request, instance):
127
+ zone_table = ZoneTable(instance.zone_set.all(), exclude=["server"])
128
+ zone_table.configure(request)
129
+ reversezone_table = ZoneTable(instance.reversezone_set.all(), exclude=["server"])
130
+ reversezone_table.configure(request)
131
+ return {
132
+ 'zone_table': zone_table,
133
+ 'reversezone_table': reversezone_table,
134
+ }
135
+
136
+
137
+ @register_model_view(Server, 'list', path='', detail=False)
138
+ class ServerListView(ObjectListView):
139
+ queryset = Server.objects.all()
140
+ table = ServerTable
141
+ filterset = ServerFilterSet
142
+
143
+
144
+ @register_model_view(Server, 'add', detail=False)
145
+ @register_model_view(Server, 'edit')
146
+ class ServerEditView(ObjectEditView):
147
+ queryset = Server.objects.all()
148
+ form = ServerForm
149
+
150
+
151
+ @register_model_view(Server, 'delete')
152
+ class ServerDeleteView(ObjectDeleteView):
153
+ queryset = Server.objects.all()
154
+
155
+
156
+ @register_model_view(Server, 'bulk_delete', path='delete', detail=False)
157
+ class ServerBulkDeleteView(BulkDeleteView):
158
+ queryset = Server.objects.all()
159
+ filterset = ServerFilterSet
160
+ table = ServerTable
161
+
162
+
163
+ # ExtraDNSName
164
+ @register_model_view(ExtraDNSName)
165
+ class ExtraDNSNameView(ObjectView):
166
+ queryset = ExtraDNSName.objects.all()
167
+ def get_extra_context(self, request, instance):
168
+ zone = Zone.objects.find_for_dns_name(instance.name)
169
+ server = zone.server if zone else None
170
+ return {
171
+ 'zone': zone,
172
+ 'server': server,
173
+ }
174
+
175
+ @register_model_view(ExtraDNSName, 'list', path='', detail=False)
176
+ class ExtraDNSNameListView(ObjectListView):
177
+ queryset = ExtraDNSName.objects.all()
178
+ table = ExtraDNSNameTable
179
+ filterset = ExtraDNSNameFilterSet
180
+
181
+
182
+ @register_model_view(ExtraDNSName, 'add', detail=False)
183
+ class ExtraDNSNameEditView(ObjectEditView):
63
184
  queryset = ExtraDNSName.objects.all()
64
- form = ExtraDNSNameEditForm
65
- # NetBox < 3.2.0
66
- @property
67
- def model_form(self):
68
- return self.form
185
+ form = ExtraDNSNameForm
69
186
 
70
187
 
71
- class ExtraDNSNameView(PermissionRequiredMixin,ExtraDNSNameObjectMixin,ObjectView):
72
- permission_required = 'netbox_ddns.view_extradnsname'
188
+ @register_model_view(ExtraDNSName, 'edit')
189
+ class ExtraDNSNameEditView(ObjectEditView):
73
190
  queryset = ExtraDNSName.objects.all()
191
+ form = ExtraDNSNameIPAddressForm
74
192
 
75
- class ExtraDNSNameEditView(ExtraDNSNameCreateView):
76
- permission_required = 'netbox_ddns.change_extradnsname'
193
+
194
+ @register_model_view(ExtraDNSName, 'delete')
195
+ class ExtraDNSNameDeleteView(ObjectDeleteView):
196
+ queryset = ExtraDNSName.objects.all()
197
+
198
+ def get_return_url(self, request, obj=None):
199
+ if obj and obj.ip_address:
200
+ return obj.ip_address.get_absolute_url()
201
+ return super().get_return_url(request, obj)
77
202
 
78
203
 
79
- class ExtraDNSNameDeleteView(PermissionRequiredMixin, ExtraDNSNameObjectMixin, ObjectDeleteView):
80
- permission_required = 'netbox_ddns.delete_extradnsname'
204
+ @register_model_view(ExtraDNSName, 'bulk_delete', path='delete', detail=False)
205
+ class ExtraDNSNameBulkDeleteView(BulkDeleteView):
81
206
  queryset = ExtraDNSName.objects.all()
207
+ filterset = ExtraDNSNameFilterSet
208
+ table = ExtraDNSNameTable
82
209
 
83
- # Override request handler to fix the error on delete GET due to missing reverse route argument
84
- def get(self, request, *args, **kwargs):
85
- """
86
- GET request handler.
87
-
88
- Args:
89
- request: The current request
90
- """
91
- obj = self.get_object(**kwargs)
92
- form = ConfirmationForm(initial=request.GET)
93
-
94
- try:
95
- dependent_objects = self._get_dependent_objects(obj)
96
- except ProtectedError as e:
97
- return self._handle_protected_objects(obj, e.protected_objects, request, e)
98
- except RestrictedError as e:
99
- return self._handle_protected_objects(obj, e.restricted_objects, request, e)
100
-
101
- # If this is an HTMX request, return only the rendered deletion form as modal content
102
- if htmx_partial(request):
103
- viewname = get_viewname(self.queryset.model, action='delete')
104
- form_url = reverse(viewname, kwargs={'pk': obj.pk, 'ipaddress_pk': obj.ip_address.pk})
105
- return render(request, 'htmx/delete_form.html', {
106
- 'object': obj,
107
- 'object_type': self.queryset.model._meta.verbose_name,
108
- 'form': form,
109
- 'form_url': form_url,
110
- 'dependent_objects': dependent_objects,
111
- **self.get_extra_context(request, obj),
112
- })
113
210
 
211
+ class ExtraDNSNameCreateView(PermissionRequiredMixin, ObjectEditView):
212
+ permission_required = 'netbox_ddns.add_extradnsname'
213
+ queryset = ExtraDNSName.objects.all()
214
+ form = ExtraDNSNameIPAddressForm
215
+
216
+ def get_object(self, *args, **kwargs):
217
+ ip_address = get_object_or_404(IPAddress, pk=kwargs['ipaddress_pk'])
218
+ return ExtraDNSName(ip_address=ip_address)
114
219
 
115
220
 
116
221
  class IPAddressDNSNameRecreateView(PermissionRequiredMixin, View):
@@ -153,3 +258,82 @@ class IPAddressDNSNameRecreateView(PermissionRequiredMixin, View):
153
258
  messages.info(request, _("Updating DNS for {names}").format(names=', '.join(updated_names)))
154
259
 
155
260
  return redirect('ipam:ipaddress', pk=ip_address.pk)
261
+
262
+
263
+ class UpdateForwardZone(PermissionRequiredMixin, View):
264
+ permission_required = 'ipam.change_ipaddress'
265
+
266
+ def post(self, request, pk):
267
+ zone = get_object_or_404(Zone, pk=pk)
268
+ counter = 0
269
+
270
+ ip_addresses = zone.get_managed_ip_address()
271
+ for ip_address in ip_addresses:
272
+ new_address = ip_address.address.ip
273
+ new_dns_name = normalize_fqdn(ip_address.dns_name)
274
+
275
+ if new_dns_name:
276
+ status, created = DNSStatus.objects.get_or_create(ip_address=ip_address)
277
+
278
+ dns_create.delay(
279
+ dns_name=new_dns_name,
280
+ address=new_address,
281
+ status=status,
282
+ reverse=False,
283
+ )
284
+ counter += 1
285
+
286
+ extra_names = zone.get_managed_extra_dns_name()
287
+ for extra in extra_names:
288
+ new_address = extra.ip_address.address.ip
289
+ new_dns_name = extra.name
290
+
291
+ dns_create.delay(
292
+ dns_name=new_dns_name,
293
+ address=new_address,
294
+ status=extra,
295
+ reverse=False,
296
+ )
297
+ counter += 1
298
+
299
+ messages.info(
300
+ request, _("Updating {count} forward records in {name}").format(
301
+ count=counter,
302
+ name=zone.name
303
+ )
304
+ )
305
+ return redirect(zone.get_absolute_url())
306
+
307
+
308
+ class UpdateReverseZone(PermissionRequiredMixin, View):
309
+ permission_required = 'ipam.change_ipaddress'
310
+
311
+ def post(self, request, pk):
312
+ reversezone = get_object_or_404(ReverseZone, pk=pk)
313
+
314
+ counter = 0
315
+
316
+ ip_addresses = reversezone.get_managed_ip_address()
317
+
318
+ for ip_address in ip_addresses:
319
+ new_address = ip_address.address.ip
320
+ new_dns_name = normalize_fqdn(ip_address.dns_name)
321
+
322
+ if new_dns_name:
323
+ status, created = DNSStatus.objects.get_or_create(ip_address=ip_address)
324
+
325
+ dns_create.delay(
326
+ dns_name=new_dns_name,
327
+ address=new_address,
328
+ status=status,
329
+ forward=False,
330
+ )
331
+ counter += 1
332
+
333
+ messages.info(
334
+ request, _("Updating {count} reverse records in {name}").format(
335
+ count=counter,
336
+ name=reversezone.name
337
+ )
338
+ )
339
+ return redirect(reversezone.get_absolute_url())
@@ -1,22 +1,24 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: netbox-ddns
3
- Version: 1.4.0
3
+ Version: 1.7.0
4
4
  Summary: Dynamic DNS Connector for NetBox
5
5
  Home-page: https://github.com/sjm-steffann/netbox-ddns
6
6
  Author: Sander Steffann
7
7
  Author-email: sander@steffann.nl
8
8
  License: Apache 2.0
9
- Classifier: Development Status :: 2 - Pre-Alpha
9
+ Classifier: Development Status :: 5 - Production/Stable
10
10
  Classifier: Framework :: Django
11
11
  Classifier: Framework :: Django :: 3.0
12
12
  Classifier: License :: OSI Approved :: Apache Software License
13
13
  Classifier: Programming Language :: Python :: 3
14
- Classifier: Programming Language :: Python :: 3.6
15
- Requires-Python: >=3.10
14
+ Classifier: Programming Language :: Python :: 3.11
15
+ Classifier: Programming Language :: Python :: 3.12
16
+ Requires-Python: >=3.11
16
17
  Description-Content-Type: text/markdown
17
18
  License-File: LICENSE.txt
18
19
  Requires-Dist: setuptools
19
20
  Requires-Dist: dnspython
21
+ Dynamic: license-file
20
22
 
21
23
  # Dynamic DNS Connector for NetBox
22
24
 
@@ -0,0 +1,50 @@
1
+ netbox_ddns/__init__.py,sha256=friu8evzGLj_1VYrptsexpNvH2VhLl7J0vWnxpXos_c,652
2
+ netbox_ddns/admin.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
+ netbox_ddns/background_tasks.py,sha256=u_3H_ktST9F05iRV3hVwF6Q7JDPlDlAc9tcV6YnEnjw,7824
4
+ netbox_ddns/filtersets.py,sha256=nhHgkef7IqUA9ljyFn5rTuFYl4wKHzMkPfbLMCeHMtk,828
5
+ netbox_ddns/forms.py,sha256=ZcDxRWelufSc4kbUALI3ZrjhhXIWcefBtDgyU_632H4,1544
6
+ netbox_ddns/models.py,sha256=PTDR0okKBmcn1QgiyVi9cWGuM6REMxJXA5cQEEhRJz8,14400
7
+ netbox_ddns/navigation.py,sha256=NT0agBkUisanyGYzbAkH5CiuMBIOGL58Q6C-eZ5R7Xc,2047
8
+ netbox_ddns/search.py,sha256=G07DBvjOzKNjbtm9d6_n___GKXQyJ2aCfSDjPRdRzGs,212
9
+ netbox_ddns/signals.py,sha256=yHkgZImnyTqRwPXAr2W9bd4rJof7YblkylJnDn1_FDc,4185
10
+ netbox_ddns/tables.py,sha256=4RTQI_H74awe8kN38iiT2-Vp7IZPBN6jfOeP1Jz37iU,2781
11
+ netbox_ddns/template_content.py,sha256=AN0voBq7LFwZ-v7UZcoIvt-8UlbEF4Lq1KQ4gfnka3o,2443
12
+ netbox_ddns/urls.py,sha256=VDoT1h0WwWrv4KpoVqUQUuZy-E8TmuYCuvll-dpbwPI,1681
13
+ netbox_ddns/utils.py,sha256=SJ00wzuMKGdeawVQOyXZoLkKX5iRuPBjj8-wYNnTCPA,4135
14
+ netbox_ddns/validators.py,sha256=bT9QA905uSWZzsGyhRDFWAlJceNd4cf7RWNdSc7FwSo,1084
15
+ netbox_ddns/views.py,sha256=h-QE9JZVr630Jme5rSzhDVQQIE-SdtGL9GBvjuhs0Y8,10949
16
+ netbox_ddns/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
+ netbox_ddns/api/serializers.py,sha256=UOPZPh80rq4o06uK3mhB7dR0hUFO4YoGbmB5hvbrkKE,1110
18
+ netbox_ddns/api/urls.py,sha256=eoDxcu9tvR31xtTu0QebvTPqsCpckJfTqFj6Pm6-EyY,204
19
+ netbox_ddns/api/views.py,sha256=9P5vqubPTd0MYOrApnmDYSzjdEo9kmq0BcjVqUFtIA8,362
20
+ netbox_ddns/migrations/0001_initial.py,sha256=pYwGDj9C3mPUuc8lfiXqTOYEhZ-MpGhLywGRulHcZQA,2461
21
+ netbox_ddns/migrations/0002_add_ttl.py,sha256=HP_lzWLZeSzgkIFFiGUgdzkPDRYt48uNwNTdAFwEwdg,617
22
+ netbox_ddns/migrations/0003_dnsstatus.py,sha256=TBQltrJeyk9q24_WdFpnUfMbV2-1VDt3ADuXN65bVJw,1200
23
+ netbox_ddns/migrations/0004_ensure_trailing_dot.py,sha256=SxKzmMC8IaO9ZDGRPzI3tWWt6AT0q01Dg1tY60mc1Mc,1243
24
+ netbox_ddns/migrations/0005_extradnsname.py,sha256=80f8OANyKpOa5LMZPQgRBdFQQ7ELjUeE0AU4fw5p114,1429
25
+ netbox_ddns/migrations/0006_extradns_cname.py,sha256=-To2qntWjzhnn3eTUX0JZRtf79NU06hkTJKs3CmTJiM,456
26
+ netbox_ddns/migrations/0007_zone_meta.py,sha256=iKHEk-KUJYbaAvuXL6YrsZsMcEPCYqs0EoEb6hRr_m8,416
27
+ netbox_ddns/migrations/0008_server_server_port.py,sha256=qqCMbOVJgxNmoEd2WofNy6QT6QbsiiML_ZzAaXuo0WI,530
28
+ netbox_ddns/migrations/0009_alter_dnsstatus_id_alter_extradnsname_id_and_more.py,sha256=3pjw6MqigeunuaHX011a2-yzxhwG3cELmtp4pmTx_BQ,1204
29
+ netbox_ddns/migrations/0010_extradnsname_created_extradnsname_custom_field_data_and_more.py,sha256=4bpm4nZLCHU0CqnCF6qWGtZd5x9flKrhJYRuAGFycwA,1157
30
+ netbox_ddns/migrations/0011_server_created_server_custom_field_data_and_more.py,sha256=D0resBMdiy7JEznlq1Fcw018CPFZFIn7lEBp5sC6frU,1133
31
+ netbox_ddns/migrations/0012_zone_created_zone_custom_field_data_and_more.py,sha256=5Rx21TsOxbb-bFRWceRTzBWVuw2b9p70w9yha7SfizE,1113
32
+ netbox_ddns/migrations/0013_reversezone_created_reversezone_custom_field_data_and_more.py,sha256=BTo5lpO9NZMwHOCiOhINMfp4aFeIQXkXLQ5HKTARIk0,1137
33
+ netbox_ddns/migrations/0014_alter_extradnsname_name.py,sha256=oXN7jblZBZKGJFXpCEblUQeYwewgyE00FdeH4uUUR4E,521
34
+ netbox_ddns/migrations/0015_server_protocol.py,sha256=dbzGOeGSIqHl5yX7hEtlamuKjktgCSL79KUXLsxBE9w,409
35
+ netbox_ddns/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
+ netbox_ddns/templates/netbox_ddns/extradnsname.html,sha256=noeIxirmaaxBFCCbhCloIfctGQGY7JRi92z19by7e8s,2630
37
+ netbox_ddns/templates/netbox_ddns/managed_dns_names.html,sha256=sCIrlNFel-2sKwI0dYQkHBHfZv5OcZGEmyo850Ve_YA,491
38
+ netbox_ddns/templates/netbox_ddns/reversezone.html,sha256=Ez5su5iqpbwZbRP8LUS0qcojWrnukyTtWBSLVGjI8MQ,1787
39
+ netbox_ddns/templates/netbox_ddns/server.html,sha256=72gyeS7gUe3E4a_R5PZySClAymD7sh0Luv-BNZ6oYqY,2664
40
+ netbox_ddns/templates/netbox_ddns/update_reverse_zone.html,sha256=oF01zNC5sDJVhoWzoj7jQxZqaBE9xvZRsJ-JmI5zonI,429
41
+ netbox_ddns/templates/netbox_ddns/update_zone.html,sha256=76o3CI7CbaJh6VDtAq2SgeW-kLGmY8SjYlkTfLDE8hw,422
42
+ netbox_ddns/templates/netbox_ddns/zone.html,sha256=j1xHfagwx7hEuOWT5h4YIwGkKD9KM3guYtzZsdYhi8o,1912
43
+ netbox_ddns/templates/netbox_ddns/ipaddress/dns_extra.html,sha256=8lk_HTcDiXugbHMq2hsOdjRB3gv-HX9XnrvZJVHnpoA,724
44
+ netbox_ddns/templates/netbox_ddns/ipaddress/dns_info.html,sha256=x4cpUovY3ZxmFoJeTLeqNUIw4ezoBkNfsYaRA6abUh4,1714
45
+ netbox_ddns/templates/netbox_ddns/ipaddress/dns_refresh_button.html,sha256=BBFwn2AP9PHfaU1ieYoB6X2eX84pPrUYYILbwYiKApc,430
46
+ netbox_ddns-1.7.0.dist-info/licenses/LICENSE.txt,sha256=DVQuDIgE45qn836wDaWnYhSdxoLXgpRRKH4RuTjpRZQ,10174
47
+ netbox_ddns-1.7.0.dist-info/METADATA,sha256=bHDDTy-Re-McIvHph68im8mDsgjcgmotJ6wdDiVUytc,2348
48
+ netbox_ddns-1.7.0.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
49
+ netbox_ddns-1.7.0.dist-info/top_level.txt,sha256=nSPx7dwqPj2hyzG2H0ohzHt0kkyzA-6M3zYRL6qAm-s,12
50
+ netbox_ddns-1.7.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.5.0)
2
+ Generator: setuptools (80.10.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,38 +0,0 @@
1
- netbox_ddns/__init__.py,sha256=IZOC5tt2ftbeV5deUVxlZZ_W19rc-sjm4PpGcEtqb8s,652
2
- netbox_ddns/admin.py,sha256=cCi0PnfuNv9PSygWbjFCh0ah6F0m3Ty0C3L-VtQYkFg,5658
3
- netbox_ddns/background_tasks.py,sha256=oCw6V3aas1Q1C8ftsn1TisrJ0JU51sdDt_iTlm-ZNmk,7070
4
- netbox_ddns/filtersets.py,sha256=dv2jGdhtBVeDu2sSxO9E8tJI6byhQcLdFGrK8XTvxXc,245
5
- netbox_ddns/forms.py,sha256=zxj7IDk6kLxb-Z4HBcPH_-VuHP8bxfy2eEeKuYuf6Gg,188
6
- netbox_ddns/models.py,sha256=me_0d4F3U0CEDNZAuhDNh9PaYY6IwIweo68INzDoTJE,12048
7
- netbox_ddns/search.py,sha256=G07DBvjOzKNjbtm9d6_n___GKXQyJ2aCfSDjPRdRzGs,212
8
- netbox_ddns/signals.py,sha256=yHkgZImnyTqRwPXAr2W9bd4rJof7YblkylJnDn1_FDc,4185
9
- netbox_ddns/tables.py,sha256=v3VVoVc6Nscu46QZeptewroof40U_9T_a5yrvuaATIQ,1682
10
- netbox_ddns/template_content.py,sha256=cnv3dOUd1LiidpSH2bMtYCs15sDcHLlqRv4cwfoeKNQ,1228
11
- netbox_ddns/urls.py,sha256=m7Y86NHch-dNBOt_vn-3CEIiWyoEqReAfTHYRjLsFsk,946
12
- netbox_ddns/utils.py,sha256=qAomseFWGL_VvL0sPF3Zmb6taMl3P9eEASqbMunmoyA,901
13
- netbox_ddns/validators.py,sha256=K8EzI6D-Mm_H3Es6LzzXx5ntBDsr8tY79_DHZmbamWM,851
14
- netbox_ddns/views.py,sha256=We1hUOmj9WH78BV-IKYO1OArXeCJaJoCrKD3XY5H6oo,5622
15
- netbox_ddns/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
- netbox_ddns/api/serializers.py,sha256=JtLoVrd7PB5DS-FGwKuOU393QMKbWEzqze31rLXInw8,616
17
- netbox_ddns/api/urls.py,sha256=eoDxcu9tvR31xtTu0QebvTPqsCpckJfTqFj6Pm6-EyY,204
18
- netbox_ddns/api/views.py,sha256=gaIYp6fKOkvmgdeWo7qrRYKOG6Fzs95uqnwQ1YjHd4w,361
19
- netbox_ddns/migrations/0001_initial.py,sha256=pYwGDj9C3mPUuc8lfiXqTOYEhZ-MpGhLywGRulHcZQA,2461
20
- netbox_ddns/migrations/0002_add_ttl.py,sha256=HP_lzWLZeSzgkIFFiGUgdzkPDRYt48uNwNTdAFwEwdg,617
21
- netbox_ddns/migrations/0003_dnsstatus.py,sha256=TBQltrJeyk9q24_WdFpnUfMbV2-1VDt3ADuXN65bVJw,1200
22
- netbox_ddns/migrations/0004_ensure_trailing_dot.py,sha256=SxKzmMC8IaO9ZDGRPzI3tWWt6AT0q01Dg1tY60mc1Mc,1243
23
- netbox_ddns/migrations/0005_extradnsname.py,sha256=80f8OANyKpOa5LMZPQgRBdFQQ7ELjUeE0AU4fw5p114,1429
24
- netbox_ddns/migrations/0006_extradns_cname.py,sha256=-To2qntWjzhnn3eTUX0JZRtf79NU06hkTJKs3CmTJiM,456
25
- netbox_ddns/migrations/0007_zone_meta.py,sha256=iKHEk-KUJYbaAvuXL6YrsZsMcEPCYqs0EoEb6hRr_m8,416
26
- netbox_ddns/migrations/0008_server_server_port.py,sha256=qqCMbOVJgxNmoEd2WofNy6QT6QbsiiML_ZzAaXuo0WI,530
27
- netbox_ddns/migrations/0009_alter_dnsstatus_id_alter_extradnsname_id_and_more.py,sha256=3pjw6MqigeunuaHX011a2-yzxhwG3cELmtp4pmTx_BQ,1204
28
- netbox_ddns/migrations/0010_extradnsname_created_extradnsname_custom_field_data_and_more.py,sha256=4bpm4nZLCHU0CqnCF6qWGtZd5x9flKrhJYRuAGFycwA,1157
29
- netbox_ddns/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
- netbox_ddns/templates/netbox_ddns/extradnsname.html,sha256=yWxangwanerD-poPxCLql3y-ojzoFCFRVGzVEwfzMNk,6234
31
- netbox_ddns/templates/netbox_ddns/ipaddress/dns_extra.html,sha256=80fVzSSQUY1b5wfN_fLqbp_oCpByOlVsEQx5ezj2F_w,713
32
- netbox_ddns/templates/netbox_ddns/ipaddress/dns_info.html,sha256=x4cpUovY3ZxmFoJeTLeqNUIw4ezoBkNfsYaRA6abUh4,1714
33
- netbox_ddns/templates/netbox_ddns/ipaddress/dns_refresh_button.html,sha256=BBFwn2AP9PHfaU1ieYoB6X2eX84pPrUYYILbwYiKApc,430
34
- netbox_ddns-1.4.0.dist-info/LICENSE.txt,sha256=DVQuDIgE45qn836wDaWnYhSdxoLXgpRRKH4RuTjpRZQ,10174
35
- netbox_ddns-1.4.0.dist-info/METADATA,sha256=t8W8fHcCq9L2BnReAtSVgeuzLEIRV2OWuoGVZJnQAns,2266
36
- netbox_ddns-1.4.0.dist-info/WHEEL,sha256=R06PA3UVYHThwHvxuRWMqaGcr-PuniXahwjmQRFMEkY,91
37
- netbox_ddns-1.4.0.dist-info/top_level.txt,sha256=nSPx7dwqPj2hyzG2H0ohzHt0kkyzA-6M3zYRL6qAm-s,12
38
- netbox_ddns-1.4.0.dist-info/RECORD,,