Router details

This commit is contained in:
Eduardo Silva 2024-03-28 13:13:44 -03:00
parent 7d2cd9a7dd
commit c5ec5c0944
8 changed files with 234 additions and 11 deletions

View file

@ -0,0 +1,18 @@
# Generated by Django 5.0.3 on 2024-03-28 14:19
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('backup_data', '0002_routerbackup_backup_binary_and_more'),
]
operations = [
migrations.AddField(
model_name='routerbackup',
name='config_change_detected',
field=models.BooleanField(default=False),
),
]

View file

@ -8,6 +8,7 @@ class RouterBackup(models.Model):
success = models.BooleanField(default=False)
error = models.BooleanField(default=False)
backup_pending_retrieval = models.BooleanField(default=False)
config_change_detected = models.BooleanField(default=False)
error_message = models.TextField(blank=True, null=True)
retry_count = models.IntegerField(default=0)
next_retry = models.DateTimeField(blank=True, null=True)

View file

@ -27,6 +27,18 @@ def view_router_list(request):
return render(request, 'router_manager/router_list.html', context=context)
@login_required()
def view_router_details(request):
router = get_object_or_404(Router, uuid=request.GET.get('uuid'))
router_status, router_status_created = RouterStatus.objects.get_or_create(router=router)
context = {
'router': router,
'router_status': router_status,
'router_backup_list': router.routerbackup_set.all().order_by('-created'),
'page_title': 'Router Details',
}
return render(request, 'router_manager/router_details.html', context=context)
@login_required()
def view_manage_router(request):
if request.GET.get('uuid'):

View file

