mirror of
				https://github.com/usmannasir/cyberpanel.git
				synced 2025-10-31 02:15:55 +01:00 
			
		
		
		
	
		
			
	
	
		
			7916 lines
		
	
	
		
			308 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			7916 lines
		
	
	
		
			308 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|  | #!/usr/local/CyberCP/bin/python | ||
|  | import html | ||
|  | import os | ||
|  | import os.path | ||
|  | import sys | ||
|  | import django | ||
|  | 
 | ||
|  | from databases.models import Databases | ||
|  | from plogical.DockerSites import Docker_Sites | ||
|  | from plogical.httpProc import httpProc | ||
|  | 
 | ||
|  | sys.path.append('/usr/local/CyberCP') | ||
|  | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings") | ||
|  | django.setup() | ||
|  | import json | ||
|  | from plogical.acl import ACLManager | ||
|  | import plogical.CyberCPLogFileWriter as logging | ||
|  | from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter | ||
|  | from websiteFunctions.models import Websites, ChildDomains, GitLogs, wpplugins, WPSites, WPStaging, WPSitesBackup, \ | ||
|  |     RemoteBackupConfig, RemoteBackupSchedule, RemoteBackupsites, DockerPackages, PackageAssignment, DockerSites | ||
|  | from plogical.virtualHostUtilities import virtualHostUtilities | ||
|  | import subprocess | ||
|  | import shlex | ||
|  | from plogical.installUtilities import installUtilities | ||
|  | from django.shortcuts import HttpResponse, render, redirect | ||
|  | from loginSystem.models import Administrator, ACL | ||
|  | from packages.models import Package | ||
|  | from plogical.mailUtilities import mailUtilities | ||
|  | from random import randint | ||
|  | import time | ||
|  | import re | ||
|  | import boto3 | ||
|  | from plogical.childDomain import ChildDomainManager | ||
|  | from math import ceil | ||
|  | from plogical.alias import AliasManager | ||
|  | from plogical.applicationInstaller import ApplicationInstaller | ||
|  | from plogical import hashPassword, randomPassword | ||
|  | from emailMarketing.emACL import emACL | ||
|  | from plogical.processUtilities import ProcessUtilities | ||
|  | from managePHP.phpManager import PHPManager | ||
|  | from ApachController.ApacheVhosts import ApacheVhost | ||
|  | from plogical.vhostConfs import vhostConfs | ||
|  | from plogical.cronUtil import CronUtil | ||
|  | from .StagingSetup import StagingSetup | ||
|  | import validators | ||
|  | from django.http import JsonResponse | ||
|  | import ipaddress | ||
|  | 
 | ||
|  | 
 | ||
|  | class WebsiteManager: | ||
|  |     apache = 1 | ||
|  |     ols = 2 | ||
|  |     lsws = 3 | ||
|  | 
 | ||
|  |     def __init__(self, domain=None, childDomain=None): | ||
|  |         self.domain = domain | ||
|  |         self.childDomain = childDomain | ||
|  | 
 | ||
|  |     def createWebsite(self, request=None, userID=None, data=None): | ||
|  | 
 | ||
|  |         url = "https://platform.cyberpersons.com/CyberpanelAdOns/Adonpermission" | ||
|  |         data = { | ||
|  |             "name": "all", | ||
|  |             "IP": ACLManager.GetServerIP() | ||
|  |         } | ||
|  | 
 | ||
|  |         import requests | ||
|  |         response = requests.post(url, data=json.dumps(data)) | ||
|  |         Status = response.json()['status'] | ||
|  | 
 | ||
|  |         test_domain_status = 0 | ||
|  | 
 | ||
|  |         if (Status == 1) or ProcessUtilities.decideServer() == ProcessUtilities.ent: | ||
|  |             test_domain_status = 1 | ||
|  | 
 | ||
|  |         currentACL = ACLManager.loadedACL(userID) | ||
|  |         adminNames = ACLManager.loadAllUsers(userID) | ||
|  |         packagesName = ACLManager.loadPackages(userID, currentACL) | ||
|  |         phps = PHPManager.findPHPVersions() | ||
|  | 
 | ||
|  |         rnpss = randomPassword.generate_pass(10) | ||
|  | 
 | ||
|  |         Data = {'packageList': packagesName, "owernList": adminNames, 'phps': phps, 'Randam_String': rnpss.lower(), | ||
|  |                 'test_domain_data': test_domain_status} | ||
|  |         proc = httpProc(request, 'websiteFunctions/createWebsite.html', | ||
|  |                         Data, 'createWebsite') | ||
|  |         return proc.render() | ||
|  | 
 | ||
|  |     def WPCreate(self, request=None, userID=None, data=None): | ||
|  |         url = "https://platform.cyberpersons.com/CyberpanelAdOns/Adonpermission" | ||
|  |         data = { | ||
|  |             "name": "wp-manager", | ||
|  |             "IP": ACLManager.GetServerIP() | ||
|  |         } | ||
|  | 
 | ||
|  |         import requests | ||
|  |         response = requests.post(url, data=json.dumps(data)) | ||
|  |         Status = response.json()['status'] | ||
|  | 
 | ||
|  | 
 | ||
|  |         if (Status == 1) or ProcessUtilities.decideServer() == ProcessUtilities.ent: | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             adminNames = ACLManager.loadAllUsers(userID) | ||
|  |             packagesName = ACLManager.loadPackages(userID, currentACL) | ||
|  | 
 | ||
|  |             if len(packagesName) == 0: | ||
|  |                 packagesName = ['Default'] | ||
|  | 
 | ||
|  |             FinalVersions = [] | ||
|  |             userobj = Administrator.objects.get(pk=userID) | ||
|  |             counter = 0 | ||
|  |             try: | ||
|  |                 import requests | ||
|  |                 WPVersions = json.loads(requests.get('https://api.wordpress.org/core/version-check/1.7/').text)[ | ||
|  |                     'offers'] | ||
|  | 
 | ||
|  |                 for versions in WPVersions: | ||
|  |                     if counter == 7: | ||
|  |                         break | ||
|  |                     if versions['current'] not in FinalVersions: | ||
|  |                         FinalVersions.append(versions['current']) | ||
|  |                         counter = counter + 1 | ||
|  |             except: | ||
|  |                 FinalVersions = ['5.6', '5.5.3', '5.5.2'] | ||
|  | 
 | ||
|  |             Plugins = wpplugins.objects.filter(owner=userobj) | ||
|  |             rnpss = randomPassword.generate_pass(10) | ||
|  | 
 | ||
|  |             ## | ||
|  | 
 | ||
|  |             test_domain_status = 1 | ||
|  | 
 | ||
|  |             Data = {'packageList': packagesName, "owernList": adminNames, 'WPVersions': FinalVersions, | ||
|  |                     'Plugins': Plugins, 'Randam_String': rnpss.lower(), 'test_domain_data': test_domain_status} | ||
|  |             proc = httpProc(request, 'websiteFunctions/WPCreate.html', | ||
|  |                             Data, 'createDatabase') | ||
|  |             return proc.render() | ||
|  |         else: | ||
|  |             from django.shortcuts import reverse | ||
|  |             return redirect(reverse('pricing')) | ||
|  | 
 | ||
|  |     def ListWPSites(self, request=None, userID=None, DeleteID=None): | ||
|  |         import json | ||
|  |         currentACL = ACLManager.loadedACL(userID) | ||
|  | 
 | ||
|  |         admin = Administrator.objects.get(pk=userID) | ||
|  |         data = {} | ||
|  |         wp_sites = ACLManager.GetALLWPObjects(currentACL, userID) | ||
|  |         data['wp'] = wp_sites | ||
|  | 
 | ||
|  |         try: | ||
|  |             if DeleteID != None: | ||
|  |                 WPDelete = WPSites.objects.get(pk=DeleteID) | ||
|  | 
 | ||
|  |                 if ACLManager.checkOwnership(WPDelete.owner.domain, admin, currentACL) == 1: | ||
|  |                     WPDelete.delete() | ||
|  |         except BaseException as msg: | ||
|  |             pass | ||
|  | 
 | ||
|  |         sites = [] | ||
|  |         for site in data['wp']: | ||
|  |             sites.append({ | ||
|  |                 'id': site.id, | ||
|  |                 'title': site.title, | ||
|  |                 'url': site.FinalURL, | ||
|  |                 'production_status': True | ||
|  |             }) | ||
|  | 
 | ||
|  |         context = { | ||
|  |             "wpsite": json.dumps(sites), | ||
|  |             "status": 1, | ||
|  |             "total_sites": len(sites), | ||
|  |             "debug_info": json.dumps({ | ||
|  |                 "user_id": userID, | ||
|  |                 "is_admin": bool(currentACL.get('admin', 0)), | ||
|  |                 "wp_sites_count": wp_sites.count() | ||
|  |             }) | ||
|  |         } | ||
|  | 
 | ||
|  |         proc = httpProc(request, 'websiteFunctions/WPsitesList.html', context) | ||
|  |         return proc.render() | ||
|  | 
 | ||
|  |     def WPHome(self, request=None, userID=None, WPid=None, DeleteID=None): | ||
|  |         Data = {} | ||
|  |         currentACL = ACLManager.loadedACL(userID) | ||
|  |         WPobj = WPSites.objects.get(pk=WPid) | ||
|  |         admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |         if ACLManager.checkOwnership(WPobj.owner.domain, admin, currentACL) == 1: | ||
|  |             pass | ||
|  |         else: | ||
|  |             return ACLManager.loadError() | ||
|  | 
 | ||
|  |         try: | ||
|  | 
 | ||
|  |             url = "https://platform.cyberpersons.com/CyberpanelAdOns/Adonpermission" | ||
|  |             data = { | ||
|  |                 "name": "wp-manager", | ||
|  |                 "IP": ACLManager.GetServerIP() | ||
|  |             } | ||
|  | 
 | ||
|  |             import requests | ||
|  |             response = requests.post(url, data=json.dumps(data)) | ||
|  |             Status = response.json()['status'] | ||
|  | 
 | ||
|  |             rnpss = randomPassword.generate_pass(10) | ||
|  | 
 | ||
|  |             Data['Randam_String'] = rnpss.lower() | ||
|  | 
 | ||
|  |             if (Status == 1) or ProcessUtilities.decideServer() == ProcessUtilities.ent: | ||
|  |                 Data['wpsite'] = WPobj | ||
|  |                 Data['test_domain_data'] = 1 | ||
|  | 
 | ||
|  |                 try: | ||
|  |                     DeleteID = request.GET.get('DeleteID', None) | ||
|  | 
 | ||
|  |                     if DeleteID != None: | ||
|  |                         wstagingDelete = WPStaging.objects.get(pk=DeleteID, owner=WPobj) | ||
|  |                         wstagingDelete.delete() | ||
|  | 
 | ||
|  |                 except BaseException as msg: | ||
|  |                     da = str(msg) | ||
|  | 
 | ||
|  |                 proc = httpProc(request, 'websiteFunctions/WPsiteHome.html', | ||
|  |                                 Data, 'createDatabase') | ||
|  |                 return proc.render() | ||
|  |             else: | ||
|  |                 from django.shortcuts import reverse | ||
|  |                 return redirect(reverse('pricing')) | ||
|  |         except: | ||
|  |             proc = httpProc(request, 'websiteFunctions/WPsiteHome.html', | ||
|  |                             Data, 'createDatabase') | ||
|  |             return proc.render() | ||
|  | 
 | ||
|  |     def RestoreHome(self, request=None, userID=None, BackupID=None): | ||
|  |         Data = {} | ||
|  |         currentACL = ACLManager.loadedACL(userID) | ||
|  |         admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |         if ACLManager.CheckForPremFeature('wp-manager'): | ||
|  | 
 | ||
|  |             Data['backupobj'] = WPSitesBackup.objects.get(pk=BackupID) | ||
|  | 
 | ||
|  |             if ACLManager.CheckIPBackupObjectOwner(currentACL, Data['backupobj'], admin) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadError() | ||
|  | 
 | ||
|  |             config = json.loads(Data['backupobj'].config) | ||
|  |             Data['FileName'] = config['name'] | ||
|  |             try: | ||
|  |                 Data['Backuptype'] = config['Backuptype'] | ||
|  | 
 | ||
|  |                 if Data['Backuptype'] == 'DataBase Backup' or Data['Backuptype'] == 'Website Backup': | ||
|  |                     Data['WPsites'] = [WPSites.objects.get(pk=Data['backupobj'].WPSiteID)] | ||
|  |                 else: | ||
|  |                     Data['WPsites'] = ACLManager.GetALLWPObjects(currentACL, userID) | ||
|  | 
 | ||
|  |             except: | ||
|  |                 Data['Backuptype'] = None | ||
|  |                 Data['WPsites'] = ACLManager.GetALLWPObjects(currentACL, userID) | ||
|  | 
 | ||
|  |             proc = httpProc(request, 'websiteFunctions/WPRestoreHome.html', | ||
|  |                             Data, 'createDatabase') | ||
|  |             return proc.render() | ||
|  |         else: | ||
|  |             from django.shortcuts import reverse | ||
|  |             return redirect(reverse('pricing')) | ||
|  | 
 | ||
|  |     def RemoteBackupConfig(self, request=None, userID=None, DeleteID=None): | ||
|  |         Data = {} | ||
|  |         currentACL = ACLManager.loadedACL(userID) | ||
|  |         admin = Administrator.objects.get(pk=userID) | ||
|  |         try: | ||
|  |             if DeleteID != None: | ||
|  |                 BackupconfigDelete = RemoteBackupConfig.objects.get(pk=DeleteID) | ||
|  |                 BackupconfigDelete.delete() | ||
|  |         except: | ||
|  |             pass | ||
|  | 
 | ||
|  |         if ACLManager.CheckForPremFeature('wp-manager'): | ||
|  | 
 | ||
|  |             Data['WPsites'] = ACLManager.GetALLWPObjects(currentACL, userID) | ||
|  |             allcon = RemoteBackupConfig.objects.all() | ||
|  |             Data['backupconfigs'] = [] | ||
|  |             for i in allcon: | ||
|  |                 configr = json.loads(i.config) | ||
|  |                 if i.configtype == "SFTP": | ||
|  |                     Data['backupconfigs'].append({ | ||
|  |                         'id': i.pk, | ||
|  |                         'Type': i.configtype, | ||
|  |                         'HostName': configr['Hostname'], | ||
|  |                         'Path': configr['Path'] | ||
|  |                     }) | ||
|  |                 elif i.configtype == "S3": | ||
|  |                     Provider = configr['Provider'] | ||
|  |                     if Provider == "Backblaze": | ||
|  |                         Data['backupconfigs'].append({ | ||
|  |                             'id': i.pk, | ||
|  |                             'Type': i.configtype, | ||
|  |                             'HostName': Provider, | ||
|  |                             'Path': configr['S3keyname'] | ||
|  |                         }) | ||
|  |                     else: | ||
|  |                         Data['backupconfigs'].append({ | ||
|  |                             'id': i.pk, | ||
|  |                             'Type': i.configtype, | ||
|  |                             'HostName': Provider, | ||
|  |                             'Path': configr['S3keyname'] | ||
|  |                         }) | ||
|  | 
 | ||
|  |             proc = httpProc(request, 'websiteFunctions/RemoteBackupConfig.html', | ||
|  |                             Data, 'createDatabase') | ||
|  |             return proc.render() | ||
|  |         else: | ||
|  |             from django.shortcuts import reverse | ||
|  |             return redirect(reverse('pricing')) | ||
|  | 
 | ||
|  |     def BackupfileConfig(self, request=None, userID=None, RemoteConfigID=None, DeleteID=None): | ||
|  |         Data = {} | ||
|  |         currentACL = ACLManager.loadedACL(userID) | ||
|  |         admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |         Data['RemoteConfigID'] = RemoteConfigID | ||
|  |         RemoteConfigobj = RemoteBackupConfig.objects.get(pk=RemoteConfigID) | ||
|  |         try: | ||
|  |             if DeleteID != None: | ||
|  |                 RemoteBackupConfigDelete = RemoteBackupSchedule.objects.get(pk=DeleteID) | ||
|  |                 RemoteBackupConfigDelete.delete() | ||
|  |         except: | ||
|  |             pass | ||
|  | 
 | ||
|  |         if ACLManager.CheckForPremFeature('wp-manager'): | ||
|  |             Data['WPsites'] = ACLManager.GetALLWPObjects(currentACL, userID) | ||
|  |             allsechedule = RemoteBackupSchedule.objects.filter(RemoteBackupConfig=RemoteConfigobj) | ||
|  |             Data['Backupschedule'] = [] | ||
|  |             for i in allsechedule: | ||
|  |                 lastrun = i.lastrun | ||
|  |                 LastRun = time.strftime('%Y-%m-%d', time.localtime(float(lastrun))) | ||
|  |                 Data['Backupschedule'].append({ | ||
|  |                     'id': i.pk, | ||
|  |                     'Name': i.Name, | ||
|  |                     'RemoteConfiguration': i.RemoteBackupConfig.configtype, | ||
|  |                     'Retention': i.fileretention, | ||
|  |                     'Frequency': i.timeintervel, | ||
|  |                     'LastRun': LastRun | ||
|  |                 }) | ||
|  |             proc = httpProc(request, 'websiteFunctions/BackupfileConfig.html', | ||
|  |                             Data, 'createDatabase') | ||
|  |             return proc.render() | ||
|  |         else: | ||
|  |             from django.shortcuts import reverse | ||
|  |             return redirect(reverse('pricing')) | ||
|  | 
 | ||
|  |     def AddRemoteBackupsite(self, request=None, userID=None, RemoteScheduleID=None, DeleteSiteID=None): | ||
|  |         Data = {} | ||
|  |         currentACL = ACLManager.loadedACL(userID) | ||
|  |         admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |         Data['RemoteScheduleID'] = RemoteScheduleID | ||
|  |         RemoteBackupScheduleobj = RemoteBackupSchedule.objects.get(pk=RemoteScheduleID) | ||
|  | 
 | ||
|  |         try: | ||
|  |             if DeleteSiteID != None: | ||
|  |                 RemoteBackupsitesDelete = RemoteBackupsites.objects.get(pk=DeleteSiteID) | ||
|  |                 RemoteBackupsitesDelete.delete() | ||
|  |         except: | ||
|  |             pass | ||
|  | 
 | ||
|  |         if ACLManager.CheckForPremFeature('wp-manager'): | ||
|  |             Data['WPsites'] = ACLManager.GetALLWPObjects(currentACL, userID) | ||
|  |             allRemoteBackupsites = RemoteBackupsites.objects.filter(owner=RemoteBackupScheduleobj) | ||
|  |             Data['RemoteBackupsites'] = [] | ||
|  |             for i in allRemoteBackupsites: | ||
|  |                 try: | ||
|  |                     wpsite = WPSites.objects.get(pk=i.WPsites) | ||
|  |                     Data['RemoteBackupsites'].append({ | ||
|  |                         'id': i.pk, | ||
|  |                         'Title': wpsite.title, | ||
|  |                     }) | ||
|  |                 except: | ||
|  |                     pass | ||
|  |             proc = httpProc(request, 'websiteFunctions/AddRemoteBackupSite.html', | ||
|  |                             Data, 'createDatabase') | ||
|  |             return proc.render() | ||
|  |         else: | ||
|  |             from django.shortcuts import reverse | ||
|  |             return redirect(reverse('pricing')) | ||
|  | 
 | ||
|  |     def WordpressPricing(self, request=None, userID=None, ): | ||
|  |         Data = {} | ||
|  |         proc = httpProc(request, 'websiteFunctions/CyberpanelPricing.html', Data, 'createWebsite') | ||
|  |         return proc.render() | ||
|  | 
 | ||
|  |     def RestoreBackups(self, request=None, userID=None, DeleteID=None): | ||
|  |         Data = {} | ||
|  |         currentACL = ACLManager.loadedACL(userID) | ||
|  |         admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |         url = "https://platform.cyberpersons.com/CyberpanelAdOns/Adonpermission" | ||
|  |         data = { | ||
|  |             "name": "wp-manager", | ||
|  |             "IP": ACLManager.GetServerIP() | ||
|  |         } | ||
|  | 
 | ||
|  |         import requests | ||
|  |         response = requests.post(url, data=json.dumps(data)) | ||
|  |         Status = response.json()['status'] | ||
|  | 
 | ||
|  |         if (Status == 1) or ProcessUtilities.decideServer() == ProcessUtilities.ent: | ||
|  | 
 | ||
|  |             backobj = WPSitesBackup.objects.filter(owner=admin).order_by('-id') | ||
|  | 
 | ||
|  |             # if ACLManager.CheckIPBackupObjectOwner(currentACL, backobj, admin) == 1: | ||
|  |             #     pass | ||
|  |             # else: | ||
|  |             #     return ACLManager.loadError() | ||
|  | 
 | ||
|  |             try: | ||
|  |                 if DeleteID != None: | ||
|  |                     DeleteIDobj = WPSitesBackup.objects.get(pk=DeleteID) | ||
|  | 
 | ||
|  |                     if ACLManager.CheckIPBackupObjectOwner(currentACL, DeleteIDobj, admin) == 1: | ||
|  |                         config = DeleteIDobj.config | ||
|  |                         conf = json.loads(config) | ||
|  |                         FileName = conf['name'] | ||
|  |                         command = "rm -r /home/backup/%s.tar.gz" % FileName | ||
|  |                         ProcessUtilities.executioner(command) | ||
|  |                         DeleteIDobj.delete() | ||
|  | 
 | ||
|  |             except BaseException as msg: | ||
|  |                 pass | ||
|  |             Data['job'] = [] | ||
|  | 
 | ||
|  |             for sub in backobj: | ||
|  |                 try: | ||
|  |                     wpsite = WPSites.objects.get(pk=sub.WPSiteID) | ||
|  |                     web = wpsite.title | ||
|  |                 except: | ||
|  |                     web = "Website Not Found" | ||
|  | 
 | ||
|  |                 try: | ||
|  |                     config = sub.config | ||
|  |                     conf = json.loads(config) | ||
|  |                     Backuptype = conf['Backuptype'] | ||
|  |                     BackupDestination = conf['BackupDestination'] | ||
|  |                 except: | ||
|  |                     Backuptype = "Backup type not exists" | ||
|  | 
 | ||
|  |                 Data['job'].append({ | ||
|  |                     'id': sub.id, | ||
|  |                     'title': web, | ||
|  |                     'Backuptype': Backuptype, | ||
|  |                     'BackupDestination': BackupDestination | ||
|  |                 }) | ||
|  | 
 | ||
|  |             proc = httpProc(request, 'websiteFunctions/RestoreBackups.html', | ||
|  |                             Data, 'createDatabase') | ||
|  |             return proc.render() | ||
|  |         else: | ||
|  |             from django.shortcuts import reverse | ||
|  |             return redirect(reverse('pricing')) | ||
|  | 
 | ||
|  |     def AutoLogin(self, request=None, userID=None): | ||
|  | 
 | ||
|  |         WPid = request.GET.get('id') | ||
|  |         currentACL = ACLManager.loadedACL(userID) | ||
|  |         WPobj = WPSites.objects.get(pk=WPid) | ||
|  |         admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |         if ACLManager.checkOwnership(WPobj.owner.domain, admin, currentACL) == 1: | ||
|  |             pass | ||
|  |         else: | ||
|  |             return ACLManager.loadError() | ||
|  | 
 | ||
|  |         from managePHP.phpManager import PHPManager | ||
|  | 
 | ||
|  |         php = PHPManager.getPHPString(WPobj.owner.phpSelection) | ||
|  |         FinalPHPPath = '/usr/local/lsws/lsphp%s/bin/php' % (php) | ||
|  | 
 | ||
|  |         url = "https://platform.cyberpersons.com/CyberpanelAdOns/Adonpermission" | ||
|  |         data = { | ||
|  |             "name": "wp-manager", | ||
|  |             "IP": ACLManager.GetServerIP() | ||
|  |         } | ||
|  | 
 | ||
|  |         import requests | ||
|  |         response = requests.post(url, data=json.dumps(data)) | ||
|  |         Status = response.json()['status'] | ||
|  | 
 | ||
|  |         if (Status == 1) or ProcessUtilities.decideServer() == ProcessUtilities.ent: | ||
|  | 
 | ||
|  |             ## Get title | ||
|  | 
 | ||
|  |             password = randomPassword.generate_pass(10) | ||
|  | 
 | ||
|  |             command = f'sudo -u %s {FinalPHPPath} /usr/bin/wp user create autologin %s --role=administrator --user_pass="%s" --path=%s --skip-plugins --skip-themes' % ( | ||
|  |                 WPobj.owner.externalApp, 'autologin@cloudpages.cloud', password, WPobj.path) | ||
|  |             ProcessUtilities.executioner(command) | ||
|  | 
 | ||
|  |             command = f'sudo -u %s {FinalPHPPath} /usr/bin/wp user update autologin --user_pass="%s" --path=%s --skip-plugins --skip-themes' % ( | ||
|  |                 WPobj.owner.externalApp, password, WPobj.path) | ||
|  |             ProcessUtilities.executioner(command) | ||
|  | 
 | ||
|  |             data = {} | ||
|  | 
 | ||
|  |             if WPobj.FinalURL.endswith('/'): | ||
|  |                 FinalURL = WPobj.FinalURL[:-1] | ||
|  |             else: | ||
|  |                 FinalURL = WPobj.FinalURL | ||
|  | 
 | ||
|  |             data['url'] = 'https://%s' % (FinalURL) | ||
|  |             data['userName'] = 'autologin' | ||
|  |             data['password'] = password | ||
|  | 
 | ||
|  |             proc = httpProc(request, 'websiteFunctions/AutoLogin.html', | ||
|  |                             data, 'createDatabase') | ||
|  |             return proc.render() | ||
|  |         else: | ||
|  |             from django.shortcuts import reverse | ||
|  |             return redirect(reverse('pricing')) | ||
|  | 
 | ||
|  |     def ConfigurePlugins(self, request=None, userID=None, data=None): | ||
|  | 
 | ||
|  |         if ACLManager.CheckForPremFeature('wp-manager'): | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             userobj = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             Selectedplugins = wpplugins.objects.filter(owner=userobj) | ||
|  |             # data['Selectedplugins'] = wpplugins.objects.filter(ProjectOwner=HostingCompany) | ||
|  | 
 | ||
|  |             Data = {'Selectedplugins': Selectedplugins, } | ||
|  |             proc = httpProc(request, 'websiteFunctions/WPConfigurePlugins.html', | ||
|  |                             Data, 'createDatabase') | ||
|  |             return proc.render() | ||
|  |         else: | ||
|  |             from django.shortcuts import reverse | ||
|  |             return redirect(reverse('pricing')) | ||
|  | 
 | ||
|  |     def Addnewplugin(self, request=None, userID=None, data=None): | ||
|  |         from django.shortcuts import reverse | ||
|  |         if ACLManager.CheckForPremFeature('wp-manager'): | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             adminNames = ACLManager.loadAllUsers(userID) | ||
|  |             packagesName = ACLManager.loadPackages(userID, currentACL) | ||
|  |             phps = PHPManager.findPHPVersions() | ||
|  | 
 | ||
|  |             Data = {'packageList': packagesName, "owernList": adminNames, 'phps': phps} | ||
|  |             proc = httpProc(request, 'websiteFunctions/WPAddNewPlugin.html', | ||
|  |                             Data, 'createDatabase') | ||
|  |             return proc.render() | ||
|  | 
 | ||
|  |         return redirect(reverse('pricing')) | ||
|  | 
 | ||
|  |     def SearchOnkeyupPlugin(self, userID=None, data=None): | ||
|  |         try: | ||
|  |             if ACLManager.CheckForPremFeature('wp-manager'): | ||
|  |                 currentACL = ACLManager.loadedACL(userID) | ||
|  | 
 | ||
|  |                 pluginname = data['pluginname'] | ||
|  |                 # logging.CyberCPLogFileWriter.writeToFile("Plugin Name ....... %s"%pluginname) | ||
|  | 
 | ||
|  |                 url = "http://api.wordpress.org/plugins/info/1.1/?action=query_plugins&request[search]=%s" % str( | ||
|  |                     pluginname) | ||
|  |                 import requests | ||
|  | 
 | ||
|  |                 res = requests.get(url) | ||
|  |                 r = res.json() | ||
|  | 
 | ||
|  |                 # return proc.ajax(1, 'Done', {'plugins': r}) | ||
|  | 
 | ||
|  |                 data_ret = {'status': 1, 'plugns': r, } | ||
|  | 
 | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  |             else: | ||
|  |                 data_ret = {'status': 0, 'createWebSiteStatus': 0, 'error_message': 'Premium feature not available.'} | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'createWebSiteStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def AddNewpluginAjax(self, userID=None, data=None): | ||
|  |         try: | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  | 
 | ||
|  |             userobj = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             config = data['config'] | ||
|  |             Name = data['Name'] | ||
|  |             # pluginname = data['pluginname'] | ||
|  |             # logging.CyberCPLogFileWriter.writeToFile("config ....... %s"%config) | ||
|  |             # logging.CyberCPLogFileWriter.writeToFile(" Name ....... %s"%Name) | ||
|  | 
 | ||
|  |             addpl = wpplugins(Name=Name, config=json.dumps(config), owner=userobj) | ||
|  |             addpl.save() | ||
|  | 
 | ||
|  |             data_ret = {'status': 1} | ||
|  | 
 | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'AddNewpluginAjax': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def EidtPlugin(self, request=None, userID=None, pluginbID=None): | ||
|  |         Data = {} | ||
|  |         currentACL = ACLManager.loadedACL(userID) | ||
|  |         admin = Administrator.objects.get(pk=userID) | ||
|  |         pluginobj = wpplugins.objects.get(pk=pluginbID) | ||
|  | 
 | ||
|  |         if ACLManager.CheckIPPluginObjectOwner(currentACL, pluginobj, admin) == 1: | ||
|  |             pass | ||
|  |         else: | ||
|  |             return ACLManager.loadError() | ||
|  | 
 | ||
|  |         lmo = json.loads(pluginobj.config) | ||
|  |         Data['Selectedplugins'] = lmo | ||
|  |         Data['pluginbID'] = pluginbID | ||
|  |         Data['BucketName'] = pluginobj.Name | ||
|  | 
 | ||
|  |         proc = httpProc(request, 'websiteFunctions/WPEidtPlugin.html', | ||
|  |                         Data, 'createDatabase') | ||
|  |         return proc.render() | ||
|  | 
 | ||
|  |     def deletesPlgin(self, userID=None, data=None, ): | ||
|  |         try: | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  |             userobj = Administrator.objects.get(pk=userID) | ||
|  |             pluginname = data['pluginname'] | ||
|  |             pluginbBucketID = data['pluginbBucketID'] | ||
|  |             # logging.CyberCPLogFileWriter.writeToFile("pluginbID ....... %s" % pluginbBucketID) | ||
|  |             # logging.CyberCPLogFileWriter.writeToFile("pluginname ....... %s" % pluginname) | ||
|  | 
 | ||
|  |             obj = wpplugins.objects.get(pk=pluginbBucketID, owner=userobj) | ||
|  | 
 | ||
|  |             if ACLManager.CheckIPPluginObjectOwner(currentACL, obj, admin) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadError() | ||
|  | 
 | ||
|  |             ab = [] | ||
|  |             ab = json.loads(obj.config) | ||
|  |             ab.remove(pluginname) | ||
|  |             obj.config = json.dumps(ab) | ||
|  |             obj.save() | ||
|  | 
 | ||
|  |             data_ret = {'status': 1} | ||
|  | 
 | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'deletesPlgin': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def Addplugineidt(self, userID=None, data=None, ): | ||
|  |         try: | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  |             userobj = Administrator.objects.get(pk=userID) | ||
|  |             pluginname = data['pluginname'] | ||
|  |             pluginbBucketID = data['pluginbBucketID'] | ||
|  | 
 | ||
|  |             # logging.CyberCPLogFileWriter.writeToFile("pluginbID ....... %s" % pluginbBucketID) | ||
|  |             # logging.CyberCPLogFileWriter.writeToFile("pluginname ....... %s" % pluginname) | ||
|  | 
 | ||
|  |             pObj = wpplugins.objects.get(pk=pluginbBucketID, owner=userobj) | ||
|  | 
 | ||
|  |             if ACLManager.CheckIPPluginObjectOwner(currentACL, pObj, admin) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadError() | ||
|  | 
 | ||
|  |             listofplugin = json.loads(pObj.config) | ||
|  |             try: | ||
|  |                 index = listofplugin.index(pluginname) | ||
|  |                 print('index.....%s' % index) | ||
|  |                 if (index >= 0): | ||
|  |                     data_ret = {'status': 0, 'deletesPlgin': 0, 'error_message': str('Already Save in your Plugin lis')} | ||
|  |                     json_data = json.dumps(data_ret) | ||
|  |                     return HttpResponse(json_data) | ||
|  | 
 | ||
|  |             except: | ||
|  |                 ab = [] | ||
|  |                 ab = json.loads(pObj.config) | ||
|  |                 ab.append(pluginname) | ||
|  |                 pObj.config = json.dumps(ab) | ||
|  |                 pObj.save() | ||
|  | 
 | ||
|  |             data_ret = {'status': 1} | ||
|  | 
 | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'deletesPlgin': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def modifyWebsite(self, request=None, userID=None, data=None): | ||
|  |         currentACL = ACLManager.loadedACL(userID) | ||
|  | 
 | ||
|  |         websitesName = ACLManager.findAllSites(currentACL, userID) | ||
|  |         phps = PHPManager.findPHPVersions() | ||
|  |         proc = httpProc(request, 'websiteFunctions/modifyWebsite.html', | ||
|  |                         {'websiteList': websitesName, 'phps': phps}, 'modifyWebsite') | ||
|  |         return proc.render() | ||
|  | 
 | ||
|  |     def deleteWebsite(self, request=None, userID=None, data=None): | ||
|  |         currentACL = ACLManager.loadedACL(userID) | ||
|  |         websitesName = ACLManager.findAllSites(currentACL, userID) | ||
|  |         proc = httpProc(request, 'websiteFunctions/deleteWebsite.html', | ||
|  |                         {'websiteList': websitesName}, 'deleteWebsite') | ||
|  |         return proc.render() | ||
|  | 
 | ||
|  |     def CreateNewDomain(self, request=None, userID=None, data=None): | ||
|  |         currentACL = ACLManager.loadedACL(userID) | ||
|  |         websitesName = ACLManager.findAllSites(currentACL, userID) | ||
|  | 
 | ||
|  |         try: | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  |             if admin.defaultSite == 0: | ||
|  |                 websites = ACLManager.findWebsiteObjects(currentACL, userID) | ||
|  |                 admin.defaultSite = websites[0].id | ||
|  |                 admin.save() | ||
|  |         except: | ||
|  |             pass | ||
|  | 
 | ||
|  |         try: | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  |             defaultDomain = Websites.objects.get(pk=admin.defaultSite).domain | ||
|  |         except: | ||
|  |             try: | ||
|  |                 admin = Administrator.objects.get(pk=userID) | ||
|  |                 websites = ACLManager.findWebsiteObjects(currentACL, userID) | ||
|  |                 admin.defaultSite = websites[0].id | ||
|  |                 admin.save() | ||
|  |                 defaultDomain = websites[0].domain | ||
|  |             except: | ||
|  |                 defaultDomain='NONE' | ||
|  | 
 | ||
|  | 
 | ||
|  |         url = "https://platform.cyberpersons.com/CyberpanelAdOns/Adonpermission" | ||
|  |         data = { | ||
|  |             "name": "all", | ||
|  |             "IP": ACLManager.GetServerIP() | ||
|  |         } | ||
|  | 
 | ||
|  |         import requests | ||
|  |         response = requests.post(url, data=json.dumps(data)) | ||
|  |         Status = response.json()['status'] | ||
|  | 
 | ||
|  |         test_domain_status = 0 | ||
|  | 
 | ||
|  |         if (Status == 1) or ProcessUtilities.decideServer() == ProcessUtilities.ent: | ||
|  |             test_domain_status = 1 | ||
|  | 
 | ||
|  |         rnpss = randomPassword.generate_pass(10) | ||
|  |         proc = httpProc(request, 'websiteFunctions/createDomain.html', | ||
|  |                         {'websiteList': websitesName, 'phps': PHPManager.findPHPVersions(), 'Randam_String': rnpss, | ||
|  |                          'test_domain_data': test_domain_status, 'defaultSite': defaultDomain}) | ||
|  |         return proc.render() | ||
|  | 
 | ||
|  |     def siteState(self, request=None, userID=None, data=None): | ||
|  |         currentACL = ACLManager.loadedACL(userID) | ||
|  | 
 | ||
|  |         websitesName = ACLManager.findAllSites(currentACL, userID) | ||
|  | 
 | ||
|  |         proc = httpProc(request, 'websiteFunctions/suspendWebsite.html', | ||
|  |                         {'websiteList': websitesName}, 'suspendWebsite') | ||
|  |         return proc.render() | ||
|  | 
 | ||
|  |     def listWebsites(self, request=None, userID=None, data=None): | ||
|  |         currentACL = ACLManager.loadedACL(userID) | ||
|  |         pagination = self.websitePagination(currentACL, userID) | ||
|  |         proc = httpProc(request, 'websiteFunctions/listWebsites.html', | ||
|  |                         {"pagination": pagination}) | ||
|  |         return proc.render() | ||
|  | 
 | ||
|  |     def listChildDomains(self, request=None, userID=None, data=None): | ||
|  |         currentACL = ACLManager.loadedACL(userID) | ||
|  |         adminNames = ACLManager.loadAllUsers(userID) | ||
|  |         packagesName = ACLManager.loadPackages(userID, currentACL) | ||
|  |         phps = PHPManager.findPHPVersions() | ||
|  | 
 | ||
|  |         Data = {'packageList': packagesName, "owernList": adminNames, 'phps': phps} | ||
|  |         proc = httpProc(request, 'websiteFunctions/listChildDomains.html', | ||
|  |                         Data) | ||
|  |         return proc.render() | ||
|  | 
 | ||
|  |     def listCron(self, request=None, userID=None, data=None): | ||
|  |         currentACL = ACLManager.loadedACL(userID) | ||
|  |         admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |         if ACLManager.checkOwnership(request.GET.get('domain'), admin, currentACL) == 1: | ||
|  |             pass | ||
|  |         else: | ||
|  |             return ACLManager.loadError() | ||
|  | 
 | ||
|  |         proc = httpProc(request, 'websiteFunctions/listCron.html', | ||
|  |                         {'domain': request.GET.get('domain')}) | ||
|  |         return proc.render() | ||
|  | 
 | ||
|  |     def domainAlias(self, request=None, userID=None, data=None): | ||
|  |         currentACL = ACLManager.loadedACL(userID) | ||
|  |         admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |         if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |             pass | ||
|  |         else: | ||
|  |             return ACLManager.loadError() | ||
|  | 
 | ||
|  |         aliasManager = AliasManager(self.domain) | ||
|  |         noAlias, finalAlisList = aliasManager.fetchAlisForDomains() | ||
|  | 
 | ||
|  |         path = "/home/" + self.domain + "/public_html" | ||
|  | 
 | ||
|  |         proc = httpProc(request, 'websiteFunctions/domainAlias.html', { | ||
|  |             'masterDomain': self.domain, | ||
|  |             'aliases': finalAlisList, | ||
|  |             'path': path, | ||
|  |             'noAlias': noAlias | ||
|  |         }) | ||
|  |         return proc.render() | ||
|  | 
 | ||
|  |     def FetchWPdata(self, userID=None, data=None): | ||
|  |         try: | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             WPManagerID = data['WPid'] | ||
|  |             wpsite = WPSites.objects.get(pk=WPManagerID) | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(wpsite.owner.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadError() | ||
|  | 
 | ||
|  |             path = wpsite.path | ||
|  | 
 | ||
|  |             Webobj = Websites.objects.get(pk=wpsite.owner_id) | ||
|  | 
 | ||
|  |             Vhuser = Webobj.externalApp | ||
|  |             PHPVersion = Webobj.phpSelection | ||
|  | 
 | ||
|  |             php = ACLManager.getPHPString(PHPVersion) | ||
|  |             FinalPHPPath = '/usr/local/lsws/lsphp%s/bin/php' % (php) | ||
|  | 
 | ||
|  |             command = 'sudo -u %s %s -d error_reporting=0 /usr/bin/wp core version --skip-plugins --skip-themes --path=%s 2>/dev/null' % ( | ||
|  |                 Vhuser, FinalPHPPath, path) | ||
|  |             version = ProcessUtilities.outputExecutioner(command, None, True) | ||
|  |             version = html.escape(version) | ||
|  | 
 | ||
|  |             command = 'sudo -u %s %s -d error_reporting=0 /usr/bin/wp plugin status litespeed-cache --skip-plugins --skip-themes --path=%s' % ( | ||
|  |                 Vhuser, FinalPHPPath, path) | ||
|  |             lscachee = ProcessUtilities.outputExecutioner(command) | ||
|  | 
 | ||
|  |             # Get current theme | ||
|  |             command = 'sudo -u %s %s -d error_reporting=0 /usr/bin/wp theme list --status=active --field=name --skip-plugins --skip-themes --path=%s 2>/dev/null' % ( | ||
|  |                 Vhuser, FinalPHPPath, path) | ||
|  |             currentTheme = ProcessUtilities.outputExecutioner(command, None, True) | ||
|  |             currentTheme = currentTheme.strip() | ||
|  | 
 | ||
|  |             # Get number of plugins | ||
|  |             command = 'sudo -u %s %s -d error_reporting=0 /usr/bin/wp plugin list --field=name --skip-plugins --skip-themes --path=%s 2>/dev/null' % ( | ||
|  |                 Vhuser, FinalPHPPath, path) | ||
|  |             plugins = ProcessUtilities.outputExecutioner(command, None, True) | ||
|  |             pluginCount = len([p for p in plugins.split('\n') if p.strip()]) | ||
|  | 
 | ||
|  | 
 | ||
|  |             if lscachee.find('Status: Active') > -1: | ||
|  |                 lscache = 1 | ||
|  |             else: | ||
|  |                 lscache = 0 | ||
|  | 
 | ||
|  |             command = 'sudo -u %s %s -d error_reporting=0 /usr/bin/wp config list --skip-plugins --skip-themes --path=%s' % ( | ||
|  |                 Vhuser, FinalPHPPath, path) | ||
|  |             stdout = ProcessUtilities.outputExecutioner(command) | ||
|  |             debugging = 0 | ||
|  |             for items in stdout.split('\n'): | ||
|  |                 if items.find('WP_DEBUG	true	constant') > -1: | ||
|  |                     debugging = 1 | ||
|  |                     break | ||
|  | 
 | ||
|  |             command = 'sudo -u %s %s -d error_reporting=0 /usr/bin/wp option get blog_public --skip-plugins --skip-themes --path=%s' % ( | ||
|  |                 Vhuser, FinalPHPPath, path) | ||
|  |             stdoutput = ProcessUtilities.outputExecutioner(command) | ||
|  |             searchindex = int(stdoutput.splitlines()[-1]) | ||
|  | 
 | ||
|  |             command = 'sudo -u %s %s -d error_reporting=0 /usr/bin/wp maintenance-mode status --skip-plugins --skip-themes --path=%s' % ( | ||
|  |                 Vhuser, FinalPHPPath, path) | ||
|  |             maintenanceMod = ProcessUtilities.outputExecutioner(command) | ||
|  | 
 | ||
|  |              | ||
|  | 
 | ||
|  |             result = maintenanceMod.splitlines()[-1] | ||
|  |             if result.find('not active') > -1: | ||
|  |                 maintenanceMode = 0 | ||
|  |             else: | ||
|  |                 maintenanceMode = 1 | ||
|  | 
 | ||
|  |             ##### Check passwd protection | ||
|  |             vhostName = wpsite.owner.domain | ||
|  |             vhostPassDir = f'/home/{vhostName}' | ||
|  |             path = f'{vhostPassDir}/{WPManagerID}' | ||
|  |             if os.path.exists(path): | ||
|  |                 passwd = 1 | ||
|  |             else: | ||
|  |                 passwd = 0 | ||
|  | 
 | ||
|  |             #### Check WP cron | ||
|  |             command = "sudo -u %s cat %s/wp-config.php" % (Vhuser, wpsite.path) | ||
|  |             stdout = ProcessUtilities.outputExecutioner(command) | ||
|  |             if stdout.find("'DISABLE_WP_CRON', 'true'") > -1: | ||
|  |                 wpcron = 1 | ||
|  |             else: | ||
|  |                 wpcron = 0 | ||
|  | 
 | ||
|  |             fb = { | ||
|  |                 'version': version.rstrip('\n'), | ||
|  |                 'lscache': lscache, | ||
|  |                 'debugging': debugging, | ||
|  |                 'searchIndex': searchindex, | ||
|  |                 'maintenanceMode': maintenanceMode, | ||
|  |                 'passwordprotection': passwd, | ||
|  |                 'wpcron': wpcron, | ||
|  |                 'theme': currentTheme, | ||
|  |                 'activePlugins': pluginCount, | ||
|  |                 'phpVersion': wpsite.owner.phpSelection | ||
|  | 
 | ||
|  |             } | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'error_message': 'None', 'ret_data': fb} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'installStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def GetCurrentPlugins(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             WPManagerID = data['WPid'] | ||
|  |             wpsite = WPSites.objects.get(pk=WPManagerID) | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(wpsite.owner.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadError() | ||
|  | 
 | ||
|  |             path = wpsite.path | ||
|  | 
 | ||
|  |             Webobj = Websites.objects.get(pk=wpsite.owner_id) | ||
|  | 
 | ||
|  |             Vhuser = Webobj.externalApp | ||
|  |             PHPVersion = Webobj.phpSelection | ||
|  |             php = ACLManager.getPHPString(PHPVersion) | ||
|  |             FinalPHPPath = '/usr/local/lsws/lsphp%s/bin/php' % (php) | ||
|  | 
 | ||
|  |             command = 'sudo -u %s %s -d error_reporting=0 /usr/bin/wp plugin list --skip-plugins --skip-themes --format=json --path=%s' % ( | ||
|  |                 Vhuser, FinalPHPPath, path) | ||
|  |             stdoutput = ProcessUtilities.outputExecutioner(command) | ||
|  |             json_data = stdoutput.splitlines()[-1] | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'error_message': 'None', 'plugins': json_data} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'installStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def GetCurrentThemes(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             WPManagerID = data['WPid'] | ||
|  |             wpsite = WPSites.objects.get(pk=WPManagerID) | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(wpsite.owner.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadError() | ||
|  | 
 | ||
|  |             path = wpsite.path | ||
|  | 
 | ||
|  |             Webobj = Websites.objects.get(pk=wpsite.owner_id) | ||
|  | 
 | ||
|  |             Vhuser = Webobj.externalApp | ||
|  |             PHPVersion = Webobj.phpSelection | ||
|  |             php = ACLManager.getPHPString(PHPVersion) | ||
|  |             FinalPHPPath = '/usr/local/lsws/lsphp%s/bin/php' % (php) | ||
|  | 
 | ||
|  |             command = 'sudo -u %s %s -d error_reporting=0 /usr/bin/wp theme list --skip-plugins --skip-themes --format=json --path=%s' % ( | ||
|  |                 Vhuser, FinalPHPPath, path) | ||
|  |             stdoutput = ProcessUtilities.outputExecutioner(command) | ||
|  |             json_data = stdoutput.splitlines()[-1] | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'error_message': 'None', 'themes': json_data} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'installStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def fetchstaging(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             WPManagerID = data['WPid'] | ||
|  |             wpsite = WPSites.objects.get(pk=WPManagerID) | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(wpsite.owner.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadError() | ||
|  | 
 | ||
|  |             from plogical.phpUtilities import phpUtilities | ||
|  | 
 | ||
|  |             json_data = phpUtilities.GetStagingInJson(wpsite.wpstaging_set.all().order_by('-id')) | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'error_message': 'None', 'wpsites': json_data} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'installStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def fetchDatabase(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             WPManagerID = data['WPid'] | ||
|  |             wpsite = WPSites.objects.get(pk=WPManagerID) | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(wpsite.owner.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadError() | ||
|  | 
 | ||
|  |             php = PHPManager.getPHPString(wpsite.owner.phpSelection) | ||
|  |             FinalPHPPath = '/usr/local/lsws/lsphp%s/bin/php' % (php) | ||
|  | 
 | ||
|  |             command = f'{FinalPHPPath} -d error_reporting=0 /usr/bin/wp config get DB_NAME  --skip-plugins --skip-themes --path={wpsite.path} 2>/dev/null' | ||
|  |             retStatus, stdoutput = ProcessUtilities.outputExecutioner(command, wpsite.owner.externalApp, True, None, 1) | ||
|  | 
 | ||
|  |             if stdoutput.find('Error:') == -1: | ||
|  |                 DataBaseName = stdoutput.rstrip("\n") | ||
|  |                 DataBaseName = html.escape(DataBaseName) | ||
|  |             else: | ||
|  |                 data_ret = {'status': 0, 'error_message': stdoutput} | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  | 
 | ||
|  |             command = f'{FinalPHPPath} -d error_reporting=0 /usr/bin/wp config get DB_USER  --skip-plugins --skip-themes --path={wpsite.path} 2>/dev/null' | ||
|  |             retStatus, stdoutput = ProcessUtilities.outputExecutioner(command, wpsite.owner.externalApp, True, None, 1) | ||
|  | 
 | ||
|  |             if stdoutput.find('Error:') == -1: | ||
|  |                 DataBaseUser = stdoutput.rstrip("\n") | ||
|  |                 DataBaseUser = html.escape(DataBaseUser) | ||
|  |             else: | ||
|  |                 data_ret = {'status': 0, 'error_message': stdoutput} | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  | 
 | ||
|  |             command = f'{FinalPHPPath} -d error_reporting=0 /usr/bin/wp config get table_prefix  --skip-plugins --skip-themes --path={wpsite.path} 2>/dev/null' | ||
|  |             retStatus, stdoutput = ProcessUtilities.outputExecutioner(command, wpsite.owner.externalApp, True, None, 1) | ||
|  | 
 | ||
|  |             if stdoutput.find('Error:') == -1: | ||
|  |                 tableprefix = stdoutput.rstrip("\n") | ||
|  |                 tableprefix = html.escape(tableprefix) | ||
|  |             else: | ||
|  |                 data_ret = {'status': 0, 'error_message': stdoutput} | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'error_message': 'None', "DataBaseUser": DataBaseUser, | ||
|  |                         "DataBaseName": DataBaseName, 'tableprefix': tableprefix} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'installStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def SaveUpdateConfig(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             WPManagerID = data['WPid'] | ||
|  |             Plugins = data['Plugins'] | ||
|  |             Themes = data['Themes'] | ||
|  |             AutomaticUpdates = data['AutomaticUpdates'] | ||
|  | 
 | ||
|  |             wpsite = WPSites.objects.get(pk=WPManagerID) | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(wpsite.owner.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadError() | ||
|  | 
 | ||
|  | 
 | ||
|  |             php = PHPManager.getPHPString(wpsite.owner.phpSelection) | ||
|  |             FinalPHPPath = '/usr/local/lsws/lsphp%s/bin/php' % (php) | ||
|  | 
 | ||
|  |             if AutomaticUpdates == 'Disabled': | ||
|  |                 command = f"{FinalPHPPath} -d error_reporting=0 /usr/bin/wp config set WP_AUTO_UPDATE_CORE false --raw --allow-root --path=" + wpsite.path | ||
|  |                 result = ProcessUtilities.outputExecutioner(command, wpsite.owner.externalApp) | ||
|  | 
 | ||
|  |                 if result.find('Success:') == -1: | ||
|  |                     raise BaseException(result) | ||
|  |             elif AutomaticUpdates == 'Minor and Security Updates': | ||
|  |                 command = f"{FinalPHPPath} -d error_reporting=0 /usr/bin/wp config set WP_AUTO_UPDATE_CORE minor --allow-root --path=" + wpsite.path | ||
|  |                 result = ProcessUtilities.outputExecutioner(command, wpsite.owner.externalApp) | ||
|  | 
 | ||
|  |                 if result.find('Success:') == -1: | ||
|  |                     raise BaseException(result) | ||
|  |             else: | ||
|  |                 command = f"{FinalPHPPath} -d error_reporting=0 /usr/bin/wp config set WP_AUTO_UPDATE_CORE true --raw --allow-root --path=" + wpsite.path | ||
|  |                 result = ProcessUtilities.outputExecutioner(command, wpsite.owner.externalApp) | ||
|  | 
 | ||
|  |                 if result.find('Success:') == -1: | ||
|  |                     raise BaseException(result) | ||
|  | 
 | ||
|  |             wpsite.AutoUpdates = AutomaticUpdates | ||
|  |             wpsite.PluginUpdates = Plugins | ||
|  |             wpsite.ThemeUpdates = Themes | ||
|  |             wpsite.save() | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'error_message': 'None', } | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'installStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def DeploytoProduction(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             WPManagerID = data['WPid'] | ||
|  |             statgingID = data['StagingID'] | ||
|  |             wpsite = WPSites.objects.get(pk=WPManagerID) | ||
|  |             StagingObj = WPSites.objects.get(pk=statgingID) | ||
|  | 
 | ||
|  |             ### | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(wpsite.owner.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadError() | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(StagingObj.owner.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadError() | ||
|  | 
 | ||
|  |             ### | ||
|  | 
 | ||
|  |             extraArgs = {} | ||
|  |             extraArgs['adminID'] = admin.pk | ||
|  |             extraArgs['statgingID'] = statgingID | ||
|  |             extraArgs['WPid'] = WPManagerID | ||
|  |             extraArgs['tempStatusPath'] = "/home/cyberpanel/" + str(randint(1000, 9999)) | ||
|  | 
 | ||
|  |             background = ApplicationInstaller('DeploytoProduction', extraArgs) | ||
|  |             background.start() | ||
|  | 
 | ||
|  |             time.sleep(2) | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'installStatus': 1, 'error_message': 'None', | ||
|  |                         'tempStatusPath': extraArgs['tempStatusPath']} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'installStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def WPCreateBackup(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             WPManagerID = data['WPid'] | ||
|  |             Backuptype = data['Backuptype'] | ||
|  | 
 | ||
|  |             wpsite = WPSites.objects.get(pk=WPManagerID) | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(wpsite.owner.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadError() | ||
|  | 
 | ||
|  |             extraArgs = {} | ||
|  |             extraArgs['adminID'] = admin.pk | ||
|  |             extraArgs['WPid'] = WPManagerID | ||
|  |             extraArgs['Backuptype'] = Backuptype | ||
|  |             extraArgs['tempStatusPath'] = "/home/cyberpanel/" + str(randint(1000, 9999)) | ||
|  | 
 | ||
|  |             background = ApplicationInstaller('WPCreateBackup', extraArgs) | ||
|  |             background.start() | ||
|  | 
 | ||
|  |             time.sleep(2) | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'installStatus': 1, 'error_message': 'None', | ||
|  |                         'tempStatusPath': extraArgs['tempStatusPath']} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'installStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def RestoreWPbackupNow(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             backupid = data['backupid'] | ||
|  |             DesSiteID = data['DesSite'] | ||
|  | 
 | ||
|  |             # try: | ||
|  |             # | ||
|  |             #     bwp = WPSites.objects.get(pk=int(backupid)) | ||
|  |             # | ||
|  |             #     if ACLManager.checkOwnership(bwp.owner.domain, admin, currentACL) == 1: | ||
|  |             #         pass | ||
|  |             #     else: | ||
|  |             #         return ACLManager.loadError() | ||
|  |             # | ||
|  |             # except: | ||
|  |             #     pass | ||
|  |             # | ||
|  |             # dwp = WPSites.objects.get(pk=int(DesSiteID)) | ||
|  |             # if ACLManager.checkOwnership(dwp.owner.domain, admin, currentACL) == 1: | ||
|  |             #     pass | ||
|  |             # else: | ||
|  |             #     return ACLManager.loadError() | ||
|  | 
 | ||
|  |             Domain = data['Domain'] | ||
|  | 
 | ||
|  |             extraArgs = {} | ||
|  |             extraArgs['adminID'] = admin.pk | ||
|  |             extraArgs['backupid'] = backupid | ||
|  |             extraArgs['DesSiteID'] = DesSiteID | ||
|  |             extraArgs['Domain'] = Domain | ||
|  |             extraArgs['path'] = data['path'] | ||
|  |             extraArgs['home'] = data['home'] | ||
|  |             extraArgs['tempStatusPath'] = "/home/cyberpanel/" + str(randint(1000, 9999)) | ||
|  | 
 | ||
|  |             background = ApplicationInstaller('RestoreWPbackupNow', extraArgs) | ||
|  |             background.start() | ||
|  | 
 | ||
|  |             time.sleep(2) | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'installStatus': 1, 'error_message': 'None', | ||
|  |                         'tempStatusPath': extraArgs['tempStatusPath']} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'installStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def SaveBackupConfig(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  |             ConfigType = data['type'] | ||
|  |             if ConfigType == 'SFTP': | ||
|  |                 Hname = data['Hname'] | ||
|  |                 Uname = data['Uname'] | ||
|  |                 Passwd = data['Passwd'] | ||
|  |                 path = data['path'] | ||
|  |                 config = { | ||
|  |                     "Hostname": Hname, | ||
|  |                     "Username": Uname, | ||
|  |                     "Password": Passwd, | ||
|  |                     "Path": path | ||
|  |                 } | ||
|  |             elif ConfigType == "S3": | ||
|  |                 Provider = data['Provider'] | ||
|  |                 if Provider == "Backblaze": | ||
|  |                     S3keyname = data['S3keyname'] | ||
|  |                     SecertKey = data['SecertKey'] | ||
|  |                     AccessKey = data['AccessKey'] | ||
|  |                     EndUrl = data['EndUrl'] | ||
|  |                     config = { | ||
|  |                         "Provider": Provider, | ||
|  |                         "S3keyname": S3keyname, | ||
|  |                         "SecertKey": SecertKey, | ||
|  |                         "AccessKey": AccessKey, | ||
|  |                         "EndUrl": EndUrl | ||
|  | 
 | ||
|  |                     } | ||
|  |                 else: | ||
|  |                     S3keyname = data['S3keyname'] | ||
|  |                     SecertKey = data['SecertKey'] | ||
|  |                     AccessKey = data['AccessKey'] | ||
|  |                     config = { | ||
|  |                         "Provider": Provider, | ||
|  |                         "S3keyname": S3keyname, | ||
|  |                         "SecertKey": SecertKey, | ||
|  |                         "AccessKey": AccessKey, | ||
|  | 
 | ||
|  |                     } | ||
|  | 
 | ||
|  |             mkobj = RemoteBackupConfig(owner=admin, configtype=ConfigType, config=json.dumps(config)) | ||
|  |             mkobj.save() | ||
|  | 
 | ||
|  |             time.sleep(1) | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'error_message': 'None', } | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def SaveBackupSchedule(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  |             FileRetention = data['FileRetention'] | ||
|  |             Backfrequency = data['Backfrequency'] | ||
|  |             ScheduleName = data['ScheduleName'] | ||
|  |             RemoteConfigID = data['RemoteConfigID'] | ||
|  |             BackupType = data['BackupType'] | ||
|  | 
 | ||
|  |             RemoteBackupConfigobj = RemoteBackupConfig.objects.get(pk=RemoteConfigID) | ||
|  |             Rconfig = json.loads(RemoteBackupConfigobj.config) | ||
|  | 
 | ||
|  |             try: | ||
|  |                 # This code is only supposed to run if backups are s3, not for SFTP | ||
|  |                 provider = Rconfig['Provider'] | ||
|  |                 if provider == "Backblaze": | ||
|  |                     EndURl = Rconfig['EndUrl'] | ||
|  |                 elif provider == "Amazon": | ||
|  |                     EndURl = "https://s3.us-east-1.amazonaws.com" | ||
|  |                 elif provider == "Wasabi": | ||
|  |                     EndURl = "https://s3.wasabisys.com" | ||
|  | 
 | ||
|  |                 AccessKey = Rconfig['AccessKey'] | ||
|  |                 SecertKey = Rconfig['SecertKey'] | ||
|  | 
 | ||
|  |                 session = boto3.session.Session() | ||
|  | 
 | ||
|  |                 client = session.client( | ||
|  |                     's3', | ||
|  |                     endpoint_url=EndURl, | ||
|  |                     aws_access_key_id=AccessKey, | ||
|  |                     aws_secret_access_key=SecertKey, | ||
|  |                     verify=False | ||
|  |                 ) | ||
|  | 
 | ||
|  |                 ############Creating Bucket | ||
|  |                 BucketName = randomPassword.generate_pass().lower() | ||
|  | 
 | ||
|  |                 try: | ||
|  |                     client.create_bucket(Bucket=BucketName) | ||
|  |                 except BaseException as msg: | ||
|  |                     logging.CyberCPLogFileWriter.writeToFile("Creating Bucket Error: %s" % str(msg)) | ||
|  |                     data_ret = {'status': 0, 'error_message': str(msg)} | ||
|  |                     json_data = json.dumps(data_ret) | ||
|  |                     return HttpResponse(json_data) | ||
|  | 
 | ||
|  |                 config = { | ||
|  |                     'BackupType': BackupType, | ||
|  |                     'BucketName': BucketName | ||
|  |                 } | ||
|  |             except BaseException as msg: | ||
|  |                 config = {'BackupType': BackupType} | ||
|  |                 pass | ||
|  | 
 | ||
|  |             svobj = RemoteBackupSchedule(RemoteBackupConfig=RemoteBackupConfigobj, Name=ScheduleName, | ||
|  |                                          timeintervel=Backfrequency, fileretention=FileRetention, | ||
|  |                                          config=json.dumps(config), | ||
|  |                                          lastrun=str(time.time())) | ||
|  |             svobj.save() | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'error_message': 'None', } | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def AddWPsiteforRemoteBackup(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  |             WPid = data['WpsiteID'] | ||
|  |             RemoteScheduleID = data['RemoteScheduleID'] | ||
|  | 
 | ||
|  |             wpsiteobj = WPSites.objects.get(pk=WPid) | ||
|  |             WPpath = wpsiteobj.path | ||
|  |             VHuser = wpsiteobj.owner.externalApp | ||
|  |             PhpVersion = wpsiteobj.owner.phpSelection | ||
|  |             php = PHPManager.getPHPString(PhpVersion) | ||
|  |             FinalPHPPath = '/usr/local/lsws/lsphp%s/bin/php' % (php) | ||
|  | 
 | ||
|  |             ####Get DB Name | ||
|  | 
 | ||
|  |             command = 'sudo -u %s %s -d error_reporting=0 /usr/bin/wp config get DB_NAME  --skip-plugins --skip-themes --path=%s' % ( | ||
|  |                 VHuser, FinalPHPPath, WPpath) | ||
|  |             result, stdout = ProcessUtilities.outputExecutioner(command, None, None, None, 1) | ||
|  | 
 | ||
|  |             if stdout.find('Error:') > -1: | ||
|  |                 raise BaseException(stdout) | ||
|  |             else: | ||
|  |                 Finaldbname = stdout.rstrip("\n") | ||
|  | 
 | ||
|  |             ## Get DB obj | ||
|  |             try: | ||
|  |                 DBobj = Databases.objects.get(dbName=Finaldbname) | ||
|  |             except: | ||
|  |                 raise BaseException(str("DataBase Not Found")) | ||
|  |             RemoteScheduleIDobj = RemoteBackupSchedule.objects.get(pk=RemoteScheduleID) | ||
|  | 
 | ||
|  |             svobj = RemoteBackupsites(owner=RemoteScheduleIDobj, WPsites=WPid, database=DBobj.pk) | ||
|  |             svobj.save() | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'error_message': 'None', } | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def UpdateRemoteschedules(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  |             ScheduleID = data['ScheduleID'] | ||
|  |             Frequency = data['Frequency'] | ||
|  |             FileRetention = data['FileRetention'] | ||
|  | 
 | ||
|  |             scheduleobj = RemoteBackupSchedule.objects.get(pk=ScheduleID) | ||
|  |             scheduleobj.timeintervel = Frequency | ||
|  |             scheduleobj.fileretention = FileRetention | ||
|  |             scheduleobj.save() | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'error_message': 'None', } | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def ScanWordpressSite(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             allweb = Websites.objects.all() | ||
|  | 
 | ||
|  |             childdomain = ChildDomains.objects.all() | ||
|  | 
 | ||
|  |             for web in allweb: | ||
|  |                 webpath = "/home/%s/public_html/" % web.domain | ||
|  |                 command = "cat %swp-config.php" % webpath | ||
|  |                 result = ProcessUtilities.outputExecutioner(command, web.externalApp) | ||
|  | 
 | ||
|  |                 if os.path.exists(ProcessUtilities.debugPath): | ||
|  |                     logging.CyberCPLogFileWriter.writeToFile(result) | ||
|  | 
 | ||
|  |                 if result.find('No such file or directory') == -1: | ||
|  |                     try: | ||
|  |                         WPSites.objects.get(path=webpath) | ||
|  |                     except: | ||
|  |                         wpobj = WPSites(owner=web, title=web.domain, path=webpath, FinalURL=web.domain, | ||
|  |                                         AutoUpdates="Enabled", PluginUpdates="Enabled", | ||
|  |                                         ThemeUpdates="Enabled", ) | ||
|  |                         wpobj.save() | ||
|  | 
 | ||
|  |             for chlid in childdomain: | ||
|  |                 childPath = chlid.path.rstrip('/') | ||
|  | 
 | ||
|  |                 command = "cat %s/wp-config.php" % childPath | ||
|  |                 result = ProcessUtilities.outputExecutioner(command, chlid.master.externalApp) | ||
|  | 
 | ||
|  |                 if os.path.exists(ProcessUtilities.debugPath): | ||
|  |                     logging.CyberCPLogFileWriter.writeToFile(result) | ||
|  | 
 | ||
|  |                 if result.find('No such file or directory') == -1: | ||
|  |                     fChildPath = f'{childPath}/' | ||
|  |                     try: | ||
|  |                         WPSites.objects.get(path=fChildPath) | ||
|  |                     except: | ||
|  | 
 | ||
|  |                         wpobj = WPSites(owner=chlid.master, title=chlid.domain, path=fChildPath, FinalURL=chlid.domain, | ||
|  |                                         AutoUpdates="Enabled", PluginUpdates="Enabled", | ||
|  |                                         ThemeUpdates="Enabled", ) | ||
|  |                         wpobj.save() | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'error_message': 'None', } | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def installwpcore(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             WPManagerID = data['WPid'] | ||
|  |             wpsite = WPSites.objects.get(pk=WPManagerID) | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(wpsite.owner.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadError() | ||
|  | 
 | ||
|  |             path = wpsite.path | ||
|  | 
 | ||
|  |             Webobj = Websites.objects.get(pk=wpsite.owner_id) | ||
|  | 
 | ||
|  |             Vhuser = Webobj.externalApp | ||
|  |             PHPVersion = Webobj.phpSelection | ||
|  | 
 | ||
|  |             php = ACLManager.getPHPString(PHPVersion) | ||
|  |             FinalPHPPath = '/usr/local/lsws/lsphp%s/bin/php' % (php) | ||
|  | 
 | ||
|  |             ###fetch WP version | ||
|  | 
 | ||
|  |             command = 'sudo -u %s %s -d error_reporting=0 /usr/bin/wp core version --skip-plugins --skip-themes --path=%s 2>/dev/null' % ( | ||
|  |                 Vhuser, FinalPHPPath, path) | ||
|  |             version = ProcessUtilities.outputExecutioner(command, None, True) | ||
|  |             version = version.rstrip("\n") | ||
|  | 
 | ||
|  |             ###install wp core | ||
|  |             command = f"sudo -u {Vhuser} {FinalPHPPath} -d error_reporting=0 /usr/bin/wp core download --force --skip-content --version={version} --path={path}" | ||
|  |             output = ProcessUtilities.outputExecutioner(command) | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'installStatus': 1, 'error_message': 'None', 'result': output} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'installStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def dataintegrity(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             WPManagerID = data['WPid'] | ||
|  |             wpsite = WPSites.objects.get(pk=WPManagerID) | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(wpsite.owner.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadError() | ||
|  | 
 | ||
|  |             path = wpsite.path | ||
|  | 
 | ||
|  |             Webobj = Websites.objects.get(pk=wpsite.owner_id) | ||
|  | 
 | ||
|  |             Vhuser = Webobj.externalApp | ||
|  |             PHPVersion = Webobj.phpSelection | ||
|  | 
 | ||
|  |             php = ACLManager.getPHPString(PHPVersion) | ||
|  |             FinalPHPPath = '/usr/local/lsws/lsphp%s/bin/php' % (php) | ||
|  | 
 | ||
|  |             ###fetch WP version | ||
|  | 
 | ||
|  |             command = 'sudo -u %s %s -d error_reporting=0 /usr/bin/wp core verify-checksums --skip-plugins --skip-themes --path=%s' % ( | ||
|  |                 Vhuser, FinalPHPPath, path) | ||
|  |             result = ProcessUtilities.outputExecutioner(command) | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'installStatus': 1, 'error_message': 'None', 'result': result} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'installStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def UpdatePlugins(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             WPManagerID = data['WPid'] | ||
|  |             plugin = data['plugin'] | ||
|  |             pluginarray = data['pluginarray'] | ||
|  |             wpsite = WPSites.objects.get(pk=WPManagerID) | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(wpsite.owner.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadError() | ||
|  | 
 | ||
|  |             path = wpsite.path | ||
|  | 
 | ||
|  |             Webobj = Websites.objects.get(pk=wpsite.owner_id) | ||
|  | 
 | ||
|  |             Vhuser = Webobj.externalApp | ||
|  |             PHPVersion = Webobj.phpSelection | ||
|  |             php = ACLManager.getPHPString(PHPVersion) | ||
|  |             FinalPHPPath = '/usr/local/lsws/lsphp%s/bin/php' % (php) | ||
|  | 
 | ||
|  |             extraArgs = {} | ||
|  |             extraArgs['adminID'] = admin.pk | ||
|  |             extraArgs['plugin'] = plugin | ||
|  |             extraArgs['pluginarray'] = pluginarray | ||
|  |             extraArgs['FinalPHPPath'] = FinalPHPPath | ||
|  |             extraArgs['path'] = path | ||
|  |             extraArgs['Vhuser'] = Vhuser | ||
|  | 
 | ||
|  |             background = ApplicationInstaller('UpdateWPPlugin', extraArgs) | ||
|  |             background.start() | ||
|  | 
 | ||
|  |             time.sleep(2) | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'error_message': 'None'} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'installStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def UpdateThemes(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             WPManagerID = data['WPid'] | ||
|  |             Theme = data['Theme'] | ||
|  |             Themearray = data['Themearray'] | ||
|  |             wpsite = WPSites.objects.get(pk=WPManagerID) | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(wpsite.owner.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadError() | ||
|  | 
 | ||
|  |             path = wpsite.path | ||
|  | 
 | ||
|  |             Webobj = Websites.objects.get(pk=wpsite.owner_id) | ||
|  | 
 | ||
|  |             Vhuser = Webobj.externalApp | ||
|  |             PHPVersion = Webobj.phpSelection | ||
|  |             php = ACLManager.getPHPString(PHPVersion) | ||
|  |             FinalPHPPath = '/usr/local/lsws/lsphp%s/bin/php' % (php) | ||
|  | 
 | ||
|  |             extraArgs = {} | ||
|  |             extraArgs['adminID'] = admin.pk | ||
|  |             extraArgs['Theme'] = Theme | ||
|  |             extraArgs['Themearray'] = Themearray | ||
|  |             extraArgs['FinalPHPPath'] = FinalPHPPath | ||
|  |             extraArgs['path'] = path | ||
|  |             extraArgs['Vhuser'] = Vhuser | ||
|  | 
 | ||
|  |             background = ApplicationInstaller('UpdateWPTheme', extraArgs) | ||
|  |             background.start() | ||
|  | 
 | ||
|  |             time.sleep(2) | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'error_message': 'None'} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'installStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def DeletePlugins(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             WPManagerID = data['WPid'] | ||
|  |             plugin = data['plugin'] | ||
|  |             pluginarray = data['pluginarray'] | ||
|  |             wpsite = WPSites.objects.get(pk=WPManagerID) | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(wpsite.owner.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadError() | ||
|  | 
 | ||
|  |             path = wpsite.path | ||
|  | 
 | ||
|  |             Webobj = Websites.objects.get(pk=wpsite.owner_id) | ||
|  | 
 | ||
|  |             Vhuser = Webobj.externalApp | ||
|  |             PHPVersion = Webobj.phpSelection | ||
|  |             php = ACLManager.getPHPString(PHPVersion) | ||
|  |             FinalPHPPath = '/usr/local/lsws/lsphp%s/bin/php' % (php) | ||
|  | 
 | ||
|  |             extraArgs = {} | ||
|  |             extraArgs['adminID'] = admin.pk | ||
|  |             extraArgs['plugin'] = plugin | ||
|  |             extraArgs['pluginarray'] = pluginarray | ||
|  |             extraArgs['FinalPHPPath'] = FinalPHPPath | ||
|  |             extraArgs['path'] = path | ||
|  |             extraArgs['Vhuser'] = Vhuser | ||
|  | 
 | ||
|  |             background = ApplicationInstaller('DeletePlugins', extraArgs) | ||
|  |             background.start() | ||
|  | 
 | ||
|  |             time.sleep(2) | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'error_message': 'None'} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'installStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def DeleteThemes(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             WPManagerID = data['WPid'] | ||
|  |             Theme = data['Theme'] | ||
|  |             Themearray = data['Themearray'] | ||
|  |             wpsite = WPSites.objects.get(pk=WPManagerID) | ||
|  |             path = wpsite.path | ||
|  | 
 | ||
|  |             Webobj = Websites.objects.get(pk=wpsite.owner_id) | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(wpsite.owner.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadError() | ||
|  | 
 | ||
|  |             Vhuser = Webobj.externalApp | ||
|  |             PHPVersion = Webobj.phpSelection | ||
|  |             php = ACLManager.getPHPString(PHPVersion) | ||
|  |             FinalPHPPath = '/usr/local/lsws/lsphp%s/bin/php' % (php) | ||
|  | 
 | ||
|  |             extraArgs = {} | ||
|  |             extraArgs['adminID'] = admin.pk | ||
|  |             extraArgs['Theme'] = Theme | ||
|  |             extraArgs['Themearray'] = Themearray | ||
|  |             extraArgs['FinalPHPPath'] = FinalPHPPath | ||
|  |             extraArgs['path'] = path | ||
|  |             extraArgs['Vhuser'] = Vhuser | ||
|  | 
 | ||
|  |             background = ApplicationInstaller('DeleteThemes', extraArgs) | ||
|  |             background.start() | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'error_message': 'None'} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'installStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def ChangeStatus(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             WPManagerID = data['WPid'] | ||
|  |             plugin = data['plugin'] | ||
|  |             wpsite = WPSites.objects.get(pk=WPManagerID) | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(wpsite.owner.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadError() | ||
|  | 
 | ||
|  |             path = wpsite.path | ||
|  | 
 | ||
|  |             Webobj = Websites.objects.get(pk=wpsite.owner_id) | ||
|  | 
 | ||
|  |             Vhuser = Webobj.externalApp | ||
|  |             PHPVersion = Webobj.phpSelection | ||
|  |             php = ACLManager.getPHPString(PHPVersion) | ||
|  |             FinalPHPPath = '/usr/local/lsws/lsphp%s/bin/php' % (php) | ||
|  | 
 | ||
|  |             command = 'sudo -u %s %s -d error_reporting=0 /usr/bin/wp plugin status %s --skip-plugins --skip-themes --path=%s' % ( | ||
|  |                 Vhuser, FinalPHPPath, plugin, path) | ||
|  |             stdoutput = ProcessUtilities.outputExecutioner(command) | ||
|  | 
 | ||
|  |             if stdoutput.find('Status: Active') > -1: | ||
|  |                 command = 'sudo -u %s %s -d error_reporting=0 /usr/bin/wp plugin deactivate %s --skip-plugins --skip-themes --path=%s' % ( | ||
|  |                     Vhuser, FinalPHPPath, plugin, path) | ||
|  |                 stdoutput = ProcessUtilities.outputExecutioner(command) | ||
|  |                 time.sleep(3) | ||
|  | 
 | ||
|  |             else: | ||
|  | 
 | ||
|  |                 command = 'sudo -u %s %s -d error_reporting=0 /usr/bin/wp plugin activate %s --skip-plugins --skip-themes --path=%s' % ( | ||
|  |                     Vhuser, FinalPHPPath, plugin, path) | ||
|  |                 stdoutput = ProcessUtilities.outputExecutioner(command) | ||
|  |                 time.sleep(3) | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'error_message': 'None'} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'installStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def ChangeStatusThemes(self, userID=None, data=None): | ||
|  |         try: | ||
|  |             # logging.CyberCPLogFileWriter.writeToFile("Error WP ChangeStatusThemes ....... %s") | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             WPManagerID = data['WPid'] | ||
|  |             Theme = data['theme'] | ||
|  |             wpsite = WPSites.objects.get(pk=WPManagerID) | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(wpsite.owner.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadError() | ||
|  | 
 | ||
|  |             path = wpsite.path | ||
|  | 
 | ||
|  |             Webobj = Websites.objects.get(pk=wpsite.owner_id) | ||
|  | 
 | ||
|  |             Vhuser = Webobj.externalApp | ||
|  |             PHPVersion = Webobj.phpSelection | ||
|  |             php = ACLManager.getPHPString(PHPVersion) | ||
|  |             FinalPHPPath = '/usr/local/lsws/lsphp%s/bin/php' % (php) | ||
|  | 
 | ||
|  |             extraArgs = {} | ||
|  |             extraArgs['adminID'] = admin.pk | ||
|  |             extraArgs['Theme'] = Theme | ||
|  |             extraArgs['FinalPHPPath'] = FinalPHPPath | ||
|  |             extraArgs['path'] = path | ||
|  |             extraArgs['Vhuser'] = Vhuser | ||
|  | 
 | ||
|  |             background = ApplicationInstaller('ChangeStatusThemes', extraArgs) | ||
|  |             background.start() | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'error_message': 'None'} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'installStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def CreateStagingNow(self, userID=None, data=None): | ||
|  |         try: | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             extraArgs = {} | ||
|  |             extraArgs['adminID'] = admin.pk | ||
|  |             extraArgs['StagingDomain'] = data['StagingDomain'] | ||
|  |             extraArgs['StagingName'] = data['StagingName'] | ||
|  |             extraArgs['WPid'] = data['WPid'] | ||
|  |             extraArgs['tempStatusPath'] = "/home/cyberpanel/" + str(randint(1000, 9999)) | ||
|  | 
 | ||
|  |             wpsite = WPSites.objects.get(pk=data['WPid']) | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(wpsite.owner.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadError() | ||
|  | 
 | ||
|  |             background = ApplicationInstaller('CreateStagingNow', extraArgs) | ||
|  |             background.start() | ||
|  | 
 | ||
|  |             time.sleep(2) | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'installStatus': 1, 'error_message': 'None', | ||
|  |                         'tempStatusPath': extraArgs['tempStatusPath']} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'installStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  |          | ||
|  |     def UpdateWPSettings(self, userID=None, data=None): | ||
|  |         # Map old setting names to new ones | ||
|  |         setting_map = { | ||
|  |             'PasswordProtection': 'password-protection', | ||
|  |             'searchIndex': 'search-indexing', | ||
|  |             'debugging': 'debugging', | ||
|  |             'maintenanceMode': 'maintenance-mode', | ||
|  |             'lscache': 'lscache', | ||
|  |             'Wpcron': 'wpcron', | ||
|  |             # Add more mappings as needed | ||
|  |         } | ||
|  | 
 | ||
|  |         siteId = data.get('siteId') or data.get('WPid') | ||
|  |         if not siteId: | ||
|  |             resp = {'status': 0, 'error_message': 'Missing siteId or WPid'} | ||
|  |             return JsonResponse(resp) | ||
|  | 
 | ||
|  |         # Accept both new and old setting names | ||
|  |         setting = data.get('setting') | ||
|  |         if not setting: | ||
|  |             for old_key in setting_map: | ||
|  |                 if old_key in data: | ||
|  |                     setting = old_key | ||
|  |                     data['settingValue'] = data[old_key] | ||
|  |                     break | ||
|  | 
 | ||
|  |         # Map to new setting name if needed | ||
|  |         setting = setting_map.get(setting, setting) | ||
|  |         value = data.get('value') or data.get('settingValue') | ||
|  | 
 | ||
|  |         try: | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  |             wpsite = WPSites.objects.get(pk=siteId) | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(wpsite.owner.domain, admin, currentACL) != 1: | ||
|  |                 return ACLManager.loadError() | ||
|  | 
 | ||
|  |             # Get PHP version and path | ||
|  |             Webobj = Websites.objects.get(pk=wpsite.owner_id) | ||
|  |             Vhuser = Webobj.externalApp | ||
|  |             PHPVersion = Webobj.phpSelection | ||
|  |             php = ACLManager.getPHPString(PHPVersion) | ||
|  |             FinalPHPPath = '/usr/local/lsws/lsphp%s/bin/php' % (php) | ||
|  | 
 | ||
|  |             # Update the appropriate setting based on the setting type | ||
|  |             if setting == 'search-indexing': | ||
|  |                 command = f'sudo -u {Vhuser} {FinalPHPPath} -d error_reporting=0 /usr/bin/wp option update blog_public {value} --skip-plugins --skip-themes --path={wpsite.path}' | ||
|  |             elif setting == 'debugging': | ||
|  |                 if value: | ||
|  |                     command = f'sudo -u {Vhuser} {FinalPHPPath} -d error_reporting=0 /usr/bin/wp config set WP_DEBUG true --raw --skip-plugins --skip-themes --path={wpsite.path}' | ||
|  |                 else: | ||
|  |                     command = f'sudo -u {Vhuser} {FinalPHPPath} -d error_reporting=0 /usr/bin/wp config set WP_DEBUG false --raw --skip-plugins --skip-themes --path={wpsite.path}' | ||
|  |             elif setting == 'password-protection': | ||
|  |                 vhostName = wpsite.owner.domain | ||
|  |                 vhostPassDir = f'/home/{vhostName}' | ||
|  |                 path = f'{vhostPassDir}/{siteId}' | ||
|  |                 if value: | ||
|  |                     tempPath = f'/home/cyberpanel/{str(randint(1000, 9999))}' | ||
|  |                     os.makedirs(tempPath) | ||
|  |                     htpasswd = f'{tempPath}/.htpasswd' | ||
|  |                     htaccess = f'{tempPath}/.htaccess' | ||
|  |                     password = randomPassword.generate_pass(12) | ||
|  |                     command = f"htpasswd -cb {htpasswd} admin {password}" | ||
|  |                     ProcessUtilities.executioner(command) | ||
|  |                     htaccess_content = f"""
 | ||
|  | AuthType Basic | ||
|  | AuthName "Restricted Access" | ||
|  | AuthUserFile {path}/.htpasswd | ||
|  | Require valid-user | ||
|  | """
 | ||
|  |                     with open(htaccess, 'w') as f: | ||
|  |                         f.write(htaccess_content) | ||
|  |                     command = f"mkdir -p {path}" | ||
|  |                     ProcessUtilities.executioner(command, wpsite.owner.externalApp) | ||
|  |                     command = f"mv {htpasswd} {path}/.htpasswd" | ||
|  |                     ProcessUtilities.executioner(command, wpsite.owner.externalApp) | ||
|  |                     command = f"mv {htaccess} {wpsite.path}/.htaccess" | ||
|  |                     ProcessUtilities.executioner(command, wpsite.owner.externalApp) | ||
|  |                     command = f"rm -rf {tempPath}" | ||
|  |                     ProcessUtilities.executioner(command) | ||
|  |                 else: | ||
|  |                     if os.path.exists(path): | ||
|  |                         command = f"rm -rf {path}" | ||
|  |                         ProcessUtilities.executioner(command, wpsite.owner.externalApp) | ||
|  |                     htaccess = f'{wpsite.path}/.htaccess' | ||
|  |                     if os.path.exists(htaccess): | ||
|  |                         command = f"rm -f {htaccess}" | ||
|  |                         ProcessUtilities.executioner(command, wpsite.owner.externalApp) | ||
|  |                     resp = {'status': 1, 'error_message': 'None'} | ||
|  |                     if data.get('legacy_response'): | ||
|  |                         import json | ||
|  |                         return HttpResponse(json.dumps(resp)) | ||
|  |                     else: | ||
|  |                         return JsonResponse(resp) | ||
|  |             elif setting == 'maintenance-mode': | ||
|  |                 if value: | ||
|  |                     command = f'sudo -u {Vhuser} {FinalPHPPath} -d error_reporting=0 /usr/bin/wp maintenance-mode activate --skip-plugins --skip-themes --path={wpsite.path}' | ||
|  |                 else: | ||
|  |                     command = f'sudo -u {Vhuser} {FinalPHPPath} -d error_reporting=0 /usr/bin/wp maintenance-mode deactivate --skip-plugins --skip-themes --path={wpsite.path}' | ||
|  |             elif setting == 'lscache': | ||
|  |                 if value: | ||
|  |                     command = f'sudo -u {Vhuser} {FinalPHPPath} -d error_reporting=0 /usr/bin/wp plugin activate litespeed-cache --skip-plugins --skip-themes --path={wpsite.path}' | ||
|  |                 else: | ||
|  |                     command = f'sudo -u {Vhuser} {FinalPHPPath} -d error_reporting=0 /usr/bin/wp plugin deactivate litespeed-cache --skip-plugins --skip-themes --path={wpsite.path}' | ||
|  |             else: | ||
|  |                 resp = {'status': 0, 'error_message': 'Invalid setting type'} | ||
|  |                 if data.get('legacy_response'): | ||
|  |                     import json | ||
|  |                     return HttpResponse(json.dumps(resp)) | ||
|  |                 else: | ||
|  |                     return JsonResponse(resp) | ||
|  | 
 | ||
|  |             result = ProcessUtilities.outputExecutioner(command) | ||
|  |             if result.find('Error:') > -1: | ||
|  |                 resp = {'status': 0, 'error_message': result} | ||
|  |                 if data.get('legacy_response'): | ||
|  |                     import json | ||
|  |                     return HttpResponse(json.dumps(resp)) | ||
|  |                 else: | ||
|  |                     return JsonResponse(resp) | ||
|  | 
 | ||
|  |             resp = {'status': 1, 'error_message': 'None'} | ||
|  |             if data.get('legacy_response'): | ||
|  |                 import json | ||
|  |                 return HttpResponse(json.dumps(resp)) | ||
|  |             else: | ||
|  |                 return JsonResponse(resp) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             resp = {'status': 0, 'error_message': str(msg)} | ||
|  |             if data and data.get('legacy_response'): | ||
|  |                 import json | ||
|  |                 return HttpResponse(json.dumps(resp)) | ||
|  |             else: | ||
|  |                 return JsonResponse(resp) | ||
|  | 
 | ||
|  |     def submitWorpressCreation(self, userID=None, data=None): | ||
|  |         try: | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             extraArgs = {} | ||
|  |             extraArgs['currentACL'] = currentACL | ||
|  |             extraArgs['adminID'] = admin.pk | ||
|  |             extraArgs['domainName'] = data['domain'] | ||
|  |             extraArgs['WPVersion'] = data['WPVersion'] | ||
|  |             extraArgs['blogTitle'] = data['title'] | ||
|  |             try: | ||
|  |                 extraArgs['pluginbucket'] = data['pluginbucket'] | ||
|  |             except: | ||
|  |                 extraArgs['pluginbucket'] = '-1' | ||
|  |             extraArgs['adminUser'] = data['adminUser'] | ||
|  |             extraArgs['PasswordByPass'] = data['PasswordByPass'] | ||
|  |             extraArgs['adminPassword'] = data['PasswordByPass'] | ||
|  |             extraArgs['adminEmail'] = data['Email'] | ||
|  |             extraArgs['updates'] = data['AutomaticUpdates'] | ||
|  |             extraArgs['Plugins'] = data['Plugins'] | ||
|  |             extraArgs['Themes'] = data['Themes'] | ||
|  |             extraArgs['websiteOwner'] = data['websiteOwner'] | ||
|  |             extraArgs['package'] = data['package'] | ||
|  |             extraArgs['home'] = data['home'] | ||
|  |             extraArgs['apacheBackend'] = data['apacheBackend'] | ||
|  |             try: | ||
|  |                 extraArgs['path'] = data['path'] | ||
|  |                 if extraArgs['path'] == '': | ||
|  |                     extraArgs['home'] = '1' | ||
|  |             except: | ||
|  |                 pass | ||
|  |             extraArgs['tempStatusPath'] = "/home/cyberpanel/" + str(randint(1000, 9999)) | ||
|  | 
 | ||
|  |             background = ApplicationInstaller('wordpressInstallNew', extraArgs) | ||
|  |             background.start() | ||
|  | 
 | ||
|  |             time.sleep(2) | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'installStatus': 1, 'error_message': 'None', | ||
|  |                         'tempStatusPath': extraArgs['tempStatusPath']} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'installStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def submitWebsiteCreation(self, userID=None, data=None): | ||
|  |         try: | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  | 
 | ||
|  |             domain = data['domainName'] | ||
|  |             adminEmail = data['adminEmail'] | ||
|  |             phpSelection = data['phpSelection'] | ||
|  |             packageName = data['package'] | ||
|  |             websiteOwner = data['websiteOwner'].lower() | ||
|  | 
 | ||
|  |             if data['domainName'].find("cyberpanel.website") > -1: | ||
|  |                 url = "https://platform.cyberpersons.com/CyberpanelAdOns/CreateDomain" | ||
|  | 
 | ||
|  |                 domain_data = { | ||
|  |                     "name": "test-domain", | ||
|  |                     "IP": ACLManager.GetServerIP(), | ||
|  |                     "domain": data['domainName'] | ||
|  |                 } | ||
|  | 
 | ||
|  |                 import requests | ||
|  |                 response = requests.post(url, data=json.dumps(domain_data)) | ||
|  |                 domain_status = response.json()['status'] | ||
|  | 
 | ||
|  |                 if domain_status == 0: | ||
|  |                     data_ret = {'status': 0, 'installStatus': 0, 'error_message': response.json()['error_message']} | ||
|  |                     json_data = json.dumps(data_ret) | ||
|  |                     return HttpResponse(json_data) | ||
|  | 
 | ||
|  |             loggedUser = Administrator.objects.get(pk=userID) | ||
|  |             newOwner = Administrator.objects.get(userName=websiteOwner) | ||
|  | 
 | ||
|  |             if ACLManager.currentContextPermission(currentACL, 'createWebsite') == 0: | ||
|  |                 return ACLManager.loadErrorJson('createWebSiteStatus', 0) | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnerProtection(currentACL, loggedUser, newOwner) == 0: | ||
|  |                 return ACLManager.loadErrorJson('createWebSiteStatus', 0) | ||
|  | 
 | ||
|  |             if currentACL['admin'] == 0: | ||
|  |                 if ACLManager.CheckDomainBlackList(domain) == 0: | ||
|  |                     data_ret = {'status': 0, 'createWebSiteStatus': 0, 'error_message': "Blacklisted domain."} | ||
|  |                     json_data = json.dumps(data_ret) | ||
|  |                     return HttpResponse(json_data) | ||
|  | 
 | ||
|  |             if not validators.domain(domain): | ||
|  |                 data_ret = {'status': 0, 'createWebSiteStatus': 0, 'error_message': "Invalid domain."} | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  | 
 | ||
|  |             if not validators.email(adminEmail) or adminEmail.find('--') > -1: | ||
|  |                 data_ret = {'status': 0, 'createWebSiteStatus': 0, 'error_message': "Invalid email."} | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  | 
 | ||
|  |             try: | ||
|  |                 HA = data['HA'] | ||
|  |                 externalApp = 'nobody' | ||
|  |             except: | ||
|  |                 externalApp = "".join(re.findall("[a-zA-Z]+", domain))[:5] + str(randint(1000, 9999)) | ||
|  | 
 | ||
|  |             try: | ||
|  |                 counter = 0 | ||
|  |                 while 1: | ||
|  |                     tWeb = Websites.objects.get(externalApp=externalApp) | ||
|  |                     externalApp = '%s%s' % (tWeb.externalApp, str(counter)) | ||
|  |                     counter = counter + 1 | ||
|  |             except: | ||
|  |                 pass | ||
|  | 
 | ||
|  |             tempStatusPath = "/home/cyberpanel/" + str(randint(1000, 9999)) | ||
|  | 
 | ||
|  |             try: | ||
|  |                 apacheBackend = str(data['apacheBackend']) | ||
|  |             except: | ||
|  |                 apacheBackend = "0" | ||
|  | 
 | ||
|  |             try: | ||
|  |                 mailDomain = str(data['mailDomain']) | ||
|  |             except: | ||
|  |                 mailDomain = "1" | ||
|  | 
 | ||
|  |             import pwd | ||
|  |             counter = 0 | ||
|  | 
 | ||
|  |             ## Create Configurations | ||
|  | 
 | ||
|  |             execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" | ||
|  |             execPath = execPath + " createVirtualHost --virtualHostName " + domain + \ | ||
|  |                        " --administratorEmail " + adminEmail + " --phpVersion '" + phpSelection + \ | ||
|  |                        "' --virtualHostUser " + externalApp + " --ssl " + str(1) + " --dkimCheck " \ | ||
|  |                        + str(1) + " --openBasedir " + str(data['openBasedir']) + \ | ||
|  |                        ' --websiteOwner "' + websiteOwner + '" --package "' + packageName + '" --tempStatusPath ' + tempStatusPath + " --apache " + apacheBackend + " --mailDomain %s" % ( | ||
|  |                            mailDomain) | ||
|  | 
 | ||
|  |             ProcessUtilities.popenExecutioner(execPath) | ||
|  |             time.sleep(2) | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'createWebSiteStatus': 1, 'error_message': "None", | ||
|  |                         'tempStatusPath': tempStatusPath, 'LinuxUser': externalApp} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'createWebSiteStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def submitDomainCreation(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             try: | ||
|  |                 alias = data['alias'] | ||
|  |             except: | ||
|  |                 alias = 0 | ||
|  | 
 | ||
|  |             masterDomain = data['masterDomain'] | ||
|  |             domain = data['domainName'] | ||
|  | 
 | ||
|  | 
 | ||
|  |             if alias == 0: | ||
|  |                 phpSelection = data['phpSelection'] | ||
|  |                 path = data['path'] | ||
|  |             else: | ||
|  | 
 | ||
|  |                 ### if master website have apache then create this sub-domain also as ols + apache | ||
|  | 
 | ||
|  |                 apachePath = ApacheVhost.configBasePath + masterDomain + '.conf' | ||
|  | 
 | ||
|  |                 if os.path.exists(apachePath): | ||
|  |                     data['apacheBackend'] = 1 | ||
|  | 
 | ||
|  |                 phpSelection = Websites.objects.get(domain=masterDomain).phpSelection | ||
|  | 
 | ||
|  |             tempStatusPath = "/home/cyberpanel/" + str(randint(1000, 9999)) | ||
|  | 
 | ||
|  |             if not validators.domain(domain): | ||
|  |                 data_ret = {'status': 0, 'createWebSiteStatus': 0, 'error_message': "Invalid domain."} | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  | 
 | ||
|  |             if data['domainName'].find("cyberpanel.website") > -1: | ||
|  |                 url = "https://platform.cyberpersons.com/CyberpanelAdOns/CreateDomain" | ||
|  | 
 | ||
|  |                 domain_data = { | ||
|  |                     "name": "test-domain", | ||
|  |                     "IP": ACLManager.GetServerIP(), | ||
|  |                     "domain": data['domainName'] | ||
|  |                 } | ||
|  | 
 | ||
|  |                 import requests | ||
|  |                 response = requests.post(url, data=json.dumps(domain_data)) | ||
|  |                 domain_status = response.json()['status'] | ||
|  | 
 | ||
|  |                 if domain_status == 0: | ||
|  |                     data_ret = {'status': 0, 'installStatus': 0, 'error_message': response.json()['error_message']} | ||
|  |                     json_data = json.dumps(data_ret) | ||
|  |                     return HttpResponse(json_data) | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(masterDomain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('createWebSiteStatus', 0) | ||
|  | 
 | ||
|  |             if data['path'].find('..') > -1: | ||
|  |                 return ACLManager.loadErrorJson('createWebSiteStatus', 0) | ||
|  | 
 | ||
|  |             if currentACL['admin'] != 1: | ||
|  |                 data['openBasedir'] = 1 | ||
|  | 
 | ||
|  |             if alias == 0: | ||
|  | 
 | ||
|  |                 if len(path) > 0: | ||
|  |                     path = path.lstrip("/") | ||
|  |                     path = "/home/" + masterDomain + "/" + path | ||
|  |                 else: | ||
|  |                     path = "/home/" + masterDomain + "/" + domain | ||
|  |             else: | ||
|  |                 path = f'/home/{masterDomain}/public_html' | ||
|  | 
 | ||
|  |             try: | ||
|  |                 apacheBackend = str(data['apacheBackend']) | ||
|  |             except: | ||
|  |                 apacheBackend = "0" | ||
|  | 
 | ||
|  |             execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" | ||
|  | 
 | ||
|  |             execPath = execPath + " createDomain --masterDomain " + masterDomain + " --virtualHostName " + domain + \ | ||
|  |                        " --phpVersion '" + phpSelection + "' --ssl " + str(1) + " --dkimCheck " + str(1) \ | ||
|  |                        + " --openBasedir " + str(data['openBasedir']) + ' --path ' + path + ' --websiteOwner ' \ | ||
|  |                        + admin.userName + ' --tempStatusPath ' + tempStatusPath + " --apache " + apacheBackend + f' --aliasDomain {str(alias)}' | ||
|  | 
 | ||
|  |             ProcessUtilities.popenExecutioner(execPath) | ||
|  |             time.sleep(2) | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'createWebSiteStatus': 1, 'error_message': "None", | ||
|  |                         'tempStatusPath': tempStatusPath} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'createWebSiteStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def fetchDomains(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  |             masterDomain = data['masterDomain'] | ||
|  | 
 | ||
|  |             try: | ||
|  |                 alias = data['alias'] | ||
|  |             except: | ||
|  |                 alias = 0 | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(masterDomain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('fetchStatus', 0) | ||
|  | 
 | ||
|  |             cdManager = ChildDomainManager(masterDomain) | ||
|  |             json_data = cdManager.findChildDomainsJson(alias) | ||
|  | 
 | ||
|  |             final_json = json.dumps({'status': 1, 'fetchStatus': 1, 'error_message': "None", "data": json_data}) | ||
|  |             return HttpResponse(final_json) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             final_dic = {'status': 0, 'fetchStatus': 0, 'error_message': str(msg)} | ||
|  |             final_json = json.dumps(final_dic) | ||
|  |             return HttpResponse(final_json) | ||
|  | 
 | ||
|  |     def searchWebsites(self, userID=None, data=None): | ||
|  |         try: | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             try: | ||
|  |                 json_data = self.searchWebsitesJson(currentACL, userID, data['patternAdded']) | ||
|  |             except BaseException as msg: | ||
|  |                 tempData = {} | ||
|  |                 tempData['page'] = 1 | ||
|  |                 return self.getFurtherAccounts(userID, tempData) | ||
|  | 
 | ||
|  |             pagination = self.websitePagination(currentACL, userID) | ||
|  |             final_dic = {'status': 1, 'listWebSiteStatus': 1, 'error_message': "None", "data": json_data, | ||
|  |                          'pagination': pagination} | ||
|  |             final_json = json.dumps(final_dic) | ||
|  |             return HttpResponse(final_json) | ||
|  |         except BaseException as msg: | ||
|  |             dic = {'status': 1, 'listWebSiteStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(dic) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def searchChilds(self, userID=None, data=None): | ||
|  |         try: | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  | 
 | ||
|  |             websites = ACLManager.findWebsiteObjects(currentACL, userID) | ||
|  |             childDomains = [] | ||
|  | 
 | ||
|  |             for web in websites: | ||
|  |                 for child in web.childdomains_set.filter(domain__istartswith=data['patternAdded']): | ||
|  |                     childDomains.append(child) | ||
|  | 
 | ||
|  |             json_data = self.findChildsListJson(childDomains) | ||
|  | 
 | ||
|  |             final_dic = {'status': 1, 'listWebSiteStatus': 1, 'error_message': "None", "data": json_data} | ||
|  |             final_json = json.dumps(final_dic) | ||
|  |             return HttpResponse(final_json) | ||
|  |         except BaseException as msg: | ||
|  |             dic = {'status': 1, 'listWebSiteStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(dic) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def getFurtherAccounts(self, userID=None, data=None): | ||
|  |         try: | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             pageNumber = int(data['page']) | ||
|  |             json_data = self.findWebsitesJson(currentACL, userID, pageNumber) | ||
|  |             pagination = self.websitePagination(currentACL, userID) | ||
|  |             final_dic = {'status': 1, 'listWebSiteStatus': 1, 'error_message': "None", "data": json_data, | ||
|  |                          'pagination': pagination} | ||
|  |             final_json = json.dumps(final_dic) | ||
|  |             return HttpResponse(final_json) | ||
|  |         except BaseException as msg: | ||
|  |             dic = {'status': 1, 'listWebSiteStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(dic) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def fetchWebsitesList(self, userID=None, data=None): | ||
|  |         try: | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             pageNumber = int(data['page']) | ||
|  |             recordsToShow = int(data['recordsToShow']) | ||
|  | 
 | ||
|  |             if os.path.exists(ProcessUtilities.debugPath): | ||
|  |                 logging.CyberCPLogFileWriter.writeToFile(f'Fetch sites step 1..') | ||
|  | 
 | ||
|  |             endPageNumber, finalPageNumber = self.recordsPointer(pageNumber, recordsToShow) | ||
|  | 
 | ||
|  |             if os.path.exists(ProcessUtilities.debugPath): | ||
|  |                 logging.CyberCPLogFileWriter.writeToFile(f'Fetch sites step 2..') | ||
|  | 
 | ||
|  |             websites = ACLManager.findWebsiteObjects(currentACL, userID) | ||
|  | 
 | ||
|  |             if os.path.exists(ProcessUtilities.debugPath): | ||
|  |                 logging.CyberCPLogFileWriter.writeToFile(f'Fetch sites step 3..') | ||
|  | 
 | ||
|  |             pagination = self.getPagination(len(websites), recordsToShow) | ||
|  | 
 | ||
|  |             if os.path.exists(ProcessUtilities.debugPath): | ||
|  |                 logging.CyberCPLogFileWriter.writeToFile(f'Fetch sites step 4..') | ||
|  | 
 | ||
|  |             json_data = self.findWebsitesListJson(websites[finalPageNumber:endPageNumber]) | ||
|  | 
 | ||
|  |             if os.path.exists(ProcessUtilities.debugPath): | ||
|  |                 logging.CyberCPLogFileWriter.writeToFile(f'Fetch sites step 5..') | ||
|  | 
 | ||
|  |             final_dic = {'status': 1, 'listWebSiteStatus': 1, 'error_message': "None", "data": json_data, | ||
|  |                          'pagination': pagination} | ||
|  |             final_json = json.dumps(final_dic) | ||
|  |             return HttpResponse(final_json) | ||
|  |         except BaseException as msg: | ||
|  |             dic = {'status': 1, 'listWebSiteStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(dic) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def fetchChildDomainsMain(self, userID=None, data=None): | ||
|  |         try: | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             pageNumber = int(data['page']) | ||
|  |             recordsToShow = int(data['recordsToShow']) | ||
|  | 
 | ||
|  |             endPageNumber, finalPageNumber = self.recordsPointer(pageNumber, recordsToShow) | ||
|  |             websites = ACLManager.findWebsiteObjects(currentACL, userID) | ||
|  |             childDomains = [] | ||
|  | 
 | ||
|  |             for web in websites: | ||
|  |                 for child in web.childdomains_set.filter(alais=0): | ||
|  |                     if child.domain == f'mail.{web.domain}': | ||
|  |                         pass | ||
|  |                     else: | ||
|  |                         childDomains.append(child) | ||
|  | 
 | ||
|  |             pagination = self.getPagination(len(childDomains), recordsToShow) | ||
|  |             json_data = self.findChildsListJson(childDomains[finalPageNumber:endPageNumber]) | ||
|  | 
 | ||
|  |             final_dic = {'status': 1, 'listWebSiteStatus': 1, 'error_message': "None", "data": json_data, | ||
|  |                          'pagination': pagination} | ||
|  |             final_json = json.dumps(final_dic) | ||
|  |             return HttpResponse(final_json) | ||
|  |         except BaseException as msg: | ||
|  |             dic = {'status': 1, 'listWebSiteStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(dic) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def findWebsitesListJson(self, websites): | ||
|  |         try: | ||
|  |             ipFile = "/etc/cyberpanel/machineIP" | ||
|  |             f = open(ipFile) | ||
|  |             ipData = f.read() | ||
|  |             ipAddress = ipData.split('\n', 1)[0] | ||
|  |         except BaseException as msg: | ||
|  |             logging.CyberCPLogFileWriter.writeToFile("Failed to read machine IP, error:" + str(msg)) | ||
|  |             ipAddress = "192.168.100.1" | ||
|  | 
 | ||
|  |         json_data = [] | ||
|  | 
 | ||
|  |         for website in websites: | ||
|  |             wp_sites = [] | ||
|  |             try: | ||
|  |                 wp_sites = WPSites.objects.filter(owner=website) | ||
|  |                 wp_sites = [{ | ||
|  |                     'id': wp.id, | ||
|  |                     'title': wp.title, | ||
|  |                     'url': wp.FinalURL, | ||
|  |                     'version': wp.version if hasattr(wp, 'version') else 'Unknown', | ||
|  |                     'phpVersion': wp.phpVersion if hasattr(wp, 'phpVersion') else 'Unknown' | ||
|  |                 } for wp in wp_sites] | ||
|  |             except: | ||
|  |                 pass | ||
|  | 
 | ||
|  |             # Calculate disk usage | ||
|  |             DiskUsage, DiskUsagePercentage, bwInMB, bwUsage = virtualHostUtilities.FindStats(website) | ||
|  |             diskUsed = "%sMB" % str(DiskUsage) | ||
|  | 
 | ||
|  |             # Convert numeric state to text | ||
|  |             state = "Active" if website.state == 1 else "Suspended" | ||
|  | 
 | ||
|  |             json_data.append({ | ||
|  |                 'domain': website.domain, | ||
|  |                 'adminEmail': website.adminEmail, | ||
|  |                 'phpVersion': website.phpSelection, | ||
|  |                 'state': state, | ||
|  |                 'ipAddress': ipAddress, | ||
|  |                 'package': website.package.packageName, | ||
|  |                 'admin': website.admin.userName, | ||
|  |                 'wp_sites': wp_sites, | ||
|  |                 'diskUsed': diskUsed | ||
|  |             }) | ||
|  |         return json.dumps(json_data) | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  |     def findDockersitesListJson(self, Dockersite): | ||
|  | 
 | ||
|  |         json_data = "[" | ||
|  |         checker = 0 | ||
|  | 
 | ||
|  |         try: | ||
|  |             ipFile = "/etc/cyberpanel/machineIP" | ||
|  |             f = open(ipFile) | ||
|  |             ipData = f.read() | ||
|  |             ipAddress = ipData.split('\n', 1)[0] | ||
|  |         except BaseException as msg: | ||
|  |             logging.CyberCPLogFileWriter.writeToFile("Failed to read machine IP, error:" + str(msg)) | ||
|  |             ipAddress = "192.168.100.1" | ||
|  | 
 | ||
|  |         from plogical.phpUtilities import phpUtilities | ||
|  |         for items in Dockersite: | ||
|  |             website = Websites.objects.get(pk=items.admin.pk) | ||
|  |             vhFile = f'/usr/local/lsws/conf/vhosts/{website.domain}/vhost.conf' | ||
|  | 
 | ||
|  |             try: | ||
|  |                 PHPVersionActual = phpUtilities.WrapGetPHPVersionFromFileToGetVersionWithPHP(website) | ||
|  |             except: | ||
|  |                 PHPVersionActual = 'PHP 8.1' | ||
|  | 
 | ||
|  | 
 | ||
|  |             if items.state == 0: | ||
|  |                 state = "Suspended" | ||
|  |             else: | ||
|  |                 state = "Active" | ||
|  | 
 | ||
|  |             dpkg = PackageAssignment.objects.get(user=website.admin) | ||
|  | 
 | ||
|  | 
 | ||
|  |             dic = {'id':items.pk, 'domain': website.domain,  'adminEmail': website.adminEmail, 'ipAddress': ipAddress, | ||
|  |                    'admin': website.admin.userName, 'package': dpkg.package.Name, 'state': state, | ||
|  |                    'CPU': int(items.CPUsMySQL)+int(items.CPUsSite), 'Ram': int(items.MemorySite)+int(items.MemoryMySQL),  'phpVersion': PHPVersionActual } | ||
|  | 
 | ||
|  |             if checker == 0: | ||
|  |                 json_data = json_data + json.dumps(dic) | ||
|  |                 checker = 1 | ||
|  |             else: | ||
|  |                 json_data = json_data + ',' + json.dumps(dic) | ||
|  | 
 | ||
|  |         json_data = json_data + ']' | ||
|  | 
 | ||
|  |         return json_data | ||
|  | 
 | ||
|  |     def findChildsListJson(self, childs): | ||
|  | 
 | ||
|  |         json_data = "[" | ||
|  |         checker = 0 | ||
|  | 
 | ||
|  |         try: | ||
|  |             ipFile = "/etc/cyberpanel/machineIP" | ||
|  |             f = open(ipFile) | ||
|  |             ipData = f.read() | ||
|  |             ipAddress = ipData.split('\n', 1)[0] | ||
|  |         except BaseException as msg: | ||
|  |             logging.CyberCPLogFileWriter.writeToFile("Failed to read machine IP, error:" + str(msg)) | ||
|  |             ipAddress = "192.168.100.1" | ||
|  | 
 | ||
|  |         for items in childs: | ||
|  | 
 | ||
|  |             dic = {'domain': items.domain, 'masterDomain': items.master.domain, 'adminEmail': items.master.adminEmail, | ||
|  |                    'ipAddress': ipAddress, | ||
|  |                    'admin': items.master.admin.userName, 'package': items.master.package.packageName, | ||
|  |                    'path': items.path} | ||
|  | 
 | ||
|  |             if checker == 0: | ||
|  |                 json_data = json_data + json.dumps(dic) | ||
|  |                 checker = 1 | ||
|  |             else: | ||
|  |                 json_data = json_data + ',' + json.dumps(dic) | ||
|  | 
 | ||
|  |         json_data = json_data + ']' | ||
|  | 
 | ||
|  |         return json_data | ||
|  | 
 | ||
|  |     def recordsPointer(self, page, toShow): | ||
|  |         finalPageNumber = ((page * toShow)) - toShow | ||
|  |         endPageNumber = finalPageNumber + toShow | ||
|  |         return endPageNumber, finalPageNumber | ||
|  | 
 | ||
|  |     def getPagination(self, records, toShow): | ||
|  |         pages = float(records) / float(toShow) | ||
|  | 
 | ||
|  |         pagination = [] | ||
|  |         counter = 1 | ||
|  | 
 | ||
|  |         if pages <= 1.0: | ||
|  |             pages = 1 | ||
|  |             pagination.append(counter) | ||
|  |         else: | ||
|  |             pages = ceil(pages) | ||
|  |             finalPages = int(pages) + 1 | ||
|  | 
 | ||
|  |             for i in range(1, finalPages): | ||
|  |                 pagination.append(counter) | ||
|  |                 counter = counter + 1 | ||
|  | 
 | ||
|  |         return pagination | ||
|  | 
 | ||
|  |     def submitWebsiteDeletion(self, userID=None, data=None): | ||
|  |         try: | ||
|  |             if data['websiteName'].find("cyberpanel.website") > -1: | ||
|  |                 url = "https://platform.cyberpersons.com/CyberpanelAdOns/DeleteDomain" | ||
|  | 
 | ||
|  |                 domain_data = { | ||
|  |                     "name": "test-domain", | ||
|  |                     "IP": ACLManager.GetServerIP(), | ||
|  |                     "domain": data['websiteName'] | ||
|  |                 } | ||
|  | 
 | ||
|  |                 import requests | ||
|  |                 response = requests.post(url, data=json.dumps(domain_data)) | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             if ACLManager.currentContextPermission(currentACL, 'deleteWebsite') == 0: | ||
|  |                 return ACLManager.loadErrorJson('websiteDeleteStatus', 0) | ||
|  | 
 | ||
|  |             websiteName = data['websiteName'] | ||
|  | 
 | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  |             if ACLManager.checkOwnership(websiteName, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('websiteDeleteStatus', 0) | ||
|  | 
 | ||
|  |             ## Deleting master domain | ||
|  | 
 | ||
|  |             execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" | ||
|  |             execPath = execPath + " deleteVirtualHostConfigurations --virtualHostName " + websiteName | ||
|  |             ProcessUtilities.popenExecutioner(execPath) | ||
|  | 
 | ||
|  |             ### delete site from dgdrive backups | ||
|  | 
 | ||
|  |             try: | ||
|  | 
 | ||
|  |                 from websiteFunctions.models import GDriveSites | ||
|  |                 GDriveSites.objects.filter(domain=websiteName).delete() | ||
|  |             except: | ||
|  |                 pass | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'websiteDeleteStatus': 1, 'error_message': "None"} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'websiteDeleteStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def submitDomainDeletion(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             if data['websiteName'].find("cyberpanel.website") > -1: | ||
|  |                 url = "https://platform.cyberpersons.com/CyberpanelAdOns/DeleteDomain" | ||
|  | 
 | ||
|  |                 domain_data = { | ||
|  |                     "name": "test-domain", | ||
|  |                     "IP": ACLManager.GetServerIP(), | ||
|  |                     "domain": data['websiteName'] | ||
|  |                 } | ||
|  | 
 | ||
|  |                 import requests | ||
|  |                 response = requests.post(url, data=json.dumps(domain_data)) | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  |             websiteName = data['websiteName'] | ||
|  | 
 | ||
|  |             try: | ||
|  |                 DeleteDocRoot = int(data['DeleteDocRoot']) | ||
|  |             except: | ||
|  |                 DeleteDocRoot = 0 | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(websiteName, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('websiteDeleteStatus', 0) | ||
|  | 
 | ||
|  |             execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" | ||
|  |             execPath = execPath + " deleteDomain --virtualHostName " + websiteName + ' --DeleteDocRoot %s' % ( | ||
|  |                 str(DeleteDocRoot)) | ||
|  |             ProcessUtilities.outputExecutioner(execPath) | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'websiteDeleteStatus': 1, 'error_message': "None"} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'websiteDeleteStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def submitWebsiteStatus(self, userID=None, data=None): | ||
|  |         try: | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             if ACLManager.currentContextPermission(currentACL, 'suspendWebsite') == 0: | ||
|  |                 return ACLManager.loadErrorJson('websiteStatus', 0) | ||
|  | 
 | ||
|  |             websiteName = data['websiteName'] | ||
|  |             state = data['state'] | ||
|  | 
 | ||
|  |             website = Websites.objects.get(domain=websiteName) | ||
|  | 
 | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  |             if ACLManager.checkOwnership(websiteName, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('websiteStatus', 0) | ||
|  | 
 | ||
|  |             if state == "Suspend": | ||
|  |                 confPath = virtualHostUtilities.Server_root + "/conf/vhosts/" + websiteName | ||
|  |                 vhostConfPath = confPath + "/vhost.conf" | ||
|  |                  | ||
|  |                 # Ensure suspension page exists and has proper permissions | ||
|  |                 suspensionPagePath = "/usr/local/CyberCP/websiteFunctions/suspension.html" | ||
|  |                 if not os.path.exists(suspensionPagePath): | ||
|  |                     # Create default suspension page if it doesn't exist | ||
|  |                     defaultSuspensionHTML = """<!DOCTYPE html>
 | ||
|  | <html lang="en"> | ||
|  | <head> | ||
|  |     <meta charset="UTF-8"> | ||
|  |     <meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||
|  |     <title>Website Suspended</title> | ||
|  |     <style> | ||
|  |         body { | ||
|  |             font-family: Arial, sans-serif; | ||
|  |             background-color: #f5f5f5; | ||
|  |             margin: 0; | ||
|  |             padding: 0; | ||
|  |             display: flex; | ||
|  |             justify-content: center; | ||
|  |             align-items: center; | ||
|  |             height: 100vh; | ||
|  |         } | ||
|  |         .container { | ||
|  |             text-align: center; | ||
|  |             background-color: white; | ||
|  |             padding: 40px; | ||
|  |             border-radius: 8px; | ||
|  |             box-shadow: 0 2px 10px rgba(0,0,0,0.1); | ||
|  |             max-width: 500px; | ||
|  |         } | ||
|  |         h1 { | ||
|  |             color: #e74c3c; | ||
|  |             margin-bottom: 20px; | ||
|  |         } | ||
|  |         p { | ||
|  |             color: #555; | ||
|  |             line-height: 1.6; | ||
|  |             margin-bottom: 20px; | ||
|  |         } | ||
|  |         .contact { | ||
|  |             color: #777; | ||
|  |             font-size: 14px; | ||
|  |         } | ||
|  |     </style> | ||
|  | </head> | ||
|  | <body> | ||
|  |     <div class="container"> | ||
|  |         <h1>Website Suspended</h1> | ||
|  |         <p>This website has been temporarily suspended. This could be due to various reasons including billing issues, policy violations, or administrative actions.</p> | ||
|  |         <p>If you are the website owner, please contact your hosting provider for more information about why your account was suspended and how to restore service.</p> | ||
|  |         <p class="contact">For support, please contact your system administrator.</p> | ||
|  |     </div> | ||
|  | </body> | ||
|  | </html>"""
 | ||
|  |                     try: | ||
|  |                         # Create directory if it doesn't exist | ||
|  |                         dirPath = os.path.dirname(suspensionPagePath) | ||
|  |                         if not os.path.exists(dirPath): | ||
|  |                             command = f"mkdir -p {dirPath}" | ||
|  |                             ProcessUtilities.executioner(command) | ||
|  |                          | ||
|  |                         # Write the HTML content to a temporary file in /home/cyberpanel | ||
|  |                         tempFile = "/home/cyberpanel/suspension_temp.html" | ||
|  |                          | ||
|  |                         # Create the file using normal Python file operations | ||
|  |                         with open(tempFile, 'w') as f: | ||
|  |                             f.write(defaultSuspensionHTML) | ||
|  |                          | ||
|  |                         # Use ProcessUtilities to move the file to the final location | ||
|  |                         command = f"mv {tempFile} {suspensionPagePath}" | ||
|  |                         ProcessUtilities.executioner(command) | ||
|  |                     except: | ||
|  |                         pass | ||
|  |                  | ||
|  |                 # Set proper permissions for suspension page | ||
|  |                 try: | ||
|  |                     command = f"chown lsadm:lsadm {suspensionPagePath}" | ||
|  |                     ProcessUtilities.executioner(command) | ||
|  |                     command = f"chmod 644 {suspensionPagePath}" | ||
|  |                     ProcessUtilities.executioner(command) | ||
|  |                 except: | ||
|  |                     pass | ||
|  |                  | ||
|  |                 # Create suspension configuration with end marker | ||
|  |                 suspensionConf = """# Website Suspension Configuration
 | ||
|  | context /{ | ||
|  |   location                        $DOC_ROOT/ | ||
|  |   allowBrowse                     1 | ||
|  |    | ||
|  |   rewrite  { | ||
|  |     enable                  1 | ||
|  |     autoLoadHtaccess        0 | ||
|  |     rules                   <<<END_rules | ||
|  | RewriteEngine On | ||
|  | RewriteCond %{REQUEST_URI} !^/cyberpanel_suspension_page\.html$ | ||
|  | RewriteRule ^(.*)$ /cyberpanel_suspension_page.html [L] | ||
|  | END_rules | ||
|  |   } | ||
|  |    | ||
|  |   addDefaultCharset               off | ||
|  | } | ||
|  | 
 | ||
|  | context /cyberpanel_suspension_page.html { | ||
|  |   location                        /usr/local/CyberCP/websiteFunctions/suspension.html | ||
|  |   accessible                      1 | ||
|  |   extraHeaders                    X-Frame-Options: DENY | ||
|  |   allowBrowse                     1 | ||
|  | } | ||
|  | # End Website Suspension Configuration | ||
|  | """
 | ||
|  |                  | ||
|  |                 try: | ||
|  |                     # Read current vhost configuration | ||
|  |                     with open(vhostConfPath, 'r') as f: | ||
|  |                         vhostContent = f.read() | ||
|  |                      | ||
|  |                     if "# Website Suspension Configuration" not in vhostContent: | ||
|  |                         # Check if there's an existing rewrite block at the root level | ||
|  |                         # If so, we need to comment it out to avoid conflicts | ||
|  |                          | ||
|  |                         # Pattern to find root-level rewrite block | ||
|  |                         rewrite_pattern = r'^(rewrite\s*\{[^}]*\})' | ||
|  |                          | ||
|  |                         # Comment out existing root-level rewrite block if found | ||
|  |                         if re.search(rewrite_pattern, vhostContent, re.MULTILINE | re.DOTALL): | ||
|  |                             vhostContent = re.sub(rewrite_pattern,  | ||
|  |                                 lambda m: '# Commented out during suspension\n#' + m.group(0).replace('\n', '\n#'),  | ||
|  |                                 vhostContent,  | ||
|  |                                 flags=re.MULTILINE | re.DOTALL) | ||
|  |                          | ||
|  |                         # Add suspension configuration at the beginning | ||
|  |                         modifiedContent = suspensionConf + "\n" + vhostContent | ||
|  |                          | ||
|  |                         # Write directly to vhost file | ||
|  |                         with open(vhostConfPath, 'w') as f: | ||
|  |                             f.write(modifiedContent) | ||
|  |                          | ||
|  |                         # Set proper ownership | ||
|  |                         command = f"chown lsadm:lsadm {vhostConfPath}" | ||
|  |                         ProcessUtilities.executioner(command) | ||
|  |                 except IOError as e: | ||
|  |                     # If direct file access fails, fall back to command-based approach | ||
|  |                     command = f"cat {vhostConfPath}" | ||
|  |                     vhostContent = ProcessUtilities.outputExecutioner(command) | ||
|  |                      | ||
|  |                     if vhostContent and "# Website Suspension Configuration" not in vhostContent: | ||
|  |                         # Check if there's an existing rewrite block at the root level | ||
|  |                         # If so, we need to comment it out to avoid conflicts | ||
|  |                          | ||
|  |                         # Pattern to find root-level rewrite block | ||
|  |                         rewrite_pattern = r'^(rewrite\s*\{[^}]*\})' | ||
|  |                          | ||
|  |                         # Comment out existing root-level rewrite block if found | ||
|  |                         if re.search(rewrite_pattern, vhostContent, re.MULTILINE | re.DOTALL): | ||
|  |                             vhostContent = re.sub(rewrite_pattern,  | ||
|  |                                 lambda m: '# Commented out during suspension\n#' + m.group(0).replace('\n', '\n#'),  | ||
|  |                                 vhostContent,  | ||
|  |                                 flags=re.MULTILINE | re.DOTALL) | ||
|  |                          | ||
|  |                         modifiedContent = suspensionConf + "\n" + vhostContent | ||
|  |                          | ||
|  |                         # Use temp file in /tmp | ||
|  |                         import tempfile | ||
|  |                         with tempfile.NamedTemporaryFile(mode='w', delete=False, prefix='cyberpanel_') as tmpfile: | ||
|  |                             tmpfile.write(modifiedContent) | ||
|  |                             tempFile = tmpfile.name | ||
|  |                          | ||
|  |                         # Copy to vhost configuration | ||
|  |                         command = f"cp {tempFile} {vhostConfPath}" | ||
|  |                         ProcessUtilities.executioner(command) | ||
|  |                          | ||
|  |                         # Set proper ownership | ||
|  |                         command = f"chown lsadm:lsadm {vhostConfPath}" | ||
|  |                         ProcessUtilities.executioner(command) | ||
|  |                          | ||
|  |                         # Remove temporary file | ||
|  |                         try: | ||
|  |                             os.remove(tempFile) | ||
|  |                         except: | ||
|  |                             pass | ||
|  |                  | ||
|  |                 # Apply same suspension configuration to child domains | ||
|  |                 childDomains = website.childdomains_set.all() | ||
|  |                  | ||
|  |                 for items in childDomains: | ||
|  |                     childConfPath = virtualHostUtilities.Server_root + "/conf/vhosts/" + items.domain | ||
|  |                     childVhostConfPath = childConfPath + "/vhost.conf" | ||
|  |                      | ||
|  |                     try: | ||
|  |                         # Try direct file access first | ||
|  |                         try: | ||
|  |                             with open(childVhostConfPath, 'r') as f: | ||
|  |                                 childVhostContent = f.read() | ||
|  |                              | ||
|  |                             if "# Website Suspension Configuration" not in childVhostContent: | ||
|  |                                 childModifiedContent = suspensionConf + "\n" + childVhostContent | ||
|  |                                  | ||
|  |                                 with open(childVhostConfPath, 'w') as f: | ||
|  |                                     f.write(childModifiedContent) | ||
|  |                                  | ||
|  |                                 command = f"chown lsadm:lsadm {childVhostConfPath}" | ||
|  |                                 ProcessUtilities.executioner(command) | ||
|  |                         except IOError: | ||
|  |                             # Fall back to command-based approach | ||
|  |                             command = f"cat {childVhostConfPath}" | ||
|  |                             childVhostContent = ProcessUtilities.outputExecutioner(command) | ||
|  |                              | ||
|  |                             if childVhostContent and "# Website Suspension Configuration" not in childVhostContent: | ||
|  |                                 childModifiedContent = suspensionConf + "\n" + childVhostContent | ||
|  |                                  | ||
|  |                                 import tempfile | ||
|  |                                 with tempfile.NamedTemporaryFile(mode='w', delete=False, prefix='cyberpanel_child_') as tmpfile: | ||
|  |                                     tmpfile.write(childModifiedContent) | ||
|  |                                     childTempFile = tmpfile.name | ||
|  |                                  | ||
|  |                                 command = f"cp {childTempFile} {childVhostConfPath}" | ||
|  |                                 ProcessUtilities.executioner(command) | ||
|  |                                  | ||
|  |                                 command = f"chown lsadm:lsadm {childVhostConfPath}" | ||
|  |                                 ProcessUtilities.executioner(command) | ||
|  |                                  | ||
|  |                                 try: | ||
|  |                                     os.remove(childTempFile) | ||
|  |                                 except: | ||
|  |                                     pass | ||
|  |                     except Exception as e: | ||
|  |                         CyberCPLogFileWriter.writeToFile(f"Error suspending child domain {items.domain}: {str(e)}") | ||
|  |                  | ||
|  |                 installUtilities.reStartLiteSpeedSocket() | ||
|  |                 website.state = 0 | ||
|  |             else: | ||
|  |                 confPath = virtualHostUtilities.Server_root + "/conf/vhosts/" + websiteName | ||
|  |                 vhostConfPath = confPath + "/vhost.conf" | ||
|  |                  | ||
|  |                 try: | ||
|  |                     # Try direct file access first | ||
|  |                     with open(vhostConfPath, 'r') as f: | ||
|  |                         vhostContent = f.read() | ||
|  |                      | ||
|  |                     if "# Website Suspension Configuration" in vhostContent: | ||
|  |                         # Use regex to remove the suspension configuration block | ||
|  |                         pattern = r'# Website Suspension Configuration.*?# End Website Suspension Configuration\n' | ||
|  |                         modifiedContent = re.sub(pattern, '', vhostContent, flags=re.DOTALL) | ||
|  |                          | ||
|  |                         # Restore any rewrite blocks that were commented out during suspension | ||
|  |                         commented_rewrite_pattern = r'# Commented out during suspension\n((?:#[^\n]*\n)+)' | ||
|  |                          | ||
|  |                         def restore_commented_block(match): | ||
|  |                             commented_block = match.group(1) | ||
|  |                             # Remove the leading # from each line | ||
|  |                             restored_block = '\n'.join(line[1:] if line.startswith('#') else line  | ||
|  |                                                      for line in commented_block.splitlines()) | ||
|  |                             return restored_block | ||
|  |                          | ||
|  |                         if re.search(commented_rewrite_pattern, modifiedContent): | ||
|  |                             modifiedContent = re.sub(commented_rewrite_pattern, | ||
|  |                                                    restore_commented_block, | ||
|  |                                                    modifiedContent) | ||
|  |                          | ||
|  |                         with open(vhostConfPath, 'w') as f: | ||
|  |                             f.write(modifiedContent) | ||
|  |                          | ||
|  |                         command = f"chown lsadm:lsadm {vhostConfPath}" | ||
|  |                         ProcessUtilities.executioner(command) | ||
|  |                 except IOError: | ||
|  |                     # Fall back to command-based approach | ||
|  |                     command = f"cat {vhostConfPath}" | ||
|  |                     vhostContent = ProcessUtilities.outputExecutioner(command) | ||
|  |                      | ||
|  |                     if vhostContent and "# Website Suspension Configuration" in vhostContent: | ||
|  |                         pattern = r'# Website Suspension Configuration.*?# End Website Suspension Configuration\n' | ||
|  |                         modifiedContent = re.sub(pattern, '', vhostContent, flags=re.DOTALL) | ||
|  |                          | ||
|  |                         # Restore any rewrite blocks that were commented out during suspension | ||
|  |                         commented_rewrite_pattern = r'# Commented out during suspension\n((?:#[^\n]*\n)+)' | ||
|  |                          | ||
|  |                         def restore_commented_block(match): | ||
|  |                             commented_block = match.group(1) | ||
|  |                             # Remove the leading # from each line | ||
|  |                             restored_block = '\n'.join(line[1:] if line.startswith('#') else line  | ||
|  |                                                      for line in commented_block.splitlines()) | ||
|  |                             return restored_block | ||
|  |                          | ||
|  |                         if re.search(commented_rewrite_pattern, modifiedContent): | ||
|  |                             modifiedContent = re.sub(commented_rewrite_pattern, | ||
|  |                                                    restore_commented_block, | ||
|  |                                                    modifiedContent) | ||
|  |                          | ||
|  |                         import tempfile | ||
|  |                         with tempfile.NamedTemporaryFile(mode='w', delete=False, prefix='cyberpanel_') as tmpfile: | ||
|  |                             tmpfile.write(modifiedContent) | ||
|  |                             tempFile = tmpfile.name | ||
|  |                          | ||
|  |                         command = f"cp {tempFile} {vhostConfPath}" | ||
|  |                         ProcessUtilities.executioner(command) | ||
|  |                          | ||
|  |                         command = f"chown lsadm:lsadm {vhostConfPath}" | ||
|  |                         ProcessUtilities.executioner(command) | ||
|  |                          | ||
|  |                         try: | ||
|  |                             os.remove(tempFile) | ||
|  |                         except: | ||
|  |                             pass | ||
|  |                  | ||
|  |                 # Remove suspension configuration from child domains | ||
|  |                 childDomains = website.childdomains_set.all() | ||
|  |                  | ||
|  |                 for items in childDomains: | ||
|  |                     childConfPath = virtualHostUtilities.Server_root + "/conf/vhosts/" + items.domain | ||
|  |                     childVhostConfPath = childConfPath + "/vhost.conf" | ||
|  |                      | ||
|  |                     try: | ||
|  |                         # Try direct file access first | ||
|  |                         try: | ||
|  |                             with open(childVhostConfPath, 'r') as f: | ||
|  |                                 childVhostContent = f.read() | ||
|  |                              | ||
|  |                             if "# Website Suspension Configuration" in childVhostContent: | ||
|  |                                 pattern = r'# Website Suspension Configuration.*?# End Website Suspension Configuration\n' | ||
|  |                                 childModifiedContent = re.sub(pattern, '', childVhostContent, flags=re.DOTALL) | ||
|  |                                  | ||
|  |                                 with open(childVhostConfPath, 'w') as f: | ||
|  |                                     f.write(childModifiedContent) | ||
|  |                                  | ||
|  |                                 command = f"chown lsadm:lsadm {childVhostConfPath}" | ||
|  |                                 ProcessUtilities.executioner(command) | ||
|  |                         except IOError: | ||
|  |                             # Fall back to command-based approach | ||
|  |                             command = f"cat {childVhostConfPath}" | ||
|  |                             childVhostContent = ProcessUtilities.outputExecutioner(command) | ||
|  |                              | ||
|  |                             if childVhostContent and "# Website Suspension Configuration" in childVhostContent: | ||
|  |                                 pattern = r'# Website Suspension Configuration.*?# End Website Suspension Configuration\n' | ||
|  |                                 childModifiedContent = re.sub(pattern, '', childVhostContent, flags=re.DOTALL) | ||
|  |                                  | ||
|  |                                 import tempfile | ||
|  |                                 with tempfile.NamedTemporaryFile(mode='w', delete=False, prefix='cyberpanel_child_') as tmpfile: | ||
|  |                                     tmpfile.write(childModifiedContent) | ||
|  |                                     childTempFile = tmpfile.name | ||
|  |                                  | ||
|  |                                 command = f"cp {childTempFile} {childVhostConfPath}" | ||
|  |                                 ProcessUtilities.executioner(command) | ||
|  |                                  | ||
|  |                                 command = f"chown lsadm:lsadm {childVhostConfPath}" | ||
|  |                                 ProcessUtilities.executioner(command) | ||
|  |                                  | ||
|  |                                 try: | ||
|  |                                     os.remove(childTempFile) | ||
|  |                                 except: | ||
|  |                                     pass | ||
|  |                     except Exception as e: | ||
|  |                         CyberCPLogFileWriter.writeToFile(f"Error unsuspending child domain {items.domain}: {str(e)}") | ||
|  |                  | ||
|  |                 installUtilities.reStartLiteSpeedSocket() | ||
|  |                 website.state = 1 | ||
|  | 
 | ||
|  |             website.save() | ||
|  | 
 | ||
|  |             data_ret = {'websiteStatus': 1, 'error_message': "None"} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except Exception as msg: | ||
|  |             CyberCPLogFileWriter.writeToFile(f"Error in submitWebsiteStatus: {str(msg)}") | ||
|  |             data_ret = {'websiteStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def submitWebsiteModify(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             if ACLManager.currentContextPermission(currentACL, 'modifyWebsite') == 0: | ||
|  |                 return ACLManager.loadErrorJson('modifyStatus', 0) | ||
|  | 
 | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  |             if ACLManager.checkOwnership(data['websiteToBeModified'], admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('websiteDeleteStatus', 0) | ||
|  | 
 | ||
|  |             packs = ACLManager.loadPackages(userID, currentACL) | ||
|  |             admins = ACLManager.loadAllUsers(userID) | ||
|  | 
 | ||
|  |             ## Get packs name | ||
|  | 
 | ||
|  |             json_data = "[" | ||
|  |             checker = 0 | ||
|  | 
 | ||
|  |             for items in packs: | ||
|  |                 dic = {"pack": items} | ||
|  | 
 | ||
|  |                 if checker == 0: | ||
|  |                     json_data = json_data + json.dumps(dic) | ||
|  |                     checker = 1 | ||
|  |                 else: | ||
|  |                     json_data = json_data + ',' + json.dumps(dic) | ||
|  | 
 | ||
|  |             json_data = json_data + ']' | ||
|  | 
 | ||
|  |             ### Get admin names | ||
|  | 
 | ||
|  |             admin_data = "[" | ||
|  |             checker = 0 | ||
|  | 
 | ||
|  |             for items in admins: | ||
|  |                 dic = {"adminNames": items} | ||
|  | 
 | ||
|  |                 if checker == 0: | ||
|  |                     admin_data = admin_data + json.dumps(dic) | ||
|  |                     checker = 1 | ||
|  |                 else: | ||
|  |                     admin_data = admin_data + ',' + json.dumps(dic) | ||
|  | 
 | ||
|  |             admin_data = admin_data + ']' | ||
|  | 
 | ||
|  |             websiteToBeModified = data['websiteToBeModified'] | ||
|  | 
 | ||
|  |             modifyWeb = Websites.objects.get(domain=websiteToBeModified) | ||
|  | 
 | ||
|  |             email = modifyWeb.adminEmail | ||
|  |             currentPack = modifyWeb.package.packageName | ||
|  |             owner = modifyWeb.admin.userName | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'modifyStatus': 1, 'error_message': "None", "adminEmail": email, | ||
|  |                         "packages": json_data, "current_pack": currentPack, "adminNames": admin_data, | ||
|  |                         'currentAdmin': owner} | ||
|  |             final_json = json.dumps(data_ret) | ||
|  |             return HttpResponse(final_json) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             dic = {'status': 0, 'modifyStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(dic) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def fetchWebsiteDataJSON(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             if ACLManager.currentContextPermission(currentACL, 'createWebsite') == 0: | ||
|  |                 return ACLManager.loadErrorJson('createWebSiteStatus', 0) | ||
|  | 
 | ||
|  |             packs = ACLManager.loadPackages(userID, currentACL) | ||
|  |             admins = ACLManager.loadAllUsers(userID) | ||
|  | 
 | ||
|  |             ## Get packs name | ||
|  | 
 | ||
|  |             json_data = "[" | ||
|  |             checker = 0 | ||
|  | 
 | ||
|  |             for items in packs: | ||
|  |                 dic = {"pack": items} | ||
|  | 
 | ||
|  |                 if checker == 0: | ||
|  |                     json_data = json_data + json.dumps(dic) | ||
|  |                     checker = 1 | ||
|  |                 else: | ||
|  |                     json_data = json_data + ',' + json.dumps(dic) | ||
|  | 
 | ||
|  |             json_data = json_data + ']' | ||
|  | 
 | ||
|  |             ### Get admin names | ||
|  | 
 | ||
|  |             admin_data = "[" | ||
|  |             checker = 0 | ||
|  | 
 | ||
|  |             for items in admins: | ||
|  |                 dic = {"adminNames": items} | ||
|  | 
 | ||
|  |                 if checker == 0: | ||
|  |                     admin_data = admin_data + json.dumps(dic) | ||
|  |                     checker = 1 | ||
|  |                 else: | ||
|  |                     admin_data = admin_data + ',' + json.dumps(dic) | ||
|  | 
 | ||
|  |             admin_data = admin_data + ']' | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'error_message': "None", | ||
|  |                         "packages": json_data, "adminNames": admin_data} | ||
|  |             final_json = json.dumps(data_ret) | ||
|  |             return HttpResponse(final_json) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             dic = {'status': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(dic) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def saveWebsiteChanges(self, userID=None, data=None): | ||
|  |         try: | ||
|  |             domain = data['domain'] | ||
|  |             package = data['packForWeb'] | ||
|  |             email = data['email'] | ||
|  |             phpVersion = data['phpVersion'] | ||
|  |             newUser = data['admin'] | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             if ACLManager.currentContextPermission(currentACL, 'modifyWebsite') == 0: | ||
|  |                 return ACLManager.loadErrorJson('saveStatus', 0) | ||
|  | 
 | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  |             if ACLManager.checkOwnership(domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('websiteDeleteStatus', 0) | ||
|  | 
 | ||
|  |             newOwner = Administrator.objects.get(userName=newUser) | ||
|  |             if ACLManager.checkUserOwnerShip(currentACL, admin, newOwner) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('websiteDeleteStatus', 0) | ||
|  | 
 | ||
|  |             confPath = virtualHostUtilities.Server_root + "/conf/vhosts/" + domain | ||
|  |             completePathToConfigFile = confPath + "/vhost.conf" | ||
|  | 
 | ||
|  |             execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" | ||
|  |             execPath = execPath + " changePHP --phpVersion '" + phpVersion + "' --path " + completePathToConfigFile | ||
|  |             ProcessUtilities.popenExecutioner(execPath) | ||
|  | 
 | ||
|  |             #### | ||
|  | 
 | ||
|  |             newOwner = Administrator.objects.get(userName=newUser) | ||
|  | 
 | ||
|  |             modifyWeb = Websites.objects.get(domain=domain) | ||
|  |             webpack = Package.objects.get(packageName=package) | ||
|  | 
 | ||
|  |             modifyWeb.package = webpack | ||
|  |             modifyWeb.adminEmail = email | ||
|  |             modifyWeb.phpSelection = phpVersion | ||
|  |             modifyWeb.admin = newOwner | ||
|  | 
 | ||
|  |             modifyWeb.save() | ||
|  | 
 | ||
|  |             ## Update disk quota when package changes - Fix for GitHub issue #1442 | ||
|  |             if webpack.enforceDiskLimits: | ||
|  |                 spaceString = f'{webpack.diskSpace}M {webpack.diskSpace}M' | ||
|  |                 command = f'setquota -u {modifyWeb.externalApp} {spaceString} 0 0 /' | ||
|  |                 ProcessUtilities.executioner(command) | ||
|  | 
 | ||
|  |             ## Fix https://github.com/usmannasir/cyberpanel/issues/998 | ||
|  | 
 | ||
|  |             # from plogical.IncScheduler import IncScheduler | ||
|  |             # isPU = IncScheduler('CalculateAndUpdateDiskUsage', {}) | ||
|  |             # isPU.start() | ||
|  | 
 | ||
|  |             command = '/usr/local/CyberCP/bin/python /usr/local/CyberCP/plogical/IncScheduler.py UpdateDiskUsageForce' | ||
|  |             ProcessUtilities.outputExecutioner(command) | ||
|  | 
 | ||
|  |             ## | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'saveStatus': 1, 'error_message': "None"} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'saveStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def loadDomainHome(self, request=None, userID=None, data=None): | ||
|  | 
 | ||
|  |         if Websites.objects.filter(domain=self.domain).exists(): | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             website = Websites.objects.get(domain=self.domain) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadError() | ||
|  | 
 | ||
|  |             Data = {} | ||
|  | 
 | ||
|  |             from plogical.processUtilities import ProcessUtilities | ||
|  | 
 | ||
|  |             marketingStatus = emACL.checkIfEMEnabled(admin.userName) | ||
|  | 
 | ||
|  |             Data['marketingStatus'] = marketingStatus | ||
|  |             Data['ftpTotal'] = website.package.ftpAccounts | ||
|  |             Data['ftpUsed'] = website.users_set.all().count() | ||
|  | 
 | ||
|  |             Data['databasesUsed'] = website.databases_set.all().count() | ||
|  |             Data['databasesTotal'] = website.package.dataBases | ||
|  | 
 | ||
|  |             Data['domain'] = self.domain | ||
|  | 
 | ||
|  |             DiskUsage, DiskUsagePercentage, bwInMB, bwUsage = virtualHostUtilities.FindStats(website) | ||
|  | 
 | ||
|  |             ## bw usage calculations | ||
|  | 
 | ||
|  |             Data['bwInMBTotal'] = website.package.bandwidth | ||
|  |             Data['bwInMB'] = bwInMB | ||
|  |             Data['bwUsage'] = bwUsage | ||
|  | 
 | ||
|  |             if DiskUsagePercentage > 100: | ||
|  |                 DiskUsagePercentage = 100 | ||
|  | 
 | ||
|  |             Data['diskUsage'] = DiskUsagePercentage | ||
|  |             Data['diskInMB'] = DiskUsage | ||
|  |             Data['diskInMBTotal'] = website.package.diskSpace | ||
|  | 
 | ||
|  |             Data['phps'] = PHPManager.findPHPVersions() | ||
|  |             import os | ||
|  | 
 | ||
|  |             servicePath = '/home/cyberpanel/postfix' | ||
|  |             if os.path.exists(servicePath): | ||
|  |                 Data['email'] = 1 | ||
|  |             else: | ||
|  |                 Data['email'] = 0 | ||
|  | 
 | ||
|  |             ## Getting SSL Information | ||
|  |             try: | ||
|  |                 import OpenSSL | ||
|  |                 from datetime import datetime | ||
|  |                 filePath = '/etc/letsencrypt/live/%s/fullchain.pem' % (self.domain) | ||
|  |                 x509 = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, | ||
|  |                                                        open(filePath, 'r').read()) | ||
|  |                 expireData = x509.get_notAfter().decode('ascii') | ||
|  |                 finalDate = datetime.strptime(expireData, '%Y%m%d%H%M%SZ') | ||
|  | 
 | ||
|  |                 now = datetime.now() | ||
|  |                 diff = finalDate - now | ||
|  |                 Data['viewSSL'] = 1 | ||
|  |                 Data['days'] = str(diff.days) | ||
|  |                 Data['authority'] = x509.get_issuer().get_components()[1][1].decode('utf-8') | ||
|  | 
 | ||
|  |                 if Data['authority'] == 'Denial': | ||
|  |                     Data['authority'] = '%s has SELF-SIGNED SSL.' % (self.domain) | ||
|  |                 else: | ||
|  |                     Data['authority'] = '%s has SSL from %s.' % (self.domain, Data['authority']) | ||
|  | 
 | ||
|  |             except BaseException as msg: | ||
|  |                 Data['viewSSL'] = 0 | ||
|  |                 logging.CyberCPLogFileWriter.writeToFile(str(msg)) | ||
|  | 
 | ||
|  |             servicePath = '/home/cyberpanel/pureftpd' | ||
|  |             if os.path.exists(servicePath): | ||
|  |                 Data['ftp'] = 1 | ||
|  |             else: | ||
|  |                 Data['ftp'] = 0 | ||
|  | 
 | ||
|  |             # Add-on check logic (copied from sshAccess) | ||
|  |             url = "https://platform.cyberpersons.com/CyberpanelAdOns/Adonpermission" | ||
|  |             addon_data = { | ||
|  |                 "name": "all", | ||
|  |                 "IP": ACLManager.GetServerIP() | ||
|  |             } | ||
|  |             import requests | ||
|  |             import json | ||
|  |             try: | ||
|  |                 response = requests.post(url, data=json.dumps(addon_data)) | ||
|  |                 Status = response.json().get('status', 0) | ||
|  |             except Exception: | ||
|  |                 Status = 0 | ||
|  |             Data['has_addons'] = bool((Status == 1) or ProcessUtilities.decideServer() == ProcessUtilities.ent) | ||
|  | 
 | ||
|  |             # SSL check (self-signed logic) | ||
|  |             cert_path = '/etc/letsencrypt/live/%s/fullchain.pem' % (self.domain) | ||
|  |             is_selfsigned = False | ||
|  |             ssl_issue_link = '/manageSSL/sslForHostName' | ||
|  |             try: | ||
|  |                 import OpenSSL | ||
|  |                 with open(cert_path, 'r') as f: | ||
|  |                     pem_data = f.read() | ||
|  |                 cert = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, pem_data) | ||
|  |                 # Only check the first cert in the PEM | ||
|  |                 issuer_org = None | ||
|  |                 for k, v in cert.get_issuer().get_components(): | ||
|  |                     if k.decode() == 'O': | ||
|  |                         issuer_org = v.decode() | ||
|  |                         break | ||
|  |                 if issuer_org == 'Denial': | ||
|  |                     is_selfsigned = True | ||
|  |                 else: | ||
|  |                     is_selfsigned = False | ||
|  |             except Exception: | ||
|  |                 is_selfsigned = True  # If cert missing or unreadable, treat as self-signed | ||
|  |             Data['is_selfsigned_ssl'] = bool(is_selfsigned) | ||
|  |             Data['ssl_issue_link'] = ssl_issue_link | ||
|  |              | ||
|  | 
 | ||
|  |             # Detect if accessed via IP | ||
|  |             from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter | ||
|  |             accessed_via_ip = False | ||
|  |             try: | ||
|  |                 host = request.get_host().split(':')[0]  # Remove port if present | ||
|  |                 try: | ||
|  |                     ipaddress.ip_address(host) | ||
|  |                     accessed_via_ip = True | ||
|  |                 except ValueError: | ||
|  |                     accessed_via_ip = False | ||
|  |             except Exception as e: | ||
|  |                 accessed_via_ip = False | ||
|  |                 CyberCPLogFileWriter.writeToFile(f"Error detecting accessed_via_ip: {str(e)}") | ||
|  | 
 | ||
|  |             Data['accessed_via_ip'] = bool(accessed_via_ip) | ||
|  | 
 | ||
|  |             #### update jwt secret if needed | ||
|  | 
 | ||
|  |             import secrets | ||
|  | 
 | ||
|  |             fastapi_file = '/usr/local/CyberCP/fastapi_ssh_server.py' | ||
|  |             from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter | ||
|  |             try: | ||
|  |                  | ||
|  |                 content = ProcessUtilities.outputExecutioner(f'cat {fastapi_file}') | ||
|  |                 if 'REPLACE_ME_WITH_INSTALLER' in content: | ||
|  |                     new_secret = secrets.token_urlsafe(32) | ||
|  |                      | ||
|  |                     sed_cmd = f"sed -i 's|JWT_SECRET = \"REPLACE_ME_WITH_INSTALLER\"|JWT_SECRET = \"{new_secret}\"|' '{fastapi_file}'" | ||
|  |                     ProcessUtilities.outputExecutioner(sed_cmd) | ||
|  |                      | ||
|  |                     command = 'systemctl restart fastapi_ssh_server' | ||
|  |                     ProcessUtilities.outputExecutioner(command) | ||
|  |             except Exception: | ||
|  |                 CyberCPLogFileWriter.writeLog(f"Failed to update JWT secret: {e}") | ||
|  |                 pass | ||
|  | 
 | ||
|  |             ##### | ||
|  | 
 | ||
|  |             ##### | ||
|  | 
 | ||
|  |             from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter | ||
|  |             # Ensure FastAPI SSH server systemd service file is in place | ||
|  |             try: | ||
|  |                 service_path = '/etc/systemd/system/fastapi_ssh_server.service' | ||
|  |                 local_service_path = 'fastapi_ssh_server.service' | ||
|  |                 check_service = ProcessUtilities.outputExecutioner(f'test -f {service_path} && echo exists || echo missing') | ||
|  |                 if 'missing' in check_service: | ||
|  |                     ProcessUtilities.outputExecutioner(f'cp /usr/local/CyberCP/fastapi_ssh_server.service {service_path}') | ||
|  |                     ProcessUtilities.outputExecutioner('systemctl daemon-reload') | ||
|  |             except Exception as e: | ||
|  |                 CyberCPLogFileWriter.writeLog(f"Failed to copy or reload fastapi_ssh_server.service: {e}") | ||
|  |              | ||
|  | 
 | ||
|  |             ##### | ||
|  | 
 | ||
|  |             # Ensure FastAPI SSH server is running using ProcessUtilities | ||
|  |             try: | ||
|  |                 ProcessUtilities.outputExecutioner('systemctl is-active --quiet fastapi_ssh_server') | ||
|  |                 ProcessUtilities.outputExecutioner('systemctl enable --now fastapi_ssh_server') | ||
|  |                 ProcessUtilities.outputExecutioner('systemctl start fastapi_ssh_server') | ||
|  | 
 | ||
|  |                 csfPath = '/etc/csf' | ||
|  | 
 | ||
|  |                 sshPort = '8888' | ||
|  | 
 | ||
|  |                 if os.path.exists(csfPath): | ||
|  |                         dataIn = {'protocol': 'TCP_IN', 'ports': sshPort} | ||
|  | 
 | ||
|  |                         # self.modifyPorts is a method in the firewallManager.py file so how can we call it here? | ||
|  |                         # we need to call the method from the firewallManager.py file | ||
|  |                         from firewall.firewallManager import FirewallManager | ||
|  |                         firewallManager = FirewallManager() | ||
|  |                         firewallManager.modifyPorts(dataIn) | ||
|  |                         dataIn = {'protocol': 'TCP_OUT', 'ports': sshPort} | ||
|  |                         firewallManager.modifyPorts(dataIn) | ||
|  |                 else: | ||
|  |                     from plogical.firewallUtilities import FirewallUtilities | ||
|  |                     from firewall.models import FirewallRules | ||
|  |                     try: | ||
|  |                         updateFW = FirewallRules.objects.get(name="WebTerminalPort") | ||
|  |                         FirewallUtilities.deleteRule("tcp", updateFW.port, "0.0.0.0/0") | ||
|  |                         updateFW.port = sshPort | ||
|  |                         updateFW.save() | ||
|  |                         FirewallUtilities.addRule('tcp', sshPort, "0.0.0.0/0") | ||
|  |                     except: | ||
|  |                         try: | ||
|  |                             newFireWallRule = FirewallRules(name="WebTerminalPort", port=sshPort, proto="tcp") | ||
|  |                             newFireWallRule.save() | ||
|  |                             FirewallUtilities.addRule('tcp', sshPort, "0.0.0.0/0") | ||
|  |                         except BaseException as msg: | ||
|  |                             CyberCPLogFileWriter.writeToFile(str(msg)) | ||
|  | 
 | ||
|  |             except Exception as e: | ||
|  |                 CyberCPLogFileWriter.writeLog(f"Failed to ensure fastapi_ssh_server is running: {e}") | ||
|  | 
 | ||
|  |             proc = httpProc(request, 'websiteFunctions/website.html', Data) | ||
|  |             return proc.render() | ||
|  |         else: | ||
|  |             proc = httpProc(request, 'websiteFunctions/website.html', | ||
|  |                             {"error": 1, "domain": "This domain does not exists."}) | ||
|  |             return proc.render() | ||
|  | 
 | ||
|  |     def launchChild(self, request=None, userID=None, data=None): | ||
|  | 
 | ||
|  |         if ChildDomains.objects.filter(domain=self.childDomain).exists(): | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadError() | ||
|  | 
 | ||
|  |             website = Websites.objects.get(domain=self.domain) | ||
|  | 
 | ||
|  |             Data = {} | ||
|  | 
 | ||
|  |             Data['ftpTotal'] = website.package.ftpAccounts | ||
|  |             Data['ftpUsed'] = website.users_set.all().count() | ||
|  | 
 | ||
|  |             Data['databasesUsed'] = website.databases_set.all().count() | ||
|  |             Data['databasesTotal'] = website.package.dataBases | ||
|  | 
 | ||
|  |             Data['domain'] = self.domain | ||
|  |             Data['childDomain'] = self.childDomain | ||
|  | 
 | ||
|  |             DiskUsage, DiskUsagePercentage, bwInMB, bwUsage = virtualHostUtilities.FindStats(website) | ||
|  | 
 | ||
|  |             ## bw usage calculations | ||
|  | 
 | ||
|  |             Data['bwInMBTotal'] = website.package.bandwidth | ||
|  |             Data['bwInMB'] = bwInMB | ||
|  |             Data['bwUsage'] = bwUsage | ||
|  | 
 | ||
|  |             if DiskUsagePercentage > 100: | ||
|  |                 DiskUsagePercentage = 100 | ||
|  | 
 | ||
|  |             Data['diskUsage'] = DiskUsagePercentage | ||
|  |             Data['diskInMB'] = DiskUsage | ||
|  |             Data['diskInMBTotal'] = website.package.diskSpace | ||
|  | 
 | ||
|  |             Data['phps'] = PHPManager.findPHPVersions() | ||
|  | 
 | ||
|  |             servicePath = '/home/cyberpanel/postfix' | ||
|  |             if os.path.exists(servicePath): | ||
|  |                 Data['email'] = 1 | ||
|  |             else: | ||
|  |                 Data['email'] = 0 | ||
|  | 
 | ||
|  |             servicePath = '/home/cyberpanel/pureftpd' | ||
|  |             if os.path.exists(servicePath): | ||
|  |                 Data['ftp'] = 1 | ||
|  |             else: | ||
|  |                 Data['ftp'] = 0 | ||
|  | 
 | ||
|  |             ## Getting SSL Information | ||
|  |             try: | ||
|  |                 import OpenSSL | ||
|  |                 from datetime import datetime | ||
|  |                 filePath = '/etc/letsencrypt/live/%s/fullchain.pem' % (self.childDomain) | ||
|  |                 x509 = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, | ||
|  |                                                        open(filePath, 'r').read()) | ||
|  |                 expireData = x509.get_notAfter().decode('ascii') | ||
|  |                 finalDate = datetime.strptime(expireData, '%Y%m%d%H%M%SZ') | ||
|  | 
 | ||
|  |                 now = datetime.now() | ||
|  |                 diff = finalDate - now | ||
|  |                 Data['viewSSL'] = 1 | ||
|  |                 Data['days'] = str(diff.days) | ||
|  |                 Data['authority'] = x509.get_issuer().get_components()[1][1].decode('utf-8') | ||
|  | 
 | ||
|  |                 if Data['authority'] == 'Denial': | ||
|  |                     Data['authority'] = '%s has SELF-SIGNED SSL.' % (self.childDomain) | ||
|  |                 else: | ||
|  |                     Data['authority'] = '%s has SSL from %s.' % (self.childDomain, Data['authority']) | ||
|  | 
 | ||
|  |             except BaseException as msg: | ||
|  |                 Data['viewSSL'] = 0 | ||
|  |                 logging.CyberCPLogFileWriter.writeToFile(str(msg)) | ||
|  | 
 | ||
|  |             proc = httpProc(request, 'websiteFunctions/launchChild.html', Data) | ||
|  |             return proc.render() | ||
|  |         else: | ||
|  |             proc = httpProc(request, 'websiteFunctions/launchChild.html', | ||
|  |                             {"error": 1, "domain": "This child domain does not exists"}) | ||
|  |             return proc.render() | ||
|  | 
 | ||
|  |     def getDataFromLogFile(self, userID=None, data=None): | ||
|  | 
 | ||
|  |         currentACL = ACLManager.loadedACL(userID) | ||
|  |         admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |         logType = data['logType'] | ||
|  |         self.domain = data['virtualHost'] | ||
|  |         page = data['page'] | ||
|  | 
 | ||
|  |         if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |             pass | ||
|  |         else: | ||
|  |             return ACLManager.loadErrorJson('logstatus', 0) | ||
|  | 
 | ||
|  |         if logType == 1: | ||
|  |             fileName = "/home/" + self.domain + "/logs/" + self.domain + ".access_log" | ||
|  |         else: | ||
|  |             fileName = "/home/" + self.domain + "/logs/" + self.domain + ".error_log" | ||
|  | 
 | ||
|  |         command = 'ls -la %s' % fileName | ||
|  |         result = ProcessUtilities.outputExecutioner(command) | ||
|  | 
 | ||
|  |         if result.find('->') > -1: | ||
|  |             final_json = json.dumps( | ||
|  |                 {'status': 0, 'logstatus': 0, | ||
|  |                  'error_message': "Symlink attack."}) | ||
|  |             return HttpResponse(final_json) | ||
|  | 
 | ||
|  |         ## get Logs | ||
|  |         website = Websites.objects.get(domain=self.domain) | ||
|  | 
 | ||
|  |         output = virtualHostUtilities.getAccessLogs(fileName, page, website.externalApp) | ||
|  | 
 | ||
|  |         if output.find("1,None") > -1: | ||
|  |             final_json = json.dumps( | ||
|  |                 {'status': 0, 'logstatus': 0, | ||
|  |                  'error_message': "Not able to fetch logs, see CyberPanel main log file, Error: %s" % (output)}) | ||
|  |             return HttpResponse(final_json) | ||
|  | 
 | ||
|  |         ## get log ends here. | ||
|  | 
 | ||
|  |         data = output.split("\n") | ||
|  | 
 | ||
|  |         json_data = "[" | ||
|  |         checker = 0 | ||
|  | 
 | ||
|  |         for items in reversed(data): | ||
|  |             if len(items) > 10: | ||
|  |                 logData = items.split(" ") | ||
|  |                 domain = logData[5].strip('"') | ||
|  |                 ipAddress = logData[0].strip('"') | ||
|  |                 time = (logData[3]).strip("[").strip("]") | ||
|  |                 resource = logData[6].strip('"') | ||
|  |                 size = logData[9].replace('"', '') | ||
|  | 
 | ||
|  |                 dic = {'domain': domain, | ||
|  |                        'ipAddress': ipAddress, | ||
|  |                        'time': time, | ||
|  |                        'resource': resource, | ||
|  |                        'size': size, | ||
|  |                        } | ||
|  | 
 | ||
|  |                 if checker == 0: | ||
|  |                     json_data = json_data + json.dumps(dic) | ||
|  |                     checker = 1 | ||
|  |                 else: | ||
|  |                     json_data = json_data + ',' + json.dumps(dic) | ||
|  | 
 | ||
|  |         json_data = json_data + ']' | ||
|  |         final_json = json.dumps({'status': 1, 'logstatus': 1, 'error_message': "None", "data": json_data}) | ||
|  |         return HttpResponse(final_json) | ||
|  | 
 | ||
|  |     def fetchErrorLogs(self, userID=None, data=None): | ||
|  | 
 | ||
|  |         currentACL = ACLManager.loadedACL(userID) | ||
|  |         admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |         self.domain = data['virtualHost'] | ||
|  |         page = data['page'] | ||
|  | 
 | ||
|  |         if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |             pass | ||
|  |         else: | ||
|  |             return ACLManager.loadErrorJson('logstatus', 0) | ||
|  | 
 | ||
|  |         fileName = "/home/" + self.domain + "/logs/" + self.domain + ".error_log" | ||
|  | 
 | ||
|  |         command = 'ls -la %s' % fileName | ||
|  |         result = ProcessUtilities.outputExecutioner(command) | ||
|  | 
 | ||
|  |         if result.find('->') > -1: | ||
|  |             final_json = json.dumps( | ||
|  |                 {'status': 0, 'logstatus': 0, | ||
|  |                  'error_message': "Symlink attack."}) | ||
|  |             return HttpResponse(final_json) | ||
|  | 
 | ||
|  |         ## get Logs | ||
|  |         website = Websites.objects.get(domain=self.domain) | ||
|  | 
 | ||
|  |         output = virtualHostUtilities.getErrorLogs(fileName, page, website.externalApp) | ||
|  | 
 | ||
|  |         if output.find("1,None") > -1: | ||
|  |             final_json = json.dumps( | ||
|  |                 {'status': 0, 'logstatus': 0, 'error_message': "Not able to fetch logs, see CyberPanel main log file!"}) | ||
|  |             return HttpResponse(final_json) | ||
|  | 
 | ||
|  |         ## get log ends here. | ||
|  | 
 | ||
|  |         final_json = json.dumps({'status': 1, 'logstatus': 1, 'error_message': "None", "data": output}) | ||
|  |         return HttpResponse(final_json) | ||
|  | 
 | ||
|  |     def getDataFromConfigFile(self, userID=None, data=None): | ||
|  | 
 | ||
|  |         currentACL = ACLManager.loadedACL(userID) | ||
|  |         admin = Administrator.objects.get(pk=userID) | ||
|  |         self.domain = data['virtualHost'] | ||
|  | 
 | ||
|  |         if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |             pass | ||
|  |         else: | ||
|  |             return ACLManager.loadErrorJson('configstatus', 0) | ||
|  | 
 | ||
|  |         command = 'cat %s' % ('/usr/local/lsws/conf/dvhost_redis.conf') | ||
|  | 
 | ||
|  |         if ProcessUtilities.outputExecutioner(command).find('127.0.0.1') == -1: | ||
|  |             filePath = installUtilities.Server_root_path + "/conf/vhosts/" + self.domain + "/vhost.conf" | ||
|  | 
 | ||
|  |             command = 'cat ' + filePath | ||
|  |             configData = ProcessUtilities.outputExecutioner(command, 'lsadm') | ||
|  | 
 | ||
|  |             if len(configData) == 0: | ||
|  |                 status = {'status': 0, "configstatus": 0, "error_message": "Configuration file is currently empty!"} | ||
|  | 
 | ||
|  |                 final_json = json.dumps(status) | ||
|  |                 return HttpResponse(final_json) | ||
|  | 
 | ||
|  |         else: | ||
|  |             command = 'redis-cli get "vhost:%s"' % (self.domain) | ||
|  |             configData = ProcessUtilities.outputExecutioner(command) | ||
|  |             configData = '#### This configuration is fetched from redis as Redis-Mass Hosting is being used.\n%s' % ( | ||
|  |                 configData) | ||
|  | 
 | ||
|  |         status = {'status': 1, "configstatus": 1, "configData": configData} | ||
|  |         final_json = json.dumps(status) | ||
|  |         return HttpResponse(final_json) | ||
|  | 
 | ||
|  |     def saveConfigsToFile(self, userID=None, data=None): | ||
|  | 
 | ||
|  |         currentACL = ACLManager.loadedACL(userID) | ||
|  | 
 | ||
|  |         if currentACL['admin'] != 1: | ||
|  |             return ACLManager.loadErrorJson('configstatus', 0) | ||
|  | 
 | ||
|  |         configData = data['configData'] | ||
|  |         self.domain = data['virtualHost'] | ||
|  | 
 | ||
|  |         if len(configData) == 0: | ||
|  |             status = {"configstatus": 0, 'error_message': 'Error: you are trying to save empty vhost file, your website will stop working.'} | ||
|  | 
 | ||
|  |             final_json = json.dumps(status) | ||
|  |             return HttpResponse(final_json) | ||
|  | 
 | ||
|  | 
 | ||
|  |         command = 'cat %s' % ('/usr/local/lsws/conf/dvhost_redis.conf') | ||
|  | 
 | ||
|  |         if ProcessUtilities.outputExecutioner(command).find('127.0.0.1') == -1: | ||
|  | 
 | ||
|  |             mailUtilities.checkHome() | ||
|  | 
 | ||
|  |             tempPath = "/home/cyberpanel/" + str(randint(1000, 9999)) | ||
|  | 
 | ||
|  |             vhost = open(tempPath, "w") | ||
|  | 
 | ||
|  |             vhost.write(configData) | ||
|  | 
 | ||
|  |             vhost.close() | ||
|  | 
 | ||
|  |             ## writing data temporary to file | ||
|  | 
 | ||
|  |             filePath = installUtilities.Server_root_path + "/conf/vhosts/" + self.domain + "/vhost.conf" | ||
|  | 
 | ||
|  |             ## save configuration data | ||
|  | 
 | ||
|  |             execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" | ||
|  |             execPath = execPath + " saveVHostConfigs --path " + filePath + " --tempPath " + tempPath | ||
|  | 
 | ||
|  |             output = ProcessUtilities.outputExecutioner(execPath) | ||
|  | 
 | ||
|  |             if output.find("1,None") > -1: | ||
|  |                 status = {"configstatus": 1} | ||
|  | 
 | ||
|  |                 final_json = json.dumps(status) | ||
|  |                 return HttpResponse(final_json) | ||
|  |             else: | ||
|  |                 data_ret = {'configstatus': 0, 'error_message': output} | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  | 
 | ||
|  |                 ## save configuration data ends | ||
|  |         else: | ||
|  |             command = "redis-cli set vhost:%s '%s'" % (self.domain, configData.replace( | ||
|  |                 '#### This configuration is fetched from redis as Redis-Mass Hosting is being used.\n', '')) | ||
|  |             ProcessUtilities.executioner(command) | ||
|  | 
 | ||
|  |             status = {"configstatus": 1} | ||
|  | 
 | ||
|  |             final_json = json.dumps(status) | ||
|  |             return HttpResponse(final_json) | ||
|  | 
 | ||
|  |     def getRewriteRules(self, userID=None, data=None): | ||
|  | 
 | ||
|  |         currentACL = ACLManager.loadedACL(userID) | ||
|  |         admin = Administrator.objects.get(pk=userID) | ||
|  |         self.domain = data['virtualHost'] | ||
|  | 
 | ||
|  |         if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |             pass | ||
|  |         else: | ||
|  |             return ACLManager.loadErrorJson('rewriteStatus', 0) | ||
|  | 
 | ||
|  |         try: | ||
|  |             childDom = ChildDomains.objects.get(domain=self.domain) | ||
|  |             filePath = childDom.path + '/.htaccess' | ||
|  |             externalApp = childDom.master.externalApp | ||
|  |         except: | ||
|  |             website = Websites.objects.get(domain=self.domain) | ||
|  |             externalApp = website.externalApp | ||
|  |             filePath = "/home/" + self.domain + "/public_html/.htaccess" | ||
|  | 
 | ||
|  |         try: | ||
|  |             command = 'cat %s' % (filePath) | ||
|  |             rewriteRules = ProcessUtilities.outputExecutioner(command, externalApp) | ||
|  | 
 | ||
|  |             if len(rewriteRules) == 0: | ||
|  |                 status = {"rewriteStatus": 1, "error_message": "Rules file is currently empty"} | ||
|  |                 final_json = json.dumps(status) | ||
|  |                 return HttpResponse(final_json) | ||
|  | 
 | ||
|  |             status = {"rewriteStatus": 1, "rewriteRules": rewriteRules} | ||
|  | 
 | ||
|  |             final_json = json.dumps(status) | ||
|  |             return HttpResponse(final_json) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             status = {"rewriteStatus": 1, "error_message": str(msg), "rewriteRules": ""} | ||
|  |             final_json = json.dumps(status) | ||
|  |             return HttpResponse(final_json) | ||
|  | 
 | ||
|  |     def saveRewriteRules(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  |             self.domain = data['virtualHost'] | ||
|  |             rewriteRules = data['rewriteRules'].encode('utf-8') | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('rewriteStatus', 0) | ||
|  | 
 | ||
|  |             ## writing data temporary to file | ||
|  | 
 | ||
|  |             mailUtilities.checkHome() | ||
|  |             tempPath = "/tmp/" + str(randint(1000, 9999)) | ||
|  |             vhost = open(tempPath, "wb") | ||
|  |             vhost.write(rewriteRules) | ||
|  |             vhost.close() | ||
|  | 
 | ||
|  |             ## writing data temporary to file | ||
|  | 
 | ||
|  |             try: | ||
|  |                 childDomain = ChildDomains.objects.get(domain=self.domain) | ||
|  |                 filePath = childDomain.path + '/.htaccess' | ||
|  |                 externalApp = childDomain.master.externalApp | ||
|  |             except: | ||
|  |                 filePath = "/home/" + self.domain + "/public_html/.htaccess" | ||
|  |                 website = Websites.objects.get(domain=self.domain) | ||
|  |                 externalApp = website.externalApp | ||
|  | 
 | ||
|  |             ## save configuration data | ||
|  | 
 | ||
|  |             command = 'cp %s %s' % (tempPath, filePath) | ||
|  |             ProcessUtilities.executioner(command, externalApp) | ||
|  | 
 | ||
|  |             command = 'rm -f %s' % (tempPath) | ||
|  |             ProcessUtilities.executioner(command, 'cyberpanel') | ||
|  | 
 | ||
|  |             installUtilities.reStartLiteSpeedSocket() | ||
|  |             status = {"rewriteStatus": 1, 'error_message': 'None'} | ||
|  |             final_json = json.dumps(status) | ||
|  |             return HttpResponse(final_json) | ||
|  |         except BaseException as msg: | ||
|  |             status = {"rewriteStatus": 0, 'error_message': str(msg)} | ||
|  |             final_json = json.dumps(status) | ||
|  |             return HttpResponse(final_json) | ||
|  | 
 | ||
|  |     def saveSSL(self, userID=None, data=None): | ||
|  | 
 | ||
|  |         currentACL = ACLManager.loadedACL(userID) | ||
|  |         admin = Administrator.objects.get(pk=userID) | ||
|  |         self.domain = data['virtualHost'] | ||
|  |         key = data['key'] | ||
|  |         cert = data['cert'] | ||
|  | 
 | ||
|  |         if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |             pass | ||
|  |         else: | ||
|  |             return ACLManager.loadErrorJson('sslStatus', 0) | ||
|  | 
 | ||
|  |         mailUtilities.checkHome() | ||
|  | 
 | ||
|  |         ## writing data temporary to file | ||
|  | 
 | ||
|  |         tempKeyPath = "/home/cyberpanel/" + str(randint(1000, 9999)) | ||
|  |         vhost = open(tempKeyPath, "w") | ||
|  |         vhost.write(key) | ||
|  |         vhost.close() | ||
|  | 
 | ||
|  |         tempCertPath = "/home/cyberpanel/" + str(randint(1000, 9999)) | ||
|  |         vhost = open(tempCertPath, "w") | ||
|  |         vhost.write(cert) | ||
|  |         vhost.close() | ||
|  | 
 | ||
|  |         ## writing data temporary to file | ||
|  | 
 | ||
|  |         execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" | ||
|  |         execPath = execPath + " saveSSL --virtualHostName " + self.domain + " --tempKeyPath " + tempKeyPath + " --tempCertPath " + tempCertPath | ||
|  |         output = ProcessUtilities.outputExecutioner(execPath) | ||
|  | 
 | ||
|  |         if output.find("1,None") > -1: | ||
|  |             data_ret = {'sslStatus': 1, 'error_message': "None"} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  |         else: | ||
|  |             logging.CyberCPLogFileWriter.writeToFile( | ||
|  |                 output) | ||
|  |             data_ret = {'sslStatus': 0, 'error_message': output} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def changePHP(self, userID=None, data=None): | ||
|  | 
 | ||
|  |         currentACL = ACLManager.loadedACL(userID) | ||
|  |         admin = Administrator.objects.get(pk=userID) | ||
|  |         self.domain = data['childDomain'] | ||
|  |         phpVersion = data['phpSelection'] | ||
|  | 
 | ||
|  |         if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |             pass | ||
|  |         else: | ||
|  |             return ACLManager.loadErrorJson('changePHP', 0) | ||
|  | 
 | ||
|  |         confPath = virtualHostUtilities.Server_root + "/conf/vhosts/" + self.domain | ||
|  |         completePathToConfigFile = confPath + "/vhost.conf" | ||
|  | 
 | ||
|  |         execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" | ||
|  |         execPath = execPath + " changePHP --phpVersion '" + phpVersion + "' --path " + completePathToConfigFile | ||
|  |         ProcessUtilities.popenExecutioner(execPath) | ||
|  | 
 | ||
|  |         try: | ||
|  |             website = Websites.objects.get(domain=self.domain) | ||
|  |             website.phpSelection = data['phpSelection'] | ||
|  |             website.save() | ||
|  | 
 | ||
|  |             ### check if there are any alias domains under the main website and then change php for them too | ||
|  | 
 | ||
|  |             for alias in website.childdomains_set.filter(alais=1): | ||
|  | 
 | ||
|  |                 try: | ||
|  | 
 | ||
|  |                     confPath = virtualHostUtilities.Server_root + "/conf/vhosts/" + alias.domain | ||
|  |                     completePathToConfigFile = confPath + "/vhost.conf" | ||
|  |                     execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" | ||
|  |                     execPath = execPath + " changePHP --phpVersion '" + phpVersion + "' --path " + completePathToConfigFile | ||
|  |                     ProcessUtilities.popenExecutioner(execPath) | ||
|  |                 except BaseException as msg: | ||
|  |                     logging.CyberCPLogFileWriter.writeToFile(f'Error changing PHP for alias: {str(msg)}') | ||
|  | 
 | ||
|  | 
 | ||
|  |         except: | ||
|  |             website = ChildDomains.objects.get(domain=self.domain) | ||
|  |             website.phpSelection = data['phpSelection'] | ||
|  |             website.save() | ||
|  | 
 | ||
|  |         data_ret = {'status': 1, 'changePHP': 1, 'error_message': "None"} | ||
|  |         json_data = json.dumps(data_ret) | ||
|  |         return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def getWebsiteCron(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  |             self.domain = data['domain'] | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('getWebsiteCron', 0) | ||
|  | 
 | ||
|  |             website = Websites.objects.get(domain=self.domain) | ||
|  | 
 | ||
|  |             if Websites.objects.filter(domain=self.domain).exists(): | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 dic = {'getWebsiteCron': 0, 'error_message': 'You do not own this domain'} | ||
|  |                 json_data = json.dumps(dic) | ||
|  |                 return HttpResponse(json_data) | ||
|  | 
 | ||
|  |             CronUtil.CronPrem(1) | ||
|  | 
 | ||
|  |             crons = [] | ||
|  | 
 | ||
|  |             execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/cronUtil.py" | ||
|  |             execPath = execPath + " getWebsiteCron --externalApp " + website.externalApp | ||
|  | 
 | ||
|  |             f = ProcessUtilities.outputExecutioner(execPath, website.externalApp) | ||
|  | 
 | ||
|  |             CronUtil.CronPrem(0) | ||
|  | 
 | ||
|  |             if ProcessUtilities.decideDistro() == ProcessUtilities.centos or ProcessUtilities.decideDistro() == ProcessUtilities.cent8: | ||
|  |                 cronPath = "/var/spool/cron/" + website.externalApp | ||
|  |             else: | ||
|  |                 cronPath = "/var/spool/cron/crontabs/" + website.externalApp | ||
|  | 
 | ||
|  |             if f.find('Permission denied') > -1: | ||
|  |                 command = 'chmod 644 %s' % (cronPath) | ||
|  |                 ProcessUtilities.executioner(command) | ||
|  | 
 | ||
|  |                 command = 'chown %s:%s %s' % (website.externalApp, website.externalApp, cronPath) | ||
|  |                 ProcessUtilities.executioner(command) | ||
|  | 
 | ||
|  |                 f = ProcessUtilities.outputExecutioner(execPath, website.externalApp) | ||
|  | 
 | ||
|  |             if f.find("0,CyberPanel,") > -1: | ||
|  |                 data_ret = {'getWebsiteCron': 0, "user": website.externalApp, "crons": {}} | ||
|  |                 final_json = json.dumps(data_ret) | ||
|  |                 return HttpResponse(final_json) | ||
|  | 
 | ||
|  |             counter = 0 | ||
|  |             for line in f.split("\n"): | ||
|  |                 if line: | ||
|  |                     split = line.split(" ", 5) | ||
|  |                     if len(split) == 6: | ||
|  |                         counter += 1 | ||
|  |                         crons.append({"line": counter, | ||
|  |                                       "minute": split[0], | ||
|  |                                       "hour": split[1], | ||
|  |                                       "monthday": split[2], | ||
|  |                                       "month": split[3], | ||
|  |                                       "weekday": split[4], | ||
|  |                                       "command": split[5]}) | ||
|  | 
 | ||
|  |             data_ret = {'getWebsiteCron': 1, "user": website.externalApp, "crons": crons} | ||
|  |             final_json = json.dumps(data_ret) | ||
|  |             return HttpResponse(final_json) | ||
|  |         except BaseException as msg: | ||
|  |             logging.CyberCPLogFileWriter.writeToFile(str(msg)) | ||
|  |             dic = {'getWebsiteCron': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(dic) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def getCronbyLine(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             self.domain = data['domain'] | ||
|  |             line = data['line'] | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('getWebsiteCron', 0) | ||
|  | 
 | ||
|  |             if Websites.objects.filter(domain=self.domain).exists(): | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 dic = {'getWebsiteCron': 0, 'error_message': 'You do not own this domain'} | ||
|  |                 json_data = json.dumps(dic) | ||
|  |                 return HttpResponse(json_data) | ||
|  | 
 | ||
|  |             line -= 1 | ||
|  |             website = Websites.objects.get(domain=self.domain) | ||
|  | 
 | ||
|  |             try: | ||
|  |                 CronUtil.CronPrem(1) | ||
|  |                 execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/cronUtil.py" | ||
|  |                 execPath = execPath + " getWebsiteCron --externalApp " + website.externalApp | ||
|  | 
 | ||
|  |                 f = ProcessUtilities.outputExecutioner(execPath, website.externalApp) | ||
|  |                 CronUtil.CronPrem(0) | ||
|  |             except subprocess.CalledProcessError as error: | ||
|  |                 dic = {'getWebsiteCron': 0, 'error_message': 'Unable to access Cron file'} | ||
|  |                 json_data = json.dumps(dic) | ||
|  |                 return HttpResponse(json_data) | ||
|  | 
 | ||
|  |             f = f.split("\n") | ||
|  |             cron = f[line] | ||
|  | 
 | ||
|  |             cron = cron.split(" ", 5) | ||
|  |             if len(cron) != 6: | ||
|  |                 dic = {'getWebsiteCron': 0, 'error_message': 'Cron line incorrect'} | ||
|  |                 json_data = json.dumps(dic) | ||
|  |                 return HttpResponse(json_data) | ||
|  | 
 | ||
|  |             data_ret = {"getWebsiteCron": 1, | ||
|  |                         "user": website.externalApp, | ||
|  |                         "cron": { | ||
|  |                             "minute": cron[0], | ||
|  |                             "hour": cron[1], | ||
|  |                             "monthday": cron[2], | ||
|  |                             "month": cron[3], | ||
|  |                             "weekday": cron[4], | ||
|  |                             "command": cron[5], | ||
|  |                         }, | ||
|  |                         "line": line} | ||
|  |             final_json = json.dumps(data_ret) | ||
|  |             return HttpResponse(final_json) | ||
|  |         except BaseException as msg: | ||
|  |             print(msg) | ||
|  |             dic = {'getWebsiteCron': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(dic) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def saveCronChanges(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             self.domain = data['domain'] | ||
|  |             line = data['line'] | ||
|  | 
 | ||
|  |             minute = data['minute'] | ||
|  |             hour = data['hour'] | ||
|  |             monthday = data['monthday'] | ||
|  |             month = data['month'] | ||
|  |             weekday = data['weekday'] | ||
|  |             command = data['cronCommand'] | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('getWebsiteCron', 0) | ||
|  | 
 | ||
|  |             website = Websites.objects.get(domain=self.domain) | ||
|  | 
 | ||
|  |             finalCron = "%s %s %s %s %s %s" % (minute, hour, monthday, month, weekday, command) | ||
|  | 
 | ||
|  |             CronUtil.CronPrem(1) | ||
|  | 
 | ||
|  |             execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/cronUtil.py" | ||
|  |             execPath = execPath + " saveCronChanges --externalApp " + website.externalApp + " --line " + str( | ||
|  |                 line) + " --finalCron '" + finalCron + "'" | ||
|  |             output = ProcessUtilities.outputExecutioner(execPath, website.externalApp) | ||
|  |             CronUtil.CronPrem(0) | ||
|  | 
 | ||
|  |             if output.find("1,") > -1: | ||
|  |                 data_ret = {"getWebsiteCron": 1, | ||
|  |                             "user": website.externalApp, | ||
|  |                             "cron": finalCron, | ||
|  |                             "line": line} | ||
|  |                 final_json = json.dumps(data_ret) | ||
|  |                 return HttpResponse(final_json) | ||
|  |             else: | ||
|  |                 dic = {'getWebsiteCron': 0, 'error_message': output} | ||
|  |                 json_data = json.dumps(dic) | ||
|  |                 return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             dic = {'getWebsiteCron': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(dic) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def remCronbyLine(self, userID=None, data=None): | ||
|  |         try: | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             self.domain = data['domain'] | ||
|  |             line = data['line'] | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('addNewCron', 0) | ||
|  | 
 | ||
|  |             website = Websites.objects.get(domain=self.domain) | ||
|  | 
 | ||
|  |             CronUtil.CronPrem(1) | ||
|  | 
 | ||
|  |             execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/cronUtil.py" | ||
|  |             execPath = execPath + " remCronbyLine --externalApp " + website.externalApp + " --line " + str( | ||
|  |                 line) | ||
|  |             output = ProcessUtilities.outputExecutioner(execPath, website.externalApp) | ||
|  | 
 | ||
|  |             CronUtil.CronPrem(0) | ||
|  | 
 | ||
|  |             if output.find("1,") > -1: | ||
|  |                 data_ret = {"remCronbyLine": 1, | ||
|  |                             "user": website.externalApp, | ||
|  |                             "removeLine": output.split(',')[1], | ||
|  |                             "line": line} | ||
|  |                 final_json = json.dumps(data_ret) | ||
|  |                 return HttpResponse(final_json) | ||
|  |             else: | ||
|  |                 dic = {'remCronbyLine': 0, 'error_message': output} | ||
|  |                 json_data = json.dumps(dic) | ||
|  |                 return HttpResponse(json_data) | ||
|  | 
 | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             dic = {'remCronbyLine': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(dic) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def addNewCron(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             self.domain = data['domain'] | ||
|  |             minute = data['minute'] | ||
|  |             hour = data['hour'] | ||
|  |             monthday = data['monthday'] | ||
|  |             month = data['month'] | ||
|  |             weekday = data['weekday'] | ||
|  |             command = data['cronCommand'] | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('addNewCron', 0) | ||
|  | 
 | ||
|  |             website = Websites.objects.get(domain=self.domain) | ||
|  | 
 | ||
|  |             if ProcessUtilities.decideDistro() == ProcessUtilities.centos or ProcessUtilities.decideDistro() == ProcessUtilities.cent8: | ||
|  |                 cronPath = "/var/spool/cron/" + website.externalApp | ||
|  |             else: | ||
|  |                 cronPath = "/var/spool/cron/crontabs/" + website.externalApp | ||
|  | 
 | ||
|  |             commandT = 'touch %s' % (cronPath) | ||
|  |             ProcessUtilities.executioner(commandT, 'root') | ||
|  |             commandT = 'chown %s:%s %s' % (website.externalApp, website.externalApp, cronPath) | ||
|  |             ProcessUtilities.executioner(commandT, 'root') | ||
|  | 
 | ||
|  |             CronUtil.CronPrem(1) | ||
|  | 
 | ||
|  |             finalCron = "%s %s %s %s %s %s" % (minute, hour, monthday, month, weekday, command) | ||
|  | 
 | ||
|  |             execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/cronUtil.py" | ||
|  |             execPath = execPath + " addNewCron --externalApp " + website.externalApp + " --finalCron '" + finalCron + "'" | ||
|  |             output = ProcessUtilities.outputExecutioner(execPath, website.externalApp) | ||
|  | 
 | ||
|  |             if ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu or ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu20: | ||
|  |                 command = 'chmod 600 %s' % (cronPath) | ||
|  |                 ProcessUtilities.executioner(command) | ||
|  | 
 | ||
|  |                 command = 'systemctl restart cron' | ||
|  |                 ProcessUtilities.executioner(command) | ||
|  | 
 | ||
|  |             CronUtil.CronPrem(0) | ||
|  | 
 | ||
|  |             if output.find("1,") > -1: | ||
|  | 
 | ||
|  |                 data_ret = {"addNewCron": 1, | ||
|  |                             "user": website.externalApp, | ||
|  |                             "cron": finalCron} | ||
|  |                 final_json = json.dumps(data_ret) | ||
|  |                 return HttpResponse(final_json) | ||
|  |             else: | ||
|  |                 dic = {'addNewCron': 0, 'error_message': output} | ||
|  |                 json_data = json.dumps(dic) | ||
|  |                 return HttpResponse(json_data) | ||
|  | 
 | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             dic = {'addNewCron': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(dic) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def submitAliasCreation(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             self.domain = data['masterDomain'] | ||
|  |             aliasDomain = data['aliasDomain'] | ||
|  |             ssl = data['ssl'] | ||
|  | 
 | ||
|  |             if not validators.domain(aliasDomain): | ||
|  |                 data_ret = {'status': 0, 'createAliasStatus': 0, 'error_message': "Invalid domain."} | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('createAliasStatus', 0) | ||
|  | 
 | ||
|  |             sslpath = "/home/" + self.domain + "/public_html" | ||
|  | 
 | ||
|  |             ## Create Configurations | ||
|  | 
 | ||
|  |             execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" | ||
|  | 
 | ||
|  |             execPath = execPath + " createAlias --masterDomain " + self.domain + " --aliasDomain " + aliasDomain + " --ssl " + str( | ||
|  |                 ssl) + " --sslPath " + sslpath + " --administratorEmail " + admin.email + ' --websiteOwner ' + admin.userName | ||
|  | 
 | ||
|  |             output = ProcessUtilities.outputExecutioner(execPath) | ||
|  | 
 | ||
|  |             if output.find("1,None") > -1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 data_ret = {'createAliasStatus': 0, 'error_message': output, "existsStatus": 0} | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  | 
 | ||
|  |             ## Create Configurations ends here | ||
|  | 
 | ||
|  |             data_ret = {'createAliasStatus': 1, 'error_message': "None", "existsStatus": 0} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'createAliasStatus': 0, 'error_message': str(msg), "existsStatus": 0} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def issueAliasSSL(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             self.domain = data['masterDomain'] | ||
|  |             aliasDomain = data['aliasDomain'] | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('sslStatus', 0) | ||
|  | 
 | ||
|  |             if ACLManager.AliasDomainCheck(currentACL, aliasDomain, self.domain) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('sslStatus', 0) | ||
|  | 
 | ||
|  |             sslpath = "/home/" + self.domain + "/public_html" | ||
|  | 
 | ||
|  |             ## Create Configurations | ||
|  | 
 | ||
|  |             execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" | ||
|  |             execPath = execPath + " issueAliasSSL --masterDomain " + self.domain + " --aliasDomain " + aliasDomain + " --sslPath " + sslpath + " --administratorEmail " + admin.email | ||
|  | 
 | ||
|  |             output = ProcessUtilities.outputExecutioner(execPath) | ||
|  | 
 | ||
|  |             if output.find("1,None") > -1: | ||
|  |                 data_ret = {'sslStatus': 1, 'error_message': "None", "existsStatus": 0} | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  |             else: | ||
|  |                 data_ret = {'sslStatus': 0, 'error_message': output, "existsStatus": 0} | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'sslStatus': 0, 'error_message': str(msg), "existsStatus": 0} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def delateAlias(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             self.domain = data['masterDomain'] | ||
|  |             aliasDomain = data['aliasDomain'] | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('deleteAlias', 0) | ||
|  | 
 | ||
|  |             if ACLManager.AliasDomainCheck(currentACL, aliasDomain, self.domain) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('deleteAlias', 0) | ||
|  | 
 | ||
|  |             ## Create Configurations | ||
|  | 
 | ||
|  |             execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" | ||
|  |             execPath = execPath + " deleteAlias --masterDomain " + self.domain + " --aliasDomain " + aliasDomain | ||
|  |             output = ProcessUtilities.outputExecutioner(execPath) | ||
|  | 
 | ||
|  |             if output.find("1,None") > -1: | ||
|  |                 data_ret = {'deleteAlias': 1, 'error_message': "None", "existsStatus": 0} | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  |             else: | ||
|  |                 data_ret = {'deleteAlias': 0, 'error_message': output, "existsStatus": 0} | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  | 
 | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'deleteAlias': 0, 'error_message': str(msg), "existsStatus": 0} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def changeOpenBasedir(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  | 
 | ||
|  |             self.domain = data['domainName'] | ||
|  |             openBasedirValue = data['openBasedirValue'] | ||
|  | 
 | ||
|  |             if currentACL['admin'] == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('changeOpenBasedir', 0) | ||
|  | 
 | ||
|  |             execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" | ||
|  |             execPath = execPath + " changeOpenBasedir --virtualHostName '" + self.domain + "' --openBasedirValue " + openBasedirValue | ||
|  |             output = ProcessUtilities.popenExecutioner(execPath) | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'changeOpenBasedir': 1, 'error_message': "None"} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'changeOpenBasedir': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def wordpressInstall(self, request=None, userID=None, data=None): | ||
|  |         currentACL = ACLManager.loadedACL(userID) | ||
|  |         admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |         if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |             pass | ||
|  |         else: | ||
|  |             return ACLManager.loadError() | ||
|  | 
 | ||
|  |         proc = httpProc(request, 'websiteFunctions/installWordPress.html', {'domainName': self.domain}) | ||
|  |         return proc.render() | ||
|  | 
 | ||
|  |     def installWordpress(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             self.domain = data['domain'] | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('installStatus', 0) | ||
|  | 
 | ||
|  |             mailUtilities.checkHome() | ||
|  | 
 | ||
|  |             extraArgs = {} | ||
|  |             extraArgs['admin'] = admin | ||
|  |             extraArgs['domainName'] = data['domain'] | ||
|  |             extraArgs['home'] = data['home'] | ||
|  |             extraArgs['blogTitle'] = data['blogTitle'] | ||
|  |             extraArgs['adminUser'] = data['adminUser'] | ||
|  |             extraArgs['adminPassword'] = data['passwordByPass'] | ||
|  |             extraArgs['adminEmail'] = data['adminEmail'] | ||
|  |             extraArgs['tempStatusPath'] = "/home/cyberpanel/" + str(randint(1000, 9999)) | ||
|  | 
 | ||
|  |             if data['home'] == '0': | ||
|  |                 extraArgs['path'] = data['path'] | ||
|  | 
 | ||
|  |             background = ApplicationInstaller('wordpress', extraArgs) | ||
|  |             background.start() | ||
|  | 
 | ||
|  |             time.sleep(2) | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'installStatus': 1, 'error_message': 'None', | ||
|  |                         'tempStatusPath': extraArgs['tempStatusPath']} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'installStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def installWordpressStatus(self, userID=None, data=None): | ||
|  |         try: | ||
|  |             statusFile = data['statusFile'] | ||
|  | 
 | ||
|  |             if ACLManager.CheckStatusFilleLoc(statusFile): | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 data_ret = {'abort': 1, 'installStatus': 0, 'installationProgress': "100", | ||
|  |                             'currentStatus': 'Invalid status file.'} | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  | 
 | ||
|  |             statusData = ProcessUtilities.outputExecutioner("cat " + statusFile).splitlines() | ||
|  | 
 | ||
|  |             lastLine = statusData[-1] | ||
|  | 
 | ||
|  |             if lastLine.find('[200]') > -1: | ||
|  |                 command = 'rm -f ' + statusFile | ||
|  |                 subprocess.call(shlex.split(command)) | ||
|  |                 data_ret = {'abort': 1, 'installStatus': 1, 'installationProgress': "100", | ||
|  |                             'currentStatus': 'Successfully Installed.'} | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  |             elif lastLine.find('[404]') > -1: | ||
|  |                 data_ret = {'abort': 1, 'installStatus': 0, 'installationProgress': "0", | ||
|  |                             'error_message': ProcessUtilities.outputExecutioner("cat " + statusFile).splitlines()} | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  |             else: | ||
|  |                 progress = lastLine.split(',') | ||
|  |                 currentStatus = progress[0] | ||
|  |                 try: | ||
|  |                     installationProgress = progress[1] | ||
|  |                 except: | ||
|  |                     installationProgress = 0 | ||
|  |                 data_ret = {'abort': 0, 'installStatus': 0, 'installationProgress': installationProgress, | ||
|  |                             'currentStatus': currentStatus} | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'abort': 0, 'installStatus': 0, 'installationProgress': "0", 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def joomlaInstall(self, request=None, userID=None, data=None): | ||
|  |         currentACL = ACLManager.loadedACL(userID) | ||
|  |         admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |         if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |             pass | ||
|  |         else: | ||
|  |             return ACLManager.loadError() | ||
|  | 
 | ||
|  |         proc = httpProc(request, 'websiteFunctions/installJoomla.html', {'domainName': self.domain}) | ||
|  |         return proc.render() | ||
|  | 
 | ||
|  |     def installJoomla(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             self.domain = data['domain'] | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('installStatus', 0) | ||
|  | 
 | ||
|  |             extraArgs = {} | ||
|  | 
 | ||
|  |             extraArgs['password'] = data['passwordByPass'] | ||
|  |             extraArgs['prefix'] = data['prefix'] | ||
|  |             extraArgs['domain'] = data['domain'] | ||
|  |             extraArgs['home'] = data['home'] | ||
|  |             extraArgs['siteName'] = data['siteName'] | ||
|  |             extraArgs['tempStatusPath'] = "/home/cyberpanel/" + str(randint(1000, 9999)) | ||
|  | 
 | ||
|  |             mailUtilities.checkHome() | ||
|  | 
 | ||
|  |             if data['home'] == '0': | ||
|  |                 extraArgs['path'] = data['path'] | ||
|  | 
 | ||
|  |             background = ApplicationInstaller('joomla', extraArgs) | ||
|  |             background.start() | ||
|  | 
 | ||
|  |             time.sleep(2) | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'installStatus': 1, 'error_message': 'None', | ||
|  |                         'tempStatusPath': extraArgs['tempStatusPath']} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |             ## Installation ends | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'installStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def setupGit(self, request=None, userID=None, data=None): | ||
|  |         currentACL = ACLManager.loadedACL(userID) | ||
|  |         admin = Administrator.objects.get(pk=userID) | ||
|  |         website = Websites.objects.get(domain=self.domain) | ||
|  | 
 | ||
|  |         if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |             pass | ||
|  |         else: | ||
|  |             return ACLManager.loadErrorJson() | ||
|  | 
 | ||
|  |         path = '/home/cyberpanel/' + self.domain + '.git' | ||
|  | 
 | ||
|  |         if os.path.exists(path): | ||
|  |             ipFile = "/etc/cyberpanel/machineIP" | ||
|  |             f = open(ipFile) | ||
|  |             ipData = f.read() | ||
|  |             ipAddress = ipData.split('\n', 1)[0] | ||
|  | 
 | ||
|  |             port = ProcessUtilities.fetchCurrentPort() | ||
|  | 
 | ||
|  |             webhookURL = 'https://' + ipAddress + ':%s/websites/' % (port) + self.domain + '/gitNotify' | ||
|  | 
 | ||
|  |             proc = httpProc(request, 'websiteFunctions/setupGit.html', | ||
|  |                             {'domainName': self.domain, 'installed': 1, 'webhookURL': webhookURL}) | ||
|  |             return proc.render() | ||
|  |         else: | ||
|  | 
 | ||
|  |             command = "ssh-keygen -f /home/%s/.ssh/%s -t rsa -N ''" % (self.domain, website.externalApp) | ||
|  |             ProcessUtilities.executioner(command, website.externalApp) | ||
|  | 
 | ||
|  |             ### | ||
|  | 
 | ||
|  |             configContent = """Host github.com
 | ||
|  | IdentityFile /home/%s/.ssh/%s | ||
|  | StrictHostKeyChecking no | ||
|  | """ % (self.domain, website.externalApp)
 | ||
|  | 
 | ||
|  |             path = "/home/cyberpanel/config" | ||
|  |             writeToFile = open(path, 'w') | ||
|  |             writeToFile.writelines(configContent) | ||
|  |             writeToFile.close() | ||
|  | 
 | ||
|  |             command = 'mv %s /home/%s/.ssh/config' % (path, self.domain) | ||
|  |             ProcessUtilities.executioner(command) | ||
|  | 
 | ||
|  |             command = 'chown %s:%s /home/%s/.ssh/config' % (website.externalApp, website.externalApp, self.domain) | ||
|  |             ProcessUtilities.executioner(command) | ||
|  | 
 | ||
|  |             command = 'cat /home/%s/.ssh/%s.pub' % (self.domain, website.externalApp) | ||
|  |             deploymentKey = ProcessUtilities.outputExecutioner(command, website.externalApp) | ||
|  | 
 | ||
|  |         proc = httpProc(request, 'websiteFunctions/setupGit.html', | ||
|  |                         {'domainName': self.domain, 'deploymentKey': deploymentKey, 'installed': 0}) | ||
|  |         return proc.render() | ||
|  | 
 | ||
|  |     def setupGitRepo(self, userID=None, data=None): | ||
|  |         try: | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             self.domain = data['domain'] | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('installStatus', 0) | ||
|  | 
 | ||
|  |             mailUtilities.checkHome() | ||
|  | 
 | ||
|  |             extraArgs = {} | ||
|  |             extraArgs['admin'] = admin | ||
|  |             extraArgs['domainName'] = data['domain'] | ||
|  |             extraArgs['username'] = data['username'] | ||
|  |             extraArgs['reponame'] = data['reponame'] | ||
|  |             extraArgs['branch'] = data['branch'] | ||
|  |             extraArgs['tempStatusPath'] = "/home/cyberpanel/" + str(randint(1000, 9999)) | ||
|  |             extraArgs['defaultProvider'] = data['defaultProvider'] | ||
|  | 
 | ||
|  |             background = ApplicationInstaller('git', extraArgs) | ||
|  |             background.start() | ||
|  | 
 | ||
|  |             time.sleep(2) | ||
|  | 
 | ||
|  |             data_ret = {'installStatus': 1, 'error_message': 'None', | ||
|  |                         'tempStatusPath': extraArgs['tempStatusPath']} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'installStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def gitNotify(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             extraArgs = {} | ||
|  |             extraArgs['domain'] = self.domain | ||
|  | 
 | ||
|  |             background = ApplicationInstaller('pull', extraArgs) | ||
|  |             background.start() | ||
|  | 
 | ||
|  |             data_ret = {'pulled': 1, 'error_message': 'None'} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'pulled': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def detachRepo(self, userID=None, data=None): | ||
|  |         try: | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             self.domain = data['domain'] | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson() | ||
|  | 
 | ||
|  |             mailUtilities.checkHome() | ||
|  | 
 | ||
|  |             extraArgs = {} | ||
|  |             extraArgs['domainName'] = data['domain'] | ||
|  |             extraArgs['admin'] = admin | ||
|  | 
 | ||
|  |             background = ApplicationInstaller('detach', extraArgs) | ||
|  |             background.start() | ||
|  | 
 | ||
|  |             time.sleep(2) | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'error_message': 'None'} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def changeBranch(self, userID=None, data=None): | ||
|  |         try: | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             self.domain = data['domain'] | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson() | ||
|  | 
 | ||
|  |             mailUtilities.checkHome() | ||
|  | 
 | ||
|  |             extraArgs = {} | ||
|  |             extraArgs['domainName'] = data['domain'] | ||
|  |             extraArgs['githubBranch'] = data['githubBranch'] | ||
|  |             extraArgs['admin'] = admin | ||
|  | 
 | ||
|  |             background = ApplicationInstaller('changeBranch', extraArgs) | ||
|  |             background.start() | ||
|  | 
 | ||
|  |             time.sleep(2) | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'error_message': 'None'} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def installPrestaShop(self, request=None, userID=None, data=None): | ||
|  |         currentACL = ACLManager.loadedACL(userID) | ||
|  |         admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |         if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |             pass | ||
|  |         else: | ||
|  |             return ACLManager.loadError() | ||
|  | 
 | ||
|  |         proc = httpProc(request, 'websiteFunctions/installPrestaShop.html', {'domainName': self.domain}) | ||
|  |         return proc.render() | ||
|  | 
 | ||
|  |     def installMagento(self, request=None, userID=None, data=None): | ||
|  |         currentACL = ACLManager.loadedACL(userID) | ||
|  |         admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |         if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |             pass | ||
|  |         else: | ||
|  |             return ACLManager.loadError() | ||
|  | 
 | ||
|  |         proc = httpProc(request, 'websiteFunctions/installMagento.html', {'domainName': self.domain}) | ||
|  |         return proc.render() | ||
|  | 
 | ||
|  |     def magentoInstall(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             self.domain = data['domain'] | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('installStatus', 0) | ||
|  | 
 | ||
|  |             mailUtilities.checkHome() | ||
|  | 
 | ||
|  |             extraArgs = {} | ||
|  |             extraArgs['admin'] = admin | ||
|  |             extraArgs['domainName'] = data['domain'] | ||
|  |             extraArgs['home'] = data['home'] | ||
|  |             extraArgs['firstName'] = data['firstName'] | ||
|  |             extraArgs['lastName'] = data['lastName'] | ||
|  |             extraArgs['username'] = data['username'] | ||
|  |             extraArgs['email'] = data['email'] | ||
|  |             extraArgs['password'] = data['passwordByPass'] | ||
|  |             extraArgs['sampleData'] = data['sampleData'] | ||
|  |             extraArgs['tempStatusPath'] = "/home/cyberpanel/" + str(randint(1000, 9999)) | ||
|  | 
 | ||
|  |             if data['home'] == '0': | ||
|  |                 extraArgs['path'] = data['path'] | ||
|  | 
 | ||
|  |             background = ApplicationInstaller('magento', extraArgs) | ||
|  |             background.start() | ||
|  | 
 | ||
|  |             time.sleep(2) | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'installStatus': 1, 'error_message': 'None', | ||
|  |                         'tempStatusPath': extraArgs['tempStatusPath']} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |             ## Installation ends | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'installStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def installMautic(self, request=None, userID=None, data=None): | ||
|  |         currentACL = ACLManager.loadedACL(userID) | ||
|  |         admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |         if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |             pass | ||
|  |         else: | ||
|  |             return ACLManager.loadError() | ||
|  | 
 | ||
|  |         proc = httpProc(request, 'websiteFunctions/installMautic.html', {'domainName': self.domain}) | ||
|  |         return proc.render() | ||
|  | 
 | ||
|  |     def mauticInstall(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             self.domain = data['domain'] | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('installStatus', 0) | ||
|  | 
 | ||
|  |             #### Before installing mautic change php to 8.1 | ||
|  | 
 | ||
|  |             completePathToConfigFile = f'/usr/local/lsws/conf/vhosts/{self.domain}/vhost.conf' | ||
|  | 
 | ||
|  |             execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" | ||
|  |             execPath = execPath + " changePHP --phpVersion 'PHP 8.1' --path " + completePathToConfigFile | ||
|  |             ProcessUtilities.executioner(execPath) | ||
|  | 
 | ||
|  |             mailUtilities.checkHome() | ||
|  | 
 | ||
|  |             extraArgs = {} | ||
|  |             extraArgs['admin'] = admin | ||
|  |             extraArgs['domainName'] = data['domain'] | ||
|  |             extraArgs['home'] = data['home'] | ||
|  |             extraArgs['username'] = data['username'] | ||
|  |             extraArgs['email'] = data['email'] | ||
|  |             extraArgs['password'] = data['passwordByPass'] | ||
|  |             extraArgs['tempStatusPath'] = "/home/cyberpanel/" + str(randint(1000, 9999)) | ||
|  | 
 | ||
|  |             if data['home'] == '0': | ||
|  |                 extraArgs['path'] = data['path'] | ||
|  | 
 | ||
|  |             background = ApplicationInstaller('mautic', extraArgs) | ||
|  |             background.start() | ||
|  | 
 | ||
|  |             time.sleep(2) | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'installStatus': 1, 'error_message': 'None', | ||
|  |                         'tempStatusPath': extraArgs['tempStatusPath']} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |             ## Installation ends | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'installStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def prestaShopInstall(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             self.domain = data['domain'] | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('installStatus', 0) | ||
|  | 
 | ||
|  |             mailUtilities.checkHome() | ||
|  | 
 | ||
|  |             extraArgs = {} | ||
|  |             extraArgs['admin'] = admin | ||
|  |             extraArgs['domainName'] = data['domain'] | ||
|  |             extraArgs['home'] = data['home'] | ||
|  |             extraArgs['shopName'] = data['shopName'] | ||
|  |             extraArgs['firstName'] = data['firstName'] | ||
|  |             extraArgs['lastName'] = data['lastName'] | ||
|  |             extraArgs['databasePrefix'] = data['databasePrefix'] | ||
|  |             extraArgs['email'] = data['email'] | ||
|  |             extraArgs['password'] = data['passwordByPass'] | ||
|  |             extraArgs['tempStatusPath'] = "/home/cyberpanel/" + str(randint(1000, 9999)) | ||
|  | 
 | ||
|  |             if data['home'] == '0': | ||
|  |                 extraArgs['path'] = data['path'] | ||
|  | 
 | ||
|  |             #### Before installing Prestashop change php to 8.3 | ||
|  | 
 | ||
|  |             completePathToConfigFile = f'/usr/local/lsws/conf/vhosts/{self.domain}/vhost.conf' | ||
|  | 
 | ||
|  |             execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" | ||
|  |             execPath = execPath + " changePHP --phpVersion 'PHP 8.3' --path " + completePathToConfigFile | ||
|  |             ProcessUtilities.executioner(execPath) | ||
|  | 
 | ||
|  |             background = ApplicationInstaller('prestashop', extraArgs) | ||
|  |             background.start() | ||
|  | 
 | ||
|  |             time.sleep(2) | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'installStatus': 1, 'error_message': 'None', | ||
|  |                         'tempStatusPath': extraArgs['tempStatusPath']} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |             ## Installation ends | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'installStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def createWebsiteAPI(self, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             adminUser = data['adminUser'] | ||
|  |             adminPass = data['adminPass'] | ||
|  |             adminEmail = data['ownerEmail'] | ||
|  |             websiteOwner = data['websiteOwner'] | ||
|  |             ownerPassword = data['ownerPassword'] | ||
|  |             data['ssl'] = 1 | ||
|  |             data['dkimCheck'] = 1 | ||
|  |             data['openBasedir'] = 1 | ||
|  |             data['adminEmail'] = data['ownerEmail'] | ||
|  | 
 | ||
|  |             try: | ||
|  |                 data['phpSelection'] = data['phpSelection'] | ||
|  |             except: | ||
|  |                 data['phpSelection'] = "PHP 7.4" | ||
|  | 
 | ||
|  |             data['package'] = data['packageName'] | ||
|  |             try: | ||
|  |                 websitesLimit = data['websitesLimit'] | ||
|  |             except: | ||
|  |                 websitesLimit = 1 | ||
|  | 
 | ||
|  |             try: | ||
|  |                 apiACL = data['acl'] | ||
|  |             except: | ||
|  |                 apiACL = 'user' | ||
|  | 
 | ||
|  |             admin = Administrator.objects.get(userName=adminUser) | ||
|  | 
 | ||
|  |             if hashPassword.check_password(admin.password, adminPass): | ||
|  | 
 | ||
|  |                 if adminEmail is None: | ||
|  |                     data['adminEmail'] = "example@example.org" | ||
|  | 
 | ||
|  |                 try: | ||
|  |                     acl = ACL.objects.get(name=apiACL) | ||
|  |                     websiteOwn = Administrator(userName=websiteOwner, | ||
|  |                                                password=hashPassword.hash_password(ownerPassword), | ||
|  |                                                email=adminEmail, type=3, owner=admin.pk, | ||
|  |                                                initWebsitesLimit=websitesLimit, acl=acl, api=1) | ||
|  |                     websiteOwn.save() | ||
|  |                 except BaseException: | ||
|  |                     pass | ||
|  | 
 | ||
|  |             else: | ||
|  |                 data_ret = {"existsStatus": 0, 'createWebSiteStatus': 0, | ||
|  |                             'error_message': "Could not authorize access to API"} | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  | 
 | ||
|  |             return self.submitWebsiteCreation(admin.pk, data) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'createWebSiteStatus': 0, 'error_message': str(msg), "existsStatus": 0} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def searchWebsitesJson(self, currentlACL, userID, searchTerm): | ||
|  | 
 | ||
|  |         websites = ACLManager.searchWebsiteObjects(currentlACL, userID, searchTerm) | ||
|  | 
 | ||
|  |         json_data = [] | ||
|  | 
 | ||
|  |         try: | ||
|  |             ipFile = "/etc/cyberpanel/machineIP" | ||
|  |             f = open(ipFile) | ||
|  |             ipData = f.read() | ||
|  |             ipAddress = ipData.split('\n', 1)[0] | ||
|  |         except BaseException as msg: | ||
|  |             logging.CyberCPLogFileWriter.writeToFile("Failed to read machine IP, error:" + str(msg)) | ||
|  |             ipAddress = "192.168.100.1" | ||
|  | 
 | ||
|  |         for items in websites: | ||
|  |             if items.state == 0: | ||
|  |                 state = "Suspended" | ||
|  |             else: | ||
|  |                 state = "Active" | ||
|  | 
 | ||
|  |             DiskUsage, DiskUsagePercentage, bwInMB, bwUsage = virtualHostUtilities.FindStats(items) | ||
|  | 
 | ||
|  |             vhFile = f'/usr/local/lsws/conf/vhosts/{items.domain}/vhost.conf' | ||
|  | 
 | ||
|  |             if os.path.exists(ProcessUtilities.debugPath): | ||
|  |                 logging.CyberCPLogFileWriter.writeToFile(vhFile) | ||
|  | 
 | ||
|  |             try: | ||
|  |                 from plogical.phpUtilities import phpUtilities | ||
|  |                 PHPVersionActual = phpUtilities.WrapGetPHPVersionFromFileToGetVersionWithPHP(vhFile) | ||
|  |             except: | ||
|  |                 PHPVersionActual = 'PHP 8.1' | ||
|  | 
 | ||
|  |             diskUsed = "%sMB" % str(DiskUsage) | ||
|  | 
 | ||
|  |             # Get WordPress sites for this website | ||
|  |             wp_sites = [] | ||
|  |             try: | ||
|  |                 wp_sites = WPSites.objects.filter(owner=items) | ||
|  |                 wp_sites = [{ | ||
|  |                     'id': wp.id, | ||
|  |                     'title': wp.title, | ||
|  |                     'url': wp.FinalURL, | ||
|  |                     'version': wp.version if hasattr(wp, 'version') else 'Unknown', | ||
|  |                     'phpVersion': wp.phpVersion if hasattr(wp, 'phpVersion') else 'Unknown' | ||
|  |                 } for wp in wp_sites] | ||
|  |             except: | ||
|  |                 pass | ||
|  | 
 | ||
|  |             json_data.append({ | ||
|  |                 'domain': items.domain, | ||
|  |                 'adminEmail': items.adminEmail, | ||
|  |                 'ipAddress': ipAddress, | ||
|  |                 'admin': items.admin.userName, | ||
|  |                 'package': items.package.packageName, | ||
|  |                 'state': state, | ||
|  |                 'diskUsed': diskUsed, | ||
|  |                 'phpVersion': PHPVersionActual, | ||
|  |                 'wp_sites': wp_sites | ||
|  |             }) | ||
|  | 
 | ||
|  |         return json.dumps(json_data) | ||
|  | 
 | ||
|  |     def findWebsitesJson(self, currentACL, userID, pageNumber): | ||
|  |         finalPageNumber = ((pageNumber * 10)) - 10 | ||
|  |         endPageNumber = finalPageNumber + 10 | ||
|  |         websites = ACLManager.findWebsiteObjects(currentACL, userID)[finalPageNumber:endPageNumber] | ||
|  | 
 | ||
|  |         json_data = "[" | ||
|  |         checker = 0 | ||
|  | 
 | ||
|  |         try: | ||
|  |             ipFile = "/etc/cyberpanel/machineIP" | ||
|  |             f = open(ipFile) | ||
|  |             ipData = f.read() | ||
|  |             ipAddress = ipData.split('\n', 1)[0] | ||
|  |         except BaseException as msg: | ||
|  |             logging.CyberCPLogFileWriter.writeToFile("Failed to read machine IP, error:" + str(msg)) | ||
|  |             ipAddress = "192.168.100.1" | ||
|  | 
 | ||
|  |         for items in websites: | ||
|  |             if items.state == 0: | ||
|  |                 state = "Suspended" | ||
|  |             else: | ||
|  |                 state = "Active" | ||
|  | 
 | ||
|  |             DiskUsage, DiskUsagePercentage, bwInMB, bwUsage = virtualHostUtilities.FindStats(items) | ||
|  | 
 | ||
|  |             diskUsed = "%sMB" % str(DiskUsage) | ||
|  | 
 | ||
|  |             dic = {'domain': items.domain, 'adminEmail': items.adminEmail, 'ipAddress': ipAddress, | ||
|  |                    'admin': items.admin.userName, 'package': items.package.packageName, 'state': state, | ||
|  |                    'diskUsed': diskUsed} | ||
|  | 
 | ||
|  |             if checker == 0: | ||
|  |                 json_data = json_data + json.dumps(dic) | ||
|  |                 checker = 1 | ||
|  |             else: | ||
|  |                 json_data = json_data + ',' + json.dumps(dic) | ||
|  | 
 | ||
|  |         json_data = json_data + ']' | ||
|  | 
 | ||
|  |         return json_data | ||
|  | 
 | ||
|  |     def websitePagination(self, currentACL, userID): | ||
|  |         websites = ACLManager.findAllSites(currentACL, userID) | ||
|  | 
 | ||
|  |         pages = float(len(websites)) / float(10) | ||
|  |         pagination = [] | ||
|  | 
 | ||
|  |         if pages <= 1.0: | ||
|  |             pages = 1 | ||
|  |             pagination.append('<li><a href="\#"></a></li>') | ||
|  |         else: | ||
|  |             pages = ceil(pages) | ||
|  |             finalPages = int(pages) + 1 | ||
|  | 
 | ||
|  |             for i in range(1, finalPages): | ||
|  |                 pagination.append('<li><a href="\#">' + str(i) + '</a></li>') | ||
|  | 
 | ||
|  |         return pagination | ||
|  | 
 | ||
|  |     def DockersitePagination(self, currentACL, userID): | ||
|  |         websites = DockerSites.objects.all() | ||
|  | 
 | ||
|  |         pages = float(len(websites)) / float(10) | ||
|  |         pagination = [] | ||
|  | 
 | ||
|  |         if pages <= 1.0: | ||
|  |             pages = 1 | ||
|  |             pagination.append('<li><a href="\#"></a></li>') | ||
|  |         else: | ||
|  |             pages = ceil(pages) | ||
|  |             finalPages = int(pages) + 1 | ||
|  | 
 | ||
|  |             for i in range(1, finalPages): | ||
|  |                 pagination.append('<li><a href="\#">' + str(i) + '</a></li>') | ||
|  | 
 | ||
|  |         return pagination | ||
|  | 
 | ||
|  |     def getSwitchStatus(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             try: | ||
|  |                 globalData = data['global'] | ||
|  | 
 | ||
|  |                 data = {} | ||
|  |                 data['status'] = 1 | ||
|  | 
 | ||
|  |                 if os.path.exists('/etc/httpd'): | ||
|  |                     data['server'] = 1 | ||
|  |                 else: | ||
|  |                     data['server'] = 0 | ||
|  | 
 | ||
|  |                 json_data = json.dumps(data) | ||
|  |                 return HttpResponse(json_data) | ||
|  |             except: | ||
|  |                 pass | ||
|  | 
 | ||
|  |             self.domain = data['domainName'] | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('status', 0) | ||
|  | 
 | ||
|  |             if ProcessUtilities.decideServer() == ProcessUtilities.OLS: | ||
|  |                 finalConfPath = ApacheVhost.configBasePath + self.domain + '.conf' | ||
|  | 
 | ||
|  |                 if os.path.exists(finalConfPath): | ||
|  | 
 | ||
|  |                     phpPath = ApacheVhost.whichPHPExists(self.domain) | ||
|  |                     command = 'sudo cat ' + phpPath | ||
|  |                     phpConf = ProcessUtilities.outputExecutioner(command).splitlines() | ||
|  |                     pmMaxChildren = phpConf[8].split(' ')[2] | ||
|  |                     pmStartServers = phpConf[9].split(' ')[2] | ||
|  |                     pmMinSpareServers = phpConf[10].split(' ')[2] | ||
|  |                     pmMaxSpareServers = phpConf[11].split(' ')[2] | ||
|  | 
 | ||
|  |                     data = {} | ||
|  |                     data['status'] = 1 | ||
|  | 
 | ||
|  |                     data['server'] = WebsiteManager.apache | ||
|  |                     data['pmMaxChildren'] = pmMaxChildren | ||
|  |                     data['pmStartServers'] = pmStartServers | ||
|  |                     data['pmMinSpareServers'] = pmMinSpareServers | ||
|  |                     data['pmMaxSpareServers'] = pmMaxSpareServers | ||
|  |                     data['phpPath'] = phpPath | ||
|  |                     data['configData'] = ProcessUtilities.outputExecutioner(f'cat {finalConfPath}') | ||
|  |                 else: | ||
|  |                     data = {} | ||
|  |                     data['status'] = 1 | ||
|  |                     data['server'] = WebsiteManager.ols | ||
|  | 
 | ||
|  |             else: | ||
|  |                 data = {} | ||
|  |                 data['status'] = 1 | ||
|  |                 data['server'] = WebsiteManager.lsws | ||
|  | 
 | ||
|  |             json_data = json.dumps(data) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'saveStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def switchServer(self, userID=None, data=None): | ||
|  | 
 | ||
|  |         currentACL = ACLManager.loadedACL(userID) | ||
|  |         admin = Administrator.objects.get(pk=userID) | ||
|  |         domainName = data['domainName'] | ||
|  |         phpVersion = data['phpSelection'] | ||
|  |         server = data['server'] | ||
|  | 
 | ||
|  |         if ACLManager.checkOwnership(domainName, admin, currentACL) == 1: | ||
|  |             pass | ||
|  |         else: | ||
|  |             return ACLManager.loadErrorJson() | ||
|  | 
 | ||
|  |         tempStatusPath = "/home/cyberpanel/" + str(randint(1000, 9999)) | ||
|  |         execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" | ||
|  |         execPath = execPath + " switchServer --phpVersion '" + phpVersion + "' --server " + str( | ||
|  |             server) + " --virtualHostName " + domainName + " --tempStatusPath " + tempStatusPath | ||
|  |         ProcessUtilities.popenExecutioner(execPath) | ||
|  | 
 | ||
|  |         time.sleep(3) | ||
|  | 
 | ||
|  |         data_ret = {'status': 1, 'tempStatusPath': tempStatusPath} | ||
|  |         json_data = json.dumps(data_ret) | ||
|  |         return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def tuneSettings(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  |             domainName = data['domainName'] | ||
|  |             pmMaxChildren = data['pmMaxChildren'] | ||
|  |             pmStartServers = data['pmStartServers'] | ||
|  |             pmMinSpareServers = data['pmMinSpareServers'] | ||
|  |             pmMaxSpareServers = data['pmMaxSpareServers'] | ||
|  |             phpPath = data['phpPath'] | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(domainName, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson() | ||
|  | 
 | ||
|  |             if int(pmStartServers) < int(pmMinSpareServers) or int(pmStartServers) > int(pmMinSpareServers): | ||
|  |                 data_ret = {'status': 0, | ||
|  |                             'error_message': 'pm.start_servers must not be less than pm.min_spare_servers and not greater than pm.max_spare_servers.'} | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  | 
 | ||
|  |             if int(pmMinSpareServers) > int(pmMaxSpareServers): | ||
|  |                 data_ret = {'status': 0, | ||
|  |                             'error_message': 'pm.max_spare_servers must not be less than pm.min_spare_servers'} | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  | 
 | ||
|  |             try: | ||
|  |                 website = Websites.objects.get(domain=domainName) | ||
|  |                 externalApp = website.externalApp | ||
|  |             except: | ||
|  |                 website = ChildDomains.objects.get(domain=domainName) | ||
|  |                 externalApp = website.master.externalApp | ||
|  | 
 | ||
|  |             tempStatusPath = "/home/cyberpanel/" + str(randint(1000, 9999)) | ||
|  | 
 | ||
|  |             if ProcessUtilities.decideDistro() == ProcessUtilities.centos or ProcessUtilities.decideDistro() == ProcessUtilities.cent8: | ||
|  |                 sockPath = '/var/run/php-fpm/' | ||
|  |                 group = 'nobody' | ||
|  |             else: | ||
|  |                 sockPath = '/var/run/php/' | ||
|  |                 group = 'nogroup' | ||
|  | 
 | ||
|  |             phpFPMConf = vhostConfs.phpFpmPoolReplace | ||
|  |             phpFPMConf = phpFPMConf.replace('{externalApp}', externalApp) | ||
|  |             phpFPMConf = phpFPMConf.replace('{pmMaxChildren}', pmMaxChildren) | ||
|  |             phpFPMConf = phpFPMConf.replace('{pmStartServers}', pmStartServers) | ||
|  |             phpFPMConf = phpFPMConf.replace('{pmMinSpareServers}', pmMinSpareServers) | ||
|  |             phpFPMConf = phpFPMConf.replace('{pmMaxSpareServers}', pmMaxSpareServers) | ||
|  |             phpFPMConf = phpFPMConf.replace('{www}', "".join(re.findall("[a-zA-Z]+", domainName))[:7]) | ||
|  |             phpFPMConf = phpFPMConf.replace('{Sock}', domainName) | ||
|  |             phpFPMConf = phpFPMConf.replace('{sockPath}', sockPath) | ||
|  |             phpFPMConf = phpFPMConf.replace('{group}', group) | ||
|  | 
 | ||
|  |             writeToFile = open(tempStatusPath, 'w') | ||
|  |             writeToFile.writelines(phpFPMConf) | ||
|  |             writeToFile.close() | ||
|  | 
 | ||
|  |             command = 'sudo mv %s %s' % (tempStatusPath, phpPath) | ||
|  |             ProcessUtilities.executioner(command) | ||
|  | 
 | ||
|  |             phpPath = phpPath.split('/') | ||
|  | 
 | ||
|  |             if os.path.exists(ProcessUtilities.debugPath): | ||
|  |                 logging.CyberCPLogFileWriter.writeToFile(f'PHP path in tune settings {phpPath}') | ||
|  | 
 | ||
|  |             if ProcessUtilities.decideDistro() == ProcessUtilities.centos or ProcessUtilities.decideDistro() == ProcessUtilities.cent8: | ||
|  |                 if phpPath[1] == 'etc': | ||
|  |                     phpVersion = phpPath[4][3] + phpPath[4][4] | ||
|  |                     phpVersion = f'PHP {phpPath[4][3]}.{phpPath[4][4]}' | ||
|  |                 else: | ||
|  |                     phpVersion = phpPath[3][3] + phpPath[3][4] | ||
|  |                     phpVersion = f'PHP {phpPath[3][3]}.{phpPath[3][4]}' | ||
|  |             else: | ||
|  |                 phpVersion = f'PHP {phpPath[2]}' | ||
|  | 
 | ||
|  |             # php = PHPManager.getPHPString(phpVersion) | ||
|  | 
 | ||
|  |             if os.path.exists(ProcessUtilities.debugPath): | ||
|  |                 logging.CyberCPLogFileWriter.writeToFile(f'PHP Version in tune settings {phpVersion}') | ||
|  | 
 | ||
|  |             phpService = ApacheVhost.DecideFPMServiceName(phpVersion) | ||
|  | 
 | ||
|  |             if os.path.exists(ProcessUtilities.debugPath): | ||
|  |                 logging.CyberCPLogFileWriter.writeToFile(f'PHP service in tune settings {phpService}') | ||
|  | 
 | ||
|  |             command = f"systemctl stop {phpService}" | ||
|  |             ProcessUtilities.normalExecutioner(command) | ||
|  | 
 | ||
|  |             command = f"systemctl restart {phpService}" | ||
|  |             ProcessUtilities.normalExecutioner(command) | ||
|  | 
 | ||
|  |             data_ret = {'status': 1} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def sshAccess(self, request=None, userID=None, data=None): | ||
|  |         currentACL = ACLManager.loadedACL(userID) | ||
|  |         admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |         if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |             pass | ||
|  |         else: | ||
|  |             return ACLManager.loadError() | ||
|  | 
 | ||
|  |         website = Websites.objects.get(domain=self.domain) | ||
|  |         externalApp = website.externalApp | ||
|  | 
 | ||
|  |         #### update jwt secret if needed | ||
|  | 
 | ||
|  |         import secrets | ||
|  |         import re | ||
|  |         import os | ||
|  |         from plogical.processUtilities import ProcessUtilities | ||
|  | 
 | ||
|  |         fastapi_file = '/usr/local/CyberCP/fastapi_ssh_server.py' | ||
|  |         from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter | ||
|  |         try: | ||
|  |              | ||
|  |             content = ProcessUtilities.outputExecutioner(f'cat {fastapi_file}') | ||
|  |             if 'REPLACE_ME_WITH_INSTALLER' in content: | ||
|  |                 new_secret = secrets.token_urlsafe(32) | ||
|  |                  | ||
|  |                 sed_cmd = f"sed -i 's|JWT_SECRET = \"REPLACE_ME_WITH_INSTALLER\"|JWT_SECRET = \"{new_secret}\"|' '{fastapi_file}'" | ||
|  |                 ProcessUtilities.outputExecutioner(sed_cmd) | ||
|  |                  | ||
|  |                 command = 'systemctl restart fastapi_ssh_server' | ||
|  |                 ProcessUtilities.outputExecutioner(command) | ||
|  |         except Exception: | ||
|  |             CyberCPLogFileWriter.writeLog(f"Failed to update JWT secret: {e}") | ||
|  |             pass | ||
|  | 
 | ||
|  |         ##### | ||
|  | 
 | ||
|  |         from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter | ||
|  |         # Ensure FastAPI SSH server systemd service file is in place | ||
|  |         try: | ||
|  |             service_path = '/etc/systemd/system/fastapi_ssh_server.service' | ||
|  |             local_service_path = 'fastapi_ssh_server.service' | ||
|  |             check_service = ProcessUtilities.outputExecutioner(f'test -f {service_path} && echo exists || echo missing') | ||
|  |             if 'missing' in check_service: | ||
|  |                 ProcessUtilities.outputExecutioner(f'cp /usr/local/CyberCP/fastapi_ssh_server.service {service_path}') | ||
|  |                 ProcessUtilities.outputExecutioner('systemctl daemon-reload') | ||
|  |         except Exception as e: | ||
|  |             CyberCPLogFileWriter.writeLog(f"Failed to copy or reload fastapi_ssh_server.service: {e}") | ||
|  | 
 | ||
|  |         # Ensure FastAPI SSH server is running using ProcessUtilities | ||
|  |         try: | ||
|  |             ProcessUtilities.outputExecutioner('systemctl is-active --quiet fastapi_ssh_server') | ||
|  |             ProcessUtilities.outputExecutioner('systemctl enable --now fastapi_ssh_server') | ||
|  |             ProcessUtilities.outputExecutioner('systemctl start fastapi_ssh_server') | ||
|  | 
 | ||
|  |             csfPath = '/etc/csf' | ||
|  | 
 | ||
|  |             sshPort = '8888' | ||
|  | 
 | ||
|  |             if os.path.exists(csfPath): | ||
|  |                     dataIn = {'protocol': 'TCP_IN', 'ports': sshPort} | ||
|  | 
 | ||
|  |                     # self.modifyPorts is a method in the firewallManager.py file so how can we call it here? | ||
|  |                     # we need to call the method from the firewallManager.py file | ||
|  |                     from firewall.firewallManager import FirewallManager | ||
|  |                     firewallManager = FirewallManager() | ||
|  |                     firewallManager.modifyPorts(dataIn) | ||
|  |                     dataIn = {'protocol': 'TCP_OUT', 'ports': sshPort} | ||
|  |                     firewallManager.modifyPorts(dataIn) | ||
|  |             else: | ||
|  |                 from plogical.firewallUtilities import FirewallUtilities | ||
|  |                 from firewall.models import FirewallRules | ||
|  |                 try: | ||
|  |                     updateFW = FirewallRules.objects.get(name="WebTerminalPort") | ||
|  |                     FirewallUtilities.deleteRule("tcp", updateFW.port, "0.0.0.0/0") | ||
|  |                     updateFW.port = sshPort | ||
|  |                     updateFW.save() | ||
|  |                     FirewallUtilities.addRule('tcp', sshPort, "0.0.0.0/0") | ||
|  |                 except: | ||
|  |                     try: | ||
|  |                         newFireWallRule = FirewallRules(name="WebTerminalPort", port=sshPort, proto="tcp") | ||
|  |                         newFireWallRule.save() | ||
|  |                         FirewallUtilities.addRule('tcp', sshPort, "0.0.0.0/0") | ||
|  |                     except BaseException as msg: | ||
|  |                         CyberCPLogFileWriter.writeToFile(str(msg)) | ||
|  | 
 | ||
|  |         except Exception as e: | ||
|  |             CyberCPLogFileWriter.writeLog(f"Failed to ensure fastapi_ssh_server is running: {e}") | ||
|  | 
 | ||
|  |         # Add-on check logic | ||
|  |         url = "https://platform.cyberpersons.com/CyberpanelAdOns/Adonpermission" | ||
|  |         data = { | ||
|  |             "name": "all", | ||
|  |             "IP": ACLManager.GetServerIP() | ||
|  |         } | ||
|  |         import requests | ||
|  |         import json | ||
|  |         try: | ||
|  |             response = requests.post(url, data=json.dumps(data)) | ||
|  |             Status = response.json().get('status', 0) | ||
|  |         except Exception: | ||
|  |             Status = 0 | ||
|  |         has_addons = (Status == 1) or ProcessUtilities.decideServer() == ProcessUtilities.ent | ||
|  | 
 | ||
|  |         from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter | ||
|  | 
 | ||
|  |         #CyberCPLogFileWriter.writeToFile(f"has_addons: {has_addons}") | ||
|  | 
 | ||
|  |         # SSL check | ||
|  |         cert_path = '/usr/local/lscp/conf/cert.pem' | ||
|  |         is_selfsigned = False | ||
|  |         ssl_issue_link = '/manageSSL/sslForHostName' | ||
|  |         try: | ||
|  |             import OpenSSL | ||
|  |             cert_content = ProcessUtilities.outputExecutioner(f'cat {cert_path}') | ||
|  |             cert = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, cert_content) | ||
|  |             ssl_provider = cert.get_issuer().get_components()[1][1].decode('utf-8') | ||
|  |             CyberCPLogFileWriter.writeToFile(f"ssl_provider: {ssl_provider}") | ||
|  |             if ssl_provider == 'Denial': | ||
|  |                 is_selfsigned = True | ||
|  |             else: | ||
|  |                 is_selfsigned = False | ||
|  |         except Exception as e: | ||
|  |             is_selfsigned = True  # If cert missing or unreadable, treat as self-signed | ||
|  |             CyberCPLogFileWriter.writeToFile(f"is_selfsigned: {is_selfsigned}. Error: {str(e)}") | ||
|  | 
 | ||
|  |         # Detect if accessed via IP | ||
|  |         accessed_via_ip = False | ||
|  |         try: | ||
|  |             host = request.get_host().split(':')[0]  # Remove port if present | ||
|  |             try: | ||
|  |                 ipaddress.ip_address(host) | ||
|  |                 accessed_via_ip = True | ||
|  |             except ValueError: | ||
|  |                 accessed_via_ip = False | ||
|  |         except Exception as e: | ||
|  |             accessed_via_ip = False | ||
|  |             CyberCPLogFileWriter.writeToFile(f"Error detecting accessed_via_ip: {str(e)}") | ||
|  | 
 | ||
|  |         proc = httpProc(request, 'websiteFunctions/sshAccess.html', | ||
|  |                         {'domainName': self.domain, 'externalApp': externalApp, 'has_addons': has_addons, 'is_selfsigned_ssl': is_selfsigned, 'ssl_issue_link': ssl_issue_link, 'accessed_via_ip': accessed_via_ip}) | ||
|  |         return proc.render() | ||
|  | 
 | ||
|  |     def saveSSHAccessChanges(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             self.domain = data['domain'] | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('status', 0) | ||
|  | 
 | ||
|  |             website = Websites.objects.get(domain=self.domain) | ||
|  | 
 | ||
|  |             # if website.externalApp != data['externalApp']: | ||
|  |             #     data_ret = {'status': 0, 'error_message': 'External app mis-match.'} | ||
|  |             #     json_data = json.dumps(data_ret) | ||
|  |             #     return HttpResponse(json_data) | ||
|  | 
 | ||
|  |             uBuntuPath = '/etc/lsb-release' | ||
|  | 
 | ||
|  |             if os.path.exists(uBuntuPath): | ||
|  |                 command = "echo '%s:%s' | chpasswd" % (website.externalApp, data['password']) | ||
|  |             else: | ||
|  |                 command = 'echo "%s" | passwd --stdin %s' % (data['password'], website.externalApp) | ||
|  | 
 | ||
|  |             ProcessUtilities.executioner(command) | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'error_message': 'None', 'LinuxUser': website.externalApp} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'installStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def setupStaging(self, request=None, userID=None, data=None): | ||
|  |         currentACL = ACLManager.loadedACL(userID) | ||
|  |         admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |         if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |             pass | ||
|  |         else: | ||
|  |             return ACLManager.loadError() | ||
|  | 
 | ||
|  |         website = Websites.objects.get(domain=self.domain) | ||
|  |         externalApp = website.externalApp | ||
|  | 
 | ||
|  |         proc = httpProc(request, 'websiteFunctions/setupStaging.html', | ||
|  |                         {'domainName': self.domain, 'externalApp': externalApp}) | ||
|  |         return proc.render() | ||
|  | 
 | ||
|  |     def startCloning(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             self.domain = data['masterDomain'] | ||
|  | 
 | ||
|  |             if not validators.domain(self.domain): | ||
|  |                 data_ret = {'status': 0, 'createWebSiteStatus': 0, 'error_message': "Invalid domain."} | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  | 
 | ||
|  |             if not validators.domain(data['domainName']): | ||
|  |                 data_ret = {'status': 0, 'createWebSiteStatus': 0, 'error_message': "Invalid domain."} | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('status', 0) | ||
|  | 
 | ||
|  |             extraArgs = {} | ||
|  |             extraArgs['domain'] = data['domainName'] | ||
|  |             extraArgs['masterDomain'] = data['masterDomain'] | ||
|  |             extraArgs['admin'] = admin | ||
|  | 
 | ||
|  |             tempStatusPath = "/tmp/" + str(randint(1000, 9999)) | ||
|  |             writeToFile = open(tempStatusPath, 'a') | ||
|  |             message = 'Cloning process has started..,5' | ||
|  |             writeToFile.write(message) | ||
|  |             writeToFile.close() | ||
|  | 
 | ||
|  |             extraArgs['tempStatusPath'] = tempStatusPath | ||
|  | 
 | ||
|  |             st = StagingSetup('startCloning', extraArgs) | ||
|  |             st.start() | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'error_message': 'None', 'tempStatusPath': tempStatusPath} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'installStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def syncToMaster(self, request=None, userID=None, data=None, childDomain=None): | ||
|  |         currentACL = ACLManager.loadedACL(userID) | ||
|  |         admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |         if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |             pass | ||
|  |         else: | ||
|  |             return ACLManager.loadError() | ||
|  | 
 | ||
|  |         website = Websites.objects.get(domain=self.domain) | ||
|  |         externalApp = website.externalApp | ||
|  | 
 | ||
|  |         proc = httpProc(request, 'websiteFunctions/syncMaster.html', | ||
|  |                         {'domainName': self.domain, 'externalApp': externalApp, 'childDomain': childDomain}) | ||
|  |         return proc.render() | ||
|  | 
 | ||
|  |     def startSync(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             if not validators.domain(data['childDomain']): | ||
|  |                 data_ret = {'status': 0, 'createWebSiteStatus': 0, 'error_message': "Invalid domain."} | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  | 
 | ||
|  |             self.domain = data['childDomain'] | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('status', 0) | ||
|  | 
 | ||
|  |             extraArgs = {} | ||
|  |             extraArgs['childDomain'] = data['childDomain'] | ||
|  |             try: | ||
|  |                 extraArgs['eraseCheck'] = data['eraseCheck'] | ||
|  |             except: | ||
|  |                 extraArgs['eraseCheck'] = False | ||
|  |             try: | ||
|  |                 extraArgs['dbCheck'] = data['dbCheck'] | ||
|  |             except: | ||
|  |                 extraArgs['dbCheck'] = False | ||
|  |             try: | ||
|  |                 extraArgs['copyChanged'] = data['copyChanged'] | ||
|  |             except: | ||
|  |                 extraArgs['copyChanged'] = False | ||
|  | 
 | ||
|  |             extraArgs['admin'] = admin | ||
|  | 
 | ||
|  |             tempStatusPath = "/tmp/" + str(randint(1000, 9999)) | ||
|  |             writeToFile = open(tempStatusPath, 'a') | ||
|  |             message = 'Syncing process has started..,5' | ||
|  |             writeToFile.write(message) | ||
|  |             writeToFile.close() | ||
|  | 
 | ||
|  |             extraArgs['tempStatusPath'] = tempStatusPath | ||
|  | 
 | ||
|  |             st = StagingSetup('startSyncing', extraArgs) | ||
|  |             st.start() | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'error_message': 'None', 'tempStatusPath': tempStatusPath} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'installStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def convertDomainToSite(self, userID=None, request=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             extraArgs = {} | ||
|  |             extraArgs['request'] = request | ||
|  |             extraArgs['tempStatusPath'] = "/home/cyberpanel/" + str(randint(1000, 9999)) | ||
|  |             background = ApplicationInstaller('convertDomainToSite', extraArgs) | ||
|  |             background.start() | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'createWebSiteStatus': 1, 'tempStatusPath': extraArgs['tempStatusPath']} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'createWebSiteStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def manageGIT(self, request=None, userID=None, data=None): | ||
|  |         currentACL = ACLManager.loadedACL(userID) | ||
|  |         admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |         if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |             pass | ||
|  |         else: | ||
|  |             return ACLManager.loadError() | ||
|  | 
 | ||
|  |         try: | ||
|  |             website = Websites.objects.get(domain=self.domain) | ||
|  |             folders = ['/home/%s/public_html' % (self.domain)] | ||
|  | 
 | ||
|  |             databases = website.databases_set.all() | ||
|  | 
 | ||
|  |             # for database in databases: | ||
|  |             #     basePath = '/var/lib/mysql/' | ||
|  |             #     folders.append('%s%s' % (basePath, database.dbName)) | ||
|  |         except: | ||
|  | 
 | ||
|  |             self.childWebsite = ChildDomains.objects.get(domain=self.domain) | ||
|  | 
 | ||
|  |             folders = [self.childWebsite.path] | ||
|  | 
 | ||
|  |             databases = self.childWebsite.master.databases_set.all() | ||
|  | 
 | ||
|  |             # for database in databases: | ||
|  |             #     basePath = '/var/lib/mysql/' | ||
|  |             #     folders.append('%s%s' % (basePath, database.dbName)) | ||
|  | 
 | ||
|  |         proc = httpProc(request, 'websiteFunctions/manageGIT.html', | ||
|  |                         {'domainName': self.domain, 'folders': folders}) | ||
|  |         return proc.render() | ||
|  | 
 | ||
|  |     def folderCheck(self): | ||
|  | 
 | ||
|  |         try: | ||
|  | 
 | ||
|  |             ### | ||
|  | 
 | ||
|  |             domainPath = '/home/%s/public_html' % (self.domain) | ||
|  |             vhRoot = '/home/%s' % (self.domain) | ||
|  |             vmailPath = '/home/vmail/%s' % (self.domain) | ||
|  | 
 | ||
|  |             ## | ||
|  | 
 | ||
|  |             try: | ||
|  | 
 | ||
|  |                 website = Websites.objects.get(domain=self.domain) | ||
|  | 
 | ||
|  |                 self.masterWebsite = website | ||
|  |                 self.masterDomain = website.domain | ||
|  |                 externalApp = website.externalApp | ||
|  |                 self.externalAppLocal = website.externalApp | ||
|  |                 self.adminEmail = website.adminEmail | ||
|  |                 self.firstName = website.admin.firstName | ||
|  |                 self.lastName = website.admin.lastName | ||
|  | 
 | ||
|  |                 self.home = 0 | ||
|  |                 if self.folder == '/home/%s/public_html' % (self.domain): | ||
|  |                     self.home = 1 | ||
|  | 
 | ||
|  |             except: | ||
|  | 
 | ||
|  |                 website = ChildDomains.objects.get(domain=self.domain) | ||
|  |                 self.masterWebsite = website.master | ||
|  |                 self.masterDomain = website.master.domain | ||
|  |                 externalApp = website.master.externalApp | ||
|  |                 self.externalAppLocal = website.master.externalApp | ||
|  |                 self.adminEmail = website.master.adminEmail | ||
|  |                 self.firstName = website.master.admin.firstName | ||
|  |                 self.lastName = website.master.admin.lastName | ||
|  | 
 | ||
|  |                 self.home = 0 | ||
|  |                 if self.folder == website.path: | ||
|  |                     self.home = 1 | ||
|  | 
 | ||
|  |             ### Fetch git configurations | ||
|  | 
 | ||
|  |             self.confCheck = 1 | ||
|  | 
 | ||
|  |             gitConfFolder = '/home/cyberpanel/git' | ||
|  |             gitConFile = '%s/%s' % (gitConfFolder, self.masterDomain) | ||
|  | 
 | ||
|  |             if not os.path.exists(gitConfFolder): | ||
|  |                 os.mkdir(gitConfFolder) | ||
|  | 
 | ||
|  |             if not os.path.exists(gitConFile): | ||
|  |                 os.mkdir(gitConFile) | ||
|  | 
 | ||
|  |             if os.path.exists(gitConFile): | ||
|  |                 files = os.listdir(gitConFile) | ||
|  | 
 | ||
|  |                 if len(files) >= 1: | ||
|  |                     for file in files: | ||
|  |                         self.finalFile = '%s/%s' % (gitConFile, file) | ||
|  | 
 | ||
|  |                         gitConf = json.loads(open(self.finalFile, 'r').read()) | ||
|  | 
 | ||
|  |                         if gitConf['folder'] == self.folder: | ||
|  | 
 | ||
|  |                             self.autoCommitCurrent = gitConf['autoCommit'] | ||
|  |                             self.autoPushCurrent = gitConf['autoPush'] | ||
|  |                             self.emailLogsCurrent = gitConf['emailLogs'] | ||
|  |                             try: | ||
|  |                                 self.commands = gitConf['commands'] | ||
|  |                             except: | ||
|  |                                 self.commands = "Add Commands to run after every commit, separate commands using comma." | ||
|  | 
 | ||
|  |                             try: | ||
|  |                                 self.webhookCommandCurrent = gitConf['webhookCommand'] | ||
|  |                             except: | ||
|  |                                 self.webhookCommandCurrent = "False" | ||
|  | 
 | ||
|  |                             self.confCheck = 0 | ||
|  |                             break | ||
|  | 
 | ||
|  |             if self.confCheck: | ||
|  |                 self.autoCommitCurrent = 'Never' | ||
|  |                 self.autoPushCurrent = 'Never' | ||
|  |                 self.emailLogsCurrent = 'False' | ||
|  |                 self.webhookCommandCurrent = 'False' | ||
|  |                 self.commands = "Add Commands to run after every commit, separate commands using comma." | ||
|  | 
 | ||
|  |             ## | ||
|  | 
 | ||
|  |             if self.folder == domainPath: | ||
|  |                 self.externalApp = externalApp | ||
|  |                 return 1 | ||
|  | 
 | ||
|  |             ## | ||
|  | 
 | ||
|  |             if self.folder == vhRoot: | ||
|  |                 self.externalApp = externalApp | ||
|  |                 return 1 | ||
|  | 
 | ||
|  |             ## | ||
|  | 
 | ||
|  |             try: | ||
|  |                 childDomain = ChildDomains.objects.get(domain=self.domain) | ||
|  | 
 | ||
|  |                 if self.folder == childDomain.path: | ||
|  |                     self.externalApp = externalApp | ||
|  |                     return 1 | ||
|  | 
 | ||
|  |             except: | ||
|  |                 pass | ||
|  | 
 | ||
|  |             ## | ||
|  | 
 | ||
|  |             if self.folder == vmailPath: | ||
|  |                 self.externalApp = 'vmail' | ||
|  |                 return 1 | ||
|  | 
 | ||
|  |             try: | ||
|  | 
 | ||
|  |                 for database in website.databases_set.all(): | ||
|  |                     self.externalApp = 'mysql' | ||
|  |                     basePath = '/var/lib/mysql/' | ||
|  |                     dbPath = '%s%s' % (basePath, database.dbName) | ||
|  | 
 | ||
|  |                     if self.folder == dbPath: | ||
|  |                         return 1 | ||
|  |             except: | ||
|  |                 for database in website.master.databases_set.all(): | ||
|  |                     self.externalApp = 'mysql' | ||
|  |                     basePath = '/var/lib/mysql/' | ||
|  |                     dbPath = '%s%s' % (basePath, database.dbName) | ||
|  | 
 | ||
|  |                     if self.folder == dbPath: | ||
|  |                         return 1 | ||
|  | 
 | ||
|  |             return 0 | ||
|  | 
 | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             logging.CyberCPLogFileWriter.writeToFile('%s. [folderCheck:3002]' % (str(msg))) | ||
|  | 
 | ||
|  |         return 0 | ||
|  | 
 | ||
|  |     def fetchFolderDetails(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             self.domain = data['domain'] | ||
|  |             self.folder = data['folder'] | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('status', 0) | ||
|  | 
 | ||
|  |             if self.folderCheck(): | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson() | ||
|  | 
 | ||
|  |             gitPath = '%s/.git' % (self.folder) | ||
|  |             command = 'ls -la %s' % (gitPath) | ||
|  | 
 | ||
|  |             if ProcessUtilities.outputExecutioner(command, self.externalAppLocal).find( | ||
|  |                     'No such file or directory') > -1: | ||
|  | 
 | ||
|  |                 command = 'cat /home/%s/.ssh/%s.pub' % (self.masterDomain, self.externalAppLocal) | ||
|  |                 deploymentKey = ProcessUtilities.outputExecutioner(command, self.externalAppLocal) | ||
|  | 
 | ||
|  |                 if deploymentKey.find('No such file or directory') > -1: | ||
|  |                     command = "ssh-keygen -f /home/%s/.ssh/%s -t rsa -N ''" % (self.masterDomain, self.externalAppLocal) | ||
|  |                     ProcessUtilities.executioner(command, self.externalAppLocal) | ||
|  | 
 | ||
|  |                     command = 'cat /home/%s/.ssh/%s.pub' % (self.masterDomain, self.externalAppLocal) | ||
|  |                     deploymentKey = ProcessUtilities.outputExecutioner(command, self.externalAppLocal) | ||
|  | 
 | ||
|  |                 data_ret = {'status': 1, 'repo': 0, 'deploymentKey': deploymentKey, 'home': self.home} | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  |             else: | ||
|  | 
 | ||
|  |                 ## Find git branches | ||
|  | 
 | ||
|  |                 command = 'git -C %s branch' % (self.folder) | ||
|  |                 branches = ProcessUtilities.outputExecutioner(command, self.externalAppLocal).split('\n')[:-1] | ||
|  | 
 | ||
|  |                 ## Fetch key | ||
|  | 
 | ||
|  |                 command = 'cat /home/%s/.ssh/%s.pub' % (self.domain, self.externalAppLocal) | ||
|  |                 deploymentKey = ProcessUtilities.outputExecutioner(command, self.externalAppLocal) | ||
|  | 
 | ||
|  |                 if deploymentKey.find('No such file or directory') > -1: | ||
|  |                     command = "ssh-keygen -f /home/%s/.ssh/%s -t rsa -N ''" % (self.masterDomain, self.externalAppLocal) | ||
|  |                     ProcessUtilities.executioner(command, self.externalAppLocal) | ||
|  | 
 | ||
|  |                     command = 'cat /home/%s/.ssh/%s.pub' % (self.masterDomain, self.externalAppLocal) | ||
|  |                     deploymentKey = ProcessUtilities.outputExecutioner(command, self.externalAppLocal) | ||
|  | 
 | ||
|  |                 ## Find Remote if any | ||
|  | 
 | ||
|  |                 command = 'git -C %s remote -v' % (self.folder) | ||
|  |                 remoteResult = ProcessUtilities.outputExecutioner(command, self.externalAppLocal) | ||
|  | 
 | ||
|  |                 remote = 1 | ||
|  |                 if remoteResult.find('origin') == -1: | ||
|  |                     remote = 0 | ||
|  |                     remoteResult = 'Remote currently not set.' | ||
|  | 
 | ||
|  |                 ## Find Total commits on current branch | ||
|  | 
 | ||
|  |                 command = 'git -C %s rev-list --count HEAD' % (self.folder) | ||
|  |                 totalCommits = ProcessUtilities.outputExecutioner(command, self.externalAppLocal) | ||
|  | 
 | ||
|  |                 if totalCommits.find('fatal') > -1: | ||
|  |                     totalCommits = '0' | ||
|  | 
 | ||
|  |                 ## | ||
|  | 
 | ||
|  |                 port = ProcessUtilities.fetchCurrentPort() | ||
|  | 
 | ||
|  |                 webHookURL = 'https://%s:%s/websites/%s/webhook' % (ACLManager.fetchIP(), port, self.domain) | ||
|  | 
 | ||
|  |                 data_ret = {'status': 1, 'repo': 1, 'finalBranches': branches, 'deploymentKey': deploymentKey, | ||
|  |                             'remote': remote, 'remoteResult': remoteResult, 'totalCommits': totalCommits, | ||
|  |                             'home': self.home, | ||
|  |                             'webHookURL': webHookURL, 'autoCommitCurrent': self.autoCommitCurrent, | ||
|  |                             'autoPushCurrent': self.autoPushCurrent, 'emailLogsCurrent': self.emailLogsCurrent, | ||
|  |                             'commands': self.commands, "webhookCommandCurrent": self.webhookCommandCurrent} | ||
|  | 
 | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'installStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def initRepo(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             self.domain = data['domain'] | ||
|  |             self.folder = data['folder'] | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('status', 0) | ||
|  | 
 | ||
|  |             if self.folderCheck(): | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson() | ||
|  | 
 | ||
|  |             website = Websites.objects.get(domain=self.masterDomain) | ||
|  | 
 | ||
|  |             command = 'git -C %s init' % (self.folder) | ||
|  |             result = ProcessUtilities.outputExecutioner(command, website.externalApp) | ||
|  | 
 | ||
|  |             if result.find('Initialized empty Git repository in') > -1: | ||
|  | 
 | ||
|  |                 command = 'git -C %s config --local user.email %s' % (self.folder, self.adminEmail) | ||
|  |                 ProcessUtilities.executioner(command, website.externalApp) | ||
|  | 
 | ||
|  |                 command = 'git -C %s config --local user.name "%s %s"' % ( | ||
|  |                     self.folder, self.firstName, self.lastName) | ||
|  |                 ProcessUtilities.executioner(command, website.externalApp) | ||
|  | 
 | ||
|  |                 ## Fix permissions | ||
|  | 
 | ||
|  |                 # from filemanager.filemanager import FileManager | ||
|  |                 # | ||
|  |                 # fm = FileManager(None, None) | ||
|  |                 # fm.fixPermissions(self.masterDomain) | ||
|  | 
 | ||
|  |                 data_ret = {'status': 1} | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  |             else: | ||
|  |                 data_ret = {'status': 0, 'error_message': result} | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'installStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def setupRemote(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             self.domain = data['domain'] | ||
|  |             self.folder = data['folder'] | ||
|  |             self.gitHost = data['gitHost'] | ||
|  |             self.gitUsername = data['gitUsername'] | ||
|  |             self.gitReponame = data['gitReponame'] | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('status', 0) | ||
|  | 
 | ||
|  |             ## Security checks | ||
|  | 
 | ||
|  |             if self.folderCheck(): | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson() | ||
|  | 
 | ||
|  |             if self.gitHost.find(':') > -1: | ||
|  |                 gitHostDomain = self.gitHost.split(':')[0] | ||
|  |                 gitHostPort = self.gitHost.split(':')[1] | ||
|  | 
 | ||
|  |                 if not validators.domain(gitHostDomain): | ||
|  |                     return ACLManager.loadErrorJson('status', 'Invalid characters in your input.') | ||
|  | 
 | ||
|  |                 try: | ||
|  |                     gitHostPort = int(gitHostPort) | ||
|  |                 except: | ||
|  |                     return ACLManager.loadErrorJson('status', 'Invalid characters in your input.') | ||
|  | 
 | ||
|  |             else: | ||
|  |                 if not validators.domain(self.gitHost): | ||
|  |                     return ACLManager.loadErrorJson('status', 'Invalid characters in your input.') | ||
|  | 
 | ||
|  |             if ACLManager.validateInput(self.gitUsername) and ACLManager.validateInput(self.gitReponame): | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('status', 'Invalid characters in your input.') | ||
|  | 
 | ||
|  |             ### set default ssh key | ||
|  | 
 | ||
|  |             command = 'git -C %s config --local core.sshCommand "ssh -i /home/%s/.ssh/%s -o "StrictHostKeyChecking=no""' % ( | ||
|  |                 self.folder, self.masterDomain, self.externalAppLocal) | ||
|  |             ProcessUtilities.executioner(command, self.externalAppLocal) | ||
|  | 
 | ||
|  |             ## Check if remote exists | ||
|  | 
 | ||
|  |             command = 'git -C %s remote -v' % (self.folder) | ||
|  |             remoteResult = ProcessUtilities.outputExecutioner(command, self.externalAppLocal) | ||
|  | 
 | ||
|  |             ## Set new remote | ||
|  | 
 | ||
|  |             if remoteResult.find('origin') == -1: | ||
|  |                 command = 'git -C %s remote add origin git@%s:%s/%s.git' % ( | ||
|  |                     self.folder, self.gitHost, self.gitUsername, self.gitReponame) | ||
|  |             else: | ||
|  |                 command = 'git -C %s remote set-url origin git@%s:%s/%s.git' % ( | ||
|  |                     self.folder, self.gitHost, self.gitUsername, self.gitReponame) | ||
|  | 
 | ||
|  |             possibleError = ProcessUtilities.outputExecutioner(command, self.externalAppLocal) | ||
|  | 
 | ||
|  |             ## Check if set correctly. | ||
|  | 
 | ||
|  |             command = 'git -C %s remote -v' % (self.folder) | ||
|  |             remoteResult = ProcessUtilities.outputExecutioner(command, self.externalAppLocal) | ||
|  | 
 | ||
|  |             if remoteResult.find(self.gitUsername) > -1: | ||
|  | 
 | ||
|  |                 # ## Fix permissions | ||
|  |                 # | ||
|  |                 # from filemanager.filemanager import FileManager | ||
|  |                 # | ||
|  |                 # fm = FileManager(None, None) | ||
|  |                 # fm.fixPermissions(self.masterDomain) | ||
|  | 
 | ||
|  |                 data_ret = {'status': 1} | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  |             else: | ||
|  |                 data_ret = {'status': 0, 'error_message': possibleError} | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'installStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def changeGitBranch(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             self.domain = data['domain'] | ||
|  |             self.folder = data['folder'] | ||
|  |             self.branchName = data['branchName'] | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('status', 0) | ||
|  | 
 | ||
|  |             if self.folderCheck(): | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson() | ||
|  | 
 | ||
|  |             ## Security check | ||
|  | 
 | ||
|  |             if ACLManager.validateInput(self.branchName): | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('status', 'Invalid characters in your input.') | ||
|  | 
 | ||
|  |             if self.branchName.find('*') > -1: | ||
|  |                 data_ret = {'status': 0, 'commandStatus': 'Already on this branch.', | ||
|  |                             'error_message': 'Already on this branch.'} | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  | 
 | ||
|  |             self.externalApp = ACLManager.FetchExternalApp(self.domain) | ||
|  | 
 | ||
|  |             command = 'git -C %s checkout %s' % (self.folder, self.branchName.strip(' ')) | ||
|  |             commandStatus = ProcessUtilities.outputExecutioner(command, self.externalApp) | ||
|  | 
 | ||
|  |             if commandStatus.find('Switched to branch') > -1: | ||
|  | 
 | ||
|  |                 # ## Fix permissions | ||
|  |                 # | ||
|  |                 # from filemanager.filemanager import FileManager | ||
|  |                 # | ||
|  |                 # fm = FileManager(None, None) | ||
|  |                 # fm.fixPermissions(self.masterDomain) | ||
|  | 
 | ||
|  |                 data_ret = {'status': 1, 'commandStatus': commandStatus + 'Refreshing page in 3 seconds..'} | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  |             else: | ||
|  |                 data_ret = {'status': 0, 'error_message': 'Failed to change branch', 'commandStatus': commandStatus} | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def createNewBranch(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             self.domain = data['domain'] | ||
|  |             self.folder = data['folder'] | ||
|  |             self.newBranchName = data['newBranchName'] | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('status', 0) | ||
|  | 
 | ||
|  |             if self.folderCheck(): | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson() | ||
|  | 
 | ||
|  |             ## Security check | ||
|  | 
 | ||
|  |             if ACLManager.validateInput(self.newBranchName): | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('status', 'Invalid characters in your input.') | ||
|  | 
 | ||
|  |             ## | ||
|  | 
 | ||
|  |             self.externalApp = ACLManager.FetchExternalApp(self.domain) | ||
|  | 
 | ||
|  |             command = 'git -C %s checkout -b "%s"' % (self.folder, self.newBranchName) | ||
|  |             commandStatus = ProcessUtilities.outputExecutioner(command, self.externalApp) | ||
|  | 
 | ||
|  |             if commandStatus.find(self.newBranchName) > -1: | ||
|  | 
 | ||
|  |                 # ## Fix permissions | ||
|  |                 # | ||
|  |                 # from filemanager.filemanager import FileManager | ||
|  |                 # | ||
|  |                 # fm = FileManager(None, None) | ||
|  |                 # fm.fixPermissions(self.masterDomain) | ||
|  | 
 | ||
|  |                 data_ret = {'status': 1, 'commandStatus': commandStatus} | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  |             else: | ||
|  |                 data_ret = {'status': 0, 'error_message': 'Failed to create branch', 'commandStatus': commandStatus} | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def commitChanges(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             self.domain = data['domain'] | ||
|  |             self.folder = data['folder'] | ||
|  |             self.commitMessage = data['commitMessage'] | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('status', 0) | ||
|  | 
 | ||
|  |             if self.folderCheck(): | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('status', 0) | ||
|  | 
 | ||
|  |             # security check | ||
|  | 
 | ||
|  |             if ACLManager.validateInput(self.commitMessage): | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson() | ||
|  | 
 | ||
|  |             self.externalApp = ACLManager.FetchExternalApp(self.domain) | ||
|  | 
 | ||
|  |             ## Check if remote exists | ||
|  | 
 | ||
|  |             command = 'git -C %s add -A' % (self.folder) | ||
|  |             ProcessUtilities.outputExecutioner(command, self.externalApp) | ||
|  | 
 | ||
|  |             command = 'git -C %s commit -m "%s"' % (self.folder, self.commitMessage.replace('"', '')) | ||
|  |             commandStatus = ProcessUtilities.outputExecutioner(command, self.externalApp) | ||
|  | 
 | ||
|  |             if commandStatus.find('nothing to commit') == -1: | ||
|  | 
 | ||
|  |                 try: | ||
|  |                     if self.commands != 'NONE': | ||
|  | 
 | ||
|  |                         GitLogs(owner=self.masterWebsite, type='INFO', | ||
|  |                                 message='Running commands after successful git commit..').save() | ||
|  | 
 | ||
|  |                         if self.commands.find('\n') > -1: | ||
|  |                             commands = self.commands.split('\n') | ||
|  | 
 | ||
|  |                             for command in commands: | ||
|  |                                 GitLogs(owner=self.masterWebsite, type='INFO', | ||
|  |                                         message='Running: %s' % (command)).save() | ||
|  | 
 | ||
|  |                                 result = ProcessUtilities.outputExecutioner(command, self.externalAppLocal) | ||
|  |                                 GitLogs(owner=self.masterWebsite, type='INFO', | ||
|  |                                         message='Result: %s' % (result)).save() | ||
|  |                         else: | ||
|  |                             GitLogs(owner=self.masterWebsite, type='INFO', | ||
|  |                                     message='Running: %s' % (self.commands)).save() | ||
|  | 
 | ||
|  |                             result = ProcessUtilities.outputExecutioner(self.commands, self.externalAppLocal) | ||
|  |                             GitLogs(owner=self.masterWebsite, type='INFO', | ||
|  |                                     message='Result: %s' % (result)).save() | ||
|  | 
 | ||
|  |                         GitLogs(owner=self.masterWebsite, type='INFO', | ||
|  |                                 message='Finished running commands.').save() | ||
|  |                 except: | ||
|  |                     pass | ||
|  | 
 | ||
|  |                 ## Fix permissions | ||
|  | 
 | ||
|  |                 # from filemanager.filemanager import FileManager | ||
|  |                 # | ||
|  |                 # fm = FileManager(None, None) | ||
|  |                 # fm.fixPermissions(self.masterDomain) | ||
|  | 
 | ||
|  |                 data_ret = {'status': 1, 'commandStatus': commandStatus} | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  |             else: | ||
|  |                 data_ret = {'status': 0, 'error_message': 'Nothing to commit.', 'commandStatus': commandStatus} | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'error_message': str(msg), 'commandStatus': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def gitPull(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             self.domain = data['domain'] | ||
|  |             self.folder = data['folder'] | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('status', 0) | ||
|  | 
 | ||
|  |             if self.folderCheck(): | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson() | ||
|  | 
 | ||
|  |             self.externalApp = ACLManager.FetchExternalApp(self.domain) | ||
|  | 
 | ||
|  |             ### set default ssh key | ||
|  | 
 | ||
|  |             command = 'git -C %s config --local core.sshCommand "ssh -i /home/%s/.ssh/%s -o "StrictHostKeyChecking=no""' % ( | ||
|  |                 self.folder, self.masterDomain, self.externalAppLocal) | ||
|  |             ProcessUtilities.executioner(command, self.externalApp) | ||
|  | 
 | ||
|  |             ## Check if remote exists | ||
|  | 
 | ||
|  |             command = 'git -C %s pull' % (self.folder) | ||
|  |             commandStatus = ProcessUtilities.outputExecutioner(command, self.externalApp) | ||
|  | 
 | ||
|  |             if commandStatus.find('Already up to date') == -1: | ||
|  | 
 | ||
|  |                 ## Fix permissions | ||
|  | 
 | ||
|  |                 # from filemanager.filemanager import FileManager | ||
|  |                 # | ||
|  |                 # fm = FileManager(None, None) | ||
|  |                 # fm.fixPermissions(self.masterDomain) | ||
|  | 
 | ||
|  |                 data_ret = {'status': 1, 'commandStatus': commandStatus} | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  |             else: | ||
|  |                 data_ret = {'status': 0, 'error_message': 'Pull not required.', 'commandStatus': commandStatus} | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def gitPush(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             self.domain = data['domain'] | ||
|  |             self.folder = data['folder'] | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('status', 0) | ||
|  | 
 | ||
|  |             if self.folderCheck(): | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson() | ||
|  | 
 | ||
|  |             self.externalApp = ACLManager.FetchExternalApp(self.domain) | ||
|  | 
 | ||
|  |             ### set default ssh key | ||
|  | 
 | ||
|  |             command = 'git -C %s config --local core.sshCommand "ssh -i /home/%s/.ssh/%s -o "StrictHostKeyChecking=no""' % ( | ||
|  |                 self.folder, self.masterDomain, self.externalAppLocal) | ||
|  |             ProcessUtilities.executioner(command, self.externalApp) | ||
|  | 
 | ||
|  |             ## | ||
|  | 
 | ||
|  |             command = 'git -C %s push' % (self.folder) | ||
|  |             commandStatus = ProcessUtilities.outputExecutioner(command, self.externalApp, False) | ||
|  | 
 | ||
|  |             if commandStatus.find('has no upstream branch') > -1: | ||
|  |                 command = 'git -C %s rev-parse --abbrev-ref HEAD' % (self.folder) | ||
|  |                 currentBranch = ProcessUtilities.outputExecutioner(command, self.externalApp, False).rstrip('\n') | ||
|  | 
 | ||
|  |                 if currentBranch.find('fatal: ambiguous argument') > -1: | ||
|  |                     data_ret = {'status': 0, 'error_message': 'You need to commit first.', | ||
|  |                                 'commandStatus': 'You need to commit first.'} | ||
|  |                     json_data = json.dumps(data_ret) | ||
|  |                     return HttpResponse(json_data) | ||
|  | 
 | ||
|  |                 command = 'git -C %s push --set-upstream origin %s' % (self.folder, currentBranch) | ||
|  |                 commandStatus = ProcessUtilities.outputExecutioner(command, self.externalApp, False) | ||
|  | 
 | ||
|  |             if commandStatus.find('Everything up-to-date') == -1 and commandStatus.find( | ||
|  |                     'rejected') == -1 and commandStatus.find('Permission denied') == -1: | ||
|  |                 data_ret = {'status': 1, 'commandStatus': commandStatus} | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  |             else: | ||
|  |                 data_ret = {'status': 0, 'error_message': 'Push failed.', 'commandStatus': commandStatus} | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'error_message': str(msg), 'commandStatus': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def attachRepoGIT(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             self.domain = data['domain'] | ||
|  |             self.folder = data['folder'] | ||
|  |             self.gitHost = data['gitHost'] | ||
|  |             self.gitUsername = data['gitUsername'] | ||
|  |             self.gitReponame = data['gitReponame'] | ||
|  | 
 | ||
|  |             try: | ||
|  |                 self.overrideData = data['overrideData'] | ||
|  |             except: | ||
|  |                 self.overrideData = False | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('status', 0) | ||
|  | 
 | ||
|  |             if self.folderCheck(): | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson() | ||
|  | 
 | ||
|  |             if self.gitHost.find(':') > -1: | ||
|  |                 gitHostDomain = self.gitHost.split(':')[0] | ||
|  |                 gitHostPort = self.gitHost.split(':')[1] | ||
|  | 
 | ||
|  |                 if not validators.domain(gitHostDomain): | ||
|  |                     return ACLManager.loadErrorJson('status', 'Invalid characters in your input.') | ||
|  | 
 | ||
|  |                 try: | ||
|  |                     gitHostPort = int(gitHostPort) | ||
|  |                 except: | ||
|  |                     return ACLManager.loadErrorJson('status', 'Invalid characters in your input.') | ||
|  |             else: | ||
|  |                 if not validators.domain(self.gitHost): | ||
|  |                     return ACLManager.loadErrorJson('status', 'Invalid characters in your input.') | ||
|  | 
 | ||
|  |             ## Security check | ||
|  | 
 | ||
|  |             if ACLManager.validateInput(self.gitUsername) and ACLManager.validateInput(self.gitReponame): | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('status', 'Invalid characters in your input.') | ||
|  | 
 | ||
|  |             ## | ||
|  | 
 | ||
|  |             self.externalApp = ACLManager.FetchExternalApp(self.domain) | ||
|  | 
 | ||
|  |             if self.overrideData: | ||
|  |                 command = 'rm -rf %s' % (self.folder) | ||
|  |                 ProcessUtilities.executioner(command, self.externalApp) | ||
|  | 
 | ||
|  |             ## Set defauly key | ||
|  | 
 | ||
|  |             command = 'git config --global core.sshCommand "ssh -i /home/%s/.ssh/%s -o "StrictHostKeyChecking=no""' % ( | ||
|  |                 self.masterDomain, self.externalAppLocal) | ||
|  |             ProcessUtilities.executioner(command, self.externalApp) | ||
|  | 
 | ||
|  |             ## | ||
|  | 
 | ||
|  |             command = 'git clone git@%s:%s/%s.git %s' % (self.gitHost, self.gitUsername, self.gitReponame, self.folder) | ||
|  |             commandStatus = ProcessUtilities.outputExecutioner(command, self.externalApp) | ||
|  | 
 | ||
|  |             if commandStatus.find('already exists') == -1 and commandStatus.find('Permission denied') == -1: | ||
|  | 
 | ||
|  |                 # from filemanager.filemanager import FileManager | ||
|  |                 # | ||
|  |                 # fm = FileManager(None, None) | ||
|  |                 # fm.fixPermissions(self.masterDomain) | ||
|  | 
 | ||
|  |                 command = 'git -C %s config --local user.email %s' % (self.folder, self.adminEmail) | ||
|  |                 ProcessUtilities.executioner(command, self.externalApp) | ||
|  | 
 | ||
|  |                 command = 'git -C %s config --local user.name "%s %s"' % (self.folder, self.firstName, self.lastName) | ||
|  |                 ProcessUtilities.executioner(command, self.externalApp) | ||
|  | 
 | ||
|  |                 data_ret = {'status': 1, 'commandStatus': commandStatus} | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  | 
 | ||
|  |             else: | ||
|  | 
 | ||
|  |                 # from filemanager.filemanager import FileManager | ||
|  |                 # | ||
|  |                 # fm = FileManager(None, None) | ||
|  |                 # fm.fixPermissions(self.masterDomain) | ||
|  | 
 | ||
|  |                 data_ret = {'status': 0, 'error_message': 'Failed to clone.', 'commandStatus': commandStatus} | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def removeTracking(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             self.domain = data['domain'] | ||
|  |             self.folder = data['folder'] | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('status', 0) | ||
|  | 
 | ||
|  |             if self.folderCheck(): | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson() | ||
|  | 
 | ||
|  |             self.externalApp = ACLManager.FetchExternalApp(self.domain) | ||
|  | 
 | ||
|  |             command = 'rm -rf %s/.git' % (self.folder) | ||
|  |             ProcessUtilities.executioner(command, self.externalApp) | ||
|  | 
 | ||
|  |             gitConfFolder = '/home/cyberpanel/git' | ||
|  |             gitConFile = '%s/%s' % (gitConfFolder, self.masterDomain) | ||
|  |             finalFile = '%s/%s' % (gitConFile, self.folder.split('/')[-1]) | ||
|  | 
 | ||
|  |             command = 'rm -rf %s' % (finalFile) | ||
|  |             ProcessUtilities.outputExecutioner(command, self.externalApp) | ||
|  | 
 | ||
|  |             ## Fix permissions | ||
|  | 
 | ||
|  |             # from filemanager.filemanager import FileManager | ||
|  |             # | ||
|  |             # fm = FileManager(None, None) | ||
|  |             # fm.fixPermissions(self.masterDomain) | ||
|  | 
 | ||
|  |             data_ret = {'status': 1} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def fetchGitignore(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             self.domain = data['domain'] | ||
|  |             self.folder = data['folder'] | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('status', 0) | ||
|  | 
 | ||
|  |             if self.folderCheck(): | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson() | ||
|  | 
 | ||
|  |             command = 'cat %s/.gitignore' % (self.folder) | ||
|  |             gitIgnoreContent = ProcessUtilities.outputExecutioner(command, self.externalAppLocal) | ||
|  | 
 | ||
|  |             if gitIgnoreContent.find('No such file or directory') > -1: | ||
|  |                 gitIgnoreContent = 'File is currently empty.' | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'gitIgnoreContent': gitIgnoreContent} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def saveGitIgnore(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             self.domain = data['domain'] | ||
|  |             self.folder = data['folder'] | ||
|  |             self.gitIgnoreContent = data['gitIgnoreContent'] | ||
|  | 
 | ||
|  |             tempPath = "/home/cyberpanel/" + str(randint(1000, 9999)) | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('status', 0) | ||
|  | 
 | ||
|  |             if self.folderCheck(): | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson() | ||
|  | 
 | ||
|  |             ## Write to temp file | ||
|  | 
 | ||
|  |             writeToFile = open(tempPath, 'w') | ||
|  |             writeToFile.write(self.gitIgnoreContent) | ||
|  |             writeToFile.close() | ||
|  | 
 | ||
|  |             ## Move to original file | ||
|  | 
 | ||
|  |             self.externalApp = ACLManager.FetchExternalApp(self.domain) | ||
|  | 
 | ||
|  |             command = 'mv %s %s/.gitignore' % (tempPath, self.folder) | ||
|  |             ProcessUtilities.executioner(command, self.externalApp) | ||
|  | 
 | ||
|  |             ## Fix permissions | ||
|  | 
 | ||
|  |             # from filemanager.filemanager import FileManager | ||
|  |             # | ||
|  |             # fm = FileManager(None, None) | ||
|  |             # fm.fixPermissions(self.masterDomain) | ||
|  | 
 | ||
|  |             data_ret = {'status': 1} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def fetchCommits(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             self.domain = data['domain'] | ||
|  |             self.folder = data['folder'] | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('status', 0) | ||
|  | 
 | ||
|  |             if self.folderCheck(): | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson() | ||
|  | 
 | ||
|  |             initCommand = """log --pretty=format:"%h|%s|%cn|%cd" -50""" | ||
|  | 
 | ||
|  |             self.externalApp = ACLManager.FetchExternalApp(self.domain) | ||
|  | 
 | ||
|  |             command = 'git -C %s %s' % (self.folder, initCommand) | ||
|  |             commits = ProcessUtilities.outputExecutioner(command, self.externalApp).split('\n') | ||
|  | 
 | ||
|  |             json_data = "[" | ||
|  |             checker = 0 | ||
|  |             id = 1 | ||
|  | 
 | ||
|  |             for commit in commits: | ||
|  |                 cm = commit.split('|') | ||
|  | 
 | ||
|  |                 dic = {'id': str(id), 'commit': cm[0], 'message': cm[1].replace('"', "'"), 'name': cm[2], 'date': cm[3]} | ||
|  |                 id = id + 1 | ||
|  | 
 | ||
|  |                 if checker == 0: | ||
|  |                     json_data = json_data + json.dumps(dic) | ||
|  |                     checker = 1 | ||
|  |                 else: | ||
|  |                     json_data = json_data + ',' + json.dumps(dic) | ||
|  | 
 | ||
|  |             commits = json_data + ']' | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'commits': commits} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except IndexError: | ||
|  |             data_ret = {'status': 0, 'error_message': 'No commits found.'} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def fetchFiles(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             self.domain = data['domain'] | ||
|  |             self.folder = data['folder'] | ||
|  |             self.commit = data['commit'] | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('status', 0) | ||
|  | 
 | ||
|  |             if self.folderCheck(): | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson() | ||
|  | 
 | ||
|  |             ## Security check | ||
|  | 
 | ||
|  |             if ACLManager.validateInput(self.commit): | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('status', 'Invalid characters in your input.') | ||
|  | 
 | ||
|  |             ## | ||
|  | 
 | ||
|  |             self.externalApp = ACLManager.FetchExternalApp(self.domain) | ||
|  | 
 | ||
|  |             command = 'git -C %s diff-tree --no-commit-id --name-only -r %s' % (self.folder, self.commit) | ||
|  |             files = ProcessUtilities.outputExecutioner(command, self.externalApp).split('\n') | ||
|  | 
 | ||
|  |             FinalFiles = [] | ||
|  | 
 | ||
|  |             for items in files: | ||
|  |                 if items != '': | ||
|  |                     FinalFiles.append(items.rstrip('\n').lstrip('\n')) | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'files': FinalFiles} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def fetchChangesInFile(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             self.domain = data['domain'] | ||
|  |             self.folder = data['folder'] | ||
|  |             self.file = data['file'] | ||
|  |             self.commit = data['commit'] | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('status', 0) | ||
|  | 
 | ||
|  |             if self.folderCheck(): | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson() | ||
|  | 
 | ||
|  |             ## security check | ||
|  | 
 | ||
|  |             if ACLManager.validateInput(self.commit) and self.file.find('..') == -1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('status', 'Invalid characters in your input.') | ||
|  | 
 | ||
|  |             self.externalApp = ACLManager.FetchExternalApp(self.domain) | ||
|  | 
 | ||
|  |             command = 'git -C %s show %s -- %s/%s' % ( | ||
|  |                 self.folder, self.commit, self.folder, self.file.strip('\n').strip(' ')) | ||
|  |             fileChangedContent = ProcessUtilities.outputExecutioner(command, self.externalApp).split('\n') | ||
|  | 
 | ||
|  |             initialNumber = 0 | ||
|  |             ## Find initial line numbers | ||
|  |             for items in fileChangedContent: | ||
|  |                 if len(items) == 0: | ||
|  |                     initialNumber = initialNumber + 1 | ||
|  |                 elif items[0] == '@': | ||
|  |                     break | ||
|  |                 else: | ||
|  |                     initialNumber = initialNumber + 1 | ||
|  | 
 | ||
|  |             try: | ||
|  |                 lineNumber = int(fileChangedContent[initialNumber].split('+')[1].split(',')[0]) | ||
|  |             except: | ||
|  |                 lineNumber = int(fileChangedContent[initialNumber].split('+')[1].split(' ')[0]) | ||
|  | 
 | ||
|  |             fileLen = len(fileChangedContent) | ||
|  |             finalConent = '<tr><td style="border-top: none;color:blue">%s</td><td style="border-top: none;"><p style="color:blue">%s</p></td></tr>' % ( | ||
|  |                 '#', fileChangedContent[initialNumber]) | ||
|  | 
 | ||
|  |             for i in range(initialNumber + 1, fileLen - 1): | ||
|  |                 if fileChangedContent[i][0] == '@': | ||
|  |                     lineNumber = int(fileChangedContent[i].split('+')[1].split(',')[0]) | ||
|  |                     finalConent = finalConent + '<tr><td style="border-top: none;color:blue">%s</td><td style="border-top: none;"><p style="color:blue">%s</p></td></tr>' % ( | ||
|  |                         '#', fileChangedContent[i]) | ||
|  |                     continue | ||
|  | 
 | ||
|  |                 else: | ||
|  |                     if fileChangedContent[i][0] == '+': | ||
|  |                         content = '<p style="color:green">%s</p>' % ( | ||
|  |                             fileChangedContent[i].replace('<', "<").replace('>', ">")) | ||
|  |                         finalConent = finalConent + '<tr style="color:green"><td style="border-top: none;">%s</td><td style="border-top: none;">%s</td></tr>' % ( | ||
|  |                             str(lineNumber), content) | ||
|  |                         lineNumber = lineNumber + 1 | ||
|  |                     elif fileChangedContent[i][0] == '-': | ||
|  |                         content = '<p style="color:red">%s</p>' % ( | ||
|  |                             fileChangedContent[i].replace('<', "<").replace('>', ">")) | ||
|  |                         finalConent = finalConent + '<tr style="color:red"><td style="border-top: none;">%s</td><td style="border-top: none;">%s</td></tr>' % ( | ||
|  |                             str(lineNumber), content) | ||
|  |                         lineNumber = lineNumber + 1 | ||
|  |                     else: | ||
|  |                         content = '<p>%s</p>' % (fileChangedContent[i].replace('<', "<").replace('>', ">")) | ||
|  |                         finalConent = finalConent + '<tr><td style="border-top: none;">%s</td><td style="border-top: none;">%s</td></tr>' % ( | ||
|  |                             str(lineNumber), content) | ||
|  |                         lineNumber = lineNumber + 1 | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'fileChangedContent': finalConent} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  |         except IndexError: | ||
|  |             data_ret = {'status': 0, 'error_message': 'Not a text file.'} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def saveGitConfigurations(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             self.domain = data['domain'] | ||
|  |             self.folder = data['folder'] | ||
|  | 
 | ||
|  |             dic = {} | ||
|  | 
 | ||
|  |             dic['domain'] = self.domain | ||
|  | 
 | ||
|  |             dic['autoCommit'] = data['autoCommit'] | ||
|  | 
 | ||
|  |             try: | ||
|  |                 dic['autoPush'] = data['autoPush'] | ||
|  |             except: | ||
|  |                 dic['autoPush'] = 'Never' | ||
|  | 
 | ||
|  |             try: | ||
|  |                 dic['emailLogs'] = data['emailLogs'] | ||
|  |             except: | ||
|  |                 dic['emailLogs'] = False | ||
|  | 
 | ||
|  |             try: | ||
|  |                 dic['commands'] = data['commands'] | ||
|  |             except: | ||
|  |                 dic['commands'] = 'NONE' | ||
|  | 
 | ||
|  |             try: | ||
|  |                 dic['webhookCommand'] = data['webhookCommand'] | ||
|  |             except: | ||
|  |                 dic['webhookCommand'] = False | ||
|  | 
 | ||
|  |             dic['folder'] = self.folder | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('status', 0) | ||
|  | 
 | ||
|  |             if self.folderCheck(): | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson() | ||
|  | 
 | ||
|  |             ## | ||
|  | 
 | ||
|  |             if self.confCheck == 1: | ||
|  |                 gitConfFolder = '/home/cyberpanel/git' | ||
|  |                 gitConFile = '%s/%s' % (gitConfFolder, self.masterDomain) | ||
|  |                 self.finalFile = '%s/%s' % (gitConFile, str(randint(1000, 9999))) | ||
|  | 
 | ||
|  |                 if not os.path.exists(gitConfFolder): | ||
|  |                     os.mkdir(gitConfFolder) | ||
|  | 
 | ||
|  |                 if not os.path.exists(gitConFile): | ||
|  |                     os.mkdir(gitConFile) | ||
|  | 
 | ||
|  |             writeToFile = open(self.finalFile, 'w') | ||
|  |             writeToFile.write(json.dumps(dic)) | ||
|  |             writeToFile.close() | ||
|  | 
 | ||
|  |             data_ret = {'status': 1} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def getLogsInJson(self, logs): | ||
|  |         json_data = "[" | ||
|  |         checker = 0 | ||
|  |         counter = 1 | ||
|  | 
 | ||
|  |         for items in logs: | ||
|  |             dic = {'type': items.type, 'date': items.date.strftime('%m.%d.%Y_%H-%M-%S'), 'message': items.message} | ||
|  | 
 | ||
|  |             if checker == 0: | ||
|  |                 json_data = json_data + json.dumps(dic) | ||
|  |                 checker = 1 | ||
|  |             else: | ||
|  |                 json_data = json_data + ',' + json.dumps(dic) | ||
|  |             counter = counter + 1 | ||
|  | 
 | ||
|  |         json_data = json_data + ']' | ||
|  |         return json_data | ||
|  | 
 | ||
|  |     def fetchGitLogs(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             self.domain = data['domain'] | ||
|  |             self.folder = data['folder'] | ||
|  |             recordsToShow = int(data['recordsToShow']) | ||
|  |             page = int(data['page']) | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('status', 0) | ||
|  | 
 | ||
|  |             if self.folderCheck(): | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson() | ||
|  | 
 | ||
|  |             logs = self.masterWebsite.gitlogs_set.all().order_by('-id') | ||
|  | 
 | ||
|  |             from s3Backups.s3Backups import S3Backups | ||
|  | 
 | ||
|  |             pagination = S3Backups.getPagination(len(logs), recordsToShow) | ||
|  |             endPageNumber, finalPageNumber = S3Backups.recordsPointer(page, recordsToShow) | ||
|  |             jsonData = self.getLogsInJson(logs[finalPageNumber:endPageNumber]) | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'logs': jsonData, 'pagination': pagination} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  |         except IndexError: | ||
|  |             data_ret = {'status': 0, 'error_message': 'Not a text file.'} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def webhook(self, domain, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             self.domain = domain | ||
|  | 
 | ||
|  |             ### set default ssh key | ||
|  | 
 | ||
|  |             try: | ||
|  |                 web = Websites.objects.get(domain=self.domain) | ||
|  |                 self.web = web | ||
|  |                 self.folder = '/home/%s/public_html' % (domain) | ||
|  |                 self.masterDomain = domain | ||
|  |             except: | ||
|  |                 web = ChildDomains.objects.get(domain=self.domain) | ||
|  |                 self.folder = web.path | ||
|  |                 self.masterDomain = web.master.domain | ||
|  |                 self.web = web.master | ||
|  | 
 | ||
|  |             ## Check if remote exists | ||
|  | 
 | ||
|  |             self.externalApp = ACLManager.FetchExternalApp(self.domain) | ||
|  | 
 | ||
|  |             command = 'git -C %s pull' % (self.folder) | ||
|  |             commandStatus = ProcessUtilities.outputExecutioner(command, self.externalApp) | ||
|  | 
 | ||
|  |             if commandStatus.find('Already up to date') == -1: | ||
|  |                 message = '[Webhook Fired] Status: %s.' % (commandStatus) | ||
|  |                 GitLogs(owner=self.web, type='INFO', message=message).save() | ||
|  | 
 | ||
|  |                 ### Fetch git configurations | ||
|  | 
 | ||
|  |                 found = 0 | ||
|  | 
 | ||
|  |                 gitConfFolder = '/home/cyberpanel/git' | ||
|  |                 gitConFile = '%s/%s' % (gitConfFolder, self.masterDomain) | ||
|  | 
 | ||
|  |                 if not os.path.exists(gitConfFolder): | ||
|  |                     os.mkdir(gitConfFolder) | ||
|  | 
 | ||
|  |                 if not os.path.exists(gitConFile): | ||
|  |                     os.mkdir(gitConFile) | ||
|  | 
 | ||
|  |                 if os.path.exists(gitConFile): | ||
|  |                     files = os.listdir(gitConFile) | ||
|  | 
 | ||
|  |                     if len(files) >= 1: | ||
|  |                         for file in files: | ||
|  |                             finalFile = '%s/%s' % (gitConFile, file) | ||
|  |                             gitConf = json.loads(open(finalFile, 'r').read()) | ||
|  |                             if gitConf['folder'] == self.folder: | ||
|  |                                 found = 1 | ||
|  |                                 break | ||
|  |                 if found: | ||
|  |                     try: | ||
|  |                         if gitConf['webhookCommand']: | ||
|  |                             if gitConf['commands'] != 'NONE': | ||
|  | 
 | ||
|  |                                 GitLogs(owner=self.web, type='INFO', | ||
|  |                                         message='Running commands after successful git commit..').save() | ||
|  | 
 | ||
|  |                                 if gitConf['commands'].find('\n') > -1: | ||
|  |                                     commands = gitConf['commands'].split('\n') | ||
|  | 
 | ||
|  |                                     for command in commands: | ||
|  |                                         GitLogs(owner=self.web, type='INFO', | ||
|  |                                                 message='Running: %s' % (command)).save() | ||
|  | 
 | ||
|  |                                         result = ProcessUtilities.outputExecutioner(command, self.web.externalApp, None, | ||
|  |                                                                                     self.folder) | ||
|  |                                         GitLogs(owner=self.web, type='INFO', | ||
|  |                                                 message='Result: %s' % (result)).save() | ||
|  |                                 else: | ||
|  |                                     GitLogs(owner=self.web, type='INFO', | ||
|  |                                             message='Running: %s' % (gitConf['commands'])).save() | ||
|  | 
 | ||
|  |                                     result = ProcessUtilities.outputExecutioner(gitConf['commands'], | ||
|  |                                                                                 self.web.externalApp, None, self.folder) | ||
|  |                                     GitLogs(owner=self.web, type='INFO', | ||
|  |                                             message='Result: %s' % (result)).save() | ||
|  | 
 | ||
|  |                                 GitLogs(owner=self.web, type='INFO', | ||
|  |                                         message='Finished running commands.').save() | ||
|  |                     except: | ||
|  |                         pass | ||
|  | 
 | ||
|  |                 ## Fix permissions | ||
|  | 
 | ||
|  |                 # from filemanager.filemanager import FileManager | ||
|  |                 # | ||
|  |                 # fm = FileManager(None, None) | ||
|  |                 # fm.fixPermissions(self.masterDomain) | ||
|  | 
 | ||
|  |                 data_ret = {'status': 1, 'commandStatus': commandStatus} | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  |             else: | ||
|  |                 message = '[Webhook Fired] Status: %s.' % (commandStatus) | ||
|  |                 GitLogs(owner=self.web, type='ERROR', message=message).save() | ||
|  |                 data_ret = {'status': 0, 'error_message': 'Pull not required.', 'commandStatus': commandStatus} | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def getSSHConfigs(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             domain = data['domain'] | ||
|  |             website = Websites.objects.get(domain=domain) | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('status', 0) | ||
|  | 
 | ||
|  |             pathToKeyFile = "/home/%s/.ssh/authorized_keys" % (domain) | ||
|  | 
 | ||
|  |             cat = "cat " + pathToKeyFile | ||
|  |             data = ProcessUtilities.outputExecutioner(cat, website.externalApp).split('\n') | ||
|  | 
 | ||
|  |             json_data = "[" | ||
|  |             checker = 0 | ||
|  | 
 | ||
|  |             for items in data: | ||
|  |                 if items.find("ssh-rsa") > -1: | ||
|  |                     keydata = items.split(" ") | ||
|  | 
 | ||
|  |                     try: | ||
|  |                         key = "ssh-rsa " + keydata[1][:50] + "  ..  " + keydata[2] | ||
|  |                         try: | ||
|  |                             userName = keydata[2][:keydata[2].index("@")] | ||
|  |                         except: | ||
|  |                             userName = keydata[2] | ||
|  |                     except: | ||
|  |                         key = "ssh-rsa " + keydata[1][:50] | ||
|  |                         userName = '' | ||
|  | 
 | ||
|  |                     dic = {'userName': userName, | ||
|  |                            'key': key, | ||
|  |                            } | ||
|  | 
 | ||
|  |                     if checker == 0: | ||
|  |                         json_data = json_data + json.dumps(dic) | ||
|  |                         checker = 1 | ||
|  |                     else: | ||
|  |                         json_data = json_data + ',' + json.dumps(dic) | ||
|  | 
 | ||
|  |             json_data = json_data + ']' | ||
|  | 
 | ||
|  |             final_json = json.dumps({'status': 1, 'error_message': "None", "data": json_data}) | ||
|  |             return HttpResponse(final_json) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             final_dic = {'status': 0, 'error_message': str(msg)} | ||
|  |             final_json = json.dumps(final_dic) | ||
|  |             return HttpResponse(final_json) | ||
|  | 
 | ||
|  |     def deleteSSHKey(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             domain = data['domain'] | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('status', 0) | ||
|  | 
 | ||
|  |             key = data['key'] | ||
|  |             pathToKeyFile = "/home/%s/.ssh/authorized_keys" % (domain) | ||
|  |             website = Websites.objects.get(domain=domain) | ||
|  | 
 | ||
|  |             command = f'chown {website.externalApp}:{website.externalApp} {pathToKeyFile}' | ||
|  |             ProcessUtilities.outputExecutioner(command) | ||
|  | 
 | ||
|  |             execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/firewallUtilities.py" | ||
|  |             execPath = execPath + " deleteSSHKey --key '%s' --path %s" % (key, pathToKeyFile) | ||
|  | 
 | ||
|  |             output = ProcessUtilities.outputExecutioner(execPath, website.externalApp) | ||
|  | 
 | ||
|  |             if output.find("1,None") > -1: | ||
|  |                 final_dic = {'status': 1, 'delete_status': 1} | ||
|  |                 final_json = json.dumps(final_dic) | ||
|  |                 return HttpResponse(final_json) | ||
|  |             else: | ||
|  |                 final_dic = {'status': 1, 'delete_status': 1, "error_mssage": output} | ||
|  |                 final_json = json.dumps(final_dic) | ||
|  |                 return HttpResponse(final_json) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             final_dic = {'status': 0, 'delete_status': 0, 'error_mssage': str(msg)} | ||
|  |             final_json = json.dumps(final_dic) | ||
|  |             return HttpResponse(final_json) | ||
|  | 
 | ||
|  |     def addSSHKey(self, userID=None, data=None): | ||
|  |         try: | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             domain = data['domain'] | ||
|  |             website = Websites.objects.get(domain=domain) | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadErrorJson('status', 0) | ||
|  | 
 | ||
|  |             key = data['key'] | ||
|  |             pathToKeyFile = "/home/%s/.ssh/authorized_keys" % (domain) | ||
|  | 
 | ||
|  |             command = 'mkdir -p /home/%s/.ssh/' % (domain) | ||
|  |             ProcessUtilities.executioner(command) | ||
|  | 
 | ||
|  |             command = 'chown %s:%s /home/%s/.ssh/' % (website.externalApp, website.externalApp, domain) | ||
|  |             ProcessUtilities.executioner(command) | ||
|  | 
 | ||
|  |             tempPath = "/home/cyberpanel/" + str(randint(1000, 9999)) | ||
|  | 
 | ||
|  |             writeToFile = open(tempPath, "w") | ||
|  |             writeToFile.write(key) | ||
|  |             writeToFile.close() | ||
|  | 
 | ||
|  |             execPath = "sudo /usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/firewallUtilities.py" | ||
|  |             execPath = execPath + " addSSHKey --tempPath %s --path %s" % (tempPath, pathToKeyFile) | ||
|  | 
 | ||
|  |             output = ProcessUtilities.outputExecutioner(execPath) | ||
|  | 
 | ||
|  |             if output.find("1,None") > -1: | ||
|  |                 final_dic = {'status': 1, 'add_status': 1} | ||
|  |                 final_json = json.dumps(final_dic) | ||
|  |                 return HttpResponse(final_json) | ||
|  |             else: | ||
|  |                 final_dic = {'status': 0, 'add_status': 0, "error_mssage": output} | ||
|  |                 final_json = json.dumps(final_dic) | ||
|  |                 return HttpResponse(final_json) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             final_dic = {'status': 0, 'add_status': 0, 'error_mssage': str(msg)} | ||
|  |             final_json = json.dumps(final_dic) | ||
|  |             return HttpResponse(final_json) | ||
|  | 
 | ||
|  |     def ApacheManager(self, request=None, userID=None, data=None): | ||
|  |         currentACL = ACLManager.loadedACL(userID) | ||
|  |         admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |         if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: | ||
|  |             pass | ||
|  |         else: | ||
|  |             return ACLManager.loadError() | ||
|  | 
 | ||
|  |         phps = PHPManager.findPHPVersions() | ||
|  |         apachePHPs = PHPManager.findApachePHPVersions() | ||
|  | 
 | ||
|  |         if ACLManager.CheckForPremFeature('all'): | ||
|  |             apachemanager = 1 | ||
|  |         else: | ||
|  |             apachemanager = 0 | ||
|  | 
 | ||
|  |         proc = httpProc(request, 'websiteFunctions/ApacheManager.html', | ||
|  |                         {'domainName': self.domain, 'phps': phps, 'apachemanager': apachemanager, 'apachePHPs': apachePHPs}) | ||
|  |         return proc.render() | ||
|  | 
 | ||
|  |     def saveApacheConfigsToFile(self, userID=None, data=None): | ||
|  | 
 | ||
|  |         currentACL = ACLManager.loadedACL(userID) | ||
|  | 
 | ||
|  |         if currentACL['admin'] != 1: | ||
|  |             return ACLManager.loadErrorJson('configstatus', 0) | ||
|  | 
 | ||
|  |         configData = data['configData'] | ||
|  |         self.domain = data['domainName'] | ||
|  | 
 | ||
|  |         mailUtilities.checkHome() | ||
|  | 
 | ||
|  |         tempPath = "/home/cyberpanel/" + str(randint(1000, 9999)) | ||
|  | 
 | ||
|  |         vhost = open(tempPath, "w") | ||
|  | 
 | ||
|  |         vhost.write(configData) | ||
|  | 
 | ||
|  |         vhost.close() | ||
|  | 
 | ||
|  |         ## writing data temporary to file | ||
|  | 
 | ||
|  |         filePath = ApacheVhost.configBasePath + self.domain + '.conf' | ||
|  | 
 | ||
|  |         ## save configuration data | ||
|  | 
 | ||
|  |         execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" | ||
|  |         execPath = execPath + " saveApacheConfigsToFile --path " + filePath + " --tempPath " + tempPath | ||
|  | 
 | ||
|  |         output = ProcessUtilities.outputExecutioner(execPath) | ||
|  | 
 | ||
|  |         if output.find("1,None") > -1: | ||
|  |             status = {"status": 1} | ||
|  |             final_json = json.dumps(status) | ||
|  |             return HttpResponse(final_json) | ||
|  |         else: | ||
|  |             final_dic = {'status': 0, 'error_message': output} | ||
|  |             final_json = json.dumps(final_dic) | ||
|  |             return HttpResponse(final_json) | ||
|  | 
 | ||
|  |     def CreateDockerPackage(self, request=None, userID=None, data=None, DeleteID=None): | ||
|  |         Data = {} | ||
|  | 
 | ||
|  |         currentACL = ACLManager.loadedACL(userID) | ||
|  | 
 | ||
|  |         if currentACL['admin'] == 1: | ||
|  |             pass | ||
|  |         else: | ||
|  |             return ACLManager.loadError() | ||
|  | 
 | ||
|  |         try: | ||
|  |             if DeleteID != None: | ||
|  |                 DockerPackagesDelete = DockerPackages.objects.get(pk=DeleteID) | ||
|  |                 DockerPackagesDelete.delete() | ||
|  |         except: | ||
|  |             pass | ||
|  | 
 | ||
|  |         Data['packages'] = DockerPackages.objects.all() | ||
|  | 
 | ||
|  |         proc = httpProc(request, 'websiteFunctions/CreateDockerPackage.html', | ||
|  |                         Data, 'createWebsite') | ||
|  |         return proc.render() | ||
|  | 
 | ||
|  |     def AssignPackage(self, request=None, userID=None, data=None, DeleteID=None): | ||
|  | 
 | ||
|  |         currentACL = ACLManager.loadedACL(userID) | ||
|  | 
 | ||
|  |         if currentACL['admin'] == 1: | ||
|  |             pass | ||
|  |         else: | ||
|  |             return ACLManager.loadError() | ||
|  | 
 | ||
|  |         try: | ||
|  |             if DeleteID != None: | ||
|  |                 DockerPackagesDelete = PackageAssignment.objects.get(pk=DeleteID) | ||
|  |                 DockerPackagesDelete.delete() | ||
|  |         except: | ||
|  |             pass | ||
|  | 
 | ||
|  |         adminNames = ACLManager.loadAllUsers(userID) | ||
|  |         dockerpackages = DockerPackages.objects.all() | ||
|  |         assignpackage = PackageAssignment.objects.all() | ||
|  |         Data = {'adminNames': adminNames, 'DockerPackages': dockerpackages, 'assignpackage': assignpackage} | ||
|  |         proc = httpProc(request, 'websiteFunctions/assignPackage.html', | ||
|  |                         Data, 'createWebsite') | ||
|  |         return proc.render() | ||
|  | 
 | ||
|  |     def CreateDockersite(self, request=None, userID=None, data=None): | ||
|  |         url = "https://platform.cyberpersons.com/CyberpanelAdOns/Adonpermission" | ||
|  |         data = { | ||
|  |             "name": "docker-manager", | ||
|  |             "IP": ACLManager.GetServerIP() | ||
|  |         } | ||
|  | 
 | ||
|  |         import requests | ||
|  |         response = requests.post(url, data=json.dumps(data)) | ||
|  |         Status = response.json()['status'] | ||
|  | 
 | ||
|  |         if (Status == 1) or ProcessUtilities.decideServer() == ProcessUtilities.ent: | ||
|  |             adminNames = ACLManager.loadAllUsers(userID) | ||
|  |             Data = {'adminNames': adminNames} | ||
|  | 
 | ||
|  |             if PackageAssignment.objects.all().count() == 0: | ||
|  |                 name = 'Default' | ||
|  |                 cpu = 2 | ||
|  |                 Memory = 1024 | ||
|  |                 Bandwidth = '100' | ||
|  |                 disk = '100' | ||
|  | 
 | ||
|  |                 saveobj = DockerPackages(Name=name, CPUs=cpu, Ram=Memory, Bandwidth=Bandwidth, DiskSpace=disk, config='') | ||
|  |                 saveobj.save() | ||
|  | 
 | ||
|  |                 userobj = Administrator.objects.get(pk=1) | ||
|  | 
 | ||
|  |                 sv = PackageAssignment(user=userobj, package=saveobj) | ||
|  |                 sv.save() | ||
|  | 
 | ||
|  |             proc = httpProc(request, 'websiteFunctions/CreateDockerSite.html', | ||
|  |                             Data, 'createWebsite') | ||
|  |             return proc.render() | ||
|  |         else: | ||
|  |             from django.shortcuts import reverse | ||
|  |             return redirect(reverse('pricing')) | ||
|  | 
 | ||
|  |     def AddDockerpackage(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  | 
 | ||
|  |             if currentACL['admin'] == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadError() | ||
|  | 
 | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             name = data['name'] | ||
|  |             cpu = data['cpu'] | ||
|  |             Memory = data['Memory'] | ||
|  |             Bandwidth = data['Bandwidth'] | ||
|  |             disk = data['disk'] | ||
|  | 
 | ||
|  |             saveobj = DockerPackages(Name=name, CPUs=cpu, Ram=Memory, Bandwidth=Bandwidth, DiskSpace=disk, config='') | ||
|  |             saveobj.save() | ||
|  | 
 | ||
|  |             status = {"status": 1, 'error_message': None} | ||
|  |             final_json = json.dumps(status) | ||
|  |             return HttpResponse(final_json) | ||
|  |         except BaseException as msg: | ||
|  |             final_dic = {'status': 0, 'error_message': str(msg)} | ||
|  |             final_json = json.dumps(final_dic) | ||
|  |             return HttpResponse(final_json) | ||
|  | 
 | ||
|  |     def Getpackage(self, userID=None, data=None): | ||
|  |         try: | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  | 
 | ||
|  |             if currentACL['admin'] == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadError() | ||
|  | 
 | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  |             id = data['id'] | ||
|  | 
 | ||
|  |             docker_package = DockerPackages.objects.get(pk=id) | ||
|  | 
 | ||
|  |             # Convert DockerPackages object to dictionary | ||
|  |             package_data = { | ||
|  |                 'Name': docker_package.Name, | ||
|  |                 'CPU': docker_package.CPUs, | ||
|  |                 'Memory': docker_package.Ram, | ||
|  |                 'Bandwidth': docker_package.Bandwidth, | ||
|  |                 'DiskSpace': docker_package.DiskSpace, | ||
|  |             } | ||
|  | 
 | ||
|  |             rdata = {'obj': package_data} | ||
|  | 
 | ||
|  |             status = {"status": 1, 'error_message': rdata} | ||
|  |             final_json = json.dumps(status) | ||
|  |             return HttpResponse(final_json) | ||
|  |         except BaseException as msg: | ||
|  |             final_dic = {'status': 0, 'error_message': str(msg)} | ||
|  |             final_json = json.dumps(final_dic) | ||
|  |             return HttpResponse(final_json) | ||
|  | 
 | ||
|  |     def Updatepackage(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  | 
 | ||
|  |             if currentACL['admin'] == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadError() | ||
|  | 
 | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  |             id = data['id'] | ||
|  |             CPU = data['CPU'] | ||
|  |             RAM = data['RAM'] | ||
|  |             Bandwidth = data['Bandwidth'] | ||
|  |             DiskSpace = data['DiskSpace'] | ||
|  | 
 | ||
|  |             docker_package = DockerPackages.objects.get(pk=id) | ||
|  | 
 | ||
|  |             docker_package.CPUs = CPU | ||
|  |             docker_package.Ram = RAM | ||
|  |             docker_package.Bandwidth = Bandwidth | ||
|  |             docker_package.DiskSpace = DiskSpace | ||
|  |             docker_package.save() | ||
|  | 
 | ||
|  |             status = {"status": 1, 'error_message': None} | ||
|  |             final_json = json.dumps(status) | ||
|  |             return HttpResponse(final_json) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             final_dic = {'status': 0, 'error_message': str(msg)} | ||
|  |             final_json = json.dumps(final_dic) | ||
|  |             return HttpResponse(final_json) | ||
|  | 
 | ||
|  |     def AddAssignment(self, userID=None, data=None): | ||
|  |         try: | ||
|  | 
 | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  | 
 | ||
|  |             if currentACL['admin'] == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadError() | ||
|  | 
 | ||
|  | 
 | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             package = data['package'] | ||
|  |             user = data['user'] | ||
|  | 
 | ||
|  |             userobj = Administrator.objects.get(userName=user) | ||
|  | 
 | ||
|  |             try: | ||
|  |                 delasg = PackageAssignment.objects.get(user=userobj) | ||
|  |                 delasg.delete() | ||
|  |             except: | ||
|  |                 pass | ||
|  | 
 | ||
|  |             docker_package = DockerPackages.objects.get(pk=int(package)) | ||
|  | 
 | ||
|  |             sv = PackageAssignment(user=userobj, package=docker_package) | ||
|  |             sv.save() | ||
|  | 
 | ||
|  |             status = {"status": 1, 'error_message': None} | ||
|  |             final_json = json.dumps(status) | ||
|  |             return HttpResponse(final_json) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             final_dic = {'status': 0, 'error_message': str(msg)} | ||
|  |             final_json = json.dumps(final_dic) | ||
|  |             return HttpResponse(final_json) | ||
|  | 
 | ||
|  |     def submitDockerSiteCreation(self, userID=None, data=None): | ||
|  |         try: | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  | 
 | ||
|  |             sitename = data['sitename'] | ||
|  |             Owner = data['Owner'] | ||
|  |             Domain = data['Domain'] | ||
|  |             MysqlCPU = int(data['MysqlCPU']) | ||
|  |             MYsqlRam = int(data['MYsqlRam']) | ||
|  |             SiteCPU = int(data['SiteCPU']) | ||
|  |             SiteRam = int(data['SiteRam']) | ||
|  |             App = data['App'] | ||
|  |             WPusername = data['WPusername'] | ||
|  |             WPemal = data['WPemal'] | ||
|  |             WPpasswd = data['WPpasswd'] | ||
|  | 
 | ||
|  |             if int(MYsqlRam) < 256: | ||
|  |                 final_dic = {'status': 0, 'error_message': 'Minimum MySQL ram should be 256MB.'} | ||
|  |                 final_json = json.dumps(final_dic) | ||
|  |                 return HttpResponse(final_json) | ||
|  | 
 | ||
|  |             if int(SiteRam) < 256: | ||
|  |                 final_dic = {'status': 0, 'error_message': 'Minimum site ram should be 256MB.'} | ||
|  |                 final_json = json.dumps(final_dic) | ||
|  |                 return HttpResponse(final_json) | ||
|  | 
 | ||
|  | 
 | ||
|  |             pattern = r"^[a-z0-9][a-z0-9]*$" | ||
|  | 
 | ||
|  |             if re.match(pattern, sitename): | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 final_dic = {'status': 0, 'error_message': f'invalid site name "{sitename}": must consist only of lowercase alphanumeric characters, as well as start with a letter or number.'} | ||
|  |                 final_json = json.dumps(final_dic) | ||
|  |                 return HttpResponse(final_json) | ||
|  | 
 | ||
|  |             loggedUser = Administrator.objects.get(pk=userID) | ||
|  |             newOwner = Administrator.objects.get(userName=Owner) | ||
|  | 
 | ||
|  |             try: | ||
|  |                 pkaobj = PackageAssignment.objects.get(user=newOwner) | ||
|  |             except: | ||
|  |                 final_dic = {'status': 0, 'error_message': str('Please assign package to selected user')} | ||
|  |                 final_json = json.dumps(final_dic) | ||
|  |                 return HttpResponse(final_json) | ||
|  | 
 | ||
|  |             Dpkgobj = DockerPackages.objects.get(pk=pkaobj.package.id) | ||
|  | 
 | ||
|  |             pkg_cpu = Dpkgobj.CPUs | ||
|  |             pkg_Ram = Dpkgobj.Ram | ||
|  | 
 | ||
|  |             totalcup = SiteCPU + MysqlCPU | ||
|  |             totalRam = SiteRam + MYsqlRam | ||
|  | 
 | ||
|  |             if (totalcup > pkg_cpu): | ||
|  |                 final_dic = {'status': 0, 'error_message': str(f'You can add {pkg_cpu} or less then {pkg_cpu} CPUs.')} | ||
|  |                 final_json = json.dumps(final_dic) | ||
|  |                 return HttpResponse(final_json) | ||
|  | 
 | ||
|  |             if (totalRam > pkg_Ram): | ||
|  |                 final_dic = {'status': 0, 'error_message': str(f'You can add {pkg_Ram} or less then {pkg_Ram} Ram.')} | ||
|  |                 final_json = json.dumps(final_dic) | ||
|  |                 return HttpResponse(final_json) | ||
|  | 
 | ||
|  |             if ACLManager.currentContextPermission(currentACL, 'createWebsite') == 0: | ||
|  |                 return ACLManager.loadErrorJson('createWebSiteStatus', 0) | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnerProtection(currentACL, loggedUser, newOwner) == 0: | ||
|  |                 return ACLManager.loadErrorJson('createWebSiteStatus', 0) | ||
|  | 
 | ||
|  |             if ACLManager.CheckDomainBlackList(Domain) == 0: | ||
|  |                 data_ret = {'status': 0, 'createWebSiteStatus': 0, 'error_message': "Blacklisted domain."} | ||
|  |                 json_data = json.dumps(data_ret) | ||
|  |                 return HttpResponse(json_data) | ||
|  | 
 | ||
|  |             tempStatusPath = "/home/cyberpanel/" + str(randint(1000, 9999)) | ||
|  |             data = {} | ||
|  | 
 | ||
|  |             data['JobID'] = tempStatusPath | ||
|  |             data['Domain'] = Domain | ||
|  |             data['WPemal'] = WPemal | ||
|  |             data['Owner'] = Owner | ||
|  |             data['userID'] = userID | ||
|  |             data['MysqlCPU'] = MysqlCPU | ||
|  |             data['MYsqlRam'] = MYsqlRam | ||
|  |             data['SiteCPU'] = SiteCPU | ||
|  |             data['SiteRam'] = SiteRam | ||
|  |             data['sitename'] = sitename | ||
|  |             data['WPusername'] = WPusername | ||
|  |             data['WPpasswd'] = WPpasswd | ||
|  |             data['externalApp'] = "".join(re.findall("[a-zA-Z]+", Domain))[:5] + str(randint(1000, 9999)) | ||
|  |             data['App'] = App | ||
|  | 
 | ||
|  |             background = Docker_Sites('SubmitDockersiteCreation', data) | ||
|  |             background.start() | ||
|  | 
 | ||
|  |             time.sleep(2) | ||
|  | 
 | ||
|  |             data_ret = {'status': 1, 'installStatus': 1, 'error_message': 'None', | ||
|  |                         'tempStatusPath': tempStatusPath} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             final_dic = {'status': 0, 'error_message': str(msg)} | ||
|  |             final_json = json.dumps(final_dic) | ||
|  |             return HttpResponse(final_json) | ||
|  | 
 | ||
|  |     def ListDockerSites(self, request=None, userID=None, data=None, DeleteID=None): | ||
|  |         admin = Administrator.objects.get(pk=userID) | ||
|  |         currentACL = ACLManager.loadedACL(userID) | ||
|  |         fdata={} | ||
|  | 
 | ||
|  |         try: | ||
|  |             if DeleteID != None: | ||
|  | 
 | ||
|  |                 DockerSitesDelete = DockerSites.objects.get(pk=DeleteID) | ||
|  |                 if ACLManager.checkOwnership(DockerSitesDelete.admin.domain, admin, currentACL) == 1: | ||
|  |                     pass | ||
|  |                 else: | ||
|  |                     return ACLManager.loadError() | ||
|  | 
 | ||
|  |                 passdata={} | ||
|  |                 passdata["domain"] = DockerSitesDelete.admin.domain | ||
|  |                 passdata["JobID"] = None | ||
|  |                 passdata['name'] = DockerSitesDelete.SiteName | ||
|  |                 da = Docker_Sites(None, passdata) | ||
|  |                 da.DeleteDockerApp() | ||
|  |                 DockerSitesDelete.delete() | ||
|  |                 fdata['Deleted'] = 1 | ||
|  |         except BaseException as msg: | ||
|  |             fdata['LPError'] = 1 | ||
|  |             fdata['LPMessage'] = str(msg) | ||
|  | 
 | ||
|  | 
 | ||
|  |         fdata['pagination'] = self.DockersitePagination(currentACL, userID) | ||
|  | 
 | ||
|  |         proc = httpProc(request, 'websiteFunctions/ListDockersite.html', | ||
|  |                         fdata) | ||
|  |         return proc.render() | ||
|  | 
 | ||
|  |     def fetchDockersite(self, userID=None, data=None): | ||
|  |         try: | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             pageNumber = int(data['page']) | ||
|  |             recordsToShow = int(data['recordsToShow']) | ||
|  | 
 | ||
|  | 
 | ||
|  |             endPageNumber, finalPageNumber = self.recordsPointer(pageNumber, recordsToShow) | ||
|  | 
 | ||
|  |             dockersites = ACLManager.findDockersiteObjects(currentACL, userID) | ||
|  |             pagination = self.getPagination(len(dockersites), recordsToShow) | ||
|  |             logging.CyberCPLogFileWriter.writeToFile("Our dockersite" + str(dockersites)) | ||
|  | 
 | ||
|  | 
 | ||
|  |             json_data = self.findDockersitesListJson(dockersites[finalPageNumber:endPageNumber]) | ||
|  | 
 | ||
|  | 
 | ||
|  |             final_dic = {'status': 1, 'listWebSiteStatus': 1, 'error_message': "None", "data": json_data, | ||
|  |                          'pagination': pagination} | ||
|  |             final_json = json.dumps(final_dic) | ||
|  |             return HttpResponse(final_json) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             final_dic = {'status': 0, 'listWebSiteStatus': 1, 'error_message': str(msg)} | ||
|  |             final_json = json.dumps(final_dic) | ||
|  |             return HttpResponse(final_json) | ||
|  | 
 | ||
|  |     def Dockersitehome(self, request=None, userID=None, data=None, DeleteID=None): | ||
|  |         url = "https://platform.cyberpersons.com/CyberpanelAdOns/Adonpermission" | ||
|  |         data = { | ||
|  |             "name": "docker-manager", | ||
|  |             "IP": ACLManager.GetServerIP() | ||
|  |         } | ||
|  | 
 | ||
|  |         import requests | ||
|  |         response = requests.post(url, data=json.dumps(data)) | ||
|  |         Status = response.json()['status'] | ||
|  | 
 | ||
|  |         if (Status == 1) or ProcessUtilities.decideServer() == ProcessUtilities.ent: | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  | 
 | ||
|  |             ds = DockerSites.objects.get(pk=self.domain) | ||
|  | 
 | ||
|  |             if ACLManager.checkOwnership(ds.admin.domain, admin, currentACL) == 1: | ||
|  |                 pass | ||
|  |             else: | ||
|  |                 return ACLManager.loadError() | ||
|  | 
 | ||
|  |             proc = httpProc(request, 'websiteFunctions/DockerSiteHome.html', | ||
|  |                             {'dockerSite': ds}) | ||
|  |             return proc.render() | ||
|  |         else: | ||
|  |             from django.shortcuts import reverse | ||
|  |             return redirect(reverse('pricing')) | ||
|  |          | ||
|  |     def fetchWPSitesForDomain(self, userID=None, data=None): | ||
|  |         try: | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  |              | ||
|  |             domain = data['domain'] | ||
|  |             website = Websites.objects.get(domain=domain) | ||
|  |              | ||
|  |             if ACLManager.checkOwnership(domain, admin, currentACL) != 1: | ||
|  |                 return ACLManager.loadErrorJson('fetchStatus', 0) | ||
|  | 
 | ||
|  |             wp_sites = WPSites.objects.filter(owner=website) | ||
|  |             sites = [] | ||
|  |              | ||
|  |             Vhuser = website.externalApp | ||
|  |             PHPVersion = website.phpSelection | ||
|  | 
 | ||
|  |             php = ACLManager.getPHPString(PHPVersion) | ||
|  |             FinalPHPPath = '/usr/local/lsws/lsphp%s/bin/php' % (php) | ||
|  |              | ||
|  |             for site in wp_sites: | ||
|  |                 command = 'sudo -u %s %s -d error_reporting=0 /usr/bin/wp core version --skip-plugins --skip-themes --path=%s 2>/dev/null' % ( | ||
|  |                     Vhuser, FinalPHPPath, site.path) | ||
|  |                 version = ProcessUtilities.outputExecutioner(command, None, True) | ||
|  |                 version = html.escape(version) | ||
|  | 
 | ||
|  |                 # Get current theme | ||
|  |                 command = 'sudo -u %s %s -d error_reporting=0 /usr/bin/wp theme list --status=active --field=name --skip-plugins --skip-themes --path=%s 2>/dev/null' % ( | ||
|  |                     Vhuser, FinalPHPPath, site.path) | ||
|  |                 currentTheme = ProcessUtilities.outputExecutioner(command, None, True) | ||
|  |                 currentTheme = currentTheme.strip() | ||
|  | 
 | ||
|  |                 # Get number of plugins | ||
|  |                 command = 'sudo -u %s %s -d error_reporting=0 /usr/bin/wp plugin list --field=name --skip-plugins --skip-themes --path=%s 2>/dev/null' % ( | ||
|  |                     Vhuser, FinalPHPPath, site.path) | ||
|  |                 plugins = ProcessUtilities.outputExecutioner(command, None, True) | ||
|  |                 pluginCount = len([p for p in plugins.split('\n') if p.strip()]) | ||
|  | 
 | ||
|  |                 # Generate screenshot URL | ||
|  |                 site_url = site.FinalURL | ||
|  |                 if not site_url.startswith(('http://', 'https://')): | ||
|  |                     site_url = f'https://{site_url}' | ||
|  | 
 | ||
|  | 
 | ||
|  |                 command = 'sudo -u %s %s -d error_reporting=0 /usr/bin/wp config list --skip-plugins --skip-themes --path=%s' % ( | ||
|  |                 Vhuser, FinalPHPPath, site.path) | ||
|  |                 stdout = ProcessUtilities.outputExecutioner(command) | ||
|  |                 debugging = 0 | ||
|  |                 for items in stdout.split('\n'): | ||
|  |                     if items.find('WP_DEBUG	true	constant') > -1: | ||
|  |                         debugging = 1 | ||
|  |                         break | ||
|  | 
 | ||
|  |                 command = 'sudo -u %s %s -d error_reporting=0 /usr/bin/wp option get blog_public --skip-plugins --skip-themes --path=%s' % ( | ||
|  |                     Vhuser, FinalPHPPath, site.path) | ||
|  |                 stdoutput = ProcessUtilities.outputExecutioner(command) | ||
|  |                 searchindex = int(stdoutput.splitlines()[-1]) | ||
|  |                  | ||
|  | 
 | ||
|  |                 command = 'sudo -u %s %s -d error_reporting=0 /usr/bin/wp maintenance-mode status --skip-plugins --skip-themes --path=%s' % ( | ||
|  |                     Vhuser, FinalPHPPath, site.path) | ||
|  |                 maintenanceMod = ProcessUtilities.outputExecutioner(command) | ||
|  | 
 | ||
|  |                 result = maintenanceMod.splitlines()[-1] | ||
|  |                 if result.find('not active') > -1: | ||
|  |                     maintenanceMode = 0 | ||
|  |                 else: | ||
|  |                     maintenanceMode = 1 | ||
|  | 
 | ||
|  |                 sites.append({ | ||
|  |                     'id': site.id, | ||
|  |                     'title': site.title, | ||
|  |                     'url': site.FinalURL, | ||
|  |                     'path': site.path, | ||
|  |                     'version': version, | ||
|  |                     'phpVersion': site.owner.phpSelection, | ||
|  |                     'theme': currentTheme, | ||
|  |                     'activePlugins': pluginCount, | ||
|  |                     'debugging': debugging, | ||
|  |                     'searchIndex': searchindex, | ||
|  |                     'maintenanceMode': maintenanceMode, | ||
|  |                     'screenshot': f'https://api.microlink.io/?url={site_url}&screenshot=true&meta=false&embed=screenshot.url' | ||
|  |                 }) | ||
|  |                  | ||
|  |             data_ret = {'status': 1, 'fetchStatus': 1, 'error_message': "None", "sites": sites} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'fetchStatus': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 | ||
|  |     def fetchWPBackups(self, userID=None, data=None): | ||
|  |         try: | ||
|  |             currentACL = ACLManager.loadedACL(userID) | ||
|  |             admin = Administrator.objects.get(pk=userID) | ||
|  |             WPid = data['WPid'] | ||
|  |              | ||
|  |             # Get the WordPress site | ||
|  |             wpsite = WPSites.objects.get(pk=WPid) | ||
|  |              | ||
|  |             # Check ownership | ||
|  |             if currentACL['admin'] != 1: | ||
|  |                 if wpsite.owner != admin: | ||
|  |                     data_ret = {'status': 0, 'error_message': 'Not authorized to view this site backups'} | ||
|  |                     json_data = json.dumps(data_ret) | ||
|  |                     return HttpResponse(json_data) | ||
|  |              | ||
|  |             # Get backups for this WordPress site | ||
|  |             backups = WPSitesBackup.objects.filter(WPSiteID=WPid).order_by('-id') | ||
|  |              | ||
|  |             backup_list = [] | ||
|  |             for backup in backups: | ||
|  |                 try: | ||
|  |                     config = json.loads(backup.config) | ||
|  |                     # Extract date from backup name (format: backup-wpsite.com-11.28.23_01-12-36) | ||
|  |                     backup_name = config.get('name', 'Unknown') | ||
|  |                     date_str = 'Unknown' | ||
|  |                     if 'backup-' in backup_name: | ||
|  |                         try: | ||
|  |                             # Extract date part from name | ||
|  |                             date_part = backup_name.split('-')[-1]  # Gets "11.28.23_01-12-36" | ||
|  |                             date_components = date_part.split('_') | ||
|  |                             if len(date_components) == 2: | ||
|  |                                 date_str = date_components[0].replace('.', '/') + ' ' + date_components[1].replace('-', ':') | ||
|  |                         except: | ||
|  |                             date_str = backup_name | ||
|  |                      | ||
|  |                     backup_list.append({ | ||
|  |                         'id': backup.id, | ||
|  |                         'name': backup_name, | ||
|  |                         'date': date_str, | ||
|  |                         'type': config.get('Backuptype', 'Full Backup'), | ||
|  |                         'size': config.get('size', '0') | ||
|  |                     }) | ||
|  |                 except Exception as e: | ||
|  |                     logging.CyberCPLogFileWriter.writeToFile(f"Error parsing backup config: {str(e)}") | ||
|  |                     continue | ||
|  |              | ||
|  |             data_ret = {'status': 1, 'backups': backup_list} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  |              | ||
|  |         except BaseException as msg: | ||
|  |             data_ret = {'status': 0, 'error_message': str(msg)} | ||
|  |             json_data = json.dumps(data_ret) | ||
|  |             return HttpResponse(json_data) | ||
|  | 
 |