From 414bc8076ac1c8d11339e72b956e73b6baf5c315 Mon Sep 17 00:00:00 2001 From: Eduardo Silva Date: Fri, 26 Apr 2024 16:16:02 -0300 Subject: [PATCH] Manage DNS Settings --- dns/forms.py | 42 +++++++++++++++++++++++++++++++++++++- dns/views.py | 37 ++++++++++++++++++++++++++++++++- wireguard_webadmin/urls.py | 3 ++- 3 files changed, 79 insertions(+), 3 deletions(-) diff --git a/dns/forms.py b/dns/forms.py index 3d4d84e..deb66f6 100644 --- a/dns/forms.py +++ b/dns/forms.py @@ -11,6 +11,45 @@ from django.core.exceptions import ValidationError import re +class DNSSettingsForm(forms.ModelForm): + class Meta: + model = DNSSettings + fields = ['dns_primary', 'dns_secondary'] + + def __init__(self, *args, **kwargs): + super(DNSSettingsForm, self).__init__(*args, **kwargs) + self.helper = FormHelper() + self.fields['dns_primary'].label = 'Primary Resolver' + self.fields['dns_secondary'].label = 'Secondary Resolver' + self.helper.form_method = 'post' + self.helper.layout = Layout( + Fieldset( + 'Resolver Settings', + Div( + Field('dns_primary', css_class='form-control'), + Field('dns_secondary', css_class='form-control'), + css_class='col-md-6' + ), + ), + FormActions( + Submit('save', 'Save', css_class='btn btn-primary'), + HTML('Back'), + ) + ) + + def clean(self): + cleaned_data = super().clean() + dns_primary = cleaned_data.get('dns_primary') + dns_secondary = cleaned_data.get('dns_secondary') + if dns_secondary and not dns_primary: + dns_primary = dns_secondary + dns_secondary = '' + cleaned_data['dns_primary'] = dns_primary + cleaned_data['dns_secondary'] = dns_secondary + if dns_primary and dns_primary == dns_secondary: + raise ValidationError('Primary and secondary DNS cannot be the same') + return + class StaticHostForm(forms.ModelForm): class Meta: @@ -42,7 +81,8 @@ class StaticHostForm(forms.ModelForm): ) def clean(self): - hostname = self.cleaned_data.get('hostname') + cleaned_data = super().clean() + hostname = cleaned_data.get('hostname') if hostname: regex = r'^[a-zA-Z][a-zA-Z0-9-\.]*[a-zA-Z0-9]$' if not re.match(regex, hostname): diff --git a/dns/views.py b/dns/views.py index 7055776..3418aea 100644 --- a/dns/views.py +++ b/dns/views.py @@ -3,7 +3,7 @@ from django.shortcuts import render, get_object_or_404, redirect from django.contrib import messages from user_manager.models import UserAcl from .models import DNSSettings, StaticHost -from .forms import StaticHostForm +from .forms import StaticHostForm, DNSSettingsForm @login_required @@ -17,6 +17,41 @@ def view_static_host_list(request): return render(request, 'dns/static_host_list.html', context=context) +@login_required +def view_manage_dns_settings(request): + if not UserAcl.objects.filter(user=request.user).filter(user_level__gte=50).exists(): + return render(request, 'access_denied.html', {'page_title': 'Access Denied'}) + dns_settings, _ = DNSSettings.objects.get_or_create(name='dns_settings') + form = DNSSettingsForm(request.POST or None, instance=dns_settings) + if form.is_valid(): + form.save() + messages.success(request, 'DNS settings saved successfully') + return redirect('/dns/') + + form_description_content = ''' + DNS Forwarders +

+ All DNS queries will be forwarded to the primary resolver. If the primary resolver is not available, the secondary resolver will be used. +

+ + Local DNS Resolution + +

+ If no forwarders are specified, the system will locally resolve DNS queries. This can lead to slower DNS resolution times, but can be useful in certain scenarios. +

+ ''' + + context = { + 'dns_settings': dns_settings, + 'form': form, + 'form_description': { + 'size': '', + 'content': form_description_content + }, + } + return render(request, 'generic_form.html', context=context) + + @login_required def view_manage_static_host(request): if not UserAcl.objects.filter(user=request.user).filter(user_level__gte=40).exists(): diff --git a/wireguard_webadmin/urls.py b/wireguard_webadmin/urls.py index 822dca0..3034b96 100644 --- a/wireguard_webadmin/urls.py +++ b/wireguard_webadmin/urls.py @@ -24,7 +24,7 @@ from accounts.views import view_create_first_user, view_login, view_logout from wireguard_tools.views import export_wireguard_configs, download_config_or_qrcode, restart_wireguard_interfaces from api.views import wireguard_status, cron_check_updates, cron_update_peer_latest_handshake, routerfleet_get_user_token, routerfleet_authenticate_session from firewall.views import view_redirect_rule_list, manage_redirect_rule, view_firewall_rule_list, manage_firewall_rule, view_manage_firewall_settings, view_generate_iptables_script, view_reset_firewall, view_firewall_migration_required -from dns.views import view_static_host_list, view_manage_static_host +from dns.views import view_static_host_list, view_manage_static_host, view_manage_dns_settings urlpatterns = [ @@ -33,6 +33,7 @@ urlpatterns = [ path('status/', view_wireguard_status, name='wireguard_status'), path('dns/', view_static_host_list, name='static_host_list'), path('dns/manage_static_host/', view_manage_static_host, name='manage_static_host'), + path('dns/manage_settings/', view_manage_dns_settings, name='manage_dns_settings'), path('peer/list/', view_wireguard_peer_list, name='wireguard_peer_list'), path('peer/manage/', view_wireguard_peer_manage, name='wireguard_peer_manage'), path('peer/manage_ip_address/', view_manage_ip_address, name='manage_ip_address'),