diff --git a/dashboard/views.py b/dashboard/views.py index 3117d3a..9b77dcb 100644 --- a/dashboard/views.py +++ b/dashboard/views.py @@ -1,9 +1,10 @@ +from django.http import HttpResponseBadRequest, JsonResponse from django.shortcuts import render from django.contrib.auth.decorators import login_required +from django.views.decorators.csrf import csrf_protect 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 @@ -11,23 +12,55 @@ from datetime import timedelta import os import shutil +ALLOWED_DAYS = [3,5,7,10, 15, 30] # Define allowed values +import os +import shutil +from django.conf import settings + +import os +import shutil +from django.conf import settings + +def human_readable_size(size): + """Convert bytes to a human-readable format (KB, MB, GB).""" + for unit in ['B', 'KB', 'MB', 'GB']: + if size < 1024.0: + return f"{size:.2f} {unit}" + size /= 1024.0 + return f"{size:.2f} TB" # For sizes larger than GB def get_directory_statistics(directory_path): + # Get total disk usage 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 + + # Calculate the size of the directory + directory_used = sum(os.path.getsize(os.path.join(root, file)) for root, dirs, files in os.walk(directory_path) for file in files) + + # Get sizes in a human-readable format + total_human = human_readable_size(total) + used_human = human_readable_size(directory_used) + free_human = human_readable_size(free) + + # Calculate usage percentage + usage_percentage = (directory_used / total) * 100 if total > 0 else 0 + + # Determine storage warning + storage_warning = "" + if usage_percentage > 90: + storage_warning = "Warning: Storage usage is above 90%!" + elif usage_percentage > 75: + storage_warning = "Caution: Storage usage is above 75%." return { - "total_gb": total, - "used_gb": used, - "free_gb": free, - "usage_percentage": round(usage_percentage, 2) + "total": total_human, + "used": used_human, + "free": free_human, + "usage_percentage": round(usage_percentage, 2) if total > 0 else 0, + "storage_warning": storage_warning } + @login_required def view_dashboard(request): context = {'page_title': 'Welcome to routerfleet'} @@ -43,7 +76,9 @@ def view_status(request): '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(), + 'total_router_count':Router.objects.all().count(), + 'router_enabled_count': Router.objects.filter(enabled=True).count(), + 'router_disabled_count': Router.objects.filter(enabled=False).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(), @@ -51,3 +86,87 @@ def view_status(request): } return render(request, 'dashboard/status.html', context=context) +@login_required +def backup_statistics_data(request): + try: + days = int(request.GET.get('days', 7)) + except ValueError: + return HttpResponseBadRequest("Invalid 'days' parameter") + + if days not in ALLOWED_DAYS: + return HttpResponseBadRequest("Invalid 'days' parameter") + today = timezone.now() + start_date = today - timedelta(days=days) + + dates = [start_date + timedelta(days=i) for i in range(days + 1)] + success_data = [] + error_data = [] + + for i in range(days): + day_start = dates[i] + day_end = dates[i + 1] + success_count = RouterBackup.objects.filter(created__gte=day_start, created__lt=day_end, success=True).count() + error_count = RouterBackup.objects.filter(created__gte=day_start, created__lt=day_end, error=True).count() + success_data.append(success_count) + error_data.append(error_count) + + data = { + 'dates': [date.strftime('%Y-%m-%d') for date in dates[:-1]], + 'success_data': success_data, + 'error_data': error_data, + } + return JsonResponse(data) + +@login_required +def router_status_data(request): + try: + days = int(request.GET.get('days', '7')) + + except ValueError: + return HttpResponseBadRequest(f"Invalid 'days' {days} parameter") + + if days not in ALLOWED_DAYS: + return HttpResponseBadRequest("Invalid 'days' parameter. Must be one of: " + ', '.join(map(str, ALLOWED_DAYS))) + + today = timezone.now() + start_date = today - timedelta(days=days) + + # Create a list of dates for the period + dates = [start_date + timedelta(days=i) for i in range(days + 1)] + router_statuses = RouterStatus.objects.filter(router__enabled=True) + + online_data = [] + offline_data = [] + + for i in range(days): + day_start = dates[i] + day_end = dates[i + 1] + + # Get statuses that changed within the current day + daily_statuses = router_statuses.filter(last_status_change__gte=day_start, last_status_change__lt=day_end) + + online_count = daily_statuses.filter(status_online=True).count() + offline_count = daily_statuses.filter(status_online=False).count() + + # Get routers that have not changed status on the current day + unchanged_routers = router_statuses.exclude(last_status_change__gte=day_start, last_status_change__lt=day_end) + + for router_status in unchanged_routers: + last_change = router_status.last_status_change + # Only perform the comparison if last_change is not None + if last_change and last_change < day_start: + if router_status.status_online: + online_count += 1 + else: + offline_count += 1 + + online_data.append(online_count) + offline_data.append(offline_count) + + data = { + 'dates': [date.strftime('%Y-%m-%d') for date in dates[:-1]], + 'online_data': online_data, + 'offline_data': offline_data, + } + + return JsonResponse(data) \ No newline at end of file diff --git a/routerfleet/urls.py b/routerfleet/urls.py index 4cbaafd..d309596 100644 --- a/routerfleet/urls.py +++ b/routerfleet/urls.py @@ -1,6 +1,8 @@ from django.contrib import admin from django.urls import path from dashboard.views import view_dashboard, view_status +from dashboard.views import view_dashboard, view_status,backup_statistics_data,router_status_data + from integration_manager.views import view_wireguard_webadmin_launcher, view_manage_wireguard_integration, view_launch_wireguard_webadmin from user_manager.views import view_manage_user, view_user_list from accounts.views import view_login, view_logout, view_create_first_user @@ -19,6 +21,8 @@ urlpatterns = [ path('debug/test_messages/', view_debug_test_messages, name='debug_test_messages'), path('', view_dashboard, name='dashboard'), path('status/', view_status, name='status'), + path('router_status_data/', router_status_data, name='router_status_data'), + path('backup_statistics_data/', backup_statistics_data, name='backup_statistics_data'), path('user/list/', view_user_list, name='user_list'), path('user/manage/', view_manage_user, name='manage_user'), path('accounts/create_first_user/', view_create_first_user, name='create_first_user'), diff --git a/templates/dashboard/status.html b/templates/dashboard/status.html index 6a14ddb..5d3e5d9 100644 --- a/templates/dashboard/status.html +++ b/templates/dashboard/status.html @@ -1,123 +1,321 @@ {% extends 'base.html' %} {% block content %} -
Item | -Value | -
---|---|
- - Used storage (binary backup) - - | -- {{ media_root_stats.usage_percentage }}% - | -
- - Backup Queue - - | -- {{ queue }} - | -
- - Successful backups (24h) - - | -- {{ success_backup_last_24h }} - | -
- - Failed backups (24h) - - | -- {{ error_backup_last_24h }} - | -
- - Routers - - | -- {{ router_count }} - | -
- - Online Routers - - | -- {{ router_online_count }} - | -
- - Offline Routers - - | -- {{ router_offline_count }} - | -
- - Not monitored Routers - - | -- {{ router_not_monitored_count }} - | -
- - Router Fleet Version - - | -- {{ webadmin_version.current_version }} - | -
This status page is just a placeholder, it will be improved in next versions