From 13702c664e9622a652a3be5a4ce94703066c4737 Mon Sep 17 00:00:00 2001 From: Eduardo Silva Date: Fri, 26 Apr 2024 15:29:07 -0300 Subject: [PATCH] DNS settings first commit and static host management --- dns/__init__.py | 0 dns/admin.py | 3 ++ dns/apps.py | 6 ++++ dns/forms.py | 50 ++++++++++++++++++++++++++ dns/migrations/0001_initial.py | 39 ++++++++++++++++++++ dns/migrations/__init__.py | 0 dns/models.py | 25 +++++++++++++ dns/tests.py | 3 ++ dns/views.py | 53 +++++++++++++++++++++++++++ templates/base.html | 9 +++++ templates/dns/static_host_list.html | 55 +++++++++++++++++++++++++++++ wireguard_webadmin/settings.py | 5 +++ wireguard_webadmin/urls.py | 3 ++ 13 files changed, 251 insertions(+) create mode 100644 dns/__init__.py create mode 100644 dns/admin.py create mode 100644 dns/apps.py create mode 100644 dns/forms.py create mode 100644 dns/migrations/0001_initial.py create mode 100644 dns/migrations/__init__.py create mode 100644 dns/models.py create mode 100644 dns/tests.py create mode 100644 dns/views.py create mode 100644 templates/dns/static_host_list.html diff --git a/dns/__init__.py b/dns/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/dns/admin.py b/dns/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/dns/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/dns/apps.py b/dns/apps.py new file mode 100644 index 0000000..4e04771 --- /dev/null +++ b/dns/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class DnsConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'dns' diff --git a/dns/forms.py b/dns/forms.py new file mode 100644 index 0000000..3d4d84e --- /dev/null +++ b/dns/forms.py @@ -0,0 +1,50 @@ +import requests +from .models import DNSSettings, StaticHost + +from django import forms +from crispy_forms.helper import FormHelper +from crispy_forms.layout import Layout, Fieldset, ButtonHolder, Submit, Div, Field, HTML +from crispy_forms.bootstrap import FormActions, StrictButton +from django.core.exceptions import ValidationError +from datetime import datetime +from django.core.exceptions import ValidationError +import re + + + +class StaticHostForm(forms.ModelForm): + class Meta: + model = StaticHost + fields = ['hostname', 'ip_address'] + + def __init__(self, *args, **kwargs): + super(StaticHostForm, self).__init__(*args, **kwargs) + self.helper = FormHelper() + self.helper.form_method = 'post' + if self.instance.pk: + delete_html = "Delete" + else: + delete_html = '' + self.helper.layout = Layout( + Fieldset( + 'Static DNS', + Div( + Field('hostname', css_class='form-control'), + Field('ip_address', css_class='form-control'), + css_class='col-md-6' + ), + ), + FormActions( + Submit('save', 'Save', css_class='btn btn-primary'), + HTML('Back '), + HTML(delete_html), + ) + ) + + def clean(self): + hostname = self.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): + raise ValidationError('Invalid hostname') + return diff --git a/dns/migrations/0001_initial.py b/dns/migrations/0001_initial.py new file mode 100644 index 0000000..eadef74 --- /dev/null +++ b/dns/migrations/0001_initial.py @@ -0,0 +1,39 @@ +# Generated by Django 5.0.4 on 2024-04-26 17:42 + +import uuid +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='DNSSettings', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(default='dns_settings', max_length=100)), + ('dns_primary', models.GenericIPAddressField(blank=True, default='1.1.1.1', null=True)), + ('dns_secondary', models.GenericIPAddressField(blank=True, default='1.0.0.1', null=True)), + ('pending_changes', models.BooleanField(default=True)), + ('created', models.DateTimeField(auto_now_add=True)), + ('updated', models.DateTimeField(auto_now=True)), + ('uuid', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ], + ), + migrations.CreateModel( + name='StaticHost', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('hostname', models.CharField(max_length=100, unique=True)), + ('ip_address', models.GenericIPAddressField()), + ('created', models.DateTimeField(auto_now_add=True)), + ('updated', models.DateTimeField(auto_now=True)), + ('uuid', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ], + ), + ] diff --git a/dns/migrations/__init__.py b/dns/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/dns/models.py b/dns/models.py new file mode 100644 index 0000000..af74a49 --- /dev/null +++ b/dns/models.py @@ -0,0 +1,25 @@ +from django.db import models +import uuid + + +class DNSSettings(models.Model): + name = models.CharField(default='dns_settings', max_length=100) + dns_primary = models.GenericIPAddressField(blank=True, null=True, default='1.1.1.1') + dns_secondary = models.GenericIPAddressField(blank=True, null=True, default='1.0.0.1') + pending_changes = models.BooleanField(default=True) + + created = models.DateTimeField(auto_now_add=True) + updated = models.DateTimeField(auto_now=True) + uuid = models.UUIDField(unique=True, default=uuid.uuid4, editable=False) + + +class StaticHost(models.Model): + hostname = models.CharField(max_length=100, unique=True) + ip_address = models.GenericIPAddressField() + + created = models.DateTimeField(auto_now_add=True) + updated = models.DateTimeField(auto_now=True) + uuid = models.UUIDField(unique=True, default=uuid.uuid4, editable=False) + + def __str__(self): + return self.hostname diff --git a/dns/tests.py b/dns/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/dns/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/dns/views.py b/dns/views.py new file mode 100644 index 0000000..7055776 --- /dev/null +++ b/dns/views.py @@ -0,0 +1,53 @@ +from django.contrib.auth.decorators import login_required +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 + + +@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') + context = { + 'dns_settings': dns_settings, + 'static_host_list': static_host_list, + } + return render(request, 'dns/static_host_list.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(): + return render(request, 'access_denied.html', {'page_title': 'Access Denied'}) + dns_settings, _ = DNSSettings.objects.get_or_create(name='dns_settings') + if request.GET.get('uuid'): + static_dns = get_object_or_404(StaticHost, uuid=request.GET.get('uuid')) + if request.GET.get('action') == 'delete': + if request.GET.get('confirmation') == 'delete': + static_dns.delete() + dns_settings.pending_changes = True + dns_settings.save() + messages.success(request, 'Static DNS deleted successfully') + return redirect('/dns/') + else: + messages.warning(request, 'Static DNS not deleted|Invalid confirmation') + return redirect('/dns/') + else: + static_dns = None + + form = StaticHostForm(request.POST or None, instance=static_dns) + if form.is_valid(): + form.save() + dns_settings.pending_changes = True + dns_settings.save() + messages.success(request, 'Static DNS saved successfully') + return redirect('/dns/') + + context = { + 'dns_settings': dns_settings, + 'form': form, + 'instance': static_dns, + } + return render(request, 'generic_form.html', context=context) diff --git a/templates/base.html b/templates/base.html index dc73841..43e45b0 100644 --- a/templates/base.html +++ b/templates/base.html @@ -113,6 +113,15 @@

+ +