diff --git a/routing_templates/__init__.py b/routing_templates/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/routing_templates/admin.py b/routing_templates/admin.py new file mode 100644 index 0000000..846f6b4 --- /dev/null +++ b/routing_templates/admin.py @@ -0,0 +1 @@ +# Register your models here. diff --git a/routing_templates/apps.py b/routing_templates/apps.py new file mode 100644 index 0000000..31fcc7e --- /dev/null +++ b/routing_templates/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class RoutingTemplatesConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'routing_templates' diff --git a/routing_templates/migrations/0001_initial.py b/routing_templates/migrations/0001_initial.py new file mode 100644 index 0000000..41ff671 --- /dev/null +++ b/routing_templates/migrations/0001_initial.py @@ -0,0 +1,36 @@ +# Generated by Django 5.2.9 on 2026-01-15 21:22 + +import uuid + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('wireguard', '0027_alter_wireguardinstance_peer_list_refresh_interval'), + ] + + operations = [ + migrations.CreateModel( + name='RoutingTemplate', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('default_template', models.BooleanField(default=False)), + ('name', models.CharField(max_length=32)), + ('route_type', models.CharField(choices=[('default', 'Default Route (0.0.0.0/0)'), ('peer_same_instance', 'Routes from Peers on same Interface'), ('peer_all_instances', 'Routes from All Peers'), ('custom', 'Custom Routes')], max_length=20)), + ('custom_routes', models.TextField(blank=True, help_text='One route per line in CIDR notation.', null=True)), + ('allow_peer_custom_routes', models.BooleanField(default=False)), + ('uuid', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('created', models.DateTimeField(auto_now_add=True)), + ('updated', models.DateTimeField(auto_now=True)), + ('wireguard_instance', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='wireguard.wireguardinstance')), + ], + options={ + 'unique_together': {('wireguard_instance', 'name')}, + }, + ), + ] diff --git a/routing_templates/migrations/__init__.py b/routing_templates/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/routing_templates/models.py b/routing_templates/models.py new file mode 100644 index 0000000..e88ebec --- /dev/null +++ b/routing_templates/models.py @@ -0,0 +1,45 @@ +import uuid + +from django.db import models, transaction +from django.utils.translation import gettext_lazy as _ + +from wireguard.models import WireGuardInstance + + +class RoutingTemplate(models.Model): + ROUTE_TYPE_CHOICES = [ + ("default", _('Default Route (0.0.0.0/0)')), + ("peer_same_instance", _('Routes from Peers on same Interface')), + ("peer_all_instances", _('Routes from All Peers')), + ("custom", _('Custom Routes')), + ] + + wireguard_instance = models.ForeignKey(WireGuardInstance, on_delete=models.CASCADE) + default_template = models.BooleanField(default=False) + + name = models.CharField(max_length=32) + route_type = models.CharField(max_length=20, choices=ROUTE_TYPE_CHOICES) + + custom_routes = models.TextField(blank=True, null=True, help_text=_('One route per line in CIDR notation.')) + allow_peer_custom_routes = models.BooleanField(default=False) + + uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True) + created = models.DateTimeField(auto_now_add=True) + updated = models.DateTimeField(auto_now=True) + + class Meta: + unique_together = (("wireguard_instance", "name"),) + + def __str__(self): + return self.name + + def save(self, *args, **kwargs): + with transaction.atomic(): + super().save(*args, **kwargs) + if self.default_template: + ( + RoutingTemplate.objects + .filter(wireguard_instance=self.wireguard_instance, default_template=True) + .exclude(pk=self.pk) + .update(default_template=False) + ) diff --git a/routing_templates/tests.py b/routing_templates/tests.py new file mode 100644 index 0000000..a39b155 --- /dev/null +++ b/routing_templates/tests.py @@ -0,0 +1 @@ +# Create your tests here. diff --git a/routing_templates/views.py b/routing_templates/views.py new file mode 100644 index 0000000..60f00ef --- /dev/null +++ b/routing_templates/views.py @@ -0,0 +1 @@ +# Create your views here. diff --git a/wireguard_webadmin/settings.py b/wireguard_webadmin/settings.py index a19235b..0bf044a 100644 --- a/wireguard_webadmin/settings.py +++ b/wireguard_webadmin/settings.py @@ -47,7 +47,8 @@ INSTALLED_APPS = [ 'dns', 'vpn_invite', 'cluster', - 'api' + 'api', + 'routing_templates' ] MIDDLEWARE = [