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)
|
||||
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)
|
||||
|
|
|
@ -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'):
|
||||
|
|
|
@ -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/'
|
||||
|
|
|
@ -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'),
|
||||
|
|
|
@ -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:
|
||||
|
|
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,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>
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue