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,46 @@
|
|
|
1
|
+
import django_filters
|
|
2
|
+
from django.db.models import Q
|
|
3
|
+
from django.utils.translation import gettext as _
|
|
4
|
+
|
|
5
|
+
from netbox.filtersets import NetBoxModelFilterSet
|
|
6
|
+
from tenancy.filtersets import TenancyFilterSet
|
|
7
|
+
|
|
8
|
+
from netbox_dns.models import NameServer, Zone
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
__all__ = ("NameServerFilterSet",)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class NameServerFilterSet(TenancyFilterSet, NetBoxModelFilterSet):
|
|
15
|
+
class Meta:
|
|
16
|
+
model = NameServer
|
|
17
|
+
|
|
18
|
+
fields = (
|
|
19
|
+
"id",
|
|
20
|
+
"name",
|
|
21
|
+
"description",
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
zone_id = django_filters.ModelMultipleChoiceFilter(
|
|
25
|
+
field_name="zones",
|
|
26
|
+
queryset=Zone.objects.all(),
|
|
27
|
+
to_field_name="id",
|
|
28
|
+
label=_("Zones"),
|
|
29
|
+
)
|
|
30
|
+
soa_zone_id = django_filters.ModelMultipleChoiceFilter(
|
|
31
|
+
method="filter_soa_zones",
|
|
32
|
+
queryset=Zone.objects.all(),
|
|
33
|
+
label=_("SOA Zones"),
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
def search(self, queryset, name, value):
|
|
37
|
+
if not value.strip():
|
|
38
|
+
return queryset
|
|
39
|
+
qs_filter = Q(Q(name__icontains=value) | Q(description__icontains=value))
|
|
40
|
+
return queryset.filter(qs_filter)
|
|
41
|
+
|
|
42
|
+
def filter_soa_zones(self, queryset, name, value):
|
|
43
|
+
if not value:
|
|
44
|
+
return queryset
|
|
45
|
+
soa_mnames = {zone.soa_mname.pk for zone in value}
|
|
46
|
+
return queryset.filter(pk__in=soa_mnames)
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import netaddr
|
|
2
|
+
|
|
3
|
+
import django_filters
|
|
4
|
+
from django.db.models import Q
|
|
5
|
+
from django.utils.translation import gettext as _
|
|
6
|
+
|
|
7
|
+
from netbox.filtersets import NetBoxModelFilterSet
|
|
8
|
+
from tenancy.filtersets import TenancyFilterSet
|
|
9
|
+
from utilities.filters import MultiValueCharFilter
|
|
10
|
+
|
|
11
|
+
from ipam.models import IPAddress
|
|
12
|
+
|
|
13
|
+
from netbox_dns.models import View, Zone, Record
|
|
14
|
+
from netbox_dns.choices import RecordTypeChoices, RecordStatusChoices
|
|
15
|
+
from netbox_dns.filters import TimePeriodFilter
|
|
16
|
+
|
|
17
|
+
__all__ = ("RecordFilterSet",)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class RecordFilterSet(TenancyFilterSet, NetBoxModelFilterSet):
|
|
21
|
+
class Meta:
|
|
22
|
+
model = Record
|
|
23
|
+
|
|
24
|
+
fields = (
|
|
25
|
+
"id",
|
|
26
|
+
"name",
|
|
27
|
+
"fqdn",
|
|
28
|
+
"description",
|
|
29
|
+
"ttl",
|
|
30
|
+
"value",
|
|
31
|
+
"disable_ptr",
|
|
32
|
+
"managed",
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
fqdn = MultiValueCharFilter(
|
|
36
|
+
method="filter_fqdn",
|
|
37
|
+
)
|
|
38
|
+
ttl = TimePeriodFilter()
|
|
39
|
+
type = django_filters.MultipleChoiceFilter(
|
|
40
|
+
choices=RecordTypeChoices,
|
|
41
|
+
)
|
|
42
|
+
status = django_filters.MultipleChoiceFilter(
|
|
43
|
+
choices=RecordStatusChoices,
|
|
44
|
+
)
|
|
45
|
+
zone_id = django_filters.ModelMultipleChoiceFilter(
|
|
46
|
+
queryset=Zone.objects.all(),
|
|
47
|
+
label=_("Parent Zone ID"),
|
|
48
|
+
)
|
|
49
|
+
zone = django_filters.ModelMultipleChoiceFilter(
|
|
50
|
+
queryset=Zone.objects.all(),
|
|
51
|
+
field_name="zone__name",
|
|
52
|
+
to_field_name="name",
|
|
53
|
+
label=_("Parent Zone"),
|
|
54
|
+
)
|
|
55
|
+
view_id = django_filters.ModelMultipleChoiceFilter(
|
|
56
|
+
queryset=View.objects.all(),
|
|
57
|
+
field_name="zone__view",
|
|
58
|
+
label=_("ID of the View the Parent Zone belongs to"),
|
|
59
|
+
)
|
|
60
|
+
view = django_filters.ModelMultipleChoiceFilter(
|
|
61
|
+
queryset=View.objects.all(),
|
|
62
|
+
field_name="zone__view__name",
|
|
63
|
+
to_field_name="name",
|
|
64
|
+
label=_("View the Parent Zone belongs to"),
|
|
65
|
+
)
|
|
66
|
+
address_record_id = django_filters.ModelMultipleChoiceFilter(
|
|
67
|
+
field_name="address_records",
|
|
68
|
+
queryset=Record.objects.all(),
|
|
69
|
+
to_field_name="id",
|
|
70
|
+
label=_("Address Records"),
|
|
71
|
+
)
|
|
72
|
+
ptr_record_id = django_filters.ModelMultipleChoiceFilter(
|
|
73
|
+
field_name="ptr_record",
|
|
74
|
+
queryset=Record.objects.all(),
|
|
75
|
+
to_field_name="id",
|
|
76
|
+
label=_("Pointer Record"),
|
|
77
|
+
)
|
|
78
|
+
rfc2317_cname_record_id = django_filters.ModelMultipleChoiceFilter(
|
|
79
|
+
field_name="rfc2317_cname_record",
|
|
80
|
+
queryset=Record.objects.all(),
|
|
81
|
+
to_field_name="id",
|
|
82
|
+
label=_("Pointer Record"),
|
|
83
|
+
)
|
|
84
|
+
ipam_ip_address_id = django_filters.ModelMultipleChoiceFilter(
|
|
85
|
+
field_name="ipam_ip_address",
|
|
86
|
+
queryset=IPAddress.objects.all(),
|
|
87
|
+
to_field_name="id",
|
|
88
|
+
label=_("IPAM IP Address"),
|
|
89
|
+
)
|
|
90
|
+
ip_address = MultiValueCharFilter(
|
|
91
|
+
method="filter_ip_address",
|
|
92
|
+
label=_("IP Address"),
|
|
93
|
+
)
|
|
94
|
+
active = django_filters.BooleanFilter(
|
|
95
|
+
label=_("Record is active"),
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
managed = django_filters.BooleanFilter()
|
|
99
|
+
|
|
100
|
+
def filter_fqdn(self, queryset, name, value):
|
|
101
|
+
if not value:
|
|
102
|
+
return queryset
|
|
103
|
+
|
|
104
|
+
fqdns = []
|
|
105
|
+
for fqdn in value:
|
|
106
|
+
if not fqdn.endswith("."):
|
|
107
|
+
fqdn = fqdn + "."
|
|
108
|
+
fqdns.append(fqdn)
|
|
109
|
+
|
|
110
|
+
return queryset.filter(fqdn__in=fqdns)
|
|
111
|
+
|
|
112
|
+
def filter_ip_address(self, queryset, name, value):
|
|
113
|
+
if not value:
|
|
114
|
+
return queryset
|
|
115
|
+
try:
|
|
116
|
+
ip_addresses = [
|
|
117
|
+
str(netaddr.IPAddress(item)) for item in value if item.strip()
|
|
118
|
+
]
|
|
119
|
+
if not ip_addresses:
|
|
120
|
+
return queryset
|
|
121
|
+
|
|
122
|
+
return queryset.filter(ip_address__in=ip_addresses)
|
|
123
|
+
except (netaddr.AddrFormatError, ValueError):
|
|
124
|
+
return queryset.none()
|
|
125
|
+
|
|
126
|
+
def search(self, queryset, name, value):
|
|
127
|
+
if not value.strip():
|
|
128
|
+
return queryset
|
|
129
|
+
qs_filter = (
|
|
130
|
+
Q(fqdn__icontains=value)
|
|
131
|
+
| Q(description__icontains=value)
|
|
132
|
+
| Q(value__icontains=value)
|
|
133
|
+
| Q(zone__name__icontains=value)
|
|
134
|
+
)
|
|
135
|
+
return queryset.filter(qs_filter)
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import django_filters
|
|
2
|
+
from django.db.models import Q
|
|
3
|
+
from django.utils.translation import gettext as _
|
|
4
|
+
|
|
5
|
+
from netbox.filtersets import NetBoxModelFilterSet
|
|
6
|
+
from tenancy.filtersets import TenancyFilterSet
|
|
7
|
+
|
|
8
|
+
from netbox_dns.models import RecordTemplate, ZoneTemplate
|
|
9
|
+
from netbox_dns.choices import RecordTypeChoices, RecordStatusChoices
|
|
10
|
+
from netbox_dns.filters import TimePeriodFilter
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
__all__ = ("RecordTemplateFilterSet",)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class RecordTemplateFilterSet(TenancyFilterSet, NetBoxModelFilterSet):
|
|
17
|
+
class Meta:
|
|
18
|
+
model = RecordTemplate
|
|
19
|
+
|
|
20
|
+
fields = (
|
|
21
|
+
"id",
|
|
22
|
+
"name",
|
|
23
|
+
"record_name",
|
|
24
|
+
"value",
|
|
25
|
+
"description",
|
|
26
|
+
"ttl",
|
|
27
|
+
"disable_ptr",
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
ttl = TimePeriodFilter()
|
|
31
|
+
type = django_filters.MultipleChoiceFilter(
|
|
32
|
+
choices=RecordTypeChoices,
|
|
33
|
+
)
|
|
34
|
+
status = django_filters.MultipleChoiceFilter(
|
|
35
|
+
choices=RecordStatusChoices,
|
|
36
|
+
)
|
|
37
|
+
zone_template = django_filters.ModelMultipleChoiceFilter(
|
|
38
|
+
queryset=ZoneTemplate.objects.all(),
|
|
39
|
+
field_name="zone_templates__name",
|
|
40
|
+
to_field_name="name",
|
|
41
|
+
label=_("Zone Template"),
|
|
42
|
+
)
|
|
43
|
+
zone_template_id = django_filters.ModelMultipleChoiceFilter(
|
|
44
|
+
queryset=ZoneTemplate.objects.all(),
|
|
45
|
+
field_name="zone_templates",
|
|
46
|
+
to_field_name="id",
|
|
47
|
+
label=_("Zone Template ID"),
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
def search(self, queryset, name, value):
|
|
51
|
+
if not value.strip():
|
|
52
|
+
return queryset
|
|
53
|
+
qs_filter = (
|
|
54
|
+
Q(name__icontains=value)
|
|
55
|
+
| Q(description__icontains=value)
|
|
56
|
+
| Q(record_name__icontains=value)
|
|
57
|
+
| Q(value__icontains=value)
|
|
58
|
+
)
|
|
59
|
+
return queryset.filter(qs_filter)
|
|
@@ -5,13 +5,19 @@ from netbox.filtersets import NetBoxModelFilterSet
|
|
|
5
5
|
from netbox_dns.models import Registrar
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
__all__ = ("RegistrarFilterSet",)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class RegistrarFilterSet(NetBoxModelFilterSet):
|
|
9
12
|
class Meta:
|
|
10
13
|
model = Registrar
|
|
14
|
+
|
|
11
15
|
fields = (
|
|
12
16
|
"id",
|
|
13
17
|
"name",
|
|
18
|
+
"description",
|
|
14
19
|
"iana_id",
|
|
20
|
+
"address",
|
|
15
21
|
"referral_url",
|
|
16
22
|
"whois_server",
|
|
17
23
|
"abuse_email",
|
|
@@ -23,6 +29,7 @@ class RegistrarFilter(NetBoxModelFilterSet):
|
|
|
23
29
|
return queryset
|
|
24
30
|
qs_filter = (
|
|
25
31
|
Q(name__icontains=value)
|
|
32
|
+
| Q(description__icontains=value)
|
|
26
33
|
| Q(iana_id=value)
|
|
27
34
|
| Q(referral_url__icontains=value)
|
|
28
35
|
| Q(whois_server__icontains=value)
|
|
@@ -2,15 +2,20 @@ from django.db.models import Q
|
|
|
2
2
|
|
|
3
3
|
from netbox.filtersets import NetBoxModelFilterSet
|
|
4
4
|
|
|
5
|
-
from netbox_dns.models import
|
|
5
|
+
from netbox_dns.models import RegistrationContact
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
__all__ = ("RegistrationContactFilterSet",)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class RegistrationContactFilterSet(NetBoxModelFilterSet):
|
|
9
12
|
class Meta:
|
|
10
|
-
model =
|
|
13
|
+
model = RegistrationContact
|
|
14
|
+
|
|
11
15
|
fields = (
|
|
12
16
|
"id",
|
|
13
17
|
"name",
|
|
18
|
+
"description",
|
|
14
19
|
"contact_id",
|
|
15
20
|
"organization",
|
|
16
21
|
"street",
|
|
@@ -30,6 +35,7 @@ class ContactFilter(NetBoxModelFilterSet):
|
|
|
30
35
|
return queryset
|
|
31
36
|
qs_filter = (
|
|
32
37
|
Q(name__icontains=value)
|
|
38
|
+
| Q(description__icontains=value)
|
|
33
39
|
| Q(contact_id__icontains=value)
|
|
34
40
|
| Q(organization__icontains=value)
|
|
35
41
|
| Q(city__icontains=value)
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import django_filters
|
|
2
|
+
|
|
3
|
+
from django.db.models import Q
|
|
4
|
+
from django.utils.translation import gettext as _
|
|
5
|
+
|
|
6
|
+
from netbox.filtersets import NetBoxModelFilterSet
|
|
7
|
+
from tenancy.filtersets import TenancyFilterSet
|
|
8
|
+
from ipam.models import Prefix
|
|
9
|
+
|
|
10
|
+
from netbox_dns.models import View
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
__all__ = ("ViewFilterSet",)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class ViewFilterSet(NetBoxModelFilterSet, TenancyFilterSet):
|
|
17
|
+
class Meta:
|
|
18
|
+
model = View
|
|
19
|
+
|
|
20
|
+
fields = (
|
|
21
|
+
"id",
|
|
22
|
+
"name",
|
|
23
|
+
"default_view",
|
|
24
|
+
"description",
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
prefix_id = django_filters.ModelMultipleChoiceFilter(
|
|
28
|
+
queryset=Prefix.objects.all(),
|
|
29
|
+
field_name="prefixes",
|
|
30
|
+
to_field_name="id",
|
|
31
|
+
label=_("Prefix ID"),
|
|
32
|
+
)
|
|
33
|
+
prefix = django_filters.ModelMultipleChoiceFilter(
|
|
34
|
+
queryset=Prefix.objects.all(),
|
|
35
|
+
field_name="prefixes__prefix",
|
|
36
|
+
to_field_name="prefix",
|
|
37
|
+
label=_("Prefix"),
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
def search(self, queryset, name, value):
|
|
41
|
+
if not value.strip():
|
|
42
|
+
return queryset
|
|
43
|
+
qs_filter = Q(Q(name__icontains=value) | Q(description__icontains=value))
|
|
44
|
+
|
|
45
|
+
return queryset.filter(qs_filter)
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import netaddr
|
|
2
|
+
from netaddr.core import AddrFormatError
|
|
3
|
+
|
|
4
|
+
import django_filters
|
|
5
|
+
from django.db.models import Q
|
|
6
|
+
from django.utils.translation import gettext as _
|
|
7
|
+
|
|
8
|
+
from netbox.filtersets import NetBoxModelFilterSet
|
|
9
|
+
from tenancy.filtersets import TenancyFilterSet
|
|
10
|
+
from utilities.filters import MultiValueCharFilter
|
|
11
|
+
|
|
12
|
+
from netbox_dns.models import (
|
|
13
|
+
View,
|
|
14
|
+
Zone,
|
|
15
|
+
Registrar,
|
|
16
|
+
RegistrationContact,
|
|
17
|
+
NameServer,
|
|
18
|
+
DNSSECPolicy,
|
|
19
|
+
)
|
|
20
|
+
from netbox_dns.choices import ZoneStatusChoices, ZoneEPPStatusChoices
|
|
21
|
+
from netbox_dns.filters import TimePeriodFilter
|
|
22
|
+
|
|
23
|
+
__all__ = ("ZoneFilterSet",)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class ZoneFilterSet(TenancyFilterSet, NetBoxModelFilterSet):
|
|
27
|
+
class Meta:
|
|
28
|
+
model = Zone
|
|
29
|
+
|
|
30
|
+
fields = (
|
|
31
|
+
"id",
|
|
32
|
+
"name",
|
|
33
|
+
"description",
|
|
34
|
+
"soa_rname",
|
|
35
|
+
"soa_serial",
|
|
36
|
+
"soa_serial_auto",
|
|
37
|
+
"rfc2317_parent_managed",
|
|
38
|
+
"registry_domain_id",
|
|
39
|
+
"domain_status",
|
|
40
|
+
"inline_signing",
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
status = django_filters.MultipleChoiceFilter(
|
|
44
|
+
choices=ZoneStatusChoices,
|
|
45
|
+
)
|
|
46
|
+
view_id = django_filters.ModelMultipleChoiceFilter(
|
|
47
|
+
queryset=View.objects.all(),
|
|
48
|
+
label=_("View ID"),
|
|
49
|
+
)
|
|
50
|
+
view = django_filters.ModelMultipleChoiceFilter(
|
|
51
|
+
queryset=View.objects.all(),
|
|
52
|
+
field_name="view__name",
|
|
53
|
+
to_field_name="name",
|
|
54
|
+
label=_("View"),
|
|
55
|
+
)
|
|
56
|
+
nameserver_id = django_filters.ModelMultipleChoiceFilter(
|
|
57
|
+
queryset=NameServer.objects.all(),
|
|
58
|
+
field_name="nameservers",
|
|
59
|
+
to_field_name="id",
|
|
60
|
+
label=_("Nameservers ID"),
|
|
61
|
+
)
|
|
62
|
+
nameserver = django_filters.ModelMultipleChoiceFilter(
|
|
63
|
+
queryset=NameServer.objects.all(),
|
|
64
|
+
field_name="nameservers__name",
|
|
65
|
+
to_field_name="name",
|
|
66
|
+
label=_("Nameserver"),
|
|
67
|
+
)
|
|
68
|
+
default_ttl = TimePeriodFilter()
|
|
69
|
+
soa_mname_id = django_filters.ModelMultipleChoiceFilter(
|
|
70
|
+
queryset=NameServer.objects.all(),
|
|
71
|
+
label=_("SOA MName ID"),
|
|
72
|
+
)
|
|
73
|
+
soa_mname = django_filters.ModelMultipleChoiceFilter(
|
|
74
|
+
queryset=NameServer.objects.all(),
|
|
75
|
+
field_name="soa_mname__name",
|
|
76
|
+
to_field_name="name",
|
|
77
|
+
label=_("SOA MName"),
|
|
78
|
+
)
|
|
79
|
+
soa_ttl = TimePeriodFilter()
|
|
80
|
+
soa_refresh = TimePeriodFilter()
|
|
81
|
+
soa_retry = TimePeriodFilter()
|
|
82
|
+
soa_expire = TimePeriodFilter()
|
|
83
|
+
soa_minimum = TimePeriodFilter()
|
|
84
|
+
dnssec_policy_id = django_filters.ModelMultipleChoiceFilter(
|
|
85
|
+
queryset=DNSSECPolicy.objects.all(),
|
|
86
|
+
label=_("DNSSEC Policy ID"),
|
|
87
|
+
)
|
|
88
|
+
dnssec_policy = django_filters.ModelMultipleChoiceFilter(
|
|
89
|
+
queryset=DNSSECPolicy.objects.all(),
|
|
90
|
+
field_name="dnssec_policy__name",
|
|
91
|
+
to_field_name="name",
|
|
92
|
+
label=_("DNSSEC Policy"),
|
|
93
|
+
)
|
|
94
|
+
parental_agents = MultiValueCharFilter(
|
|
95
|
+
method="filter_parental_agents",
|
|
96
|
+
label=_("Parental Agents"),
|
|
97
|
+
)
|
|
98
|
+
rfc2317_prefix = MultiValueCharFilter(
|
|
99
|
+
method="filter_rfc2317_prefix",
|
|
100
|
+
label=_("RFC2317 Prefix"),
|
|
101
|
+
)
|
|
102
|
+
rfc2317_parent_zone_id = django_filters.ModelMultipleChoiceFilter(
|
|
103
|
+
queryset=Zone.objects.all(),
|
|
104
|
+
field_name="rfc2317_parent_zone",
|
|
105
|
+
to_field_name="id",
|
|
106
|
+
label=_("RFC2317 Parent Zone"),
|
|
107
|
+
)
|
|
108
|
+
rfc2317_parent_zone = django_filters.ModelMultipleChoiceFilter(
|
|
109
|
+
queryset=Zone.objects.all(),
|
|
110
|
+
field_name="rfc2317_parent_zone__name",
|
|
111
|
+
to_field_name="name",
|
|
112
|
+
label=_("RFC2317 Parent Zone"),
|
|
113
|
+
)
|
|
114
|
+
registrar_id = django_filters.ModelMultipleChoiceFilter(
|
|
115
|
+
queryset=Registrar.objects.all(),
|
|
116
|
+
label=_("Registrar ID"),
|
|
117
|
+
)
|
|
118
|
+
registrar = django_filters.ModelMultipleChoiceFilter(
|
|
119
|
+
queryset=Registrar.objects.all(),
|
|
120
|
+
field_name="registrar__name",
|
|
121
|
+
to_field_name="name",
|
|
122
|
+
label=_("Registrar"),
|
|
123
|
+
)
|
|
124
|
+
expiration_date = django_filters.DateFromToRangeFilter()
|
|
125
|
+
domain_status = django_filters.MultipleChoiceFilter(
|
|
126
|
+
choices=ZoneEPPStatusChoices,
|
|
127
|
+
)
|
|
128
|
+
registrant_id = django_filters.ModelMultipleChoiceFilter(
|
|
129
|
+
queryset=RegistrationContact.objects.all(),
|
|
130
|
+
label=_("Registrant ID"),
|
|
131
|
+
)
|
|
132
|
+
registrant = django_filters.ModelMultipleChoiceFilter(
|
|
133
|
+
queryset=RegistrationContact.objects.all(),
|
|
134
|
+
field_name="registrant__contact_id",
|
|
135
|
+
to_field_name="contact_id",
|
|
136
|
+
label=_("Registrant"),
|
|
137
|
+
)
|
|
138
|
+
admin_c_id = django_filters.ModelMultipleChoiceFilter(
|
|
139
|
+
queryset=RegistrationContact.objects.all(),
|
|
140
|
+
label=_("Administrative Contact ID"),
|
|
141
|
+
)
|
|
142
|
+
admin_c = django_filters.ModelMultipleChoiceFilter(
|
|
143
|
+
queryset=RegistrationContact.objects.all(),
|
|
144
|
+
field_name="admin_c__contact_id",
|
|
145
|
+
to_field_name="contact_id",
|
|
146
|
+
label=_("Administrative Contact"),
|
|
147
|
+
)
|
|
148
|
+
tech_c_id = django_filters.ModelMultipleChoiceFilter(
|
|
149
|
+
queryset=RegistrationContact.objects.all(),
|
|
150
|
+
label=_("Technical Contact ID"),
|
|
151
|
+
)
|
|
152
|
+
tech_c = django_filters.ModelMultipleChoiceFilter(
|
|
153
|
+
queryset=RegistrationContact.objects.all(),
|
|
154
|
+
field_name="tech_c__contact_id",
|
|
155
|
+
to_field_name="contact_id",
|
|
156
|
+
label=_("Technical Contact"),
|
|
157
|
+
)
|
|
158
|
+
billing_c_id = django_filters.ModelMultipleChoiceFilter(
|
|
159
|
+
queryset=RegistrationContact.objects.all(),
|
|
160
|
+
label=_("Billing Contact ID"),
|
|
161
|
+
)
|
|
162
|
+
billing_c = django_filters.ModelMultipleChoiceFilter(
|
|
163
|
+
queryset=RegistrationContact.objects.all(),
|
|
164
|
+
field_name="billing_c__contact_id",
|
|
165
|
+
to_field_name="contact_id",
|
|
166
|
+
label=_("Billing Contact"),
|
|
167
|
+
)
|
|
168
|
+
arpa_network = MultiValueCharFilter(
|
|
169
|
+
method="filter_arpa_network",
|
|
170
|
+
label=_("ARPA Network"),
|
|
171
|
+
)
|
|
172
|
+
active = django_filters.BooleanFilter(
|
|
173
|
+
label=_("Zone is active"),
|
|
174
|
+
)
|
|
175
|
+
inline_signing = django_filters.BooleanFilter(
|
|
176
|
+
label=_("Zone is using a DNSSEC policy with inline signing"),
|
|
177
|
+
method="filter_inline_signing",
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
def filter_parental_agents(self, queryset, name, value):
|
|
181
|
+
if not value:
|
|
182
|
+
return queryset
|
|
183
|
+
|
|
184
|
+
query_values = []
|
|
185
|
+
for v in value:
|
|
186
|
+
try:
|
|
187
|
+
query_values.append(str(netaddr.IPAddress(v)))
|
|
188
|
+
except (AddrFormatError, ValueError):
|
|
189
|
+
pass
|
|
190
|
+
|
|
191
|
+
return queryset.filter(parental_agents__overlap=query_values)
|
|
192
|
+
|
|
193
|
+
def filter_arpa_network(self, queryset, name, value):
|
|
194
|
+
if not value:
|
|
195
|
+
return queryset
|
|
196
|
+
try:
|
|
197
|
+
arpa_networks = [
|
|
198
|
+
str(netaddr.IPNetwork(item)) for item in value if item.strip()
|
|
199
|
+
]
|
|
200
|
+
if not arpa_networks:
|
|
201
|
+
return queryset
|
|
202
|
+
return queryset.filter(arpa_network__in=arpa_networks)
|
|
203
|
+
|
|
204
|
+
except (netaddr.AddrFormatError, ValueError):
|
|
205
|
+
return queryset.none()
|
|
206
|
+
|
|
207
|
+
def filter_rfc2317_prefix(self, queryset, name, value):
|
|
208
|
+
if not value:
|
|
209
|
+
return queryset
|
|
210
|
+
try:
|
|
211
|
+
rfc2317_prefixes = [
|
|
212
|
+
str(netaddr.IPNetwork(item)) for item in value if item.strip()
|
|
213
|
+
]
|
|
214
|
+
if not rfc2317_prefixes:
|
|
215
|
+
return queryset
|
|
216
|
+
return queryset.filter(rfc2317_prefix__in=rfc2317_prefixes)
|
|
217
|
+
|
|
218
|
+
except (netaddr.AddrFormatError, ValueError):
|
|
219
|
+
return queryset.none()
|
|
220
|
+
|
|
221
|
+
def filter_inline_signing(self, queryset, name, value):
|
|
222
|
+
if value is None:
|
|
223
|
+
return queryset
|
|
224
|
+
|
|
225
|
+
if value:
|
|
226
|
+
return queryset.filter(
|
|
227
|
+
dnssec_policy__isnull=False, dnssec_policy__inline_signing=True
|
|
228
|
+
)
|
|
229
|
+
else:
|
|
230
|
+
return queryset.filter(
|
|
231
|
+
Q(
|
|
232
|
+
Q(dnssec_policy__isnull=True)
|
|
233
|
+
| Q(dnssec_policy__inline_signing=False)
|
|
234
|
+
)
|
|
235
|
+
)
|
|
236
|
+
|
|
237
|
+
def search(self, queryset, name, value):
|
|
238
|
+
if not value.strip():
|
|
239
|
+
return queryset
|
|
240
|
+
qs_filter = (
|
|
241
|
+
Q(name__icontains=value)
|
|
242
|
+
| Q(description__icontains=value)
|
|
243
|
+
| Q(status__icontains=value)
|
|
244
|
+
| Q(view__name__icontains=value)
|
|
245
|
+
| Q(dnssec_policy__name__icontains=value)
|
|
246
|
+
| Q(registrar__name__icontains=value)
|
|
247
|
+
| Q(registry_domain_id__icontains=value)
|
|
248
|
+
| Q(registrant__name__icontains=value)
|
|
249
|
+
| Q(admin_c__name__icontains=value)
|
|
250
|
+
| Q(tech_c__name__icontains=value)
|
|
251
|
+
| Q(billing_c__name__icontains=value)
|
|
252
|
+
| Q(comments__icontains=value)
|
|
253
|
+
)
|
|
254
|
+
return queryset.filter(qs_filter)
|