diff --git a/dns/functions.py b/dns/functions.py new file mode 100644 index 0000000..52cd70c --- /dev/null +++ b/dns/functions.py @@ -0,0 +1,33 @@ +from .models import DNSSettings, StaticHost + + +def generate_unbound_config(): + dns_settings = DNSSettings.objects.get(name='dns_settings') + static_hosts = StaticHost.objects.all() + if dns_settings.dns_primary: + do_not_query_localhost = 'yes' + forward_zone = f'\nforward-zone:\n name: "."\n forward-addr: {dns_settings.dns_primary}\n' + if dns_settings.dns_secondary: + forward_zone += f' forward-addr: {dns_settings.dns_secondary}\n' + else: + do_not_query_localhost = 'no' + forward_zone = '' + + + unbound_config = f''' +server: + interface: 0.0.0.0 + port: 53 + access-control: 0.0.0.0/0 allow + do-ip4: yes + do-ip6: no + do-udp: yes + local-zone: "local." static + do-not-query-localhost: {do_not_query_localhost} + verbosity: 1 + recursion: yes +''' + unbound_config += forward_zone + for static_host in static_hosts: + unbound_config += f'local-data: "{static_host.hostname}. IN A {static_host.ip_address}"\n' + return unbound_config diff --git a/dns/views.py b/dns/views.py index 3418aea..f3467f1 100644 --- a/dns/views.py +++ b/dns/views.py @@ -4,12 +4,28 @@ from django.contrib import messages from user_manager.models import UserAcl from .models import DNSSettings, StaticHost from .forms import StaticHostForm, DNSSettingsForm +from .functions import generate_unbound_config +from django.conf import settings + + +@login_required +def view_apply_dns_config(request): + dns_settings, _ = DNSSettings.objects.get_or_create(name='dns_settings') + dns_settings.pending_changes = False + dns_settings.save() + unbound_config = generate_unbound_config() + with open(settings.UNBOUND_CONFIG, 'w') as f: + f.write(unbound_config) + messages.success(request, 'DNS settings applied successfully') + return redirect('/dns/') @login_required def view_static_host_list(request): dns_settings, _ = DNSSettings.objects.get_or_create(name='dns_settings') static_host_list = StaticHost.objects.all().order_by('hostname') + if dns_settings.pending_changes: + messages.warning(request, 'Pending Changes|There are pending DNS changes that have not been applied') context = { 'dns_settings': dns_settings, 'static_host_list': static_host_list, @@ -25,8 +41,7 @@ def view_manage_dns_settings(request): 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/') + return redirect('/dns/apply_config/') form_description_content = ''' DNS Forwarders diff --git a/wireguard_webadmin/settings.py b/wireguard_webadmin/settings.py index dbbfc17..51bc2de 100644 --- a/wireguard_webadmin/settings.py +++ b/wireguard_webadmin/settings.py @@ -131,9 +131,9 @@ STATICFILES_DIRS = [ # Default primary key field type # https://docs.djangoproject.com/en/5.0/ref/settings/#default-auto-field - +UNBOUND_CONFIG = '/config/unbound.conf' DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' WIREGUARD_WEBADMIN_VERSION = 9607 -from wireguard_webadmin.production_settings import * \ No newline at end of file +from wireguard_webadmin.production_settings import * diff --git a/wireguard_webadmin/urls.py b/wireguard_webadmin/urls.py index 3034b96..9918f86 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, view_manage_dns_settings +from dns.views import view_static_host_list, view_manage_static_host, view_manage_dns_settings, view_apply_dns_config urlpatterns = [ @@ -32,6 +32,7 @@ urlpatterns = [ path('', view_welcome, name='welcome'), path('status/', view_wireguard_status, name='wireguard_status'), path('dns/', view_static_host_list, name='static_host_list'), + path('dns/apply_config/', view_apply_dns_config, name='apply_dns_config'), 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'),