From fe604a8a4971e952b1b5614e42e6ec8276b78031 Mon Sep 17 00:00:00 2001 From: Eduardo Silva Date: Wed, 3 Apr 2024 12:54:59 -0300 Subject: [PATCH] Housekeeping tasks --- backup_data/views.py | 43 ++++++++++++++++++++++++++++++++++- routerfleet/urls.py | 3 ++- routerlib/backup_functions.py | 2 ++ 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/backup_data/views.py b/backup_data/views.py index e4d8a6d..c5356d2 100644 --- a/backup_data/views.py +++ b/backup_data/views.py @@ -7,7 +7,7 @@ from django.utils import timezone from backup.models import BackupProfile from backup_data.models import RouterBackup -from router_manager.models import Router, BackupSchedule +from router_manager.models import Router, BackupSchedule, RouterStatus from routerlib.backup_functions import perform_backup @@ -235,3 +235,44 @@ def view_perform_backup_tasks(request): return JsonResponse(data) + +def view_housekeeping(requests): + max_backup_task_age = timezone.now() - timedelta(hours=18) + data = { + 'backup_tasks_expired': 0, + 'backup_locks_removed': 0 + } + for backup in RouterBackup.objects.filter(created__lt=max_backup_task_age, success=False, error=False): + backup.error = True + backup.error_message = 'Backup task expired' + backup.save() + backup.router.routerstatus.last_backup_failed = timezone.now() + backup.router.routerstatus.save() + + if not RouterBackup.objects.filter(router=backup.router, success=False, error=False).exists(): + backup.router.routerstatus.backup_lock = None + backup.router.routerstatus.save() + data['backup_tasks_expired'] += 1 # Do not count locks removed for expired tasks + + for router_status in RouterStatus.objects.filter(backup_lock__lt=max_backup_task_age): + if not RouterBackup.objects.filter(router=router_status.router, success=False, error=False).exists(): + router_status.backup_lock = None + router_status.last_backup_failed = timezone.now() + router_status.save() + data['backup_locks_removed'] += 1 + + for backup_profile in BackupProfile.objects.all(): + if backup_profile.name == 'default': + backup_list = RouterBackup.objects.filter(Q(router__backup_profile=backup_profile) | Q(router__backup_profile__isnull=True)) + else: + backup_list = RouterBackup.objects.filter(router__backup_profile=backup_profile) + + if backup_profile.retain_backups_on_error: + backup_list = backup_list.filter(router__routerstatus__last_backup_failed__isnull=True) + + backup_list.filter(schedule_type='instant', created__lt=timezone.now() - timedelta(days=backup_profile.instant_retention)).delete() + backup_list.filter(schedule_type='monthly', created__lt=timezone.now() - timedelta(days=backup_profile.monthly_retention)).delete() + backup_list.filter(schedule_type='weekly', created__lt=timezone.now() - timedelta(days=backup_profile.weekly_retention)).delete() + backup_list.filter(schedule_type='daily', created__lt=timezone.now() - timedelta(days=backup_profile.daily_retention)).delete() + + return JsonResponse(data) diff --git a/routerfleet/urls.py b/routerfleet/urls.py index 6e1f03c..e179819 100644 --- a/routerfleet/urls.py +++ b/routerfleet/urls.py @@ -6,7 +6,7 @@ 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, view_router_details, view_create_instant_backup_task 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 +from backup_data.views import view_generate_backup_schedule, view_create_backup_tasks, view_perform_backup_tasks, view_housekeeping urlpatterns = [ @@ -39,4 +39,5 @@ urlpatterns = [ path('cron/generate_backup_schedule/', view_generate_backup_schedule, name='generate_backup_schedule'), 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'), ] diff --git a/routerlib/backup_functions.py b/routerlib/backup_functions.py index 254f6aa..b4ebec6 100644 --- a/routerlib/backup_functions.py +++ b/routerlib/backup_functions.py @@ -45,6 +45,8 @@ def perform_backup(router_backup: RouterBackup): router_backup.error_message = '' router_backup.success = True router_backup.save() + router_backup.router.routerstatus.last_backup = timezone.now() + router_backup.router.routerstatus.last_backup_failed = None router_backup.router.routerstatus.backup_lock = None router_backup.router.routerstatus.save() else: