netbox-plugin-dns 1.2.6__py3-none-any.whl → 1.2.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.
Potentially problematic release.
This version of netbox-plugin-dns might be problematic. Click here for more details.
- netbox_dns/__init__.py +16 -8
- netbox_dns/api/field_serializers.py +25 -0
- netbox_dns/api/nested_serializers.py +19 -1
- netbox_dns/api/serializers.py +3 -0
- netbox_dns/api/serializers_/dnssec_key_template.py +59 -0
- netbox_dns/api/serializers_/dnssec_policy.py +113 -0
- netbox_dns/api/serializers_/record.py +2 -0
- netbox_dns/api/serializers_/record_template.py +2 -0
- netbox_dns/api/serializers_/zone.py +20 -1
- netbox_dns/api/serializers_/zone_template.py +13 -4
- netbox_dns/api/urls.py +4 -0
- netbox_dns/api/views.py +18 -0
- netbox_dns/choices/__init__.py +2 -0
- netbox_dns/choices/dnssec_key_template.py +63 -0
- netbox_dns/choices/dnssec_policy.py +40 -0
- netbox_dns/choices/record.py +2 -25
- netbox_dns/choices/utilities.py +26 -0
- netbox_dns/choices/zone.py +96 -1
- netbox_dns/fields/__init__.py +1 -0
- netbox_dns/fields/choice_array.py +33 -0
- netbox_dns/fields/timeperiod.py +15 -13
- netbox_dns/filtersets/__init__.py +3 -0
- netbox_dns/filtersets/dnssec_key_template.py +51 -0
- netbox_dns/filtersets/dnssec_policy.py +97 -0
- netbox_dns/filtersets/zone.py +30 -6
- netbox_dns/filtersets/zone_template.py +13 -2
- netbox_dns/forms/__init__.py +2 -0
- netbox_dns/forms/dnssec_key_template.py +189 -0
- netbox_dns/forms/dnssec_policy.py +593 -0
- netbox_dns/forms/nameserver.py +2 -0
- netbox_dns/forms/record_template.py +1 -0
- netbox_dns/forms/zone.py +120 -9
- netbox_dns/forms/zone_template.py +38 -0
- netbox_dns/graphql/__init__.py +7 -3
- netbox_dns/graphql/filters.py +16 -0
- netbox_dns/graphql/schema.py +20 -0
- netbox_dns/graphql/types.py +67 -3
- netbox_dns/locale/de/LC_MESSAGES/django.mo +0 -0
- netbox_dns/locale/fr/LC_MESSAGES/django.mo +0 -0
- netbox_dns/migrations/0015_dnssec.py +168 -0
- netbox_dns/migrations/0016_dnssec_policy_status.py +18 -0
- 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/models/__init__.py +2 -0
- netbox_dns/models/dnssec_key_template.py +114 -0
- netbox_dns/models/dnssec_policy.py +203 -0
- netbox_dns/models/record.py +1 -1
- netbox_dns/models/zone.py +74 -19
- netbox_dns/models/zone_template.py +17 -7
- netbox_dns/navigation.py +49 -0
- netbox_dns/signals/dnssec.py +32 -0
- netbox_dns/tables/__init__.py +2 -0
- netbox_dns/tables/dnssec_key_template.py +48 -0
- netbox_dns/tables/dnssec_policy.py +131 -0
- netbox_dns/tables/zone.py +23 -2
- netbox_dns/tables/zone_template.py +4 -0
- netbox_dns/template_content.py +2 -1
- netbox_dns/templates/netbox_dns/dnsseckeytemplate.html +70 -0
- netbox_dns/templates/netbox_dns/dnssecpolicy.html +155 -0
- netbox_dns/templates/netbox_dns/zone/registration.html +19 -0
- netbox_dns/templates/netbox_dns/zone.html +16 -0
- netbox_dns/templates/netbox_dns/zonetemplate/child.html +46 -0
- netbox_dns/templates/netbox_dns/zonetemplate.html +12 -0
- netbox_dns/urls.py +23 -0
- netbox_dns/utilities/conversions.py +13 -0
- netbox_dns/validators/__init__.py +1 -0
- netbox_dns/validators/dnssec.py +148 -0
- netbox_dns/views/__init__.py +2 -0
- netbox_dns/views/dnssec_key_template.py +87 -0
- netbox_dns/views/dnssec_policy.py +155 -0
- netbox_dns/views/zone.py +11 -1
- {netbox_plugin_dns-1.2.6.dist-info → netbox_plugin_dns-1.2.7.dist-info}/METADATA +3 -2
- {netbox_plugin_dns-1.2.6.dist-info → netbox_plugin_dns-1.2.7.dist-info}/RECORD +76 -50
- {netbox_plugin_dns-1.2.6.dist-info → netbox_plugin_dns-1.2.7.dist-info}/WHEEL +1 -1
- {netbox_plugin_dns-1.2.6.dist-info → netbox_plugin_dns-1.2.7.dist-info/licenses}/LICENSE +0 -0
- {netbox_plugin_dns-1.2.6.dist-info → netbox_plugin_dns-1.2.7.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
# Generated by Django 5.1.6 on 2025-03-04 12:09
|
|
2
|
+
|
|
3
|
+
import django.db.models.deletion
|
|
4
|
+
import netbox_dns.fields.choice_array
|
|
5
|
+
import taggit.managers
|
|
6
|
+
import utilities.json
|
|
7
|
+
from django.db import migrations, models
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class Migration(migrations.Migration):
|
|
11
|
+
|
|
12
|
+
dependencies = [
|
|
13
|
+
("extras", "0122_charfield_null_choices"),
|
|
14
|
+
("netbox_dns", "0014_alter_unique_constraints_lowercase"),
|
|
15
|
+
("tenancy", "0017_natural_ordering"),
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
operations = [
|
|
19
|
+
migrations.CreateModel(
|
|
20
|
+
name="DNSSECKeyTemplate",
|
|
21
|
+
fields=[
|
|
22
|
+
(
|
|
23
|
+
"id",
|
|
24
|
+
models.BigAutoField(
|
|
25
|
+
auto_created=True, primary_key=True, serialize=False
|
|
26
|
+
),
|
|
27
|
+
),
|
|
28
|
+
("created", models.DateTimeField(auto_now_add=True, null=True)),
|
|
29
|
+
("last_updated", models.DateTimeField(auto_now=True, null=True)),
|
|
30
|
+
(
|
|
31
|
+
"custom_field_data",
|
|
32
|
+
models.JSONField(
|
|
33
|
+
blank=True,
|
|
34
|
+
default=dict,
|
|
35
|
+
encoder=utilities.json.CustomFieldJSONEncoder,
|
|
36
|
+
),
|
|
37
|
+
),
|
|
38
|
+
("name", models.CharField(max_length=255)),
|
|
39
|
+
("description", models.CharField(blank=True, max_length=200)),
|
|
40
|
+
("type", models.CharField(max_length=3)),
|
|
41
|
+
("lifetime", models.PositiveIntegerField(blank=True, null=True)),
|
|
42
|
+
("algorithm", models.CharField()),
|
|
43
|
+
("key_size", models.PositiveIntegerField(blank=True, null=True)),
|
|
44
|
+
(
|
|
45
|
+
"tags",
|
|
46
|
+
taggit.managers.TaggableManager(
|
|
47
|
+
through="extras.TaggedItem", to="extras.Tag"
|
|
48
|
+
),
|
|
49
|
+
),
|
|
50
|
+
(
|
|
51
|
+
"tenant",
|
|
52
|
+
models.ForeignKey(
|
|
53
|
+
blank=True,
|
|
54
|
+
null=True,
|
|
55
|
+
on_delete=django.db.models.deletion.PROTECT,
|
|
56
|
+
related_name="netbox_dns_dnssec_key_templates",
|
|
57
|
+
to="tenancy.tenant",
|
|
58
|
+
),
|
|
59
|
+
),
|
|
60
|
+
],
|
|
61
|
+
options={
|
|
62
|
+
"verbose_name": "DNSSEC Key Template",
|
|
63
|
+
"verbose_name_plural": "DNSSEC Key Templates",
|
|
64
|
+
"ordering": ("name",),
|
|
65
|
+
"unique_together": {("name", "type")},
|
|
66
|
+
},
|
|
67
|
+
),
|
|
68
|
+
migrations.CreateModel(
|
|
69
|
+
name="DNSSECPolicy",
|
|
70
|
+
fields=[
|
|
71
|
+
(
|
|
72
|
+
"id",
|
|
73
|
+
models.BigAutoField(
|
|
74
|
+
auto_created=True, primary_key=True, serialize=False
|
|
75
|
+
),
|
|
76
|
+
),
|
|
77
|
+
("created", models.DateTimeField(auto_now_add=True, null=True)),
|
|
78
|
+
("last_updated", models.DateTimeField(auto_now=True, null=True)),
|
|
79
|
+
(
|
|
80
|
+
"custom_field_data",
|
|
81
|
+
models.JSONField(
|
|
82
|
+
blank=True,
|
|
83
|
+
default=dict,
|
|
84
|
+
encoder=utilities.json.CustomFieldJSONEncoder,
|
|
85
|
+
),
|
|
86
|
+
),
|
|
87
|
+
("name", models.CharField(max_length=255, unique=True)),
|
|
88
|
+
("description", models.CharField(blank=True, max_length=200)),
|
|
89
|
+
("dnskey_ttl", models.PositiveIntegerField(blank=True, null=True)),
|
|
90
|
+
("purge_keys", models.PositiveIntegerField(blank=True, null=True)),
|
|
91
|
+
("publish_safety", models.PositiveIntegerField(blank=True, null=True)),
|
|
92
|
+
("retire_safety", models.PositiveIntegerField(blank=True, null=True)),
|
|
93
|
+
(
|
|
94
|
+
"signatures_jitter",
|
|
95
|
+
models.PositiveIntegerField(blank=True, null=True),
|
|
96
|
+
),
|
|
97
|
+
(
|
|
98
|
+
"signatures_refresh",
|
|
99
|
+
models.PositiveIntegerField(blank=True, null=True),
|
|
100
|
+
),
|
|
101
|
+
(
|
|
102
|
+
"signatures_validity",
|
|
103
|
+
models.PositiveIntegerField(blank=True, null=True),
|
|
104
|
+
),
|
|
105
|
+
(
|
|
106
|
+
"signatures_validity_dnskey",
|
|
107
|
+
models.PositiveIntegerField(blank=True, null=True),
|
|
108
|
+
),
|
|
109
|
+
("max_zone_ttl", models.PositiveIntegerField(blank=True, null=True)),
|
|
110
|
+
(
|
|
111
|
+
"zone_propagation_delay",
|
|
112
|
+
models.PositiveIntegerField(blank=True, null=True),
|
|
113
|
+
),
|
|
114
|
+
("create_cdnskey", models.BooleanField(default=True)),
|
|
115
|
+
(
|
|
116
|
+
"cds_digest_types",
|
|
117
|
+
netbox_dns.fields.choice_array.ChoiceArrayField(
|
|
118
|
+
base_field=models.CharField(),
|
|
119
|
+
blank=True,
|
|
120
|
+
default=list,
|
|
121
|
+
null=True,
|
|
122
|
+
size=None,
|
|
123
|
+
),
|
|
124
|
+
),
|
|
125
|
+
("parent_ds_ttl", models.PositiveIntegerField(blank=True, null=True)),
|
|
126
|
+
(
|
|
127
|
+
"parent_propagation_delay",
|
|
128
|
+
models.PositiveIntegerField(blank=True, null=True),
|
|
129
|
+
),
|
|
130
|
+
("use_nsec3", models.BooleanField(default=True)),
|
|
131
|
+
(
|
|
132
|
+
"nsec3_iterations",
|
|
133
|
+
models.PositiveIntegerField(blank=True, null=True),
|
|
134
|
+
),
|
|
135
|
+
("nsec3_opt_out", models.BooleanField(default=False)),
|
|
136
|
+
("nsec3_salt_size", models.PositiveIntegerField(blank=True, null=True)),
|
|
137
|
+
(
|
|
138
|
+
"key_templates",
|
|
139
|
+
models.ManyToManyField(
|
|
140
|
+
blank=True,
|
|
141
|
+
related_name="policies",
|
|
142
|
+
to="netbox_dns.dnsseckeytemplate",
|
|
143
|
+
),
|
|
144
|
+
),
|
|
145
|
+
(
|
|
146
|
+
"tags",
|
|
147
|
+
taggit.managers.TaggableManager(
|
|
148
|
+
through="extras.TaggedItem", to="extras.Tag"
|
|
149
|
+
),
|
|
150
|
+
),
|
|
151
|
+
(
|
|
152
|
+
"tenant",
|
|
153
|
+
models.ForeignKey(
|
|
154
|
+
blank=True,
|
|
155
|
+
null=True,
|
|
156
|
+
on_delete=django.db.models.deletion.PROTECT,
|
|
157
|
+
related_name="netbox_dns_dnssec_policy",
|
|
158
|
+
to="tenancy.tenant",
|
|
159
|
+
),
|
|
160
|
+
),
|
|
161
|
+
],
|
|
162
|
+
options={
|
|
163
|
+
"verbose_name": "DNSSEC Policy",
|
|
164
|
+
"verbose_name_plural": "DNSSEC Policies",
|
|
165
|
+
"ordering": ("name",),
|
|
166
|
+
},
|
|
167
|
+
),
|
|
168
|
+
]
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Generated by Django 5.1.7 on 2025-03-09 18:23
|
|
2
|
+
|
|
3
|
+
from django.db import migrations, models
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Migration(migrations.Migration):
|
|
7
|
+
|
|
8
|
+
dependencies = [
|
|
9
|
+
("netbox_dns", "0015_dnssec"),
|
|
10
|
+
]
|
|
11
|
+
|
|
12
|
+
operations = [
|
|
13
|
+
migrations.AddField(
|
|
14
|
+
model_name="dnssecpolicy",
|
|
15
|
+
name="status",
|
|
16
|
+
field=models.CharField(default="active"),
|
|
17
|
+
),
|
|
18
|
+
]
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Generated by Django 5.1.6 on 2025-03-10 15:40
|
|
2
|
+
|
|
3
|
+
import django.db.models.deletion
|
|
4
|
+
from django.db import migrations, models
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class Migration(migrations.Migration):
|
|
8
|
+
|
|
9
|
+
dependencies = [
|
|
10
|
+
("netbox_dns", "0016_dnssec_policy_status"),
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
operations = [
|
|
14
|
+
migrations.AddField(
|
|
15
|
+
model_name="zone",
|
|
16
|
+
name="dnssec_policy",
|
|
17
|
+
field=models.ForeignKey(
|
|
18
|
+
blank=True,
|
|
19
|
+
null=True,
|
|
20
|
+
on_delete=django.db.models.deletion.PROTECT,
|
|
21
|
+
related_name="zones",
|
|
22
|
+
to="netbox_dns.dnssecpolicy",
|
|
23
|
+
),
|
|
24
|
+
),
|
|
25
|
+
migrations.AddField(
|
|
26
|
+
model_name="zone",
|
|
27
|
+
name="inline_signing",
|
|
28
|
+
field=models.BooleanField(default=True),
|
|
29
|
+
),
|
|
30
|
+
migrations.AddField(
|
|
31
|
+
model_name="zonetemplate",
|
|
32
|
+
name="dnssec_policy",
|
|
33
|
+
field=models.ForeignKey(
|
|
34
|
+
blank=True,
|
|
35
|
+
null=True,
|
|
36
|
+
on_delete=django.db.models.deletion.SET_NULL,
|
|
37
|
+
related_name="zone_templates",
|
|
38
|
+
to="netbox_dns.dnssecpolicy",
|
|
39
|
+
),
|
|
40
|
+
),
|
|
41
|
+
]
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Generated by Django 5.1.7 on 2025-04-03 13:43
|
|
2
|
+
|
|
3
|
+
from django.db import migrations, models
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Migration(migrations.Migration):
|
|
7
|
+
|
|
8
|
+
dependencies = [
|
|
9
|
+
("netbox_dns", "0017_dnssec_policy_zone_zone_template"),
|
|
10
|
+
]
|
|
11
|
+
|
|
12
|
+
operations = [
|
|
13
|
+
migrations.AddField(
|
|
14
|
+
model_name="zone",
|
|
15
|
+
name="domain_status",
|
|
16
|
+
field=models.CharField(blank=True, max_length=50, null=True),
|
|
17
|
+
),
|
|
18
|
+
migrations.AddField(
|
|
19
|
+
model_name="zone",
|
|
20
|
+
name="expiration_date",
|
|
21
|
+
field=models.DateField(blank=True, null=True),
|
|
22
|
+
),
|
|
23
|
+
]
|
netbox_dns/models/__init__.py
CHANGED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
from django.urls import reverse
|
|
3
|
+
from django.utils.translation import gettext_lazy as _
|
|
4
|
+
|
|
5
|
+
from netbox.models import NetBoxModel
|
|
6
|
+
from netbox.search import SearchIndex, register_search
|
|
7
|
+
from netbox.models.features import ContactsMixin
|
|
8
|
+
|
|
9
|
+
from netbox_dns.choices import (
|
|
10
|
+
DNSSECKeyTemplateTypeChoices,
|
|
11
|
+
DNSSECKeyTemplateAlgorithmChoices,
|
|
12
|
+
DNSSECKeyTemplateKeySizeChoices,
|
|
13
|
+
)
|
|
14
|
+
from netbox_dns.validators import validate_key_template
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
__all__ = (
|
|
18
|
+
"DNSSECKeyTemplate",
|
|
19
|
+
"DNSSECKeyTemplateIndex",
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class DNSSECKeyTemplate(ContactsMixin, NetBoxModel):
|
|
24
|
+
name = models.CharField(
|
|
25
|
+
verbose_name=_("Name"),
|
|
26
|
+
max_length=255,
|
|
27
|
+
)
|
|
28
|
+
description = models.CharField(
|
|
29
|
+
verbose_name=_("Description"),
|
|
30
|
+
max_length=200,
|
|
31
|
+
blank=True,
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
type = models.CharField(
|
|
35
|
+
verbose_name=_("Type"),
|
|
36
|
+
choices=DNSSECKeyTemplateTypeChoices,
|
|
37
|
+
max_length=3,
|
|
38
|
+
blank=False,
|
|
39
|
+
null=False,
|
|
40
|
+
)
|
|
41
|
+
lifetime = models.PositiveIntegerField(
|
|
42
|
+
verbose_name=_("Lifetime"),
|
|
43
|
+
blank=True,
|
|
44
|
+
null=True,
|
|
45
|
+
)
|
|
46
|
+
algorithm = models.CharField(
|
|
47
|
+
verbose_name=_("Algorithm"),
|
|
48
|
+
choices=DNSSECKeyTemplateAlgorithmChoices,
|
|
49
|
+
blank=False,
|
|
50
|
+
null=False,
|
|
51
|
+
)
|
|
52
|
+
key_size = models.PositiveIntegerField(
|
|
53
|
+
verbose_name=_("Key Size"),
|
|
54
|
+
choices=DNSSECKeyTemplateKeySizeChoices,
|
|
55
|
+
blank=True,
|
|
56
|
+
null=True,
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
tenant = models.ForeignKey(
|
|
60
|
+
verbose_name=_("Tenant"),
|
|
61
|
+
to="tenancy.Tenant",
|
|
62
|
+
on_delete=models.PROTECT,
|
|
63
|
+
related_name="netbox_dns_dnssec_key_templates",
|
|
64
|
+
blank=True,
|
|
65
|
+
null=True,
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
clone_fields = (
|
|
69
|
+
"description",
|
|
70
|
+
"type",
|
|
71
|
+
"lifetime",
|
|
72
|
+
"algorithm",
|
|
73
|
+
"key_size",
|
|
74
|
+
"tenant",
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
class Meta:
|
|
78
|
+
verbose_name = _("DNSSEC Key Template")
|
|
79
|
+
verbose_name_plural = _("DNSSEC Key Templates")
|
|
80
|
+
unique_together = (
|
|
81
|
+
"name",
|
|
82
|
+
"type",
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
ordering = ("name",)
|
|
86
|
+
|
|
87
|
+
def __str__(self):
|
|
88
|
+
return f"{str(self.name)} [{self.type}]"
|
|
89
|
+
|
|
90
|
+
# TODO: Remove in version 1.3.0 (NetBox #18555)
|
|
91
|
+
def get_absolute_url(self):
|
|
92
|
+
return reverse("plugins:netbox_dns:dnsseckeytemplate", kwargs={"pk": self.pk})
|
|
93
|
+
|
|
94
|
+
def get_type_color(self):
|
|
95
|
+
return DNSSECKeyTemplateTypeChoices.colors.get(self.type)
|
|
96
|
+
|
|
97
|
+
def clean(self, *args, **kwargs):
|
|
98
|
+
super().clean(*args, **kwargs)
|
|
99
|
+
|
|
100
|
+
validate_key_template(self)
|
|
101
|
+
|
|
102
|
+
def save(self, *args, **kwargs):
|
|
103
|
+
validate_key_template(self)
|
|
104
|
+
|
|
105
|
+
super().save(*args, **kwargs)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
@register_search
|
|
109
|
+
class DNSSECKeyTemplateIndex(SearchIndex):
|
|
110
|
+
model = DNSSECKeyTemplate
|
|
111
|
+
fields = (
|
|
112
|
+
("name", 100),
|
|
113
|
+
("description", 500),
|
|
114
|
+
)
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
from django.urls import reverse
|
|
3
|
+
from django.utils.translation import gettext_lazy as _
|
|
4
|
+
|
|
5
|
+
from netbox.models import NetBoxModel
|
|
6
|
+
from netbox.search import SearchIndex, register_search
|
|
7
|
+
from netbox.models.features import ContactsMixin
|
|
8
|
+
from netbox.plugins.utils import get_plugin_config
|
|
9
|
+
|
|
10
|
+
from netbox_dns.choices import DNSSECPolicyDigestChoices, DNSSECPolicyStatusChoices
|
|
11
|
+
from netbox_dns.fields import ChoiceArrayField
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
__all__ = (
|
|
15
|
+
"DNSSECPolicy",
|
|
16
|
+
"DNSSECPolicyIndex",
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class DNSSECPolicy(ContactsMixin, NetBoxModel):
|
|
21
|
+
name = models.CharField(
|
|
22
|
+
verbose_name=_("Name"),
|
|
23
|
+
max_length=255,
|
|
24
|
+
unique=True,
|
|
25
|
+
)
|
|
26
|
+
description = models.CharField(
|
|
27
|
+
verbose_name=_("Description"),
|
|
28
|
+
max_length=200,
|
|
29
|
+
blank=True,
|
|
30
|
+
)
|
|
31
|
+
status = models.CharField(
|
|
32
|
+
verbose_name=_("Status"),
|
|
33
|
+
choices=DNSSECPolicyStatusChoices,
|
|
34
|
+
default=DNSSECPolicyStatusChoices.STATUS_ACTIVE,
|
|
35
|
+
blank=False,
|
|
36
|
+
null=False,
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
key_templates = models.ManyToManyField(
|
|
40
|
+
verbose_name=_("Key Templates"),
|
|
41
|
+
to="DNSSECKeyTemplate",
|
|
42
|
+
related_name="policies",
|
|
43
|
+
blank=True,
|
|
44
|
+
)
|
|
45
|
+
dnskey_ttl = models.PositiveIntegerField(
|
|
46
|
+
verbose_name=_("DNSKEY TTL"),
|
|
47
|
+
blank=True,
|
|
48
|
+
null=True,
|
|
49
|
+
)
|
|
50
|
+
purge_keys = models.PositiveIntegerField(
|
|
51
|
+
verbose_name=_("Purge Keys"),
|
|
52
|
+
blank=True,
|
|
53
|
+
null=True,
|
|
54
|
+
)
|
|
55
|
+
publish_safety = models.PositiveIntegerField(
|
|
56
|
+
verbose_name=_("Publish Safety"),
|
|
57
|
+
blank=True,
|
|
58
|
+
null=True,
|
|
59
|
+
)
|
|
60
|
+
retire_safety = models.PositiveIntegerField(
|
|
61
|
+
verbose_name=_("Retire Safety"),
|
|
62
|
+
blank=True,
|
|
63
|
+
null=True,
|
|
64
|
+
)
|
|
65
|
+
signatures_jitter = models.PositiveIntegerField(
|
|
66
|
+
verbose_name=_("Signatures Jitter"),
|
|
67
|
+
blank=True,
|
|
68
|
+
null=True,
|
|
69
|
+
)
|
|
70
|
+
signatures_refresh = models.PositiveIntegerField(
|
|
71
|
+
verbose_name=_("Signatures Refresh"),
|
|
72
|
+
blank=True,
|
|
73
|
+
null=True,
|
|
74
|
+
)
|
|
75
|
+
signatures_validity = models.PositiveIntegerField(
|
|
76
|
+
verbose_name=_("Signatures Validity"),
|
|
77
|
+
blank=True,
|
|
78
|
+
null=True,
|
|
79
|
+
)
|
|
80
|
+
signatures_validity_dnskey = models.PositiveIntegerField(
|
|
81
|
+
verbose_name=_("Signatures Validity for DNSKEY"),
|
|
82
|
+
blank=True,
|
|
83
|
+
null=True,
|
|
84
|
+
)
|
|
85
|
+
max_zone_ttl = models.PositiveIntegerField(
|
|
86
|
+
verbose_name=_("Max Zone TTL"),
|
|
87
|
+
blank=True,
|
|
88
|
+
null=True,
|
|
89
|
+
)
|
|
90
|
+
zone_propagation_delay = models.PositiveIntegerField(
|
|
91
|
+
verbose_name=_("Zone Propagation Delay"),
|
|
92
|
+
blank=True,
|
|
93
|
+
null=True,
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
create_cdnskey = models.BooleanField(
|
|
97
|
+
verbose_name=_("Create CDNSKEY"),
|
|
98
|
+
null=False,
|
|
99
|
+
default=True,
|
|
100
|
+
)
|
|
101
|
+
cds_digest_types = ChoiceArrayField(
|
|
102
|
+
base_field=models.CharField(
|
|
103
|
+
choices=DNSSECPolicyDigestChoices,
|
|
104
|
+
),
|
|
105
|
+
verbose_name=_("CDS Digest Types"),
|
|
106
|
+
blank=True,
|
|
107
|
+
null=True,
|
|
108
|
+
default=list,
|
|
109
|
+
)
|
|
110
|
+
parent_ds_ttl = models.PositiveIntegerField(
|
|
111
|
+
verbose_name=_("Parent DS TTL"),
|
|
112
|
+
blank=True,
|
|
113
|
+
null=True,
|
|
114
|
+
)
|
|
115
|
+
parent_propagation_delay = models.PositiveIntegerField(
|
|
116
|
+
verbose_name=_("Parent Propagation Delay"),
|
|
117
|
+
blank=True,
|
|
118
|
+
null=True,
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
use_nsec3 = models.BooleanField(
|
|
122
|
+
verbose_name=_("Use NSEC3"),
|
|
123
|
+
null=False,
|
|
124
|
+
default=True,
|
|
125
|
+
)
|
|
126
|
+
nsec3_iterations = models.PositiveIntegerField(
|
|
127
|
+
verbose_name=_("NSEC3 Iterations"),
|
|
128
|
+
blank=True,
|
|
129
|
+
null=True,
|
|
130
|
+
)
|
|
131
|
+
nsec3_opt_out = models.BooleanField(
|
|
132
|
+
verbose_name=_("NSEC3 Opt-Out"),
|
|
133
|
+
blank=False,
|
|
134
|
+
null=False,
|
|
135
|
+
default=False,
|
|
136
|
+
)
|
|
137
|
+
nsec3_salt_size = models.PositiveIntegerField(
|
|
138
|
+
verbose_name=_("NSEC3 Salt Size"),
|
|
139
|
+
blank=True,
|
|
140
|
+
null=True,
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
tenant = models.ForeignKey(
|
|
144
|
+
verbose_name=_("Tenant"),
|
|
145
|
+
to="tenancy.Tenant",
|
|
146
|
+
on_delete=models.PROTECT,
|
|
147
|
+
related_name="netbox_dns_dnssec_policy",
|
|
148
|
+
blank=True,
|
|
149
|
+
null=True,
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
clone_fields = (
|
|
153
|
+
"name",
|
|
154
|
+
"key_templates",
|
|
155
|
+
"description",
|
|
156
|
+
"tenant",
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
class Meta:
|
|
160
|
+
verbose_name = _("DNSSEC Policy")
|
|
161
|
+
verbose_name_plural = _("DNSSEC Policies")
|
|
162
|
+
|
|
163
|
+
ordering = ("name",)
|
|
164
|
+
|
|
165
|
+
def __str__(self):
|
|
166
|
+
return str(self.name)
|
|
167
|
+
|
|
168
|
+
def get_status_color(self):
|
|
169
|
+
return DNSSECPolicyStatusChoices.colors.get(self.status)
|
|
170
|
+
|
|
171
|
+
# TODO: Remove in version 1.3.0 (NetBox #18555)
|
|
172
|
+
def get_absolute_url(self):
|
|
173
|
+
return reverse("plugins:netbox_dns:dnssecpolicy", kwargs={"pk": self.pk})
|
|
174
|
+
|
|
175
|
+
@property
|
|
176
|
+
def purge_keys_value(self):
|
|
177
|
+
return self.purge_keys if self.purge_keys is not None else 776000
|
|
178
|
+
|
|
179
|
+
@property
|
|
180
|
+
def publish_safety_value(self):
|
|
181
|
+
return self.publish_safety if self.publish_safety is not None else 3600
|
|
182
|
+
|
|
183
|
+
def get_effective_value(self, attribute):
|
|
184
|
+
if not hasattr(self, attribute):
|
|
185
|
+
raise AttributeError(f"DNSSECPolicy does not have attribute {attribute}")
|
|
186
|
+
|
|
187
|
+
if (value := getattr(self, attribute)) is None:
|
|
188
|
+
return self.get_fallback_setting(attribute)
|
|
189
|
+
|
|
190
|
+
return value
|
|
191
|
+
|
|
192
|
+
@classmethod
|
|
193
|
+
def get_fallback_setting(cls, attribute):
|
|
194
|
+
return get_plugin_config("netbox_dns", f"dnssec_{attribute}")
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
@register_search
|
|
198
|
+
class DNSSECPolicyIndex(SearchIndex):
|
|
199
|
+
model = DNSSECPolicy
|
|
200
|
+
fields = (
|
|
201
|
+
("name", 100),
|
|
202
|
+
("description", 500),
|
|
203
|
+
)
|
netbox_dns/models/record.py
CHANGED
|
@@ -167,7 +167,7 @@ class Record(ObjectModificationMixin, ContactsMixin, NetBoxModel):
|
|
|
167
167
|
default=False,
|
|
168
168
|
)
|
|
169
169
|
ptr_record = models.OneToOneField(
|
|
170
|
-
verbose_name="PTR Record",
|
|
170
|
+
verbose_name=_("PTR Record"),
|
|
171
171
|
to="self",
|
|
172
172
|
on_delete=models.SET_NULL,
|
|
173
173
|
related_name="address_record",
|