netbox-plugin-dns 1.0.1__py3-none-any.whl → 1.0.2__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.
- netbox_dns/__init__.py +1 -1
- netbox_dns/mixins/__init__.py +1 -0
- netbox_dns/mixins/object_modification.py +26 -0
- netbox_dns/models/nameserver.py +4 -5
- netbox_dns/models/record.py +10 -4
- netbox_dns/models/view.py +10 -8
- netbox_dns/models/zone.py +10 -21
- netbox_dns/tables/view.py +1 -1
- netbox_dns/validators/dns_name.py +3 -3
- {netbox_plugin_dns-1.0.1.dist-info → netbox_plugin_dns-1.0.2.dist-info}/LICENSE +2 -1
- {netbox_plugin_dns-1.0.1.dist-info → netbox_plugin_dns-1.0.2.dist-info}/METADATA +2 -1
- {netbox_plugin_dns-1.0.1.dist-info → netbox_plugin_dns-1.0.2.dist-info}/RECORD +13 -11
- {netbox_plugin_dns-1.0.1.dist-info → netbox_plugin_dns-1.0.2.dist-info}/WHEEL +0 -0
netbox_dns/__init__.py
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from .object_modification import *
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
from netbox.models import NetBoxModel
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class ObjectModificationMixin:
|
|
5
|
+
def __init__(self, *args, **kwargs):
|
|
6
|
+
super().__init__(*args, **kwargs)
|
|
7
|
+
|
|
8
|
+
if not hasattr(self.__class__, "check_fields"):
|
|
9
|
+
self.__class__.check_fields = (
|
|
10
|
+
{field.name for field in self._meta.fields}
|
|
11
|
+
- {field.name for field in NetBoxModel._meta.fields}
|
|
12
|
+
- {"id"}
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
@property
|
|
16
|
+
def changed_fields(self):
|
|
17
|
+
if self.pk is None:
|
|
18
|
+
return None
|
|
19
|
+
|
|
20
|
+
saved = self.__class__.objects.get(pk=self.pk)
|
|
21
|
+
|
|
22
|
+
return {
|
|
23
|
+
field
|
|
24
|
+
for field in self.check_fields
|
|
25
|
+
if getattr(self, field) != getattr(saved, field)
|
|
26
|
+
}
|
netbox_dns/models/nameserver.py
CHANGED
|
@@ -14,11 +14,12 @@ from netbox_dns.utilities import (
|
|
|
14
14
|
NameFormatError,
|
|
15
15
|
)
|
|
16
16
|
from netbox_dns.validators import validate_fqdn
|
|
17
|
+
from netbox_dns.mixins import ObjectModificationMixin
|
|
17
18
|
|
|
18
19
|
from .record import Record, RecordTypeChoices
|
|
19
20
|
|
|
20
21
|
|
|
21
|
-
class NameServer(NetBoxModel):
|
|
22
|
+
class NameServer(ObjectModificationMixin, NetBoxModel):
|
|
22
23
|
name = models.CharField(
|
|
23
24
|
unique=True,
|
|
24
25
|
max_length=255,
|
|
@@ -79,14 +80,12 @@ class NameServer(NetBoxModel):
|
|
|
79
80
|
def save(self, *args, **kwargs):
|
|
80
81
|
self.full_clean()
|
|
81
82
|
|
|
82
|
-
|
|
83
|
-
self.pk is not None and self.name != NameServer.objects.get(pk=self.pk).name
|
|
84
|
-
)
|
|
83
|
+
changed_fields = self.changed_fields
|
|
85
84
|
|
|
86
85
|
with transaction.atomic():
|
|
87
86
|
super().save(*args, **kwargs)
|
|
88
87
|
|
|
89
|
-
if
|
|
88
|
+
if changed_fields is not None and "name" in changed_fields:
|
|
90
89
|
soa_zones = self.zones_soa.all()
|
|
91
90
|
for soa_zone in soa_zones:
|
|
92
91
|
soa_zone.update_soa_record()
|
netbox_dns/models/record.py
CHANGED
|
@@ -25,6 +25,7 @@ from netbox_dns.validators import (
|
|
|
25
25
|
validate_extended_hostname,
|
|
26
26
|
validate_domain_name,
|
|
27
27
|
)
|
|
28
|
+
from netbox_dns.mixins import ObjectModificationMixin
|
|
28
29
|
|
|
29
30
|
# +
|
|
30
31
|
# This is a hack designed to break cyclic imports between Record and Zone
|
|
@@ -102,7 +103,7 @@ class RecordStatusChoices(ChoiceSet):
|
|
|
102
103
|
]
|
|
103
104
|
|
|
104
105
|
|
|
105
|
-
class Record(NetBoxModel):
|
|
106
|
+
class Record(ObjectModificationMixin, NetBoxModel):
|
|
106
107
|
ACTIVE_STATUS_LIST = (RecordStatusChoices.STATUS_ACTIVE,)
|
|
107
108
|
|
|
108
109
|
unique_ptr_qs = Q(
|
|
@@ -211,9 +212,12 @@ class Record(NetBoxModel):
|
|
|
211
212
|
|
|
212
213
|
def __str__(self):
|
|
213
214
|
try:
|
|
214
|
-
|
|
215
|
+
fqdn = dns_name.from_text(
|
|
216
|
+
self.name, origin=dns_name.from_text(self.zone.name)
|
|
217
|
+
).relativize(dns_name.root)
|
|
218
|
+
name = fqdn.to_unicode()
|
|
215
219
|
except dns_name.IDNAException:
|
|
216
|
-
name =
|
|
220
|
+
name = fqdn.to_text()
|
|
217
221
|
except dns_name.LabelTooLong:
|
|
218
222
|
name = f"{self.name[:59]}..."
|
|
219
223
|
|
|
@@ -783,7 +787,9 @@ class Record(NetBoxModel):
|
|
|
783
787
|
self.ptr_record.delete()
|
|
784
788
|
self.ptr_record = None
|
|
785
789
|
|
|
786
|
-
|
|
790
|
+
changed_fields = self.changed_fields
|
|
791
|
+
if changed_fields is None or changed_fields:
|
|
792
|
+
super().save(*args, **kwargs)
|
|
787
793
|
|
|
788
794
|
_zone = self.zone
|
|
789
795
|
if self.type != RecordTypeChoices.SOA and _zone.soa_serial_auto:
|
netbox_dns/models/view.py
CHANGED
|
@@ -7,8 +7,10 @@ from netbox.search import SearchIndex, register_search
|
|
|
7
7
|
from netbox.context import current_request
|
|
8
8
|
from utilities.exceptions import AbortRequest
|
|
9
9
|
|
|
10
|
+
from netbox_dns.mixins import ObjectModificationMixin
|
|
10
11
|
|
|
11
|
-
|
|
12
|
+
|
|
13
|
+
class View(ObjectModificationMixin, NetBoxModel):
|
|
12
14
|
name = models.CharField(
|
|
13
15
|
unique=True,
|
|
14
16
|
max_length=255,
|
|
@@ -53,13 +55,11 @@ class View(NetBoxModel):
|
|
|
53
55
|
super().delete(*args, **kwargs)
|
|
54
56
|
|
|
55
57
|
def clean(self, *args, old_state=None, **kwargs):
|
|
56
|
-
if self.
|
|
58
|
+
if (changed_fields := self.changed_fields) is None:
|
|
57
59
|
return
|
|
58
60
|
|
|
59
|
-
old_state = View.objects.get(pk=self.pk)
|
|
60
|
-
|
|
61
61
|
if (
|
|
62
|
-
|
|
62
|
+
"default_view" in changed_fields
|
|
63
63
|
and not self.default_view
|
|
64
64
|
and not View.objects.filter(default_view=True).exclude(pk=self.pk).exists()
|
|
65
65
|
):
|
|
@@ -74,12 +74,14 @@ class View(NetBoxModel):
|
|
|
74
74
|
def save(self, *args, **kwargs):
|
|
75
75
|
self.clean()
|
|
76
76
|
|
|
77
|
-
|
|
77
|
+
changed_fields = self.changed_fields
|
|
78
78
|
|
|
79
79
|
super().save(*args, **kwargs)
|
|
80
80
|
|
|
81
|
-
if (
|
|
82
|
-
|
|
81
|
+
if (changed_fields is None and self.default_view) or (
|
|
82
|
+
changed_fields is not None
|
|
83
|
+
and self.default_view
|
|
84
|
+
and "default_view" in changed_fields
|
|
83
85
|
):
|
|
84
86
|
other_views = View.objects.filter(default_view=True).exclude(pk=self.pk)
|
|
85
87
|
for view in other_views:
|
netbox_dns/models/zone.py
CHANGED
|
@@ -35,6 +35,7 @@ from netbox_dns.validators import (
|
|
|
35
35
|
validate_fqdn,
|
|
36
36
|
validate_domain_name,
|
|
37
37
|
)
|
|
38
|
+
from netbox_dns.mixins import ObjectModificationMixin
|
|
38
39
|
|
|
39
40
|
# +
|
|
40
41
|
# This is a hack designed to break cyclic imports between View, Record and Zone
|
|
@@ -77,7 +78,7 @@ class ZoneStatusChoices(ChoiceSet):
|
|
|
77
78
|
]
|
|
78
79
|
|
|
79
80
|
|
|
80
|
-
class Zone(NetBoxModel):
|
|
81
|
+
class Zone(ObjectModificationMixin, NetBoxModel):
|
|
81
82
|
ACTIVE_STATUS_LIST = (ZoneStatusChoices.STATUS_ACTIVE,)
|
|
82
83
|
|
|
83
84
|
view = models.ForeignKey(
|
|
@@ -683,17 +684,7 @@ class Zone(NetBoxModel):
|
|
|
683
684
|
def save(self, *args, **kwargs):
|
|
684
685
|
self.full_clean()
|
|
685
686
|
|
|
686
|
-
|
|
687
|
-
if not new_zone:
|
|
688
|
-
old_zone = Zone.objects.get(pk=self.pk)
|
|
689
|
-
|
|
690
|
-
name_changed = not new_zone and old_zone.name != self.name
|
|
691
|
-
view_changed = not new_zone and old_zone.view != self.view
|
|
692
|
-
status_changed = not new_zone and old_zone.status != self.status
|
|
693
|
-
rfc2317_changed = not new_zone and (
|
|
694
|
-
old_zone.rfc2317_prefix != self.rfc2317_prefix
|
|
695
|
-
or old_zone.rfc2317_parent_managed != self.rfc2317_parent_managed
|
|
696
|
-
)
|
|
687
|
+
changed_fields = self.changed_fields
|
|
697
688
|
|
|
698
689
|
if self.soa_serial_auto:
|
|
699
690
|
self.soa_serial = self.get_auto_serial()
|
|
@@ -701,7 +692,7 @@ class Zone(NetBoxModel):
|
|
|
701
692
|
super().save(*args, **kwargs)
|
|
702
693
|
|
|
703
694
|
if (
|
|
704
|
-
|
|
695
|
+
changed_fields is None or {"name", "view", "status"} & changed_fields
|
|
705
696
|
) and self.is_reverse_zone:
|
|
706
697
|
zones = Zone.objects.filter(
|
|
707
698
|
view=self.view,
|
|
@@ -733,11 +724,9 @@ class Zone(NetBoxModel):
|
|
|
733
724
|
child_zone.update_rfc2317_parent_zone()
|
|
734
725
|
|
|
735
726
|
if (
|
|
736
|
-
|
|
737
|
-
or
|
|
738
|
-
|
|
739
|
-
or status_changed
|
|
740
|
-
or rfc2317_changed
|
|
727
|
+
changed_fields is None
|
|
728
|
+
or {"name", "view", "status", "rfc2317_prefix", "rfc2317_parent_managed"}
|
|
729
|
+
& changed_fields
|
|
741
730
|
) and self.is_rfc2317_zone:
|
|
742
731
|
zones = Zone.objects.filter(
|
|
743
732
|
view=self.view,
|
|
@@ -763,7 +752,7 @@ class Zone(NetBoxModel):
|
|
|
763
752
|
|
|
764
753
|
self.update_rfc2317_parent_zone()
|
|
765
754
|
|
|
766
|
-
elif
|
|
755
|
+
elif changed_fields is not None and {"name", "view", "status"} & changed_fields:
|
|
767
756
|
for address_record in self.record_set.filter(
|
|
768
757
|
type__in=(record.RecordTypeChoices.A, record.RecordTypeChoices.AAAA)
|
|
769
758
|
):
|
|
@@ -772,7 +761,7 @@ class Zone(NetBoxModel):
|
|
|
772
761
|
# Fix name in IP Address when zone name is changed
|
|
773
762
|
if (
|
|
774
763
|
get_plugin_config("netbox_dns", "feature_ipam_coupling")
|
|
775
|
-
and
|
|
764
|
+
and "name" in changed_fields
|
|
776
765
|
):
|
|
777
766
|
for ip in IPAddress.objects.filter(
|
|
778
767
|
custom_field_data__ipaddress_dns_zone_id=self.pk
|
|
@@ -780,7 +769,7 @@ class Zone(NetBoxModel):
|
|
|
780
769
|
ip.dns_name = f'{ip.custom_field_data["ipaddress_dns_record_name"]}.{self.name}'
|
|
781
770
|
ip.save(update_fields=["dns_name"])
|
|
782
771
|
|
|
783
|
-
if
|
|
772
|
+
if changed_fields is not None and "name" in changed_fields:
|
|
784
773
|
for _record in self.record_set.all():
|
|
785
774
|
_record.save(
|
|
786
775
|
update_fields=["fqdn"],
|
netbox_dns/tables/view.py
CHANGED
|
@@ -10,7 +10,7 @@ class ViewTable(TenancyColumnsMixin, NetBoxTable):
|
|
|
10
10
|
name = tables.Column(
|
|
11
11
|
linkify=True,
|
|
12
12
|
)
|
|
13
|
-
default_view = tables.
|
|
13
|
+
default_view = tables.BooleanColumn(
|
|
14
14
|
verbose_name="Default View",
|
|
15
15
|
)
|
|
16
16
|
tags = TagColumn(url_name="plugins:netbox_dns:view_list")
|
|
@@ -54,9 +54,9 @@ def validate_domain_name(name, always_tolerant=False, allow_empty_label=False):
|
|
|
54
54
|
):
|
|
55
55
|
return
|
|
56
56
|
|
|
57
|
-
if always_tolerant
|
|
58
|
-
|
|
59
|
-
):
|
|
57
|
+
if always_tolerant:
|
|
58
|
+
regex = rf"^{TOLERANT_LEADING_UNDERSCORE_LABEL}(\.{TOLERANT_LEADING_UNDERSCORE_LABEL})*\.?$"
|
|
59
|
+
elif get_plugin_config("netbox_dns", "tolerate_underscores_in_hostnames"):
|
|
60
60
|
regex = rf"^{TOLERANT_LABEL}(\.{TOLERANT_LABEL})*\.?$"
|
|
61
61
|
else:
|
|
62
62
|
regex = rf"^{LABEL}(\.{LABEL})*\.?$"
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
MIT License
|
|
2
2
|
|
|
3
|
-
Copyright (c) 2021 Aurora Research Lab
|
|
3
|
+
Copyright (c) 2021-2023 Aurora Research Lab
|
|
4
|
+
Copyright (c) 2023 Peter Eckel
|
|
4
5
|
|
|
5
6
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
7
|
of this software and associated documentation files (the "Software"), to deal
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: netbox-plugin-dns
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.2
|
|
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
|
|
@@ -44,6 +44,7 @@ The main focus of the plugin is to ensure the quality of the data stored in it.
|
|
|
44
44
|
* Validation of record names and values
|
|
45
45
|
* Automatic maintenance of PTR records for IPv6 and IPv4 address records
|
|
46
46
|
* Automatic generation of SOA records, optionally including the serial number of the zone data
|
|
47
|
+
* Validation of changes to the SOA SERIAL number, whether they are done automatically or manually
|
|
47
48
|
* Validation of record types such as CNAME and singletons, to ensure DNS zone validity
|
|
48
49
|
* Support for [RFC 2317](https://datatracker.ietf.org/doc/html/rfc2317) delegation of PTR zones for IPv4 subnets longer than 24 bits
|
|
49
50
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
netbox_dns/__init__.py,sha256
|
|
1
|
+
netbox_dns/__init__.py,sha256=-p2PZ7vCqtkAgdnSagyqpcfTghoVPFbsph9FYddm-jg,1038
|
|
2
2
|
netbox_dns/api/nested_serializers.py,sha256=kkTU4Hylkbam9-lIniv8E0nTQwE1bz8D_GzIEOUy0Mw,2145
|
|
3
3
|
netbox_dns/api/serializers.py,sha256=C4-TP1luq9QjEHjPS5cW7u2flAEdIFjghpVd_sa5S_Y,249
|
|
4
4
|
netbox_dns/api/serializers_/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -54,13 +54,15 @@ netbox_dns/migrations/0027_alter_registrar_iana_id.py,sha256=QUtRIrqqfkraFmzzeJF
|
|
|
54
54
|
netbox_dns/migrations/0028_rfc2317_fields.py,sha256=D8r43xxBjYXiL6ycmX8RY5_WG7tRYEDjutOeYM1H56I,1364
|
|
55
55
|
netbox_dns/migrations/0029_record_fqdn.py,sha256=UAAU38ekKQyiYDOJlcrz6Qbk4bqZfSHZyAHUZFFQrOw,808
|
|
56
56
|
netbox_dns/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
57
|
+
netbox_dns/mixins/__init__.py,sha256=LxTEfpod_RHCyMtnzDljv0_dwqp2z3Q6tqbXW8LTGD8,35
|
|
58
|
+
netbox_dns/mixins/object_modification.py,sha256=wq01fyCAai2staM2g5wV9BbW1hDUeRdXfJrSSkc2YK8,726
|
|
57
59
|
netbox_dns/models/__init__.py,sha256=Q7UIEe2vGh18AZN4er6CykciwXPQGgUq0L-9718wZqU,182
|
|
58
60
|
netbox_dns/models/contact.py,sha256=xXmNGuM6k1U98jO3mMmp93PXamh1YZQ270JOcy0FFnE,2958
|
|
59
|
-
netbox_dns/models/nameserver.py,sha256=
|
|
60
|
-
netbox_dns/models/record.py,sha256=
|
|
61
|
+
netbox_dns/models/nameserver.py,sha256=5Z0sFTqpxksCFCOExxXZEY_mpEVTKLMtFv5urD9yvdg,3121
|
|
62
|
+
netbox_dns/models/record.py,sha256=foj8PrFwilyXCU-H69vJanq5CkiD2N_oUC86_aA8WmE,26299
|
|
61
63
|
netbox_dns/models/registrar.py,sha256=yidjVCq7WPECsHLKQRRCSzGbvG2jIXu8lqAKox0SU5Q,1502
|
|
62
|
-
netbox_dns/models/view.py,sha256=
|
|
63
|
-
netbox_dns/models/zone.py,sha256=
|
|
64
|
+
netbox_dns/models/view.py,sha256=HgQSpD8zQCxDpNel0b1_m4GlMYoRBpxiu6-Dtb1YnxI,2712
|
|
65
|
+
netbox_dns/models/zone.py,sha256=ZBCMw2mUWaxsu-ULNI9MDVBy5XbuJlqOtQVEHoMmj24,28160
|
|
64
66
|
netbox_dns/navigation.py,sha256=ykZJE5X-sqlnaTIU_pRzsio8Ux8zZVLH-iNsC2QqIxs,4062
|
|
65
67
|
netbox_dns/signals/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
66
68
|
netbox_dns/signals/ipam_coupling.py,sha256=kJUKHUgq5XgWMhxB-312SPaZAYTLIYGgKO0lz2-z_rg,5594
|
|
@@ -69,7 +71,7 @@ netbox_dns/tables/contact.py,sha256=guT_wC3NJMYbVbXeMOg6nqmmmDcnjfbRI-SkjFDEYdU,
|
|
|
69
71
|
netbox_dns/tables/nameserver.py,sha256=8BfXzDXNuhZHEyHjGlL4EA1LYx7XU3EPGHlby0k33II,767
|
|
70
72
|
netbox_dns/tables/record.py,sha256=VwBWMiZN_Lkl9SXfJLzd8-7TM1CKetwE7azhScF4r7I,3162
|
|
71
73
|
netbox_dns/tables/registrar.py,sha256=6C8XpxvR9O7IoVK0RD5RoZgXjkm-ORSBeKP6KbwcjHA,648
|
|
72
|
-
netbox_dns/tables/view.py,sha256=
|
|
74
|
+
netbox_dns/tables/view.py,sha256=NaZmDVefmrRWF711_zOJqOmguU66LtI6bOZQ9ZdxniA,699
|
|
73
75
|
netbox_dns/tables/zone.py,sha256=4TlTB7lVsztZJ41aetkqr6PWosjZP-xc2sB9gDnw0z8,1886
|
|
74
76
|
netbox_dns/template_content.py,sha256=NmtfseYrYcU3RxzCI5okwCpMTfTEs4d8aJnDYwo4MO8,3801
|
|
75
77
|
netbox_dns/templates/netbox_dns/contact.html,sha256=fMHAQyLXIxohKoCTxFEnKetl9UVXeQgjasfpv_JONaw,2855
|
|
@@ -97,7 +99,7 @@ netbox_dns/urls/zone.py,sha256=wYRAhtq695K0QSrvNj6gdFaf1gExEN5vwmYXLAA9FrU,1849
|
|
|
97
99
|
netbox_dns/utilities/__init__.py,sha256=dVPi1gAGaRum-aQYi0oLgagRYrTVQNY5bmi2Ig02cOo,1835
|
|
98
100
|
netbox_dns/utilities/ipam_coupling.py,sha256=6z1Fx8fhesf15gLTHYc0KVqE3_YhJbNPAjqFOvWlqK8,3441
|
|
99
101
|
netbox_dns/validators/__init__.py,sha256=5W8s31R1aT5B_mKJjTRwogEKj-Xun05iCyvRuYVGkdM,47
|
|
100
|
-
netbox_dns/validators/dns_name.py,sha256=
|
|
102
|
+
netbox_dns/validators/dns_name.py,sha256=Q_Xf4YpztLWHlg5OLGaalfh5W5GakDpRiZ38KXqcuaU,2543
|
|
101
103
|
netbox_dns/validators/rfc2317.py,sha256=L2Z-z5ghktFyWMLVZPeK8OEVGnQzbXD11fha2xGHM5E,501
|
|
102
104
|
netbox_dns/views/__init__.py,sha256=Aw8HrCTjaJfu5JSwJsQRHfOUz4zKwAmZNByT9q6BrFU,136
|
|
103
105
|
netbox_dns/views/contact.py,sha256=mBWM92UVjoz90JCUGO7kaFUI0_yA7tH4lSHxOZQB3MQ,2253
|
|
@@ -106,7 +108,7 @@ netbox_dns/views/record.py,sha256=DDHbxQ33P_mduoPquvyXrdrqNT6r79qShLg1uJzU4Ic,43
|
|
|
106
108
|
netbox_dns/views/registrar.py,sha256=NK6jTYRwRjaVjYmI7T4Phh_gjXg9yPrxl-7vciZ9doc,2090
|
|
107
109
|
netbox_dns/views/view.py,sha256=a3l6pybhqGb_RMxrRgFT1Gia9tRq8EmXFxPv9WUId0U,1913
|
|
108
110
|
netbox_dns/views/zone.py,sha256=EqkjXuX1xhkjDgaSNgFBvnA74IhuK_zDWlHPb3_4YKQ,4591
|
|
109
|
-
netbox_plugin_dns-1.0.
|
|
110
|
-
netbox_plugin_dns-1.0.
|
|
111
|
-
netbox_plugin_dns-1.0.
|
|
112
|
-
netbox_plugin_dns-1.0.
|
|
111
|
+
netbox_plugin_dns-1.0.2.dist-info/LICENSE,sha256=I3tDu11bZfhFm3EkV4zOD5TmWgLjnUNLEFwrdjniZYs,1112
|
|
112
|
+
netbox_plugin_dns-1.0.2.dist-info/METADATA,sha256=g50relhX2IGxacZ1-5DMEyzS5CxjjoLwnCQHipiNCko,6146
|
|
113
|
+
netbox_plugin_dns-1.0.2.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
|
114
|
+
netbox_plugin_dns-1.0.2.dist-info/RECORD,,
|
|
File without changes
|