Fix issue not removing a backup lock in certain conditions.

This commit is contained in:
Eduardo Silva 2024-04-07 16:50:19 -03:00
parent eee765af96
commit b92212296d
4 changed files with 142 additions and 90 deletions

View file

@ -14,6 +14,7 @@ import unicodedata
from routerlib.functions import gen_backup_name, get_router_backup_file_extension from routerlib.functions import gen_backup_name, get_router_backup_file_extension
from django.conf import settings from django.conf import settings
from user_manager.models import UserAcl from user_manager.models import UserAcl
from django.utils import timezone
@login_required() @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(): if not UserAcl.objects.filter(user=request.user).filter(user_level__gte=20).exists():
return render(request, 'access_denied.html', {'page_title': 'Access Denied'}) return render(request, 'access_denied.html', {'page_title': 'Access Denied'})
backup = get_object_or_404(RouterBackup, uuid=request.GET.get('uuid')) 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] hash_list = [backup.backup_text_hash]
backup_list = [] backup_list = []
for backup_item in RouterBackup.objects.filter(router=backup.router, success=True).order_by('-created'): 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': backup,
'backup_list': backup_list, 'backup_list': backup_list,
'page_title': 'Backup Details', '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) 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(): if not UserAcl.objects.filter(user=request.user).filter(user_level__gte=30).exists():
return render(request, 'access_denied.html', {'page_title': 'Access Denied'}) return render(request, 'access_denied.html', {'page_title': 'Access Denied'})
backup = get_object_or_404(RouterBackup, uuid=request.GET.get('uuid')) backup = get_object_or_404(RouterBackup, uuid=request.GET.get('uuid'))
router = backup.router
redirect_url = f'/router/details/?uuid={backup.router.uuid}' redirect_url = f'/router/details/?uuid={backup.router.uuid}'
if request.GET.get('confirmation') == f'delete{backup.id}': if request.GET.get('confirmation') == f'delete{backup.id}':
backup.delete() backup.delete()
messages.success(request, 'Backup deleted successfully') 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) return redirect(redirect_url)
else: else:
messages.warning(request, 'Backup not deleted|Invalid confirmation') messages.warning(request, 'Backup not deleted|Invalid confirmation')

View file

@ -35,12 +35,21 @@ def view_router_list(request):
def view_router_details(request): def view_router_details(request):
router = get_object_or_404(Router, uuid=request.GET.get('uuid')) router = get_object_or_404(Router, uuid=request.GET.get('uuid'))
router_status, _ = RouterStatus.objects.get_or_create(router=router) 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 = { context = {
'router': router, 'router': router,
'router_status': router_status, 'router_status': router_status,
'router_backup_list': router.routerbackup_set.all().order_by('-created'), 'router_backup_list': router_backup_list,
'page_title': 'Router Details', 'page_title': 'Router Details',
} }
return render(request, 'router_manager/router_details.html', context=context) return render(request, 'router_manager/router_details.html', context=context)

View file

@ -140,6 +140,6 @@ STATICFILES_DIRS = [
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
MEDIA_ROOT = '/var/lib/routerfleet/' MEDIA_ROOT = '/var/lib/routerfleet/'
ROUTERFLEET_VERSION = 7003 ROUTERFLEET_VERSION = 7004
from routerfleet.production_settings import * from routerfleet.production_settings import *

View file

@ -74,22 +74,49 @@
<li class="list-group-item"> <li class="list-group-item">
<b><i class="far fa-question-circle" title="This debug information is only displayed while the backup is not finished."></i> Retry Count</b> <b><i class="far fa-question-circle" title="This debug information is only displayed while the backup is not finished."></i> Retry Count</b>
<span class="float-right"> <span class="float-right">
<span {% if backup.retry_count > 0 %}class="text-danger"{% endif %}>
{{ backup.retry_count }} {{ backup.retry_count }}
</span> </span>
</span>
</li> </li>
<li class="list-group-item"> <li class="list-group-item">
<b><i class="far fa-question-circle" title="This debug information is only displayed while the backup is not finished."></i> Next Retry</b> <b><i class="far fa-question-circle" title="This debug information is only displayed while the backup is not finished."></i> Next Retry</b>
<span class="float-right"> <span class="float-right">
{{ backup.next_retry|default_if_none:"" }} {% if backup.next_retry %}
{% if backup.next_retry > now %}
<a href="/backup/backup_details/?uuid={{ backup.uuid }}&action=anticipate">
(anticipate)
</a>
<span class="text-success" style="text-decoration: underline" title="This backup is scheduled to execute after {{ backup.next_retry }}">
{{ backup.next_retry }} <i class="far fa-clock"></i>
</span>
{% else %}
<span class="text-info" style="text-decoration: underline" title="This backup is queued to be executed as soon as possible.">
{{ backup.next_retry }} <i class="far fa-clock"></i>
</span>
{% endif %}
{% endif %}
</span> </span>
</li> </li>
<li class="list-group-item"> <li class="list-group-item">
<b><i class="far fa-question-circle" title="This debug information is only displayed while the backup is not finished."></i> Cron last run</b> <b><i class="far fa-question-circle" title="This debug information is only displayed while the backup is not finished."></i> Cron last run</b>
<span class="float-right"> <span class="float-right">
{% if webadmin_settings.cron_last_run %}
{% if webadmin_settings.cron_last_run < 5_minutes_ago %}
<span class="text-danger" style="text-decoration: underline" title="Your cron tasks are not being executed properly.">
{{ webadmin_settings.cron_last_run }} {{ webadmin_settings.cron_last_run }}
</span> </span>
{% else %}
{{ webadmin_settings.cron_last_run }}
{% endif %}
{% endif %}
</span>
</li> </li>
<li class="list-group-item"> <li class="list-group-item">
@ -237,7 +264,7 @@
{% block custom_page_scripts %} {% block custom_page_scripts %}
<script> <script>
function openCommandDialog(element) { function openCommandDialog(element) {
var command = element.getAttribute('data-command'); var command = element.getAttribute('data-command');
var confirmation = prompt("Please type 'delete{{ backup.id }}' to proceed."); var confirmation = prompt("Please type 'delete{{ backup.id }}' to proceed.");
@ -246,7 +273,7 @@
window.location.href = url; window.location.href = url;
} }
} }
</script> </script>
{% endblock %} {% endblock %}