diff --git a/backup/views.py b/backup/views.py index e9df321..091907c 100644 --- a/backup/views.py +++ b/backup/views.py @@ -14,6 +14,7 @@ import unicodedata from routerlib.functions import gen_backup_name, get_router_backup_file_extension from django.conf import settings from user_manager.models import UserAcl +from django.utils import timezone @login_required() @@ -93,6 +94,14 @@ def view_backup_details(request): if not UserAcl.objects.filter(user=request.user).filter(user_level__gte=20).exists(): return render(request, 'access_denied.html', {'page_title': 'Access Denied'}) backup = get_object_or_404(RouterBackup, uuid=request.GET.get('uuid')) + if request.GET.get('action') == 'anticipate': + if not backup.success and not backup.error: + backup.next_retry = timezone.now() + backup.save() + messages.success(request, 'Backup task anticipated|Backup task will be retried shortly') + else: + messages.warning(request, 'Backup task not anticipated|Task is already completed') + return redirect(f'/backup/backup_details/?uuid={backup.uuid}') hash_list = [backup.backup_text_hash] backup_list = [] for backup_item in RouterBackup.objects.filter(router=backup.router, success=True).order_by('-created'): @@ -104,7 +113,9 @@ def view_backup_details(request): 'backup': backup, 'backup_list': backup_list, 'page_title': 'Backup Details', - 'webadmin_settings': webadmin_settings + 'webadmin_settings': webadmin_settings, + 'now': timezone.now(), + '5_minutes_ago': timezone.now() - timezone.timedelta(minutes=5), } return render(request, 'backup/backup_details.html', context) @@ -188,10 +199,15 @@ def view_backup_delete(request): if not UserAcl.objects.filter(user=request.user).filter(user_level__gte=30).exists(): return render(request, 'access_denied.html', {'page_title': 'Access Denied'}) backup = get_object_or_404(RouterBackup, uuid=request.GET.get('uuid')) + router = backup.router redirect_url = f'/router/details/?uuid={backup.router.uuid}' if request.GET.get('confirmation') == f'delete{backup.id}': backup.delete() messages.success(request, 'Backup deleted successfully') + if router.routerstatus.backup_lock: + if not RouterBackup.objects.filter(router=router, success=False, error=False).exists(): + router.routerstatus.backup_lock = None + router.routerstatus.save() return redirect(redirect_url) else: messages.warning(request, 'Backup not deleted|Invalid confirmation') diff --git a/router_manager/views.py b/router_manager/views.py index a1e67f5..9eb3ec2 100644 --- a/router_manager/views.py +++ b/router_manager/views.py @@ -35,12 +35,21 @@ def view_router_list(request): def view_router_details(request): router = get_object_or_404(Router, uuid=request.GET.get('uuid')) router_status, _ = RouterStatus.objects.get_or_create(router=router) + router_backup_list = router.routerbackup_set.all().order_by('-created') + if router_status.backup_lock: + if not router_backup_list.filter(success=False, error=False).exists(): + router_status.backup_lock = None + router_status.save() + messages.warning(request, 'Backup lock removed|Backup lock was removed as there are no active backup tasks') + context = { 'router': router, 'router_status': router_status, - 'router_backup_list': router.routerbackup_set.all().order_by('-created'), + 'router_backup_list': router_backup_list, 'page_title': 'Router Details', } + + return render(request, 'router_manager/router_details.html', context=context) diff --git a/routerfleet/settings.py b/routerfleet/settings.py index 08646dd..b4a5d2a 100644 --- a/routerfleet/settings.py +++ b/routerfleet/settings.py @@ -140,6 +140,6 @@ STATICFILES_DIRS = [ DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' MEDIA_ROOT = '/var/lib/routerfleet/' -ROUTERFLEET_VERSION = 7003 +ROUTERFLEET_VERSION = 7004 from routerfleet.production_settings import * diff --git a/templates/backup/backup_details.html b/templates/backup/backup_details.html index cf6b85b..02c4e58 100644 --- a/templates/backup/backup_details.html +++ b/templates/backup/backup_details.html @@ -37,29 +37,29 @@ {{ backup.id }} - - - {% if not backup.success and not backup.error %} -
  • - Backup Status - + + + {% if not backup.success and not backup.error %} +
  • + Backup Status + {% if backup.success %} - - {% elif backup.error %} - - {% elif backup.backup_pending_retrieval %} - - {% else %} - - {% endif %} + + {% elif backup.error %} + + {% elif backup.backup_pending_retrieval %} + + {% else %} + + {% endif %} -
  • - -
  • - Host Monitoring - +
  • + +
  • + Host Monitoring + {% if backup.router.monitoring %} {% if backup.router.routerstatus.status_online %} @@ -70,38 +70,65 @@ Not enabled {% endif %} -
  • -
  • - Retry Count - - {{ backup.retry_count }} +
  • +
  • + Retry Count + + 0 %}class="text-danger"{% endif %}> + {{ backup.retry_count }} + -
  • - -
  • - Next Retry - - {{ backup.next_retry|default_if_none:"" }} +
  • + +
  • + Next Retry + + {% if backup.next_retry %} + {% if backup.next_retry > now %} + + (anticipate) + + + {{ backup.next_retry }} + + {% else %} + + {{ backup.next_retry }} + + {% endif %} + + {% endif %} + + -
  • - -
  • - Cron last run - - {{ webadmin_settings.cron_last_run }} +
  • + +
  • + Cron last run + + {% if webadmin_settings.cron_last_run %} + {% if webadmin_settings.cron_last_run < 5_minutes_ago %} + + {{ webadmin_settings.cron_last_run }} + + {% else %} + + {{ webadmin_settings.cron_last_run }} + {% endif %} + {% endif %} -
  • - -
  • - Error message - +
  • + +
  • + Error message + {{ backup.error_message }} -
  • - - + + + {% endif %} - +
  • Schedule Type @@ -129,23 +156,23 @@
  • Backup hash - {{ backup.backup_text_hash|slice:":16" }}... + {{ backup.backup_text_hash|slice:":16" }}...
  • - +
  • Download {% if backup.backup_text %} - + Text - {% if backup.backup_binary %} - {% endif %} + {% if backup.backup_binary %} - {% endif %} {% endif %} - {% if backup.backup_binary %} - + {% if backup.backup_binary %} + Binary - {% endif %} + {% endif %}
  • @@ -159,19 +186,19 @@ - - + + - -
    + +

    Latest Configuration changes

    - +
    @@ -182,39 +209,39 @@ ID Date Compare - + {% for compare_backup in backup_list %} - + {{ compare_backup.id }} - - - {% if compare_backup.finish_time %} - {{ compare_backup.finish_time }} - {% else %} - {{ compare_backup.created }} - {% endif %} - - - - - - Compare - - + + + {% if compare_backup.finish_time %} + {{ compare_backup.finish_time }} + {% else %} + {{ compare_backup.created }} + {% endif %} + + + + + + Compare + + {% endfor %}
    - +
    -
    +
    @@ -237,16 +264,16 @@ {% block custom_page_scripts %} - + {% endblock %} \ No newline at end of file