@ -136,3 +136,4 @@ STATICFILES_DIRS = [
# https://docs.djangoproject.com/en/5.0/ref/settings/#default-auto-field
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
MEDIA_ROOT = '/var/lib/routerfleet/'

View file

@ -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, view_router_group_list, view_ssh_key_list, view_manage_router_group, view_manage_sshkey
from router_manager.views import view_router_list, view_manage_router, view_router_group_list, view_ssh_key_list, view_manage_router_group, view_manage_sshkey, view_router_details
from backup.views import view_backup_profile_list, view_manage_backup_profile, view_backup_list, view_backup_details, view_debug_run_backups
@ -19,6 +19,7 @@ urlpatterns = [
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'),
path('router/details/', view_router_details, name='router_details'),
path('router/group_list/', view_router_group_list, name='router_group_list'),
path('router/ssh_keys/', view_ssh_key_list, name='ssh_keys_list'),
path('router/manage_group/', view_manage_router_group, name='manage_router_group'),

View file

@ -38,7 +38,6 @@ def test_ssh_authentication(router_type, address, username, password, sshkey=Non
else:
result = False, 'Device is not MikroTik'
elif router_type == 'openwrt':
# Comando para verificar OpenWRT
stdin, stdout, stderr = ssh.exec_command('ubus call system board')
output = stdout.read().decode()
if 'OpenWrt' in output:

View file

@ -0,0 +1,186 @@
{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% block content %}
<div class='row'>
<div class='col-xl-5'>
<div class="card card-primary card-outline">
<div class="card-header">
<h3 class="card-title">{{ router.name }}
</h3>
<span class="float-right">
<a href="/router/manage/?uuid={{ router.uuid }}" >
<i class="fas fa-edit"></i>
</a>
</span>
</div>
<div class="card-body row">
<div class="col-lg-12">
<ul class="list-group list-group-unbordered mb-3">
{% comment %}
<li class="list-group-item">
<b></b>
<span class="float-right">{{ router }}</span>
</li>
{% endcomment %}
<li class="list-group-item">
<b>Enabled</b>
<span class="float-right">
{% if router.enabled %}
<i class="far fa-check-circle text-success" ></i>
{% else %}
<i class="far fa-times-circle text-danger" ></i>
{% endif %}
</span>
</li>
<li class="list-group-item">
<b>Address</b>
<span class="float-right">{{ router.address }}</span>
</li>
<li class="list-group-item">
<b>username</b>
<span class="float-right">{{ router.username }}</span>
</li>
<li class="list-group-item">
<b>Authentication</b>
<span class="float-right">
{% if router.ssh_key %}
<i class="fas fa-key"></i> SSH Key: {{ router.ssh_key }}
{% elif router.password %}
<i class="fas fa-keyboard"></i> Password
{% else %}
<i class="fas fa-exclamation-triangle text-warning"></i> Missing authentication
{% endif %}
</span>
</li>
<li class="list-group-item">
<b>Monitoring</b>
<span class="float-right">
{% if router.monitoring %}
{% if router.routerstatus.status_online %}
<i class="far fa-check-circle text-success" title="Host is Online"></i>
{% else %}
<i class="far fa-times-circle text-danger" title="Host is unavailable"></i>
{% endif %}
{% else %}
Disabled
{% endif %}
</span>
</li>
<li class="list-group-item">
<b>Router Type</b>
<span class="float-right">{{ router.get_router_type_display }}</span>
</li>
<li class="list-group-item">
<b>Backup Profile</b>
<span class="float-right">
{% if router.backup_profile %}
{{ router.backup_profile }}
{% if router.routerstatus.last_backup_failed %}
<i class="fas fa-exclamation-triangle text-danger" title="Last backup failed to complete"></i>
{% endif %}
{% else %}
<i class="fas fa-exclamation-triangle text-warning" title="No backup profile selected"></i>
{% endif %}
</span>
</li>
<li class="list-group-item">
<b>Groups</b>
<span class="float-right">
{% for router_group in router.routergroup_set.all %}
<span class="badge badge-primary">{{ router_group.name }}</span>
{% endfor %}
</span>
</li>
<li class="list-group-item">
<b>Notes</b>
<span class="float-right">{{ router.internal_notes|default_if_none:""|linebreaksbr }}</span>
</li>
</ul>
</div>
</div>
</div>
</div>
<div class='col-xl-7'>
<div class="card card-primary card-outline">
<div class="card-header">
<h3 class="card-title">Backup history</h3>
</div>
<div class="card-body row">
<div class="col-lg-12">
<table class="table">
<thead>
<tr>
<th></th>
<th>Schedule</th>
<th>Time</th>
<th>Status</th>
<th><i class="fas fa-code-branch" title="Configuration has changed"></i></th>
</tr>
</thead>
<tbody>
{% for backup in router_backup_list %}
<tr>
<td class="min-width">
<a href="/backup/backup_details/?uuid={{ backup.uuid }}">
<i class="far fa-eye"></i>
</a>
</td>
<td>{{ backup.get_schedule_type_display }}</td>
<td>{% if backup.finish_time %}{{ backup.finish_time }}{% else %}
<i class="far fa-clock text-warning"></i>{% endif %}</td>
<td>
{% if backup.success %}
<i class="far fa-check-circle text-success"></i>
{% elif backup.error %}
<i class="far fa-times-circle text-danger"
title="{{ backup.error_message }}"></i>
{% elif backup.backup_pending_retrieval %}
<i class="fas fa-cloud-download-alt text-info"
title="Backup pending Retrieval"></i>
{% else %}
<i class="far fa-clock text-warning"></i>
{% endif %}
</td>
<td class="min-width">
{% if backup.config_change_detected %}
<i class="fas fa-code-branch text-info"
title="Configuration has changed since last backup"></i>
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
{% endblock %}
{% block custom_page_scripts %}
{% endblock %}

View file

@ -16,6 +16,7 @@
<div class="col-lg-12">
<table class="table table-hover">
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Address</th>
@ -24,11 +25,15 @@
<th>Groups</th>
<th>Auth</th>
<th></th>
</tr>
</thead>
<tbody>
{% for router in router_list %}
<tr {% if not router.enabled %}style="text-decoration: line-through;"{% endif %}>
<td>{{ router.name }}</td>
<td>
<a href="/router/details/?uuid={{ router.uuid }}">{{ router.name }}</a>
</td>
<td>{{ router.get_router_type_display }}</td>
<td>{{ router.address }}</td>