From 083649795af1607b882e6f3021e4bad59da399db Mon Sep 17 00:00:00 2001 From: Eduardo Silva Date: Wed, 10 Jul 2024 17:57:13 -0300 Subject: [PATCH] run import tasks --- import_tool/views.py | 133 ++++++++++++++++++ routerfleet/urls.py | 3 +- templates/import_tool/import_details.html | 1 + .../import_tool/import_details_tasks.html | 2 +- 4 files changed, 137 insertions(+), 2 deletions(-) diff --git a/import_tool/views.py b/import_tool/views.py index e6bd9ee..6b6cc2b 100644 --- a/import_tool/views.py +++ b/import_tool/views.py @@ -1,8 +1,128 @@ +from django.http import JsonResponse from django.shortcuts import render, redirect, get_object_or_404 from django.contrib.auth.decorators import login_required + +from backup.models import BackupProfile +from router_manager.models import Router, SSHKey, SUPPORTED_ROUTER_TYPES, RouterGroup +from routerlib.functions import test_authentication from .models import CsvData, ImportTask from .forms import CsvDataForm from django.contrib import messages +import ipaddress +import socket + +SUPPORTED_ROUTER_TYPES = [rt[0] for rt in SUPPORTED_ROUTER_TYPES] + + +@login_required() +def run_import_task(request): + import_task = get_object_or_404(ImportTask, uuid=request.GET.get('uuid'), import_success=False, import_error=False) + ssh_key = None + backup_profile = None + router_group = None + + name = import_task.name.strip() + + if Router.objects.filter(name=name).exists(): + error_message = f'Router with name "{name}" already exists.' + import_task.import_error = True + import_task.import_error_message = error_message + import_task.save() + return JsonResponse({'status': 'error', 'error_message': error_message}) + + if import_task.ssh_key_name: + ssh_key = SSHKey.objects.filter(name=import_task.ssh_key_name).first() + if not ssh_key: + error_message = f'SSH Key with name "{import_task.ssh_key_name}" not found.' + import_task.import_error = True + import_task.import_error_message = error_message + import_task.save() + return JsonResponse({'status': 'error', 'error_message': error_message}) + + address = import_task.address.lower() + try: + socket.gethostbyname(address) + except socket.gaierror: + try: + ipaddress.ip_address(address) + except ValueError: + error_message = 'The address field must be a valid hostname or IP address.' + import_task.import_error = True + import_task.import_error_message = error_message + import_task.save() + return JsonResponse({'status': 'error', 'error_message': error_message}) + + if not 1 <= import_task.port <= 65535: + error_message = 'Invalid port number' + import_task.import_error = True + import_task.import_error_message = error_message + import_task.save() + return JsonResponse({'status': 'error', 'error_message': error_message}) + + if import_task.router_type not in SUPPORTED_ROUTER_TYPES: + error_message = f'Invalid router_type "{import_task.router_type}"' + import_task.import_error = True + import_task.import_error_message = error_message + import_task.save() + return JsonResponse({'status': 'error', 'error_message': error_message}) + + if import_task.backup_profile_name: + backup_profile = BackupProfile.objects.filter(name=import_task.backup_profile_name).first() + if not backup_profile: + error_message = f'Backup Profile with name "{import_task.backup_profile_name}" not found.' + import_task.import_error = True + import_task.import_error_message = error_message + import_task.save() + return JsonResponse({'status': 'error', 'error_message': error_message}) + + if import_task.router_group_name: + router_group = RouterGroup.objects.filter(name=import_task.router_group_name).first() + if not router_group: + error_message = f'Router Group with name "{import_task.router_group_name}" not found.' + import_task.import_error = True + import_task.import_error_message = error_message + import_task.save() + return JsonResponse({'status': 'error', 'error_message': error_message}) + + if not import_task.password and not ssh_key: + error_message = 'You must provide a password or an SSH Key' + import_task.import_error = True + import_task.import_error_message = error_message + import_task.save() + return JsonResponse({'status': 'error', 'error_message': error_message}) + + test_authentication_success, test_authentication_message = test_authentication( + import_task.router_type, address, import_task.port, import_task.username, import_task.password, ssh_key + ) + if not test_authentication_success: + if test_authentication_message: + error_message = 'Could not authenticate: ' + test_authentication_message + else: + error_message = 'Could not authenticate to the router. Please check the credentials and try again.' + import_task.import_error = True + import_task.import_error_message = error_message + import_task.save() + return JsonResponse({'status': 'error', 'error_message': error_message}) + + + new_router = Router.objects.create( + name=import_task.name, username=import_task.username, password=import_task.password, ssh_key=ssh_key, + address=address, port=import_task.port, router_type=import_task.router_type, backup_profile=backup_profile, + monitoring=import_task.monitoring + ) + + if router_group: + router_group.routers.add(new_router) + router_group.save() + + import_task.router = new_router + import_task.import_success = True + import_task.ssh_key = ssh_key + import_task.backup_profile = backup_profile + import_task.router_group = router_group + import_task.save() + + return JsonResponse({'status': 'success', 'message': 'Task completed successfully.'}) @login_required() @@ -64,9 +184,22 @@ def view_import_details(request): else: messages.warning(request, 'No new tasks created.') return redirect(f'/router/import_tool/details/?uuid={csv_data.uuid}') + elif request.GET.get('action') == 'start_import': import_view = 'tasks' pass + + elif request.GET.get('action') == 'delete_errors': + tasks_deleted = 0 + for task in import_task_list.filter(import_error=True): + task.delete() + tasks_deleted += 1 + if tasks_deleted > 0: + messages.success(request, f'Error tasks deleted: {tasks_deleted}') + else: + messages.warning(request, 'No error tasks deleted.') + return redirect(f'/router/import_tool/details/?uuid={csv_data.uuid}') + elif request.GET.get('action') == 'delete': #import_task_list.delete() #csv_data.delete() diff --git a/routerfleet/urls.py b/routerfleet/urls.py index 2ae9bfa..4cbaafd 100644 --- a/routerfleet/urls.py +++ b/routerfleet/urls.py @@ -10,7 +10,7 @@ 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, view_housekeeping from routerfleet_tools.views import cron_check_updates from message_center.views import view_message_channel_list, view_manage_message_settings, view_manage_message_channel, view_debug_test_messages, view_cron_concatenate_notifications, view_cron_send_messages, view_cron_daily_reports, view_message_history -from import_tool.views import view_import_tool_list, view_import_csv_file, view_import_details +from import_tool.views import view_import_tool_list, view_import_csv_file, view_import_details, run_import_task urlpatterns = [ @@ -36,6 +36,7 @@ urlpatterns = [ path('router/import_tool/', view_import_tool_list, name='import_tool_list'), path('router/import_tool/csv/', view_import_csv_file, name='import_csv_file'), path('router/import_tool/details/', view_import_details, name='import_details'), + path('router/import_tool/run_import_task/', run_import_task, name='run_import_task'), path('backup/profile_list/', view_backup_profile_list, name='backup_profile_list'), path('backup/manage_profile/', view_manage_backup_profile, name='manage_backup_profile'), path('backup/backup_list/', view_backup_list, name='backup_list'), diff --git a/templates/import_tool/import_details.html b/templates/import_tool/import_details.html index 886b3ad..b70b60b 100644 --- a/templates/import_tool/import_details.html +++ b/templates/import_tool/import_details.html @@ -45,6 +45,7 @@
Create import Tasks start/resume + Delete failed tasks Delete import
diff --git a/templates/import_tool/import_details_tasks.html b/templates/import_tool/import_details_tasks.html index d8f1243..b7f9d3e 100644 --- a/templates/import_tool/import_details_tasks.html +++ b/templates/import_tool/import_details_tasks.html @@ -35,7 +35,7 @@ Working... {% endcomment %} - {{ task.import_error_message|default_if_none:'' }} + {{ task.import_error_message|default_if_none:'' }} {% endfor %}