mirror of
https://github.com/eduardogsilva/routerfleet.git
synced 2025-06-21 01:25:41 +02:00
run import tasks
This commit is contained in:
parent
6a42613c42
commit
083649795a
4 changed files with 137 additions and 2 deletions
|
@ -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()
|
||||
|
|
|
@ -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'),
|
||||
|
|
|
@ -45,6 +45,7 @@
|
|||
<div class="col-lg-12" style="padding-top: 10px">
|
||||
<a href="/router/import_tool/details/?uuid={{ csv_data.uuid }}&action=create_tasks" class="btn btn-primary">Create import Tasks</a>
|
||||
<a href="/router/import_tool/details/?uuid={{ csv_data.uuid }}&action=start_tasks" class="btn btn-primary">start/resume</a>
|
||||
<a href="/router/import_tool/details/?uuid={{ csv_data.uuid }}&action=delete_errors" onclick="return confirm('Remove failed tasks?\n\nAfter removing the failed tasks, you can click on Create import Tasks to retry only this tasks.')" class="btn btn-primary">Delete failed tasks</a>
|
||||
<a href="/router/import_tool/details/?uuid={{ csv_data.uuid }}&action=delete" onclick="return confirm('Are you sure you want to remove the current import task?\n\nThis action will remove all import data associated with this task, but will not affect routers that have already been imported.\n\nPress OK to confirm or Cancel to return.');" class="btn btn-primary">Delete import</a>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -35,7 +35,7 @@
|
|||
<span class="badge badge-info">Working...</span>
|
||||
{% endcomment %}
|
||||
</td>
|
||||
<td>{{ task.import_error_message|default_if_none:'' }}</td>
|
||||
<td id="errormessage-{{ task.uuid }}">{{ task.import_error_message|default_if_none:'' }}</td>
|
||||
</tr>
|
||||
|
||||
{% endfor %}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue