netbox-plugin-dns 0.21.4__py3-none-any.whl → 1.4.7__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_dns/__init__.py +106 -41
- netbox_dns/api/field_serializers.py +25 -0
- netbox_dns/api/nested_serializers.py +95 -52
- netbox_dns/api/serializers.py +14 -296
- netbox_dns/api/serializers_/__init__.py +0 -0
- netbox_dns/api/serializers_/dnssec_key_template.py +69 -0
- netbox_dns/api/serializers_/dnssec_policy.py +165 -0
- netbox_dns/api/serializers_/nameserver.py +56 -0
- netbox_dns/api/serializers_/prefix.py +18 -0
- netbox_dns/api/serializers_/record.py +105 -0
- netbox_dns/api/serializers_/record_template.py +71 -0
- netbox_dns/api/serializers_/registrar.py +45 -0
- netbox_dns/api/serializers_/registration_contact.py +50 -0
- netbox_dns/api/serializers_/view.py +81 -0
- netbox_dns/api/serializers_/zone.py +247 -0
- netbox_dns/api/serializers_/zone_template.py +157 -0
- netbox_dns/api/urls.py +13 -2
- netbox_dns/api/views.py +96 -58
- netbox_dns/choices/__init__.py +4 -0
- netbox_dns/choices/dnssec_key_template.py +67 -0
- netbox_dns/choices/dnssec_policy.py +40 -0
- netbox_dns/choices/record.py +104 -0
- netbox_dns/choices/utilities.py +4 -0
- netbox_dns/choices/zone.py +119 -0
- netbox_dns/fields/__init__.py +4 -0
- netbox_dns/fields/address.py +22 -16
- netbox_dns/fields/choice_array.py +33 -0
- netbox_dns/fields/ipam.py +15 -0
- netbox_dns/fields/network.py +42 -18
- netbox_dns/fields/rfc2317.py +97 -0
- netbox_dns/fields/timeperiod.py +33 -0
- netbox_dns/filters.py +7 -0
- netbox_dns/filtersets/__init__.py +12 -0
- netbox_dns/filtersets/dnssec_key_template.py +57 -0
- netbox_dns/filtersets/dnssec_policy.py +101 -0
- netbox_dns/filtersets/nameserver.py +46 -0
- netbox_dns/filtersets/record.py +135 -0
- netbox_dns/filtersets/record_template.py +59 -0
- netbox_dns/{filters → filtersets}/registrar.py +8 -1
- netbox_dns/{filters/contact.py → filtersets/registration_contact.py} +9 -3
- netbox_dns/filtersets/view.py +45 -0
- netbox_dns/filtersets/zone.py +254 -0
- netbox_dns/filtersets/zone_template.py +165 -0
- netbox_dns/forms/__init__.py +5 -1
- netbox_dns/forms/dnssec_key_template.py +250 -0
- netbox_dns/forms/dnssec_policy.py +654 -0
- netbox_dns/forms/nameserver.py +121 -27
- netbox_dns/forms/record.py +215 -104
- netbox_dns/forms/record_template.py +285 -0
- netbox_dns/forms/registrar.py +108 -31
- netbox_dns/forms/registration_contact.py +282 -0
- netbox_dns/forms/view.py +331 -20
- netbox_dns/forms/zone.py +769 -373
- netbox_dns/forms/zone_template.py +463 -0
- netbox_dns/graphql/__init__.py +25 -22
- netbox_dns/graphql/enums.py +41 -0
- netbox_dns/graphql/filter_lookups.py +13 -0
- netbox_dns/graphql/filters/__init__.py +12 -0
- netbox_dns/graphql/filters/dnssec_key_template.py +63 -0
- netbox_dns/graphql/filters/dnssec_policy.py +124 -0
- netbox_dns/graphql/filters/nameserver.py +32 -0
- netbox_dns/graphql/filters/record.py +89 -0
- netbox_dns/graphql/filters/record_template.py +55 -0
- netbox_dns/graphql/filters/registrar.py +30 -0
- netbox_dns/graphql/filters/registration_contact.py +27 -0
- netbox_dns/graphql/filters/view.py +28 -0
- netbox_dns/graphql/filters/zone.py +147 -0
- netbox_dns/graphql/filters/zone_template.py +97 -0
- netbox_dns/graphql/schema.py +89 -7
- netbox_dns/graphql/types.py +355 -0
- netbox_dns/locale/de/LC_MESSAGES/django.mo +0 -0
- netbox_dns/locale/en/LC_MESSAGES/django.mo +0 -0
- netbox_dns/locale/fr/LC_MESSAGES/django.mo +0 -0
- netbox_dns/management/commands/cleanup_database.py +175 -156
- netbox_dns/management/commands/cleanup_rrset_ttl.py +64 -0
- netbox_dns/management/commands/rebuild_dnssync.py +23 -0
- netbox_dns/management/commands/setup_dnssync.py +140 -0
- netbox_dns/migrations/0001_squashed_netbox_dns_0_15.py +0 -27
- netbox_dns/migrations/0001_squashed_netbox_dns_0_22.py +557 -0
- netbox_dns/migrations/{0013_add_nameserver_zone_record_description.py → 0002_contact_description_registrar_description.py} +4 -9
- netbox_dns/migrations/0003_default_view.py +15 -0
- netbox_dns/migrations/0004_create_and_assign_default_view.py +26 -0
- netbox_dns/migrations/0005_alter_zone_view_not_null.py +18 -0
- netbox_dns/migrations/0006_templating.py +172 -0
- netbox_dns/migrations/0007_alter_ordering_options.py +25 -0
- netbox_dns/migrations/0008_view_prefixes.py +18 -0
- netbox_dns/migrations/0009_rename_contact_registrationcontact.py +36 -0
- netbox_dns/migrations/0010_view_ip_address_filter.py +18 -0
- netbox_dns/migrations/0011_rename_related_fields.py +63 -0
- netbox_dns/migrations/0012_natural_ordering.py +88 -0
- netbox_dns/migrations/0013_zonetemplate_soa_mname_zonetemplate_soa_rname.py +30 -0
- netbox_dns/migrations/0014_alter_unique_constraints_lowercase.py +42 -0
- netbox_dns/migrations/0015_dnssec.py +168 -0
- netbox_dns/migrations/{0015_add_record_status.py → 0016_dnssec_policy_status.py} +5 -4
- netbox_dns/migrations/0017_dnssec_policy_zone_zone_template.py +41 -0
- netbox_dns/migrations/0018_zone_domain_status_zone_expiration_date.py +23 -0
- netbox_dns/migrations/0019_dnssecpolicy_parental_agents.py +25 -0
- netbox_dns/migrations/0020_netbox_3_4.py +1 -1
- netbox_dns/migrations/0020_remove_dnssecpolicy_parental_agents_and_more.py +29 -0
- netbox_dns/migrations/0021_alter_record_ptr_record.py +25 -0
- netbox_dns/migrations/0021_record_ip_address.py +1 -1
- netbox_dns/migrations/0022_alter_record_ipam_ip_address.py +26 -0
- netbox_dns/migrations/0023_disable_ptr_false.py +27 -0
- netbox_dns/migrations/0024_zonetemplate_parental_agents.py +25 -0
- netbox_dns/migrations/0025_remove_zone_inline_signing_and_more.py +22 -0
- netbox_dns/migrations/0026_alter_dnssecpolicy_nsec3_opt_out.py +18 -0
- netbox_dns/migrations/0026_domain_registration.py +1 -1
- netbox_dns/migrations/0027_zone_comments.py +18 -0
- netbox_dns/migrations/0028_alter_zone_default_ttl_alter_zone_soa_minimum_and_more.py +54 -0
- netbox_dns/migrations/0028_rfc2317_fields.py +44 -0
- netbox_dns/migrations/0029_alter_registrationcontact_street.py +18 -0
- netbox_dns/migrations/0029_record_fqdn.py +30 -0
- netbox_dns/mixins/__init__.py +1 -0
- netbox_dns/mixins/object_modification.py +57 -0
- netbox_dns/models/__init__.py +5 -1
- netbox_dns/models/dnssec_key_template.py +114 -0
- netbox_dns/models/dnssec_policy.py +203 -0
- netbox_dns/models/nameserver.py +61 -30
- netbox_dns/models/record.py +781 -234
- netbox_dns/models/record_template.py +198 -0
- netbox_dns/models/registrar.py +34 -15
- netbox_dns/models/{contact.py → registration_contact.py} +72 -43
- netbox_dns/models/view.py +129 -9
- netbox_dns/models/zone.py +806 -242
- netbox_dns/models/zone_template.py +209 -0
- netbox_dns/navigation.py +176 -76
- netbox_dns/signals/__init__.py +0 -0
- netbox_dns/signals/dnssec.py +32 -0
- netbox_dns/signals/ipam_dnssync.py +216 -0
- netbox_dns/tables/__init__.py +5 -1
- netbox_dns/tables/dnssec_key_template.py +49 -0
- netbox_dns/tables/dnssec_policy.py +140 -0
- netbox_dns/tables/ipam_dnssync.py +12 -0
- netbox_dns/tables/nameserver.py +14 -17
- netbox_dns/tables/record.py +117 -59
- netbox_dns/tables/record_template.py +91 -0
- netbox_dns/tables/registrar.py +20 -10
- netbox_dns/tables/{contact.py → registration_contact.py} +22 -11
- netbox_dns/tables/view.py +47 -3
- netbox_dns/tables/zone.py +62 -31
- netbox_dns/tables/zone_template.py +78 -0
- netbox_dns/template_content.py +124 -38
- netbox_dns/templates/netbox_dns/dnsseckeytemplate.html +70 -0
- netbox_dns/templates/netbox_dns/dnssecpolicy.html +163 -0
- netbox_dns/templates/netbox_dns/nameserver.html +31 -28
- netbox_dns/templates/netbox_dns/record/managed.html +2 -1
- netbox_dns/templates/netbox_dns/record/related.html +17 -6
- netbox_dns/templates/netbox_dns/record.html +140 -93
- netbox_dns/templates/netbox_dns/recordtemplate.html +96 -0
- netbox_dns/templates/netbox_dns/registrar.html +41 -34
- netbox_dns/templates/netbox_dns/registrationcontact.html +76 -0
- netbox_dns/templates/netbox_dns/view/button.html +10 -0
- netbox_dns/templates/netbox_dns/view/prefix.html +44 -0
- netbox_dns/templates/netbox_dns/view/related.html +33 -0
- netbox_dns/templates/netbox_dns/view.html +62 -18
- netbox_dns/templates/netbox_dns/zone/base.html +6 -3
- netbox_dns/templates/netbox_dns/zone/child.html +6 -5
- netbox_dns/templates/netbox_dns/zone/child_zone.html +18 -0
- netbox_dns/templates/netbox_dns/zone/delegation_record.html +18 -0
- netbox_dns/templates/netbox_dns/zone/managed_record.html +1 -1
- netbox_dns/templates/netbox_dns/zone/record.html +6 -5
- netbox_dns/templates/netbox_dns/zone/registration.html +43 -24
- netbox_dns/templates/netbox_dns/zone/rfc2317_child_zone.html +18 -0
- netbox_dns/templates/netbox_dns/zone.html +178 -119
- netbox_dns/templates/netbox_dns/zonetemplate/child.html +46 -0
- netbox_dns/templates/netbox_dns/zonetemplate.html +124 -0
- netbox_dns/templatetags/netbox_dns.py +10 -0
- netbox_dns/urls.py +50 -210
- netbox_dns/utilities/__init__.py +3 -0
- netbox_dns/{utilities.py → utilities/conversions.py} +55 -7
- netbox_dns/utilities/dns.py +11 -0
- netbox_dns/utilities/ipam_dnssync.py +370 -0
- netbox_dns/validators/__init__.py +4 -0
- netbox_dns/validators/dns_name.py +116 -0
- netbox_dns/validators/dns_value.py +147 -0
- netbox_dns/validators/dnssec.py +148 -0
- netbox_dns/validators/rfc2317.py +28 -0
- netbox_dns/views/__init__.py +5 -1
- netbox_dns/views/dnssec_key_template.py +78 -0
- netbox_dns/views/dnssec_policy.py +146 -0
- netbox_dns/views/nameserver.py +34 -15
- netbox_dns/views/record.py +156 -15
- netbox_dns/views/record_template.py +93 -0
- netbox_dns/views/registrar.py +32 -13
- netbox_dns/views/registration_contact.py +101 -0
- netbox_dns/views/view.py +58 -14
- netbox_dns/views/zone.py +130 -33
- netbox_dns/views/zone_template.py +82 -0
- netbox_plugin_dns-1.4.7.dist-info/METADATA +132 -0
- netbox_plugin_dns-1.4.7.dist-info/RECORD +201 -0
- {netbox_plugin_dns-0.21.4.dist-info → netbox_plugin_dns-1.4.7.dist-info}/WHEEL +2 -1
- {netbox_plugin_dns-0.21.4.dist-info → netbox_plugin_dns-1.4.7.dist-info/licenses}/LICENSE +2 -1
- netbox_plugin_dns-1.4.7.dist-info/top_level.txt +1 -0
- netbox_dns/filters/__init__.py +0 -6
- netbox_dns/filters/nameserver.py +0 -18
- netbox_dns/filters/record.py +0 -53
- netbox_dns/filters/view.py +0 -18
- netbox_dns/filters/zone.py +0 -112
- netbox_dns/forms/contact.py +0 -211
- netbox_dns/graphql/contact.py +0 -19
- netbox_dns/graphql/nameserver.py +0 -19
- netbox_dns/graphql/record.py +0 -19
- netbox_dns/graphql/registrar.py +0 -19
- netbox_dns/graphql/view.py +0 -19
- netbox_dns/graphql/zone.py +0 -19
- netbox_dns/management/commands/setup_coupling.py +0 -75
- netbox_dns/management/commands/update_soa.py +0 -22
- netbox_dns/middleware.py +0 -226
- netbox_dns/migrations/0001_initial.py +0 -115
- netbox_dns/migrations/0002_zone_default_ttl.py +0 -18
- netbox_dns/migrations/0003_soa_managed_records.py +0 -112
- netbox_dns/migrations/0004_create_ptr_for_a_aaaa_records.py +0 -80
- netbox_dns/migrations/0005_update_ns_records.py +0 -41
- netbox_dns/migrations/0006_zone_soa_serial_auto.py +0 -29
- netbox_dns/migrations/0007_alter_zone_soa_serial_auto.py +0 -17
- netbox_dns/migrations/0008_zone_status_names.py +0 -21
- netbox_dns/migrations/0009_netbox32.py +0 -71
- netbox_dns/migrations/0010_update_soa_records.py +0 -58
- netbox_dns/migrations/0011_add_view_model.py +0 -70
- netbox_dns/migrations/0012_adjust_zone_and_record.py +0 -17
- netbox_dns/migrations/0014_add_view_description.py +0 -16
- netbox_dns/migrations/0016_cleanup_ptr_records.py +0 -38
- netbox_dns/migrations/0017_alter_record_ttl.py +0 -17
- netbox_dns/migrations/0018_zone_arpa_network.py +0 -51
- netbox_dns/migrations/0019_update_ns_ttl.py +0 -19
- netbox_dns/templates/netbox_dns/contact.html +0 -71
- netbox_dns/templates/netbox_dns/related_dns_objects.html +0 -21
- netbox_dns/templatetags/view_helpers.py +0 -15
- netbox_dns/validators.py +0 -57
- netbox_dns/views/contact.py +0 -83
- netbox_plugin_dns-0.21.4.dist-info/METADATA +0 -101
- netbox_plugin_dns-0.21.4.dist-info/RECORD +0 -110
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
from django.core.exceptions import ValidationError
|
|
2
|
+
from django.utils.translation import gettext_lazy as _
|
|
3
|
+
|
|
4
|
+
from netbox_dns.choices import (
|
|
5
|
+
DNSSECKeyTemplateTypeChoices,
|
|
6
|
+
DNSSECKeyTemplateAlgorithmChoices,
|
|
7
|
+
DNSSECKeyTemplateKeySizeChoices,
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
__all__ = (
|
|
11
|
+
"validate_key_template",
|
|
12
|
+
"validate_key_template_assignment",
|
|
13
|
+
"validate_key_template_lifetime",
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def validate_key_template(key_template):
|
|
18
|
+
if key_template.key_size is None:
|
|
19
|
+
return
|
|
20
|
+
|
|
21
|
+
if key_template.key_size not in DNSSECKeyTemplateKeySizeChoices.values():
|
|
22
|
+
raise ValidationError(
|
|
23
|
+
{
|
|
24
|
+
"key_size": _("{key_size} is not a supported key size.").format(
|
|
25
|
+
key_size=key_template.key_size
|
|
26
|
+
)
|
|
27
|
+
}
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
if key_template.algorithm != DNSSECKeyTemplateAlgorithmChoices.RSASHA256:
|
|
31
|
+
raise ValidationError(
|
|
32
|
+
{
|
|
33
|
+
"key_size": _(
|
|
34
|
+
"Specifying the key size is not supported for algorithm {algorithm}."
|
|
35
|
+
).format(algorithm=key_template.algorithm)
|
|
36
|
+
}
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def validate_key_template_assignment(key_templates):
|
|
41
|
+
if key_templates is None:
|
|
42
|
+
return
|
|
43
|
+
|
|
44
|
+
csk = key_templates.filter(type=DNSSECKeyTemplateTypeChoices.TYPE_CSK)
|
|
45
|
+
ksk = key_templates.filter(type=DNSSECKeyTemplateTypeChoices.TYPE_KSK)
|
|
46
|
+
zsk = key_templates.filter(type=DNSSECKeyTemplateTypeChoices.TYPE_ZSK)
|
|
47
|
+
|
|
48
|
+
if csk and (ksk or zsk):
|
|
49
|
+
raise ValidationError(
|
|
50
|
+
{
|
|
51
|
+
"key_templates": _(
|
|
52
|
+
"Specifying a CSK together with any other key template type is not allowed."
|
|
53
|
+
)
|
|
54
|
+
}
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
if any(
|
|
58
|
+
(
|
|
59
|
+
csk.count() > 1,
|
|
60
|
+
ksk.count() > 1,
|
|
61
|
+
zsk.count() > 1,
|
|
62
|
+
)
|
|
63
|
+
):
|
|
64
|
+
raise ValidationError(
|
|
65
|
+
{
|
|
66
|
+
"key_templates": _(
|
|
67
|
+
"At most one key template per type (CSK, KSK and ZSK) is allowed."
|
|
68
|
+
)
|
|
69
|
+
}
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
if (ksk and zsk) and (ksk.first().algorithm != zsk.first().algorithm):
|
|
73
|
+
raise ValidationError(
|
|
74
|
+
{"key_templates": _("KSK and ZSK must use the same algorithm.")}
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def validate_key_template_lifetime(key_template, policy, raise_exception=True):
|
|
79
|
+
key_lifetime = key_template.lifetime
|
|
80
|
+
|
|
81
|
+
if not key_lifetime:
|
|
82
|
+
return
|
|
83
|
+
|
|
84
|
+
dnskey_ttl = policy.get_effective_value("dnskey_ttl")
|
|
85
|
+
publish_safety = policy.get_effective_value("publish_safety")
|
|
86
|
+
zone_propagation_delay = policy.get_effective_value("zone_propagation_delay")
|
|
87
|
+
max_zone_ttl = policy.get_effective_value("max_zone_ttl")
|
|
88
|
+
retire_safety = policy.get_effective_value("retire_safety")
|
|
89
|
+
|
|
90
|
+
validation_errors = []
|
|
91
|
+
|
|
92
|
+
if (
|
|
93
|
+
dnskey_ttl is not None
|
|
94
|
+
and publish_safety is not None
|
|
95
|
+
and zone_propagation_delay is not None
|
|
96
|
+
and key_lifetime < (dnskey_ttl + publish_safety + zone_propagation_delay)
|
|
97
|
+
):
|
|
98
|
+
validation_errors.append(
|
|
99
|
+
_(
|
|
100
|
+
"Key Lifetime {lifetime} is less than DNSKEY TTL + Publish Safety + Zone Propagation Delay."
|
|
101
|
+
).format(lifetime=key_lifetime)
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
if (
|
|
105
|
+
max_zone_ttl is not None
|
|
106
|
+
and retire_safety is not None
|
|
107
|
+
and zone_propagation_delay is not None
|
|
108
|
+
and key_lifetime < (max_zone_ttl + retire_safety + zone_propagation_delay)
|
|
109
|
+
):
|
|
110
|
+
validation_errors.append(
|
|
111
|
+
_(
|
|
112
|
+
"Key Lifetime {lifetime} is less than Max Zone TTL + Retire Safety + Zone Propagation Delay."
|
|
113
|
+
).format(lifetime=key_lifetime)
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
if key_template.type == DNSSECKeyTemplateTypeChoices.TYPE_ZSK:
|
|
117
|
+
signatures_validity = policy.get_effective_value("signatures_validity")
|
|
118
|
+
signatures_refresh = policy.get_effective_value("signatures_refresh")
|
|
119
|
+
|
|
120
|
+
if (
|
|
121
|
+
signatures_validity is not None
|
|
122
|
+
and signatures_validity is not None
|
|
123
|
+
and key_lifetime < signatures_validity - signatures_refresh
|
|
124
|
+
):
|
|
125
|
+
validation_errors.append(
|
|
126
|
+
_(
|
|
127
|
+
"Key Lifetime {lifetime} is less than Signatures Validity - Signatures Refresh."
|
|
128
|
+
)
|
|
129
|
+
).format(lifetime=key_lifetime)
|
|
130
|
+
else:
|
|
131
|
+
parent_ds_ttl = policy.get_effective_value("parent_ds_ttl")
|
|
132
|
+
parent_propagation_delay = policy.get_effective_value(
|
|
133
|
+
"parent_propagation_delay"
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
if (
|
|
137
|
+
parent_ds_ttl is not None
|
|
138
|
+
and retire_safety is not None
|
|
139
|
+
and parent_propagation_delay is not None
|
|
140
|
+
and parent_ds_ttl < retire_safety + parent_propagation_delay
|
|
141
|
+
):
|
|
142
|
+
validation_errors.append(
|
|
143
|
+
_(
|
|
144
|
+
"Key Lifetime {lifetime} is less than Parent DS TTL + Retire Safety + Parent Propagation Delay."
|
|
145
|
+
).format(lifetime=key_lifetime)
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
return validation_errors
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
from django.core.exceptions import ValidationError
|
|
2
|
+
from django.utils.translation import gettext as _
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
__all__ = (
|
|
6
|
+
"validate_prefix",
|
|
7
|
+
"validate_ipv4",
|
|
8
|
+
"validate_rfc2317",
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def validate_prefix(prefix):
|
|
13
|
+
if prefix.ip != prefix.cidr.ip:
|
|
14
|
+
raise ValidationError(
|
|
15
|
+
_("{prefix} is not a valid prefix. Did you mean {cidr}?").format(
|
|
16
|
+
prefix=prefix, cidr=prefix.cidr
|
|
17
|
+
)
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def validate_ipv4(prefix):
|
|
22
|
+
if prefix.version != 4:
|
|
23
|
+
raise ValidationError(_("RFC2317 requires an IPv4 prefix."))
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def validate_rfc2317(prefix):
|
|
27
|
+
if prefix.prefixlen <= 24:
|
|
28
|
+
raise ValidationError(_("RFC2317 requires at least 25 bit prefix length."))
|
netbox_dns/views/__init__.py
CHANGED
|
@@ -2,5 +2,9 @@ from .view import *
|
|
|
2
2
|
from .zone import *
|
|
3
3
|
from .nameserver import *
|
|
4
4
|
from .record import *
|
|
5
|
-
from .
|
|
5
|
+
from .registration_contact import *
|
|
6
6
|
from .registrar import *
|
|
7
|
+
from .zone_template import *
|
|
8
|
+
from .record_template import *
|
|
9
|
+
from .dnssec_key_template import *
|
|
10
|
+
from .dnssec_policy import *
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
from netbox.views import generic
|
|
2
|
+
from utilities.views import register_model_view
|
|
3
|
+
|
|
4
|
+
from netbox_dns.filtersets import DNSSECKeyTemplateFilterSet
|
|
5
|
+
from netbox_dns.forms import (
|
|
6
|
+
DNSSECKeyTemplateImportForm,
|
|
7
|
+
DNSSECKeyTemplateFilterForm,
|
|
8
|
+
DNSSECKeyTemplateForm,
|
|
9
|
+
DNSSECKeyTemplateBulkEditForm,
|
|
10
|
+
)
|
|
11
|
+
from netbox_dns.models import DNSSECKeyTemplate
|
|
12
|
+
from netbox_dns.tables import DNSSECKeyTemplateTable, DNSSECPolicyDisplayTable
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
__all__ = (
|
|
16
|
+
"DNSSECKeyTemplateView",
|
|
17
|
+
"DNSSECKeyTemplateListView",
|
|
18
|
+
"DNSSECKeyTemplateEditView",
|
|
19
|
+
"DNSSECKeyTemplateDeleteView",
|
|
20
|
+
"DNSSECKeyTemplateBulkEditView",
|
|
21
|
+
"DNSSECKeyTemplateBulkImportView",
|
|
22
|
+
"DNSSECKeyTemplateBulkDeleteView",
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@register_model_view(DNSSECKeyTemplate, "list", path="", detail=False)
|
|
27
|
+
class DNSSECKeyTemplateListView(generic.ObjectListView):
|
|
28
|
+
queryset = DNSSECKeyTemplate.objects.all()
|
|
29
|
+
filterset = DNSSECKeyTemplateFilterSet
|
|
30
|
+
filterset_form = DNSSECKeyTemplateFilterForm
|
|
31
|
+
table = DNSSECKeyTemplateTable
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@register_model_view(DNSSECKeyTemplate)
|
|
35
|
+
class DNSSECKeyTemplateView(generic.ObjectView):
|
|
36
|
+
queryset = DNSSECKeyTemplate.objects.prefetch_related("policies")
|
|
37
|
+
|
|
38
|
+
def get_extra_context(self, request, instance):
|
|
39
|
+
if instance.policies.exists():
|
|
40
|
+
policy_table = DNSSECPolicyDisplayTable(data=instance.policies.all())
|
|
41
|
+
policy_table.configure(request)
|
|
42
|
+
return {"policy_table": policy_table}
|
|
43
|
+
|
|
44
|
+
return {}
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
@register_model_view(DNSSECKeyTemplate, "add", detail=False)
|
|
48
|
+
@register_model_view(DNSSECKeyTemplate, "edit")
|
|
49
|
+
class DNSSECKeyTemplateEditView(generic.ObjectEditView):
|
|
50
|
+
queryset = DNSSECKeyTemplate.objects.all()
|
|
51
|
+
form = DNSSECKeyTemplateForm
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
@register_model_view(DNSSECKeyTemplate, "delete")
|
|
55
|
+
class DNSSECKeyTemplateDeleteView(generic.ObjectDeleteView):
|
|
56
|
+
queryset = DNSSECKeyTemplate.objects.all()
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
@register_model_view(DNSSECKeyTemplate, "bulk_import", detail=False)
|
|
60
|
+
class DNSSECKeyTemplateBulkImportView(generic.BulkImportView):
|
|
61
|
+
queryset = DNSSECKeyTemplate.objects.all()
|
|
62
|
+
model_form = DNSSECKeyTemplateImportForm
|
|
63
|
+
table = DNSSECKeyTemplateTable
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
@register_model_view(DNSSECKeyTemplate, "bulk_edit", path="edit", detail=False)
|
|
67
|
+
class DNSSECKeyTemplateBulkEditView(generic.BulkEditView):
|
|
68
|
+
queryset = DNSSECKeyTemplate.objects.all()
|
|
69
|
+
filterset = DNSSECKeyTemplateFilterSet
|
|
70
|
+
table = DNSSECKeyTemplateTable
|
|
71
|
+
form = DNSSECKeyTemplateBulkEditForm
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
@register_model_view(DNSSECKeyTemplate, "bulk_delete", path="delete", detail=False)
|
|
75
|
+
class DNSSECKeyTemplateBulkDeleteView(generic.BulkDeleteView):
|
|
76
|
+
queryset = DNSSECKeyTemplate.objects.all()
|
|
77
|
+
filterset = DNSSECKeyTemplateFilterSet
|
|
78
|
+
table = DNSSECKeyTemplateTable
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
from django.utils.translation import gettext_lazy as _
|
|
2
|
+
|
|
3
|
+
from netbox.views import generic
|
|
4
|
+
from utilities.views import ViewTab, register_model_view
|
|
5
|
+
|
|
6
|
+
from netbox_dns.filtersets import (
|
|
7
|
+
DNSSECPolicyFilterSet,
|
|
8
|
+
ZoneFilterSet,
|
|
9
|
+
ZoneTemplateFilterSet,
|
|
10
|
+
)
|
|
11
|
+
from netbox_dns.forms import (
|
|
12
|
+
DNSSECPolicyImportForm,
|
|
13
|
+
DNSSECPolicyFilterForm,
|
|
14
|
+
DNSSECPolicyForm,
|
|
15
|
+
DNSSECPolicyBulkEditForm,
|
|
16
|
+
)
|
|
17
|
+
from netbox_dns.models import DNSSECPolicy, Zone, ZoneTemplate
|
|
18
|
+
from netbox_dns.tables import (
|
|
19
|
+
DNSSECPolicyTable,
|
|
20
|
+
ZoneDisplayTable,
|
|
21
|
+
ZoneTemplateDisplayTable,
|
|
22
|
+
)
|
|
23
|
+
from netbox_dns.validators import validate_key_template_lifetime
|
|
24
|
+
from netbox_dns.choices import DNSSECKeyTemplateTypeChoices
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
__all__ = (
|
|
28
|
+
"DNSSECPolicyView",
|
|
29
|
+
"DNSSECPolicyListView",
|
|
30
|
+
"DNSSECPolicyEditView",
|
|
31
|
+
"DNSSECPolicyDeleteView",
|
|
32
|
+
"DNSSECPolicyBulkEditView",
|
|
33
|
+
"DNSSECPolicyBulkImportView",
|
|
34
|
+
"DNSSECPolicyBulkDeleteView",
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
@register_model_view(DNSSECPolicy, "list", path="", detail=False)
|
|
39
|
+
class DNSSECPolicyListView(generic.ObjectListView):
|
|
40
|
+
queryset = DNSSECPolicy.objects.all()
|
|
41
|
+
filterset = DNSSECPolicyFilterSet
|
|
42
|
+
filterset_form = DNSSECPolicyFilterForm
|
|
43
|
+
table = DNSSECPolicyTable
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
@register_model_view(DNSSECPolicy)
|
|
47
|
+
class DNSSECPolicyView(generic.ObjectView):
|
|
48
|
+
queryset = DNSSECPolicy.objects.prefetch_related(
|
|
49
|
+
"key_templates", "zones", "zone_templates"
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
def get_extra_context(self, request, instance):
|
|
53
|
+
context = {}
|
|
54
|
+
|
|
55
|
+
key_errors = {
|
|
56
|
+
key_template.pk: validate_key_template_lifetime(key_template, instance)
|
|
57
|
+
for key_template in instance.key_templates.all()
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
context["key_template_errors"] = key_errors
|
|
61
|
+
|
|
62
|
+
if not instance.key_templates.filter(
|
|
63
|
+
type__in=(
|
|
64
|
+
DNSSECKeyTemplateTypeChoices.TYPE_ZSK,
|
|
65
|
+
DNSSECKeyTemplateTypeChoices.TYPE_CSK,
|
|
66
|
+
)
|
|
67
|
+
).exists():
|
|
68
|
+
context["policy_warning"] = _(
|
|
69
|
+
"No key for signing zones (CSK or ZSK) is assigned."
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
return context
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
@register_model_view(DNSSECPolicy, "add", detail=False)
|
|
76
|
+
@register_model_view(DNSSECPolicy, "edit")
|
|
77
|
+
class DNSSECPolicyEditView(generic.ObjectEditView):
|
|
78
|
+
queryset = DNSSECPolicy.objects.all()
|
|
79
|
+
form = DNSSECPolicyForm
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
@register_model_view(DNSSECPolicy, "delete")
|
|
83
|
+
class DNSSECPolicyDeleteView(generic.ObjectDeleteView):
|
|
84
|
+
queryset = DNSSECPolicy.objects.all()
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
@register_model_view(DNSSECPolicy, "bulk_import", detail=False)
|
|
88
|
+
class DNSSECPolicyBulkImportView(generic.BulkImportView):
|
|
89
|
+
queryset = DNSSECPolicy.objects.all()
|
|
90
|
+
model_form = DNSSECPolicyImportForm
|
|
91
|
+
table = DNSSECPolicyTable
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
@register_model_view(DNSSECPolicy, "bulk_edit", path="edit", detail=False)
|
|
95
|
+
class DNSSECPolicyBulkEditView(generic.BulkEditView):
|
|
96
|
+
queryset = DNSSECPolicy.objects.all()
|
|
97
|
+
filterset = DNSSECPolicyFilterSet
|
|
98
|
+
table = DNSSECPolicyTable
|
|
99
|
+
form = DNSSECPolicyBulkEditForm
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
@register_model_view(DNSSECPolicy, "bulk_delete", path="delete", detail=False)
|
|
103
|
+
class DNSSECPolicyBulkDeleteView(generic.BulkDeleteView):
|
|
104
|
+
queryset = DNSSECPolicy.objects.all()
|
|
105
|
+
filterset = DNSSECPolicyFilterSet
|
|
106
|
+
table = DNSSECPolicyTable
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
@register_model_view(DNSSECPolicy, "zones")
|
|
110
|
+
class DNSSECPolicyZoneListView(generic.ObjectChildrenView):
|
|
111
|
+
queryset = DNSSECPolicy.objects.all()
|
|
112
|
+
child_model = Zone
|
|
113
|
+
table = ZoneDisplayTable
|
|
114
|
+
filterset = ZoneFilterSet
|
|
115
|
+
template_name = "netbox_dns/zone/child.html"
|
|
116
|
+
hide_if_empty = True
|
|
117
|
+
|
|
118
|
+
tab = ViewTab(
|
|
119
|
+
label=_("Zones"),
|
|
120
|
+
permission="netbox_dns.view_zones",
|
|
121
|
+
badge=lambda obj: obj.zones.count(),
|
|
122
|
+
hide_if_empty=True,
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
def get_children(self, request, parent):
|
|
126
|
+
return parent.zones.restrict(request.user, "view")
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
@register_model_view(DNSSECPolicy, "zonetemplates")
|
|
130
|
+
class DNSSECPolicyZoneTemplateListView(generic.ObjectChildrenView):
|
|
131
|
+
queryset = DNSSECPolicy.objects.all()
|
|
132
|
+
child_model = ZoneTemplate
|
|
133
|
+
table = ZoneTemplateDisplayTable
|
|
134
|
+
filterset = ZoneTemplateFilterSet
|
|
135
|
+
template_name = "netbox_dns/zonetemplate/child.html"
|
|
136
|
+
hide_if_empty = True
|
|
137
|
+
|
|
138
|
+
tab = ViewTab(
|
|
139
|
+
label=_("Zone Templates"),
|
|
140
|
+
permission="netbox_dns.view_zonetemplates",
|
|
141
|
+
badge=lambda obj: obj.zone_templates.count(),
|
|
142
|
+
hide_if_empty=True,
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
def get_children(self, request, parent):
|
|
146
|
+
return parent.zone_templates.restrict(request.user, "view")
|
netbox_dns/views/nameserver.py
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
from dns import name as dns_name
|
|
2
2
|
|
|
3
|
+
from django.utils.translation import gettext_lazy as _
|
|
4
|
+
|
|
3
5
|
from netbox.views import generic
|
|
4
6
|
from utilities.views import ViewTab, register_model_view
|
|
5
7
|
|
|
6
|
-
from netbox_dns.
|
|
8
|
+
from netbox_dns.filtersets import NameServerFilterSet, ZoneFilterSet
|
|
7
9
|
from netbox_dns.forms import (
|
|
8
10
|
NameServerImportForm,
|
|
9
11
|
NameServerFilterForm,
|
|
@@ -14,15 +16,28 @@ from netbox_dns.models import Zone, NameServer
|
|
|
14
16
|
from netbox_dns.tables import NameServerTable, ZoneTable
|
|
15
17
|
|
|
16
18
|
|
|
19
|
+
__all__ = (
|
|
20
|
+
"NameServerView",
|
|
21
|
+
"NameServerListView",
|
|
22
|
+
"NameServerEditView",
|
|
23
|
+
"NameServerDeleteView",
|
|
24
|
+
"NameServerBulkEditView",
|
|
25
|
+
"NameServerBulkImportView",
|
|
26
|
+
"NameServerBulkDeleteView",
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@register_model_view(NameServer, "list", path="", detail=False)
|
|
17
31
|
class NameServerListView(generic.ObjectListView):
|
|
18
32
|
queryset = NameServer.objects.all()
|
|
19
|
-
filterset =
|
|
33
|
+
filterset = NameServerFilterSet
|
|
20
34
|
filterset_form = NameServerFilterForm
|
|
21
35
|
table = NameServerTable
|
|
22
36
|
|
|
23
37
|
|
|
38
|
+
@register_model_view(NameServer)
|
|
24
39
|
class NameServerView(generic.ObjectView):
|
|
25
|
-
queryset = NameServer.objects.
|
|
40
|
+
queryset = NameServer.objects.prefetch_related("zones")
|
|
26
41
|
|
|
27
42
|
def get_extra_context(self, request, instance):
|
|
28
43
|
name = dns_name.from_text(instance.name)
|
|
@@ -34,47 +49,51 @@ class NameServerView(generic.ObjectView):
|
|
|
34
49
|
return {}
|
|
35
50
|
|
|
36
51
|
|
|
52
|
+
@register_model_view(NameServer, "add", detail=False)
|
|
53
|
+
@register_model_view(NameServer, "edit")
|
|
37
54
|
class NameServerEditView(generic.ObjectEditView):
|
|
38
55
|
queryset = NameServer.objects.all()
|
|
39
56
|
form = NameServerForm
|
|
40
|
-
default_return_url = "plugins:netbox_dns:nameserver_list"
|
|
41
57
|
|
|
42
58
|
|
|
59
|
+
@register_model_view(NameServer, "delete")
|
|
43
60
|
class NameServerDeleteView(generic.ObjectDeleteView):
|
|
44
61
|
queryset = NameServer.objects.all()
|
|
45
|
-
default_return_url = "plugins:netbox_dns:nameserver_list"
|
|
46
62
|
|
|
47
63
|
|
|
64
|
+
@register_model_view(NameServer, "bulk_import", detail=False)
|
|
48
65
|
class NameServerBulkImportView(generic.BulkImportView):
|
|
49
66
|
queryset = NameServer.objects.all()
|
|
50
67
|
model_form = NameServerImportForm
|
|
51
68
|
table = NameServerTable
|
|
52
|
-
default_return_url = "plugins:netbox_dns:nameserver_list"
|
|
53
69
|
|
|
54
70
|
|
|
71
|
+
@register_model_view(NameServer, "bulk_edit", path="edit", detail=False)
|
|
55
72
|
class NameServerBulkEditView(generic.BulkEditView):
|
|
56
73
|
queryset = NameServer.objects.all()
|
|
57
|
-
filterset =
|
|
74
|
+
filterset = NameServerFilterSet
|
|
58
75
|
table = NameServerTable
|
|
59
76
|
form = NameServerBulkEditForm
|
|
60
77
|
|
|
61
78
|
|
|
79
|
+
@register_model_view(NameServer, "bulk_delete", path="delete", detail=False)
|
|
62
80
|
class NameServerBulkDeleteView(generic.BulkDeleteView):
|
|
63
81
|
queryset = NameServer.objects.all()
|
|
82
|
+
filterset = NameServerFilterSet
|
|
64
83
|
table = NameServerTable
|
|
65
84
|
|
|
66
85
|
|
|
67
86
|
@register_model_view(NameServer, "zones")
|
|
68
87
|
class NameServerZoneListView(generic.ObjectChildrenView):
|
|
69
|
-
queryset = NameServer.objects.
|
|
88
|
+
queryset = NameServer.objects.prefetch_related("zones")
|
|
70
89
|
child_model = Zone
|
|
71
90
|
table = ZoneTable
|
|
72
|
-
filterset =
|
|
91
|
+
filterset = ZoneFilterSet
|
|
73
92
|
template_name = "netbox_dns/zone/child.html"
|
|
74
93
|
hide_if_empty = True
|
|
75
94
|
|
|
76
95
|
tab = ViewTab(
|
|
77
|
-
label="Zones",
|
|
96
|
+
label=_("Zones"),
|
|
78
97
|
permission="netbox_dns.view_zone",
|
|
79
98
|
badge=lambda obj: obj.zones.count(),
|
|
80
99
|
hide_if_empty=True,
|
|
@@ -86,19 +105,19 @@ class NameServerZoneListView(generic.ObjectChildrenView):
|
|
|
86
105
|
|
|
87
106
|
@register_model_view(NameServer, "soa_zones")
|
|
88
107
|
class NameServerSOAZoneListView(generic.ObjectChildrenView):
|
|
89
|
-
queryset = NameServer.objects.
|
|
108
|
+
queryset = NameServer.objects.prefetch_related("soa_zones")
|
|
90
109
|
child_model = Zone
|
|
91
110
|
table = ZoneTable
|
|
92
|
-
filterset =
|
|
111
|
+
filterset = ZoneFilterSet
|
|
93
112
|
template_name = "netbox_dns/zone/child.html"
|
|
94
113
|
hide_if_empty = True
|
|
95
114
|
|
|
96
115
|
tab = ViewTab(
|
|
97
|
-
label="SOA Zones",
|
|
116
|
+
label=_("SOA Zones"),
|
|
98
117
|
permission="netbox_dns.view_zone",
|
|
99
|
-
badge=lambda obj: obj.
|
|
118
|
+
badge=lambda obj: obj.soa_zones.count(),
|
|
100
119
|
hide_if_empty=True,
|
|
101
120
|
)
|
|
102
121
|
|
|
103
122
|
def get_children(self, request, parent):
|
|
104
|
-
return parent.
|
|
123
|
+
return parent.soa_zones
|