update manager, welcome and status page.

This commit is contained in:
Eduardo Silva 2024-04-04 14:25:16 -03:00
parent 6a53c8bc97
commit 7332bca96e
17 changed files with 313 additions and 7 deletions

View file

@ -1,6 +1,32 @@
from django.shortcuts import render
from django.contrib.auth.decorators import login_required
from backup.models import BackupProfile
from backup_data.models import RouterBackup
from router_manager.models import Router, RouterGroup, RouterStatus, BackupSchedule, SSHKey
from integration_manager.models import ExternalIntegration
from user_manager.models import User
from django.conf import settings
from django.utils import timezone
from datetime import timedelta
import os
import shutil
def get_directory_statistics(directory_path):
total, used, free = shutil.disk_usage(directory_path)
# Convert to GB
total = total // (2 ** 30)
used = used // (2 ** 30)
free = free // (2 ** 30)
usage_percentage = (used / total) * 100
return {
"total_gb": total,
"used_gb": used,
"free_gb": free,
"usage_percentage": round(usage_percentage, 2)
}
@login_required
def view_dashboard(request):
@ -10,5 +36,18 @@ def view_dashboard(request):
@login_required
def view_status(request):
context = {'page_title': 'Welcome to routerfleet'}
settings.MEDIA_ROOT
context = {
'page_title': 'Welcome to routerfleet',
'media_root_stats': get_directory_statistics(settings.MEDIA_ROOT),
'queue': RouterBackup.objects.filter(success=False, error=False).count(),
'success_backup_last_24h': RouterBackup.objects.filter(success=True, created__gte=timezone.now() - timedelta(days=1)).count(),
'error_backup_last_24h': RouterBackup.objects.filter(error=True, created__gte=timezone.now() - timedelta(days=1)).count(),
'router_count': Router.objects.filter(enabled=True).count(),
'router_online_count': RouterStatus.objects.filter(status_online=True, router__monitoring=True).count(),
'router_offline_count': RouterStatus.objects.filter(status_online=False, router__monitoring=True).count(),
'router_not_monitored_count': Router.objects.filter(enabled=True, monitoring=False).count(),
'routerfleet_version': settings.ROUTERFLEET_VERSION,
}
return render(request, 'dashboard/status.html', context=context)

View file

@ -46,6 +46,7 @@ INSTALLED_APPS = [
'backup',
'backup_data',
'integration_manager',
'routerfleet_tools'
]
MIDDLEWARE = [
@ -139,3 +140,4 @@ STATICFILES_DIRS = [
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
MEDIA_ROOT = '/var/lib/routerfleet/'
ROUTERFLEET_VERSION = 7002

View file

@ -8,6 +8,7 @@ from router_manager.views import view_router_list, view_manage_router, view_rout
from backup.views import view_backup_profile_list, view_manage_backup_profile, view_backup_list, view_backup_details, view_debug_run_backups, view_compare_backups, view_backup_download, view_backup_delete
from monitoring.views import view_export_router_list, view_update_router_status
from backup_data.views import view_generate_backup_schedule, view_create_backup_tasks, view_perform_backup_tasks, view_housekeeping
from routerfleet_tools.views import cron_check_updates
urlpatterns = [
@ -41,6 +42,7 @@ urlpatterns = [
path('cron/create_backup_tasks/', view_create_backup_tasks, name='create_backup_tasks'),
path('cron/perform_backup_tasks/', view_perform_backup_tasks, name='perform_backup_tasks'),
path('cron/housekeeping/', view_housekeeping, name='housekeeping'),
path('cron/check_updates/', cron_check_updates, name='check_updates'),
path('wireguard_webadmin/', view_wireguard_webadmin_launcher, name='wireguard_webadmin_launcher'),
path('wireguard_webadmin/manage/', view_manage_wireguard_integration, name='manage_wireguard_integration'),
path('wireguard_webadmin/launch/', view_launch_wireguard_webadmin, name='launch_wireguard_webadmin')

View file

View file

@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

View file

@ -0,0 +1,6 @@
from django.apps import AppConfig
class RouterfleetToolsConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'routerfleet_tools'

View file

@ -0,0 +1,29 @@
# Generated by Django 5.0.3 on 2024-04-04 16:49
import uuid
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='WebadminSettings',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(default='webadmin_settings', max_length=20, unique=True)),
('update_available', models.BooleanField(default=False)),
('current_version', models.PositiveIntegerField(default=0)),
('latest_version', models.PositiveIntegerField(default=0)),
('last_checked', 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)),
],
),
]

View file

View file

@ -0,0 +1,16 @@
from django.db import models
import uuid
class WebadminSettings(models.Model):
name = models.CharField(default='webadmin_settings', max_length=20, unique=True)
update_available = models.BooleanField(default=False)
current_version = models.PositiveIntegerField(default=0)
latest_version = models.PositiveIntegerField(default=0)
last_checked = 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)
def __str__(self):
return self.name

View file

@ -0,0 +1,21 @@
from django import template
from django.conf import settings
from routerfleet_tools.models import WebadminSettings
register = template.Library()
@register.simple_tag
def tag_webadmin_version():
webadmin_settings, settings_created = WebadminSettings.objects.get_or_create(name='webadmin_settings')
if webadmin_settings.current_version != settings.ROUTERFLEET_VERSION:
webadmin_settings.current_version = settings.ROUTERFLEET_VERSION
webadmin_settings.save()
if webadmin_settings.current_version == webadmin_settings.latest_version:
webadmin_settings.update_available = False
webadmin_settings.save()
return {
'current_version': settings.ROUTERFLEET_VERSION / 10000,
'latest_version': webadmin_settings.latest_version / 10000,
'update_available': webadmin_settings.update_available,
}

