From 54e793cfabba9b20b5f1983cf850d394292fc28d Mon Sep 17 00:00:00 2001 From: usmannasir Date: Fri, 11 Apr 2025 16:04:45 +0500 Subject: [PATCH] additional n8n functions --- websiteFunctions/dockerviews.py | 107 ++++++++++++++++++ .../websiteFunctions/DockerContainers.js | 78 ++++++++----- .../websiteFunctions/DockerSiteHome.html | 6 +- websiteFunctions/urls.py | 5 + websiteFunctions/views.py | 1 + 5 files changed, 164 insertions(+), 33 deletions(-) create mode 100644 websiteFunctions/dockerviews.py diff --git a/websiteFunctions/dockerviews.py b/websiteFunctions/dockerviews.py new file mode 100644 index 000000000..f8b32dfd6 --- /dev/null +++ b/websiteFunctions/dockerviews.py @@ -0,0 +1,107 @@ +import json +import docker +from django.http import HttpResponse +from .models import DockerSites +from .website import ACLManager +from django.shortcuts import redirect +from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging + +def loadLoginPage(request): + return redirect('/login') + +class DockerManager: + def __init__(self): + self.client = docker.from_env() + + def get_container(self, container_id): + try: + return self.client.containers.get(container_id) + except docker.errors.NotFound: + return None + except Exception as e: + logging.writeToFile(f"Error getting container {container_id}: {str(e)}") + return None + +def require_login(view_func): + def wrapper(request, *args, **kwargs): + try: + userID = request.session['userID'] + return view_func(request, userID, *args, **kwargs) + except KeyError: + return redirect(loadLoginPage) + return wrapper + +@require_login +def startContainer(request, userID): + try: + data = json.loads(request.body) + container_id = data.get('container_id') + site_name = data.get('name') + + # Verify ownership + docker_site = DockerSites.objects.get(SiteName=site_name) + if not ACLManager.checkOwnership(docker_site.admin.domain, userID): + return HttpResponse(json.dumps({'status': 0, 'error_message': 'Unauthorized access'})) + + # Get and start container + docker_manager = DockerManager() + container = docker_manager.get_container(container_id) + + if not container: + return HttpResponse(json.dumps({'status': 0, 'error_message': 'Container not found'})) + + container.start() + return HttpResponse(json.dumps({'status': 1})) + + except Exception as e: + return HttpResponse(json.dumps({'status': 0, 'error_message': str(e)})) + +@require_login +def stopContainer(request, userID): + try: + data = json.loads(request.body) + container_id = data.get('container_id') + site_name = data.get('name') + + # Verify ownership + docker_site = DockerSites.objects.get(SiteName=site_name) + if not ACLManager.checkOwnership(docker_site.admin.domain, userID): + return HttpResponse(json.dumps({'status': 0, 'error_message': 'Unauthorized access'})) + + # Get and stop container + docker_manager = DockerManager() + container = docker_manager.get_container(container_id) + + if not container: + return HttpResponse(json.dumps({'status': 0, 'error_message': 'Container not found'})) + + container.stop() + return HttpResponse(json.dumps({'status': 1})) + + except Exception as e: + return HttpResponse(json.dumps({'status': 0, 'error_message': str(e)})) + +@require_login +def restartContainer(request, userID): + try: + data = json.loads(request.body) + container_id = data.get('container_id') + site_name = data.get('name') + + # Verify ownership + docker_site = DockerSites.objects.get(SiteName=site_name) + if not ACLManager.checkOwnership(docker_site.admin.domain, userID): + return HttpResponse(json.dumps({'status': 0, 'error_message': 'Unauthorized access'})) + + # Get and restart container + docker_manager = DockerManager() + container = docker_manager.get_container(container_id) + + if not container: + return HttpResponse(json.dumps({'status': 0, 'error_message': 'Container not found'})) + + container.restart() + return HttpResponse(json.dumps({'status': 1})) + + except Exception as e: + return HttpResponse(json.dumps({'status': 0, 'error_message': str(e)})) \ No newline at end of file diff --git a/websiteFunctions/static/websiteFunctions/DockerContainers.js b/websiteFunctions/static/websiteFunctions/DockerContainers.js index a02a89ada..4614497eb 100644 --- a/websiteFunctions/static/websiteFunctions/DockerContainers.js +++ b/websiteFunctions/static/websiteFunctions/DockerContainers.js @@ -209,24 +209,25 @@ app.controller('ListDockersitecontainer', function ($scope, $http) { $scope.cyberpanelLoading = false; $('#cyberpanelLoading').show(); - var url; + var url = "/docker/"; switch(action) { case 'start': - url = "/docker/StartContainerAPP"; + url += "startContainer"; break; case 'stop': - url = "/docker/StopContainerAPP"; + url += "stopContainer"; break; case 'restart': - url = "/docker/RestartContainerAPP"; + url += "restartContainer"; break; default: + console.error("Unknown action:", action); return; } var data = { 'name': $('#sitename').html(), - 'id': $scope.selectedContainer.id + 'container_id': $scope.selectedContainer.id }; var config = { @@ -235,38 +236,55 @@ app.controller('ListDockersitecontainer', function ($scope, $http) { } }; - $http.post(url, data, config).then(ListInitialData, cantLoadInitialData); + $http.post(url, data, config).then( + function(response) { + $scope.cyberpanelLoading = true; + $('#cyberpanelLoading').hide(); - function ListInitialData(response) { - $scope.cyberpanelLoading = true; - $('#cyberpanelLoading').hide(); - - if (response.data.status === 1) { - new PNotify({ - title: 'Success!', - text: 'Container ' + action + ' successful.', - type: 'success' - }); - // Refresh container info after action - $scope.Lunchcontainer($scope.selectedContainer.id); - } else { + if (response.data.status === 1) { + new PNotify({ + title: 'Success!', + text: 'Container ' + action + ' successful.', + type: 'success' + }); + + // Update container status after action + $scope.selectedContainer.status = action === 'stop' ? 'stopped' : 'running'; + + // Refresh container info + $scope.Lunchcontainer($scope.selectedContainer.id); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message || 'An unknown error occurred.', + type: 'error' + }); + } + }, + function(error) { + $scope.cyberpanelLoading = true; + $('#cyberpanelLoading').hide(); + new PNotify({ title: 'Operation Failed!', - text: response.data.error_message, + text: 'Connection disrupted or server error occurred.', type: 'error' }); + + console.error("Error during container action:", error); } - } + ); + }; - function cantLoadInitialData(response) { - $scope.cyberpanelLoading = true; - $('#cyberpanelLoading').hide(); - new PNotify({ - title: 'Operation Failed!', - text: 'Connection disrupted, refresh the page.', - type: 'error' - }); - } + // Update the container selection when actions are triggered + $scope.setSelectedContainer = function(container) { + $scope.selectedContainer = container; + }; + + // Update the button click handlers to set selected container + $scope.handleAction = function(action, container) { + $scope.setSelectedContainer(container); + $scope.cAction(action); }; $scope.openSettings = function(container) { diff --git a/websiteFunctions/templates/websiteFunctions/DockerSiteHome.html b/websiteFunctions/templates/websiteFunctions/DockerSiteHome.html index 778fc0902..65b628d74 100644 --- a/websiteFunctions/templates/websiteFunctions/DockerSiteHome.html +++ b/websiteFunctions/templates/websiteFunctions/DockerSiteHome.html @@ -403,13 +403,13 @@

{% trans "Currently managing: " %} {$ web.name $}
- - -