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.
- netbox_ddns/__init__.py +3 -3
- netbox_ddns/admin.py +0 -156
- netbox_ddns/api/serializers.py +20 -2
- netbox_ddns/api/views.py +1 -0
- netbox_ddns/background_tasks.py +28 -5
- netbox_ddns/filtersets.py +23 -1
- netbox_ddns/forms.py +54 -3
- netbox_ddns/migrations/0011_server_created_server_custom_field_data_and_more.py +36 -0
- netbox_ddns/migrations/0012_zone_created_zone_custom_field_data_and_more.py +36 -0
- netbox_ddns/migrations/0013_reversezone_created_reversezone_custom_field_data_and_more.py +36 -0
- netbox_ddns/migrations/0014_alter_extradnsname_name.py +19 -0
- netbox_ddns/migrations/0015_server_protocol.py +18 -0
- netbox_ddns/models.py +61 -9
- netbox_ddns/navigation.py +62 -0
- netbox_ddns/tables.py +78 -32
- netbox_ddns/template_content.py +40 -3
- netbox_ddns/templates/netbox_ddns/extradnsname.html +23 -131
- netbox_ddns/templates/netbox_ddns/ipaddress/dns_extra.html +1 -1
- netbox_ddns/templates/netbox_ddns/managed_dns_names.html +17 -0
- netbox_ddns/templates/netbox_ddns/reversezone.html +51 -0
- netbox_ddns/templates/netbox_ddns/server.html +74 -0
- netbox_ddns/templates/netbox_ddns/update_reverse_zone.html +11 -0
- netbox_ddns/templates/netbox_ddns/update_zone.html +11 -0
- netbox_ddns/templates/netbox_ddns/zone.html +53 -0
- netbox_ddns/urls.py +32 -14
- netbox_ddns/utils.py +95 -0
- netbox_ddns/validators.py +6 -0
- netbox_ddns/views.py +268 -84
- {netbox_ddns-1.4.0.dist-info → netbox_ddns-1.7.0.dist-info}/METADATA +7 -5
- netbox_ddns-1.7.0.dist-info/RECORD +50 -0
- {netbox_ddns-1.4.0.dist-info → netbox_ddns-1.7.0.dist-info}/WHEEL +1 -1
- netbox_ddns-1.4.0.dist-info/RECORD +0 -38
- {netbox_ddns-1.4.0.dist-info → netbox_ddns-1.7.0.dist-info/licenses}/LICENSE.txt +0 -0
- {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.
|
|
12
|
-
from netbox_ddns.
|
|
13
|
-
from netbox_ddns.
|
|
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
|
|
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
|
-
|
|
20
|
-
|
|
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
|
-
|
|
37
|
-
|
|
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
|
-
|
|
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
|
-
|
|
42
|
-
|
|
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
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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
|
-
|
|
58
|
-
|
|
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
|
-
|
|
62
|
-
|
|
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 =
|
|
65
|
-
# NetBox < 3.2.0
|
|
66
|
-
@property
|
|
67
|
-
def model_form(self):
|
|
68
|
-
return self.form
|
|
185
|
+
form = ExtraDNSNameForm
|
|
69
186
|
|
|
70
187
|
|
|
71
|
-
|
|
72
|
-
|
|
188
|
+
@register_model_view(ExtraDNSName, 'edit')
|
|
189
|
+
class ExtraDNSNameEditView(ObjectEditView):
|
|
73
190
|
queryset = ExtraDNSName.objects.all()
|
|
191
|
+
form = ExtraDNSNameIPAddressForm
|
|
74
192
|
|
|
75
|
-
|
|
76
|
-
|
|
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
|
-
|
|
80
|
-
|
|
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
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: netbox-ddns
|
|
3
|
-
Version: 1.
|
|
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 ::
|
|
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.
|
|
15
|
-
|
|
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,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,,
|
|
File without changes
|
|
File without changes
|