View file

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

View file

@ -0,0 +1,42 @@
from django.shortcuts import render, Http404
from .models import WebadminSettings
from django.http import JsonResponse
from django.conf import settings
from django.utils import timezone
import requests
def cron_check_updates(request):
webadmin_settings, webadmin_settings_created = WebadminSettings.objects.get_or_create(name='webadmin_settings')
if webadmin_settings.last_checked is None or timezone.now() - webadmin_settings.last_checked > timezone.timedelta(
hours=1):
try:
version = settings.ROUTERFLEET_VERSION / 10000
url = f'https://updates.eth0.com.br/api/check_updates/?app=routerfleet&version={version}'
response = requests.get(url)
response.raise_for_status()
data = response.json()
if 'update_available' in data:
webadmin_settings.update_available = data['update_available']
if data['update_available']:
webadmin_settings.latest_version = float(data['current_version']) * 10000
webadmin_settings.last_checked = timezone.now()
webadmin_settings.save()
response_data = {
'update_available': webadmin_settings.update_available,
'latest_version': webadmin_settings.latest_version,
'current_version': settings.ROUTERFLEET_VERSION,
}
return JsonResponse(response_data)
except Exception as e:
webadmin_settings.update_available = False
webadmin_settings.save()
return JsonResponse({'update_available': False})
return JsonResponse({'update_available': webadmin_settings.update_available})

View file

@ -36,7 +36,8 @@
{% block page_custom_head %}{% endblock%}
</head>
{% load custom_tags %}
{% tag_webadmin_version as webadmin_version %}
<body class="hold-transition sidebar-mini layout-fixed">
<div class="wrapper">

View file

@ -1,5 +1,123 @@
{% extends 'base.html' %}
{% block content %}
status
{% endblock %}
<div class='row'>
<div class='{% if form_size %}{{ form_size }}{% else %}col-lg-6{% endif %}'>
<div class="card card-primary card-outline">
{% if page_title %}
<div class="card-header">
<h3 class="card-title">{{ page_title }}</h3>
</div>
{% endif %}
<div class="card-body row">
<div class="col-lg-12">
<table class="table">
<thead>
<tr>
<th>Item</th>
<th>Value</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<strong>
Used storage (binary backup)
</strong>
</td>
<td>
{{ media_root_stats.usage_percentage }}%
</td>
</tr>
<tr>
<td>
<strong>
Backup Queue
</strong>
</td>
<td>
{{ queue }}
</td>
</tr>
<tr>
<td>
<strong>
Successful backups (24h)
</strong>
</td>
<td>
{{ success_backup_last_24h }}
</td>
</tr>
<tr>
<td>
<strong>
Failed backups (24h)
</strong>
</td>
<td>
{{ error_backup_last_24h }}
</td>
</tr>
<tr>
<td>
<strong>
Routers
</strong>
</td>
<td>
{{ router_count }}
</td>
</tr>
<tr>
<td>
<strong>
Online Routers
</strong>
</td>
<td>
{{ router_online_count }}
</td>
</tr>
<tr>
<td>
<strong>
Offline Routers
</strong>
</td>
<td>
{{ router_offline_count }}
</td>
</tr>
<tr>
<td>
<strong>
Not monitored Routers
</strong>
</td>
<td>
{{ router_not_monitored_count }}
</td>
</tr>
<tr>
<td>
<strong>
Router Fleet Version
</strong>
</td>
<td>
{{ webadmin_version.current_version }}
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p class="small">This status page is just a placeholder, it will be improved in next versions</p>
</div>
</div>
{% endblock %}

View file

@ -1,5 +1,30 @@
{% extends 'base.html' %}
{% block content %}
Welcome
<div class='row'>
<div class='col-lg-6'>
<div class="card card-primary card-outline">
<div class="card-header">
<h3 class="card-title">Welcome to RouterFleet!</h3>
</div>
<div class="card-body row">
<div class="col-lg-12">
<p>Greetings! I'm thrilled to introduce you to RouterFleet, a newly launched open source project aimed at revolutionizing the way we manage backups for routers and network equipment. I've dedicated countless hours to developing a system that simplifies and secures network management tasks, specifically tailored for those who manage a fleet of devices.</p>
<p>At this initial stage, RouterFleet's compatibility is focused on <strong>Mikrotik devices</strong>. My commitment to you is to not only enhance the system for these devices but also to expand our compatibility list based on the community's needs. Your feedback and requests are crucial for guiding the future development of RouterFleet.</p>
<p>Being at the forefront of RouterFleet, I am on a continuous journey to improve and evolve the platform. You can expect <strong>regular updates featuring new functionalities, performance enhancements, and bug fixes</strong>. To make the most out of RouterFleet, I recommend keeping your system up to date with the latest releases.</p>
<p>As RouterFleet is an open source project, I warmly invite you to join the journey—whether it's through contributing code, providing feedback, or sharing your network management experiences. Every bit of support helps in building a robust community around RouterFleet. For more information, updates, and to get involved, please visit our <a href="https://github.com/eduardogsilva/routerfleet" target="_blank"><i class="fab fa-github"></i> GitHub page</a>.</p>
<p>Your support and involvement are what will shape the future of RouterFleet!</p>
</div>
</div>
</div>
</div>
</div>
{% endblock %}

View file

@ -33,6 +33,5 @@
}
}
</script>
{% endblock %}