mirror of
https://github.com/eduardogsilva/routerfleet.git
synced 2025-07-01 22:04:22 +02:00
Router details
This commit is contained in:
parent
7d2cd9a7dd
commit
c5ec5c0944
8 changed files with 234 additions and 11 deletions
|
@ -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),
|
||||||
|
),
|
||||||
|
]
|
|
@ -8,6 +8,7 @@ class RouterBackup(models.Model):
|
||||||
success = models.BooleanField(default=False)
|
success = models.BooleanField(default=False)
|
||||||
error = models.BooleanField(default=False)
|
error = models.BooleanField(default=False)
|
||||||
backup_pending_retrieval = 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)
|
error_message = models.TextField(blank=True, null=True)
|
||||||
retry_count = models.IntegerField(default=0)
|
retry_count = models.IntegerField(default=0)
|
||||||
next_retry = models.DateTimeField(blank=True, null=True)
|
next_retry = models.DateTimeField(blank=True, null=True)
|
||||||
|
|
|
@ -27,6 +27,18 @@ def view_router_list(request):
|
||||||
return render(request, 'router_manager/router_list.html', context=context)
|
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()
|
@login_required()
|
||||||
def view_manage_router(request):
|
def view_manage_router(request):
|
||||||
if request.GET.get('uuid'):
|
if request.GET.get('uuid'):
|
||||||
|
|
|
@ -136,3 +136,4 @@ STATICFILES_DIRS = [
|
||||||
# https://docs.djangoproject.com/en/5.0/ref/settings/#default-auto-field
|
# https://docs.djangoproject.com/en/5.0/ref/settings/#default-auto-field
|
||||||
|
|
||||||
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
|
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
|
||||||
|
MEDIA_ROOT = '/var/lib/routerfleet/'
|
||||||
|
|
|
@ -3,7 +3,7 @@ from django.urls import path
|
||||||
from dashboard.views import view_dashboard, view_status
|
from dashboard.views import view_dashboard, view_status
|
||||||
from user_manager.views import view_manage_user, view_user_list
|
from user_manager.views import view_manage_user, view_user_list
|
||||||
from accounts.views import view_login, view_logout, view_create_first_user
|
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
|
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('accounts/logout/', view_logout, name='logout'),
|
||||||
path('router/list/', view_router_list, name='router_list'),
|
path('router/list/', view_router_list, name='router_list'),
|
||||||
path('router/manage/', view_manage_router, name='manage_router'),
|
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/group_list/', view_router_group_list, name='router_group_list'),
|
||||||
path('router/ssh_keys/', view_ssh_key_list, name='ssh_keys_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'),
|
path('router/manage_group/', view_manage_router_group, name='manage_router_group'),
|
||||||
|
|
|
@ -38,7 +38,6 @@ def test_ssh_authentication(router_type, address, username, password, sshkey=Non
|
||||||
else:
|
else:
|
||||||
result = False, 'Device is not MikroTik'
|
result = False, 'Device is not MikroTik'
|
||||||
elif router_type == 'openwrt':
|
elif router_type == 'openwrt':
|
||||||
# Comando para verificar OpenWRT
|
|
||||||
stdin, stdout, stderr = ssh.exec_command('ubus call system board')
|
stdin, stdout, stderr = ssh.exec_command('ubus call system board')
|
||||||
output = stdout.read().decode()
|
output = stdout.read().decode()
|
||||||
if 'OpenWrt' in output:
|
if 'OpenWrt' in output:
|
||||||
|
|
186
templates/router_manager/router_details.html
Normal file
186
templates/router_manager/router_details.html
Normal 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 %}
|
|
@ -16,19 +16,24 @@
|
||||||
<div class="col-lg-12">
|
<div class="col-lg-12">
|
||||||
<table class="table table-hover">
|
<table class="table table-hover">
|
||||||
<thead>
|
<thead>
|
||||||
<th>Name</th>
|
<tr>
|
||||||
<th>Type</th>
|
<th>Name</th>
|
||||||
<th>Address</th>
|
<th>Type</th>
|
||||||
<th>Status</th>
|
<th>Address</th>
|
||||||
<th>Backup</th>
|
<th>Status</th>
|
||||||
<th>Groups</th>
|
<th>Backup</th>
|
||||||
<th>Auth</th>
|
<th>Groups</th>
|
||||||
<th></th>
|
<th>Auth</th>
|
||||||
|
<th></th>
|
||||||
|
</tr>
|
||||||
|
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{% for router in router_list %}
|
{% for router in router_list %}
|
||||||
<tr {% if not router.enabled %}style="text-decoration: line-through;"{% endif %}>
|
<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.get_router_type_display }}</td>
|
||||||
<td>{{ router.address }}</td>
|
<td>{{ router.address }}</td>
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue