eduardogsilva.routerfleet/monitoring/views.py
2024-04-16 16:07:48 -03:00

100 lines
No EOL
4.6 KiB
Python

from django.shortcuts import render, get_object_or_404
from message_center.functions import notify_router_status_update
from monitoring.models import RouterDownTime
from router_manager.models import Router, RouterStatus, RouterGroup
from django.http import JsonResponse
from django.utils import timezone
from django.conf import settings
from routerfleet_tools.models import WebadminSettings
def view_router_config_timestamp(request):
if not request.user.is_authenticated and request.GET.get('key') != settings.MONITORING_KEY:
return JsonResponse({'error': 'Not authenticated'}, status=403)
webadmin_settings, _ = WebadminSettings.objects.get_or_create(name='webadmin_settings')
if not webadmin_settings.router_config_last_updated:
webadmin_settings.router_config_last_updated = timezone.now()
webadmin_settings.monitoring_last_run = timezone.now()
webadmin_settings.save()
return JsonResponse({'router_config': webadmin_settings.router_config_last_updated.isoformat()})
def view_router_last_status_change(request):
if not request.user.is_authenticated and request.GET.get('key') != settings.MONITORING_KEY:
return JsonResponse({'error': 'Not authenticated'}, status=403)
last_router_status_change = RouterStatus.objects.filter(last_status_change__isnull=False).order_by('-last_status_change').first()
if last_router_status_change:
last_status_change_timestamp = last_router_status_change.last_status_change.isoformat()
else:
last_status_change_timestamp = "0"
return JsonResponse({'last_status_change': last_status_change_timestamp})
def view_export_router_list(request):
if not request.user.is_authenticated and request.GET.get('key') != settings.MONITORING_KEY:
return JsonResponse({'error': 'Not authenticated'}, status=403)
webadmin_settings, _ = WebadminSettings.objects.get_or_create(name='webadmin_settings')
# Not updating the monitoring last run here, as this view is also used on the dashboard
if not webadmin_settings.router_config_last_updated:
webadmin_settings.router_config_last_updated = timezone.now()
webadmin_settings.save()
if request.GET.get('filter_group'):
router_group = get_object_or_404(RouterGroup, uuid=request.GET.get('filter_group'))
query_router_list = router_group.routers.all().filter(enabled=True, monitoring=True)
else:
query_router_list = Router.objects.filter(enabled=True, monitoring=True)
router_list = {}
for router in query_router_list:
router_list[str(router.uuid)] = {
'address': router.address,
'name': router.name,
'online': router.routerstatus.status_online,
'uuid': str(router.uuid),
}
data = {
'router_list': router_list,
'router_config': webadmin_settings.router_config_last_updated.isoformat()
}
return JsonResponse(data)
def view_update_router_status(request):
if not request.user.is_authenticated and request.GET.get('key') != settings.MONITORING_KEY:
return JsonResponse({'error': 'Not authenticated'}, status=403)
router = Router.objects.get(uuid=request.GET.get('uuid'))
new_status = request.GET.get('status')
if router.routerstatus.status_online:
current_status = 'online'
else:
current_status = 'offline'
if new_status not in ['online', 'offline']:
return JsonResponse({'status': 'error', 'error_message': 'Invalid status'}, status=400)
if new_status == 'online':
router.routerstatus.status_online = True
else:
router.routerstatus.status_online = False
router.routerstatus.save()
if current_status != new_status:
if new_status == 'online':
router.routerstatus.status_online = True
downtime = RouterDownTime.objects.filter(router=router, end_time=None).first()
if downtime:
downtime.end_time = timezone.now()
downtime.save()
else:
router.routerstatus.status_online = False
downtime = RouterDownTime.objects.create(router=router, start_time=timezone.now())
router.routerstatus.last_status_change = timezone.now()
router.routerstatus.save()
if downtime:
RouterDownTime.objects.filter(router=router, end_time=None).exclude(uuid=downtime.uuid).delete()
notify_router_status_update(router)
webadmin_settings, _ = WebadminSettings.objects.get_or_create(name='webadmin_settings')
webadmin_settings.monitoring_last_run = timezone.now()
webadmin_settings.save()
return JsonResponse({'status': 'success', 'router_config': webadmin_settings.router_config_last_updated.isoformat()})