diff --git a/router_manager/__init__.py b/router_manager/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/router_manager/admin.py b/router_manager/admin.py new file mode 100644 index 0000000..1d8c193 --- /dev/null +++ b/router_manager/admin.py @@ -0,0 +1,29 @@ +from django.contrib import admin +from .models import Router, SSHKey, RouterStatus + + +class RouterAdmin(admin.ModelAdmin): + list_display = ('name', 'address', 'username', 'router_type', 'enabled', 'monitoring') + search_fields = ('name', 'address', 'username', 'router_type') + list_filter = ('router_type', 'enabled', 'monitoring') + + +admin.site.register(Router, RouterAdmin) + + +class SSHKeyAdmin(admin.ModelAdmin): + list_display = ('name', 'updated', 'created') + search_fields = ('name',) + list_filter = ('updated', 'created') + + +admin.site.register(SSHKey, SSHKeyAdmin) + + +class RouterStatusAdmin(admin.ModelAdmin): + list_display = ('router', 'status_online', 'last_status_change', 'last_backup') + search_fields = ('router', 'status_online') + list_filter = ('status_online', 'last_status_change', 'last_backup') + + +admin.site.register(RouterStatus, RouterStatusAdmin) diff --git a/router_manager/apps.py b/router_manager/apps.py new file mode 100644 index 0000000..b3bd261 --- /dev/null +++ b/router_manager/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class RouterManagerConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'router_manager' diff --git a/router_manager/forms.py b/router_manager/forms.py new file mode 100644 index 0000000..486638e --- /dev/null +++ b/router_manager/forms.py @@ -0,0 +1,44 @@ +from django import forms +from crispy_forms.helper import FormHelper +from crispy_forms.layout import Layout, Submit, Row, Column, HTML +from .models import Router + + +class RouterForm(forms.ModelForm): + class Meta: + model = Router + fields = ['name', 'address', 'username', 'password', 'ssh_key', 'monitoring', 'router_type', 'enabled'] + + def __init__(self, *args, **kwargs): + super(RouterForm, 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( + Row( + Column('name', css_class='form-group col-md-6 mb-0'), + Column('address', css_class='form-group col-md-6 mb-0'), + css_class='form-row' + ), + Row( + Column('username', css_class='form-group col-md-6 mb-0'), + Column('password', css_class='form-group col-md-6 mb-0'), + css_class='form-row' + ), + 'ssh_key', + + 'router_type', + 'monitoring', + 'enabled', + Row( + Column( + Submit('submit', 'Salvar', css_class='btn btn-success'), + HTML(' Back '), + HTML(delete_html), + css_class='col-md-12'), + css_class='form-row' + ) + ) diff --git a/router_manager/migrations/0001_initial.py b/router_manager/migrations/0001_initial.py new file mode 100644 index 0000000..dbf04d6 --- /dev/null +++ b/router_manager/migrations/0001_initial.py @@ -0,0 +1,45 @@ +# Generated by Django 5.0.3 on 2024-03-15 21:08 + +import django.db.models.deletion +import uuid +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='SSHKey', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=100)), + ('public_key', models.TextField()), + ('private_key', models.TextField()), + ('updated', models.DateTimeField(auto_now=True)), + ('created', models.DateTimeField(auto_now_add=True)), + ('uuid', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ], + ), + migrations.CreateModel( + name='Router', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=100)), + ('address', models.CharField(max_length=15)), + ('username', models.CharField(default='admin', max_length=100)), + ('password', models.CharField(max_length=100)), + ('monitoring', models.BooleanField(default=True)), + ('router_type', models.CharField(choices=[('routeros', 'Mikrotik (RouterOS)'), ('openwrt', 'OpenWRT')], max_length=100)), + ('enabled', models.BooleanField(default=True)), + ('updated', models.DateTimeField(auto_now=True)), + ('created', models.DateTimeField(auto_now_add=True)), + ('uuid', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('ssh_key', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='router_manager.sshkey')), + ], + ), + ] diff --git a/router_manager/migrations/0002_alter_router_password.py b/router_manager/migrations/0002_alter_router_password.py new file mode 100644 index 0000000..5d0e558 --- /dev/null +++ b/router_manager/migrations/0002_alter_router_password.py @@ -0,0 +1,18 @@ +# Generated by Django 5.0.3 on 2024-03-16 12:36 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('router_manager', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='router', + name='password', + field=models.CharField(blank=True, max_length=100, null=True), + ), + ] diff --git a/router_manager/migrations/0003_routerstatus.py b/router_manager/migrations/0003_routerstatus.py new file mode 100644 index 0000000..349662b --- /dev/null +++ b/router_manager/migrations/0003_routerstatus.py @@ -0,0 +1,28 @@ +# Generated by Django 5.0.3 on 2024-03-16 15:16 + +import django.db.models.deletion +import uuid +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('router_manager', '0002_alter_router_password'), + ] + + operations = [ + migrations.CreateModel( + name='RouterStatus', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('status_online', models.BooleanField(default=False)), + ('last_status_change', models.DateTimeField(blank=True, null=True)), + ('last_backup', models.DateTimeField(blank=True, null=True)), + ('updated', models.DateTimeField(auto_now=True)), + ('created', models.DateTimeField(auto_now_add=True)), + ('uuid', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('router', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='router_manager.router')), + ], + ), + ] diff --git a/router_manager/migrations/__init__.py b/router_manager/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/router_manager/models.py b/router_manager/models.py new file mode 100644 index 0000000..9843ecf --- /dev/null +++ b/router_manager/models.py @@ -0,0 +1,46 @@ +from django.db import models +import uuid + + +class SSHKey(models.Model): + name = models.CharField(max_length=100) + public_key = models.TextField() + private_key = models.TextField() + + updated = models.DateTimeField(auto_now=True) + created = models.DateTimeField(auto_now_add=True) + uuid = models.UUIDField(unique=True, editable=False, default=uuid.uuid4) + + def __str__(self): + return self.name + + +class Router(models.Model): + name = models.CharField(max_length=100) + address = models.CharField(max_length=15) + username = models.CharField(max_length=100, default='admin') + password = models.CharField(max_length=100, null=True, blank=True) + ssh_key = models.ForeignKey(SSHKey, on_delete=models.SET_NULL, null=True, blank=True) + monitoring = models.BooleanField(default=True) + + router_type = models.CharField(max_length=100, choices=(('routeros', 'Mikrotik (RouterOS)'), ('openwrt', 'OpenWRT'))) + enabled = models.BooleanField(default=True) + + updated = models.DateTimeField(auto_now=True) + created = models.DateTimeField(auto_now_add=True) + uuid = models.UUIDField(unique=True, editable=False, default=uuid.uuid4) + + def __str__(self): + return self.name + + +class RouterStatus(models.Model): + router = models.OneToOneField(Router, on_delete=models.CASCADE) + status_online = models.BooleanField(default=False) + last_status_change = models.DateTimeField(blank=True, null=True) + last_backup = models.DateTimeField(blank=True, null=True) + + updated = models.DateTimeField(auto_now=True) + created = models.DateTimeField(auto_now_add=True) + uuid = models.UUIDField(unique=True, editable=False, default=uuid.uuid4) + diff --git a/router_manager/tests.py b/router_manager/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/router_manager/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/router_manager/views.py b/router_manager/views.py new file mode 100644 index 0000000..a362a59 --- /dev/null +++ b/router_manager/views.py @@ -0,0 +1,45 @@ +from django.contrib import messages +from django.shortcuts import render, get_object_or_404, redirect +from django.contrib.auth.decorators import login_required +from .models import Router +from .forms import RouterForm + + +@login_required +def view_router_list(request): + router_list = Router.objects.all() + context = { + 'router_list': router_list, + 'page_title': 'Router List', + + } + return render(request, 'router_manager/router_list.html', context=context) + + +@login_required() +def view_manage_router(request): + if request.GET.get('uuid'): + router = get_object_or_404(Router, uuid=request.GET.get('uuid')) + if request.GET.get('action') == 'delete': + if request.GET.get('confirmation') == 'delete': + router.delete() + messages.success(request, 'Router deleted successfully') + return redirect('router_list') + else: + messages.warning(request, 'Router not deleted|Invalid confirmation') + return redirect('router_list') + else: + router = None + + form = RouterForm(request.POST or None, instance=router) + if form.is_valid(): + form.save() + messages.success(request, 'Router saved successfully') + return redirect('router_list') + + context = { + 'form': form, + 'page_title': 'Manage Router', + 'instance': router + } + return render(request, 'generic_form.html', context=context) \ No newline at end of file diff --git a/routerfleet/settings.py b/routerfleet/settings.py index 0bf7e62..73eb1d4 100644 --- a/routerfleet/settings.py +++ b/routerfleet/settings.py @@ -39,7 +39,8 @@ INSTALLED_APPS = [ 'django.contrib.staticfiles', 'crispy_forms', 'crispy_bootstrap4', - 'user_manager' + 'user_manager', + 'router_manager', ] MIDDLEWARE = [ diff --git a/routerfleet/urls.py b/routerfleet/urls.py index cafb318..e632163 100644 --- a/routerfleet/urls.py +++ b/routerfleet/urls.py @@ -3,7 +3,7 @@ from django.urls import path from dashboard.views import view_dashboard, view_status from user_manager.views import view_manage_user, view_user_list from accounts.views import view_login, view_logout, view_create_first_user - +from router_manager.views import view_router_list, view_manage_router urlpatterns = [ path('admin/', admin.site.urls), @@ -14,4 +14,6 @@ urlpatterns = [ path('accounts/create_first_user/', view_create_first_user, name='create_first_user'), path('accounts/login/', view_login, name='login'), path('accounts/logout/', view_logout, name='logout'), + path('router/list/', view_router_list, name='router_list'), + path('router/manage/', view_manage_router, name='manage_router'), ] diff --git a/templates/base.html b/templates/base.html index 2308d65..b2a1243 100644 --- a/templates/base.html +++ b/templates/base.html @@ -25,6 +25,14 @@ + + + {% block page_custom_head %}{% endblock%} @@ -93,6 +101,16 @@ + +
+ Router Manager +
+ +