mirror of
				https://github.com/usmannasir/cyberpanel.git
				synced 2025-10-31 10:26:01 +01:00 
			
		
		
		
	
		
			
	
	
		
			170 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			170 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|  | import json | ||
|  | import docker | ||
|  | from django.http import HttpResponse | ||
|  | from .models import DockerSites | ||
|  | from loginSystem.models import Administrator | ||
|  | from plogical.acl import ACLManager | ||
|  | from django.shortcuts import redirect | ||
|  | from loginSystem.views import loadLoginPage | ||
|  | from django.views.decorators.csrf import csrf_exempt | ||
|  | from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging | ||
|  | 
 | ||
|  | def require_login(view_func): | ||
|  |     def wrapper(request, *args, **kwargs): | ||
|  |         try: | ||
|  |             userID = request.session['userID'] | ||
|  |             return view_func(request, *args, **kwargs) | ||
|  |         except KeyError: | ||
|  |             return redirect(loadLoginPage) | ||
|  |     return wrapper | ||
|  | 
 | ||
|  | 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 | ||
|  | 
 | ||
|  | @csrf_exempt | ||
|  | @require_login | ||
|  | def startContainer(request): | ||
|  |     try: | ||
|  |         if request.method == 'POST': | ||
|  |             userID = request.session['userID'] | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             data = json.loads(request.body) | ||
|  |             container_id = data.get('container_id') | ||
|  |             site_name = data.get('name') | ||
|  | 
 | ||
|  |             # Verify Docker site ownership | ||
|  |             try: | ||
|  |                 docker_site = DockerSites.objects.get(SiteName=site_name) | ||
|  |                 if currentACL['admin'] != 1 and docker_site.admin != admin and docker_site.admin.owner != admin.pk: | ||
|  |                     return HttpResponse(json.dumps({ | ||
|  |                         'status': 0, | ||
|  |                         'error_message': 'Not authorized to access this container' | ||
|  |                     })) | ||
|  |             except DockerSites.DoesNotExist: | ||
|  |                 return HttpResponse(json.dumps({ | ||
|  |                     'status': 0, | ||
|  |                     'error_message': 'Docker site not found' | ||
|  |                 })) | ||
|  | 
 | ||
|  |             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})) | ||
|  | 
 | ||
|  |         return HttpResponse('Not allowed') | ||
|  |     except Exception as e: | ||
|  |         return HttpResponse(json.dumps({ | ||
|  |             'status': 0, | ||
|  |             'error_message': str(e) | ||
|  |         })) | ||
|  | 
 | ||
|  | @csrf_exempt | ||
|  | @require_login | ||
|  | def stopContainer(request): | ||
|  |     try: | ||
|  |         if request.method == 'POST': | ||
|  |             userID = request.session['userID'] | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             data = json.loads(request.body) | ||
|  |             container_id = data.get('container_id') | ||
|  |             site_name = data.get('name') | ||
|  | 
 | ||
|  |             # Verify Docker site ownership | ||
|  |             try: | ||
|  |                 docker_site = DockerSites.objects.get(SiteName=site_name) | ||
|  |                 if currentACL['admin'] != 1 and docker_site.admin != admin and docker_site.admin.owner != admin.pk: | ||
|  |                     return HttpResponse(json.dumps({ | ||
|  |                         'status': 0, | ||
|  |                         'error_message': 'Not authorized to access this container' | ||
|  |                     })) | ||
|  |             except DockerSites.DoesNotExist: | ||
|  |                 return HttpResponse(json.dumps({ | ||
|  |                     'status': 0, | ||
|  |                     'error_message': 'Docker site not found' | ||
|  |                 })) | ||
|  | 
 | ||
|  |             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})) | ||
|  | 
 | ||
|  |         return HttpResponse('Not allowed') | ||
|  |     except Exception as e: | ||
|  |         return HttpResponse(json.dumps({ | ||
|  |             'status': 0, | ||
|  |             'error_message': str(e) | ||
|  |         })) | ||
|  | 
 | ||
|  | @csrf_exempt | ||
|  | @require_login | ||
|  | def restartContainer(request): | ||
|  |     try: | ||
|  |         if request.method == 'POST': | ||
|  |             userID = request.session['userID'] | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             data = json.loads(request.body) | ||
|  |             container_id = data.get('container_id') | ||
|  |             site_name = data.get('name') | ||
|  | 
 | ||
|  |             # Verify Docker site ownership | ||
|  |             try: | ||
|  |                 docker_site = DockerSites.objects.get(SiteName=site_name) | ||
|  |                 if currentACL['admin'] != 1 and docker_site.admin != admin and docker_site.admin.owner != admin.pk: | ||
|  |                     return HttpResponse(json.dumps({ | ||
|  |                         'status': 0, | ||
|  |                         'error_message': 'Not authorized to access this container' | ||
|  |                     })) | ||
|  |             except DockerSites.DoesNotExist: | ||
|  |                 return HttpResponse(json.dumps({ | ||
|  |                     'status': 0, | ||
|  |                     'error_message': 'Docker site not found' | ||
|  |                 })) | ||
|  | 
 | ||
|  |             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})) | ||
|  | 
 | ||
|  |         return HttpResponse('Not allowed') | ||
|  |     except Exception as e: | ||
|  |         return HttpResponse(json.dumps({ | ||
|  |             'status': 0, | ||
|  |             'error_message': str(e) | ||
|  |         }))  |