mirror of
				https://github.com/usmannasir/cyberpanel.git
				synced 2025-10-31 02:15:55 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			674 lines
		
	
	
		
			27 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			674 lines
		
	
	
		
			27 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| #!/usr/local/CyberCP/bin/python
 | |
| import os.path
 | |
| import sys
 | |
| import errno
 | |
| import django
 | |
| sys.path.append('/usr/local/CyberCP')
 | |
| os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings")
 | |
| django.setup()
 | |
| import json
 | |
| from plogical.httpProc import httpProc
 | |
| from django.http import HttpResponse
 | |
| try:
 | |
|     from .models import Users
 | |
|     from loginSystem.models import Administrator
 | |
| except:
 | |
|     pass
 | |
| import plogical.CyberCPLogFileWriter as logging
 | |
| try:
 | |
|     from loginSystem.views import loadLoginPage
 | |
|     from websiteFunctions.models import Websites
 | |
|     from plogical.ftpUtilities import FTPUtilities
 | |
|     from plogical.acl import ACLManager
 | |
| except:
 | |
|     pass
 | |
| import os
 | |
| 
 | |
| from plogical.processUtilities import ProcessUtilities
 | |
| import argparse
 | |
| 
 | |
| class FTPManager:
 | |
|     def __init__(self, request, extraArgs = None):
 | |
|         self.request = request
 | |
|         self.extraArgs = extraArgs
 | |
| 
 | |
|     def loadFTPHome(self):
 | |
|         proc = httpProc(self.request, 'ftp/index.html',
 | |
|                         None, 'createFTPAccount')
 | |
|         return proc.render()
 | |
| 
 | |
|     def createFTPAccount(self):
 | |
|         userID = self.request.session['userID']
 | |
|         currentACL = ACLManager.loadedACL(userID)
 | |
| 
 | |
|         admin = Administrator.objects.get(pk=userID)
 | |
| 
 | |
|         if not os.path.exists('/home/cyberpanel/pureftpd'):
 | |
|             proc = httpProc(self.request, 'ftp/createFTPAccount.html',
 | |
|                             {"status": 0}, 'createFTPAccount')
 | |
|             return proc.render()
 | |
| 
 | |
|         websitesName = ACLManager.findAllSites(currentACL, userID)
 | |
| 
 | |
|         proc = httpProc(self.request, 'ftp/createFTPAccount.html',
 | |
|                         {'websiteList': websitesName, 'OwnerFTP': admin.userName, "status": 1}, 'createFTPAccount')
 | |
|         return proc.render()
 | |
| 
 | |
|     def submitFTPCreation(self):
 | |
|         try:
 | |
|             userID = self.request.session['userID']
 | |
|             currentACL = ACLManager.loadedACL(userID)
 | |
| 
 | |
|             if ACLManager.currentContextPermission(currentACL, 'createFTPAccount') == 0:
 | |
|                 return ACLManager.loadErrorJson('creatFTPStatus', 0)
 | |
| 
 | |
|             data = json.loads(self.request.body)
 | |
|             userName = data['ftpUserName']
 | |
|             password = data['passwordByPass']
 | |
| 
 | |
|             domainName = data['ftpDomain']
 | |
| 
 | |
|             admin = Administrator.objects.get(pk=userID)
 | |
| 
 | |
|             if ACLManager.checkOwnership(domainName, admin, currentACL) == 1:
 | |
|                 pass
 | |
|             else:
 | |
|                 return ACLManager.loadError()
 | |
| 
 | |
|             try:
 | |
|                 api = data['api']
 | |
|             except:
 | |
|                 api = '0'
 | |
| 
 | |
|             admin = Administrator.objects.get(id=userID)
 | |
| 
 | |
|             try:
 | |
|                 path = data['path']
 | |
|                 if len(path) > 0:
 | |
|                     pass
 | |
|                 else:
 | |
|                     path = 'None'
 | |
|             except:
 | |
|                 path = 'None'
 | |
| 
 | |
| 
 | |
|             result = FTPUtilities.submitFTPCreation(domainName, userName, password, path, admin.userName, api)
 | |
| 
 | |
|             if result[0] == 1:
 | |
|                 data_ret = {'status': 1, 'creatFTPStatus': 1, 'error_message': 'None'}
 | |
|                 json_data = json.dumps(data_ret)
 | |
|                 return HttpResponse(json_data)
 | |
|             else:
 | |
|                 data_ret = {'status': 0, 'creatFTPStatus': 0, 'error_message': result[1]}
 | |
|                 json_data = json.dumps(data_ret)
 | |
|                 return HttpResponse(json_data)
 | |
| 
 | |
|         except BaseException as msg:
 | |
|             data_ret = {'status': 0, 'creatFTPStatus': 0, 'error_message': str(msg)}
 | |
|             json_data = json.dumps(data_ret)
 | |
|             return HttpResponse(json_data)
 | |
| 
 | |
|     def deleteFTPAccount(self):
 | |
|         userID = self.request.session['userID']
 | |
|         currentACL = ACLManager.loadedACL(userID)
 | |
| 
 | |
|         if not os.path.exists('/home/cyberpanel/pureftpd'):
 | |
|             proc = httpProc(self.request, 'ftp/deleteFTPAccount.html',
 | |
|                             {"status": 0}, 'deleteFTPAccount')
 | |
|             return proc.render()
 | |
| 
 | |
|         websitesName = ACLManager.findAllSites(currentACL, userID)
 | |
| 
 | |
|         proc = httpProc(self.request, 'ftp/deleteFTPAccount.html',
 | |
|                         {'websiteList': websitesName, "status": 1}, 'deleteFTPAccount')
 | |
|         return proc.render()
 | |
| 
 | |
|     def fetchFTPAccounts(self):
 | |
|         try:
 | |
|             userID = self.request.session['userID']
 | |
|             currentACL = ACLManager.loadedACL(userID)
 | |
| 
 | |
|             if ACLManager.currentContextPermission(currentACL, 'deleteFTPAccount') == 0:
 | |
|                 return ACLManager.loadErrorJson('fetchStatus', 0)
 | |
| 
 | |
|             data = json.loads(self.request.body)
 | |
|             domain = data['ftpDomain']
 | |
| 
 | |
|             admin = Administrator.objects.get(pk=userID)
 | |
|             if ACLManager.checkOwnership(domain, admin, currentACL) == 1:
 | |
|                 pass
 | |
|             else:
 | |
|                 return ACLManager.loadErrorJson()
 | |
| 
 | |
|             website = Websites.objects.get(domain=domain)
 | |
| 
 | |
|             ftpAccounts = website.users_set.all()
 | |
| 
 | |
|             json_data = "["
 | |
|             checker = 0
 | |
| 
 | |
|             for items in ftpAccounts:
 | |
|                 dic = {"userName": items.user}
 | |
| 
 | |
|                 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({'fetchStatus': 1, 'error_message': "None", "data": json_data})
 | |
|             return HttpResponse(final_json)
 | |
| 
 | |
|         except BaseException as msg:
 | |
|             data_ret = {'fetchStatus': 0, 'error_message': str(msg)}
 | |
|             json_data = json.dumps(data_ret)
 | |
|             return HttpResponse(json_data)
 | |
| 
 | |
|     def submitFTPDelete(self):
 | |
|         try:
 | |
|             userID = self.request.session['userID']
 | |
|             currentACL = ACLManager.loadedACL(userID)
 | |
| 
 | |
|             if ACLManager.currentContextPermission(currentACL, 'deleteFTPAccount') == 0:
 | |
|                 return ACLManager.loadErrorJson('deleteStatus', 0)
 | |
| 
 | |
|             data = json.loads(self.request.body)
 | |
|             ftpUserName = data['ftpUsername']
 | |
| 
 | |
|             admin = Administrator.objects.get(pk=userID)
 | |
|             ftp = Users.objects.get(user=ftpUserName)
 | |
| 
 | |
|             if ACLManager.checkOwnership(ftp.domain.domain, admin, currentACL) == 1:
 | |
|                 pass
 | |
|             else:
 | |
|                 return ACLManager.loadErrorJson()
 | |
| 
 | |
|             FTPUtilities.submitFTPDeletion(ftpUserName)
 | |
| 
 | |
|             final_json = json.dumps({'status': 1, 'deleteStatus': 1, 'error_message': "None"})
 | |
|             return HttpResponse(final_json)
 | |
| 
 | |
|         except BaseException as msg:
 | |
|             data_ret = {'status': 0, 'deleteStatus': 0, 'error_message': str(msg)}
 | |
|             json_data = json.dumps(data_ret)
 | |
|             return HttpResponse(json_data)
 | |
| 
 | |
|     def listFTPAccounts(self):
 | |
|         userID = self.request.session['userID']
 | |
|         currentACL = ACLManager.loadedACL(userID)
 | |
| 
 | |
|         if not os.path.exists('/home/cyberpanel/pureftpd'):
 | |
|             proc = httpProc(self.request, 'ftp/listFTPAccounts.html',
 | |
|                             {"status": 0}, 'listFTPAccounts')
 | |
|             return proc.render()
 | |
| 
 | |
|         websitesName = ACLManager.findAllSites(currentACL, userID)
 | |
|         proc = httpProc(self.request, 'ftp/listFTPAccounts.html',
 | |
|                         {'websiteList': websitesName, "status": 1}, 'listFTPAccounts')
 | |
|         return proc.render()
 | |
| 
 | |
|     def getAllFTPAccounts(self):
 | |
|         try:
 | |
|             userID = self.request.session['userID']
 | |
|             currentACL = ACLManager.loadedACL(userID)
 | |
| 
 | |
|             if ACLManager.currentContextPermission(currentACL, 'listFTPAccounts') == 0:
 | |
|                 return ACLManager.loadErrorJson('fetchStatus', 0)
 | |
| 
 | |
|             data = json.loads(self.request.body)
 | |
|             selectedDomain = data['selectedDomain']
 | |
| 
 | |
|             domain = Websites.objects.get(domain=selectedDomain)
 | |
| 
 | |
|             admin = Administrator.objects.get(pk=userID)
 | |
|             if ACLManager.checkOwnership(selectedDomain, admin, currentACL) == 1:
 | |
|                 pass
 | |
|             else:
 | |
|                 return ACLManager.loadErrorJson()
 | |
| 
 | |
|             records = Users.objects.filter(domain=domain)
 | |
| 
 | |
|             json_data = "["
 | |
|             checker = 0
 | |
| 
 | |
|             for items in records:
 | |
|                 dic = {'id': items.id,
 | |
|                        'user': items.user,
 | |
|                        'dir': items.dir,
 | |
|                        'quotasize': str(items.quotasize) + "MB",
 | |
|                        }
 | |
| 
 | |
|                 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, '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 changePassword(self):
 | |
|         try:
 | |
|             userID = self.request.session['userID']
 | |
|             currentACL = ACLManager.loadedACL(userID)
 | |
| 
 | |
|             if ACLManager.currentContextPermission(currentACL, 'listFTPAccounts') == 0:
 | |
|                 return ACLManager.loadErrorJson('changePasswordStatus', 0)
 | |
| 
 | |
|             data = json.loads(self.request.body)
 | |
|             userName = data['ftpUserName']
 | |
|             password = data['passwordByPass']
 | |
| 
 | |
|             admin = Administrator.objects.get(pk=userID)
 | |
|             ftp = Users.objects.get(user=userName)
 | |
| 
 | |
|             if currentACL['admin'] == 1:
 | |
|                 pass
 | |
|             elif ftp.domain.admin != admin:
 | |
|                 return ACLManager.loadErrorJson()
 | |
| 
 | |
|             FTPUtilities.changeFTPPassword(userName, password)
 | |
| 
 | |
|             data_ret = {'status': 1, 'changePasswordStatus': 1, 'error_message': "None"}
 | |
|             json_data = json.dumps(data_ret)
 | |
|             return HttpResponse(json_data)
 | |
|         except BaseException as msg:
 | |
|             data_ret = {'status': 0, 'changePasswordStatus': 0, 'error_message': str(msg)}
 | |
|             json_data = json.dumps(data_ret)
 | |
|             return HttpResponse(json_data)
 | |
| 
 | |
|     def installPureFTPD(self):
 | |
| 
 | |
|         def pureFTPDServiceName():
 | |
|             if ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu:
 | |
|                 return 'pure-ftpd-mysql'
 | |
|             return 'pure-ftpd'
 | |
| 
 | |
|         #### new install
 | |
| 
 | |
|         if ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu or ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu20:
 | |
| 
 | |
|             command = 'DEBIAN_FRONTEND=noninteractive apt purge pure-ftp* -y'
 | |
|             ProcessUtilities.executioner(command, 'root', True)
 | |
| 
 | |
| 
 | |
|             command = 'DEBIAN_FRONTEND=noninteractive apt install pure-ftpd-mysql -y'
 | |
|             ProcessUtilities.executioner(command, 'root', True)
 | |
| 
 | |
|         elif ProcessUtilities.decideDistro() == ProcessUtilities.centos:
 | |
| 
 | |
|             command = 'yum erase pure-ftp* -y'
 | |
|             ProcessUtilities.executioner(command, 'root', True)
 | |
| 
 | |
|             command = "yum install -y pure-ftpd"
 | |
|             ProcessUtilities.executioner(command, 'root', True)
 | |
|         elif ProcessUtilities.decideDistro() == ProcessUtilities.cent8:
 | |
| 
 | |
|             command = 'yum erase pure-ftp* -y'
 | |
|             ProcessUtilities.executioner(command, 'root', True)
 | |
| 
 | |
|             command = 'dnf install pure-ftpd -y'
 | |
|             ProcessUtilities.executioner(command, 'root', True)
 | |
| 
 | |
|         ####### Install pureftpd to system startup
 | |
| 
 | |
|         command = "systemctl enable " + pureFTPDServiceName()
 | |
|         ProcessUtilities.executioner(command, 'root', True)
 | |
| 
 | |
|         ###### FTP Groups and user settings settings
 | |
| 
 | |
|         command = 'groupadd -g 2001 ftpgroup'
 | |
|         ProcessUtilities.executioner(command, 'root', True)
 | |
| 
 | |
|         command = 'useradd -u 2001 -s /bin/false -d /bin/null -c "pureftpd user" -g ftpgroup ftpuser'
 | |
|         ProcessUtilities.executioner(command, 'root', True)
 | |
| 
 | |
|         return 1
 | |
| 
 | |
|     def startPureFTPD(self):
 | |
|         ############## Start pureftpd ######################
 | |
|         if ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu:
 | |
|             serviceName = 'pure-ftpd-mysql'
 | |
|             command = 'systemctl start pure-ftpd-mysql'
 | |
|         else:
 | |
|             serviceName = 'pure-ftpd'
 | |
|             command = 'systemctl start pure-ftpd'
 | |
|         
 | |
|         ProcessUtilities.executioner(command)
 | |
|         
 | |
|         # Give service time to start
 | |
|         import time
 | |
|         time.sleep(2)
 | |
|         
 | |
|         # Check if service started successfully
 | |
|         command = 'systemctl is-active %s' % serviceName
 | |
|         output = ProcessUtilities.outputExecutioner(command)
 | |
|         
 | |
|         if output.strip() != 'active':
 | |
|             logging.CyberCPLogFileWriter.writeToFile('[ERROR] Pure-FTPd failed to start. Service status: ' + output)
 | |
|             logging.CyberCPLogFileWriter.statusWriter(self.extraArgs['tempStatusPath'],
 | |
|                                                       '[ERROR] Pure-FTPd service failed to start properly [404]')
 | |
|             return 0
 | |
| 
 | |
|         return 1
 | |
| 
 | |
|     def installPureFTPDConfigurations(self, mysqlPassword):
 | |
|         # try:
 | |
|         #     ## setup ssl for ftp
 | |
|         #
 | |
|         #     try:
 | |
|         #         os.mkdir("/etc/ssl/private")
 | |
|         #     except:
 | |
|         #         pass
 | |
|         #
 | |
|         #     if (ProcessUtilities.decideDistro() == ProcessUtilities.centos or ProcessUtilities.decideDistro() == ProcessUtilities.cent8) or (
 | |
|         #             ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu20 and ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu):
 | |
|         #         command = 'openssl req -newkey rsa:1024 -new -nodes -x509 -days 3650 -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com" -keyout /etc/ssl/private/pure-ftpd.pem -out /etc/ssl/private/pure-ftpd.pem'
 | |
|         #     else:
 | |
|         #         command = 'openssl req -x509 -nodes -days 7300 -newkey rsa:2048 -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com" -keyout /etc/ssl/private/pure-ftpd.pem -out /etc/ssl/private/pure-ftpd.pem'
 | |
|         #
 | |
|         #     ProcessUtilities.executioner(command)
 | |
|         #
 | |
|         #     import shutil
 | |
|         #
 | |
|         #     ftpdPath = "/etc/pure-ftpd"
 | |
|         #
 | |
|         #     if os.path.exists(ftpdPath):
 | |
|         #         shutil.rmtree(ftpdPath)
 | |
|         #         shutil.copytree("/usr/local/CyberCP/install/pure-ftpd-one", ftpdPath)
 | |
|         #
 | |
|         #     else:
 | |
|         #         shutil.copytree("/usr/local/CyberCP/install/pure-ftpd-one", ftpdPath)
 | |
|         #
 | |
|         #
 | |
|         #     if ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu:
 | |
|         #         try:
 | |
|         #             os.mkdir('/etc/pure-ftpd/conf')
 | |
|         #             os.mkdir('/etc/pure-ftpd/auth')
 | |
|         #             os.mkdir('/etc/pure-ftpd/db')
 | |
|         #         except OSError as err:
 | |
|         #             pass
 | |
|         #
 | |
|         #     data = open(ftpdPath + "/pureftpd-mysql.conf", "r").readlines()
 | |
|         #
 | |
|         #     writeDataToFile = open(ftpdPath + "/pureftpd-mysql.conf", "w")
 | |
|         #
 | |
|         #     dataWritten = "MYSQLPassword " + mysqlPassword + '\n'
 | |
|         #     for items in data:
 | |
|         #         if items.find("MYSQLPassword") > -1:
 | |
|         #             writeDataToFile.writelines(dataWritten)
 | |
|         #         else:
 | |
|         #             writeDataToFile.writelines(items)
 | |
|         #
 | |
|         #     writeDataToFile.close()
 | |
|         #
 | |
|         #     ftpConfPath = '/etc/pure-ftpd/pureftpd-mysql.conf'
 | |
|         #
 | |
|         #     if self.remotemysql == 'ON':
 | |
|         #         command = "sed -i 's|localhost|%s|g' %s" % (self.mysqlhost, ftpConfPath)
 | |
|         #         ProcessUtilities.executioner(command)
 | |
|         #
 | |
|         #         command = "sed -i 's|3306|%s|g' %s" % (self.mysqlport, ftpConfPath)
 | |
|         #         ProcessUtilities.executioner(command)
 | |
|         #
 | |
|         #         command = "sed -i 's|MYSQLSocket /var/lib/mysql/mysql.sock||g' %s" % (ftpConfPath)
 | |
|         #         ProcessUtilities.executioner(command)
 | |
|         #
 | |
|         #     if ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu:
 | |
|         #
 | |
|         #         if os.path.exists('/etc/pure-ftpd/db/mysql.conf'):
 | |
|         #             os.remove('/etc/pure-ftpd/db/mysql.conf')
 | |
|         #             shutil.copy(ftpdPath + "/pureftpd-mysql.conf", '/etc/pure-ftpd/db/mysql.conf')
 | |
|         #         else:
 | |
|         #             shutil.copy(ftpdPath + "/pureftpd-mysql.conf", '/etc/pure-ftpd/db/mysql.conf')
 | |
|         #
 | |
|         #         import subprocess
 | |
|         #         command = 'echo 1 > /etc/pure-ftpd/conf/TLS'
 | |
|         #         subprocess.call(command, shell=True)
 | |
|         #
 | |
|         #         command = 'echo %s > /etc/pure-ftpd/conf/ForcePassiveIP' % (self.publicip)
 | |
|         #         subprocess.call(command, shell=True)
 | |
|         #
 | |
|         #         command = 'echo "40110 40210" > /etc/pure-ftpd/conf/PassivePortRange'
 | |
|         #         subprocess.call(command, shell=True)
 | |
|         #
 | |
|         #         command = 'echo "no" > /etc/pure-ftpd/conf/UnixAuthentication'
 | |
|         #         subprocess.call(command, shell=True)
 | |
|         #
 | |
|         #         command = 'echo "/etc/pure-ftpd/db/mysql.conf" > /etc/pure-ftpd/conf/MySQLConfigFile'
 | |
|         #         subprocess.call(command, shell=True)
 | |
|         #
 | |
|         #         command = 'ln -s /etc/pure-ftpd/conf/MySQLConfigFile /etc/pure-ftpd/auth/30mysql'
 | |
|         #         ProcessUtilities.executioner(command)
 | |
|         #
 | |
|         #         command = 'ln -s /etc/pure-ftpd/conf/UnixAuthentication /etc/pure-ftpd/auth/65unix'
 | |
|         #         ProcessUtilities.executioner(command)
 | |
|         #
 | |
|         #         command = 'systemctl restart pure-ftpd-mysql.service'
 | |
|         #         ProcessUtilities.executioner(command)
 | |
|         #
 | |
|         #     return 1
 | |
|         #
 | |
|         # except IOError as msg:
 | |
|         #     return 0
 | |
| 
 | |
|         try:
 | |
|             ## setup ssl for ftp
 | |
| 
 | |
|             try:
 | |
|                 if not os.path.exists("/etc/ssl/private"):
 | |
|                     os.makedirs("/etc/ssl/private", mode=0o755)
 | |
|             except OSError as e:
 | |
|                 if e.errno != errno.EEXIST:
 | |
|                     logging.CyberCPLogFileWriter.writeToFile("[ERROR] Could not create directory for FTP SSL: " + str(e))
 | |
|                     raise
 | |
| 
 | |
|             if ProcessUtilities.decideDistro() == ProcessUtilities.centos or ProcessUtilities.decideDistro() == ProcessUtilities.cent8:
 | |
|                 command = 'openssl req -newkey rsa:1024 -new -nodes -x509 -days 3650 -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com" -keyout /etc/ssl/private/pure-ftpd.pem -out /etc/ssl/private/pure-ftpd.pem'
 | |
|             else:
 | |
|                 command = 'openssl req -x509 -nodes -days 7300 -newkey rsa:2048 -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com" -keyout /etc/ssl/private/pure-ftpd.pem -out /etc/ssl/private/pure-ftpd.pem'
 | |
| 
 | |
|             ProcessUtilities.executioner(command, 'root', True)
 | |
| 
 | |
|             ### let see if this is needed the chdir
 | |
|             cwd = os.getcwd()
 | |
|             os.chdir('/usr/local/CyberCP/install')
 | |
|             ftpdPath = "/etc/pure-ftpd"
 | |
|             import shutil
 | |
| 
 | |
|             if os.path.exists(ftpdPath):
 | |
|                 shutil.rmtree(ftpdPath)
 | |
| 
 | |
|                 shutil.copytree("pure-ftpd-one", ftpdPath)
 | |
|             else:
 | |
| 
 | |
|                 shutil.copytree("pure-ftpd-one", ftpdPath)
 | |
| 
 | |
|             if ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu or ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu20:
 | |
|                 try:
 | |
|                     os.mkdir('/etc/pure-ftpd/conf')
 | |
|                     os.mkdir('/etc/pure-ftpd/auth')
 | |
|                     os.mkdir('/etc/pure-ftpd/db')
 | |
|                 except BaseException as msg:
 | |
|                     logging.CyberCPLogFileWriter.writeToFile("[ERROR] Error creating extra pure-ftpd directories: " + str(msg), ".  Should be ok", 1)
 | |
|                     logging.CyberCPLogFileWriter.statusWriter(self.extraArgs['tempStatusPath'], "[ERROR] Error creating extra pure-ftpd directories: " + str(msg), "" + " [installPureFTPDConfigurations][404]")
 | |
|                     return 0
 | |
| 
 | |
|             data = open(ftpdPath + "/pureftpd-mysql.conf", "r").readlines()
 | |
| 
 | |
|             writeDataToFile = open(ftpdPath + "/pureftpd-mysql.conf", "w")
 | |
| 
 | |
|             dataWritten = "MYSQLPassword " + mysqlPassword + '\n'
 | |
|             for items in data:
 | |
|                 if items.find("MYSQLPassword") > -1:
 | |
|                     writeDataToFile.writelines(dataWritten)
 | |
|                 else:
 | |
|                     writeDataToFile.writelines(items)
 | |
| 
 | |
|             writeDataToFile.close()
 | |
| 
 | |
|             ftpConfPath = '/etc/pure-ftpd/pureftpd-mysql.conf'
 | |
| 
 | |
|             if self.remotemysql == 'ON':
 | |
|                 command = "sed -i 's|localhost|%s|g' %s" % (self.mysqlhost, ftpConfPath)
 | |
|                 ProcessUtilities.executioner(command, 'root', True)
 | |
| 
 | |
|                 command = "sed -i 's|3306|%s|g' %s" % (self.mysqlport, ftpConfPath)
 | |
|                 ProcessUtilities.executioner(command, 'root', True)
 | |
| 
 | |
|                 command = "sed -i 's|MYSQLSocket /var/lib/mysql/mysql.sock||g' %s" % (ftpConfPath)
 | |
|                 ProcessUtilities.executioner(command, 'root', True)
 | |
| 
 | |
|             if ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu or ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu20:
 | |
| 
 | |
|                 if os.path.exists('/etc/pure-ftpd/db/mysql.conf'):
 | |
|                     os.remove('/etc/pure-ftpd/db/mysql.conf')
 | |
|                     shutil.copy(ftpdPath + "/pureftpd-mysql.conf", '/etc/pure-ftpd/db/mysql.conf')
 | |
|                 else:
 | |
|                     shutil.copy(ftpdPath + "/pureftpd-mysql.conf", '/etc/pure-ftpd/db/mysql.conf')
 | |
| 
 | |
|                 command = 'echo 1 > /etc/pure-ftpd/conf/TLS'
 | |
|                 ProcessUtilities.executioner(command, 'root', True)
 | |
| 
 | |
|                 command = 'echo %s > /etc/pure-ftpd/conf/ForcePassiveIP' % (ACLManager.fetchIP())
 | |
|                 ProcessUtilities.executioner(command, 'root', True)
 | |
| 
 | |
|                 command = 'echo "40110 40210" > /etc/pure-ftpd/conf/PassivePortRange'
 | |
|                 ProcessUtilities.executioner(command, 'root', True)
 | |
| 
 | |
|                 command = 'echo "no" > /etc/pure-ftpd/conf/UnixAuthentication'
 | |
|                 ProcessUtilities.executioner(command, 'root', True)
 | |
| 
 | |
|                 command = 'echo "/etc/pure-ftpd/db/mysql.conf" > /etc/pure-ftpd/conf/MySQLConfigFile'
 | |
|                 ProcessUtilities.executioner(command, 'root', True)
 | |
| 
 | |
|                 command = 'ln -s /etc/pure-ftpd/conf/MySQLConfigFile /etc/pure-ftpd/auth/30mysql'
 | |
|                 ProcessUtilities.executioner(command, 'root', True)
 | |
| 
 | |
|                 command = 'ln -s /etc/pure-ftpd/conf/UnixAuthentication /etc/pure-ftpd/auth/65unix'
 | |
|                 ProcessUtilities.executioner(command, 'root', True)
 | |
| 
 | |
|                 command = 'systemctl restart pure-ftpd-mysql.service'
 | |
|                 ProcessUtilities.executioner(command, 'root', True)
 | |
| 
 | |
|                 ProcessUtilities.decideDistro()
 | |
| 
 | |
|                 if ProcessUtilities.ubuntu22Check:
 | |
|                     ### change mysql md5 to crypt
 | |
| 
 | |
|                     command = "sed -i 's/MYSQLCrypt md5/MYSQLCrypt crypt/g' /etc/pure-ftpd/db/mysql.conf"
 | |
|                     ProcessUtilities.executioner(command, 'root', True)
 | |
| 
 | |
|                     command = "systemctl restart pure-ftpd-mysql.service"
 | |
|                     ProcessUtilities.executioner(command, 'root', True)
 | |
| 
 | |
|             # from plogical.mailUtilities import mailUtilities
 | |
|             # PostFixHostname = mailUtilities.FetchPostfixHostname()
 | |
|             # pathToStoreSSLFullChain = '/etc/letsencrypt/live/' + PostFixHostname + '/fullchain.pem'
 | |
|             # pathToStoreSSLPrivKey = '/etc/letsencrypt/live/' + PostFixHostname + '/privkey.pem'
 | |
|             # if ProcessUtilities != 'localhost':
 | |
|             #
 | |
|             #     if os.path.exists('/etc/ssl/private/pure-ftpd.pem'):
 | |
|             #     ## create symlink for hostname SSL for lsws webadmin SSL
 | |
|             #         os.remove('/etc/ssl/private/pure-ftpd.pem')
 | |
|             #         command = 'ln -s %s /etc/ssl/private/pure-ftpd.pem' % (pathToStoreSSLFullChain)
 | |
|             #         ProcessUtilities.normalExecutioner(command)
 | |
| 
 | |
| 
 | |
|             os.chdir(cwd)
 | |
| 
 | |
| 
 | |
|         except IOError as msg:
 | |
|             logging.CyberCPLogFileWriter.writeToFile('[ERROR] ' + str(msg) + " [installPureFTPDConfigurations]")
 | |
|             logging.CyberCPLogFileWriter.statusWriter(self.extraArgs['tempStatusPath'], '[ERROR] ' + str(msg) + " [installPureFTPDConfigurations][404]")
 | |
|             return 0
 | |
| 
 | |
|     def ResetFTPConfigurations(self):
 | |
|         try:
 | |
|             ### Check if remote or local mysql
 | |
| 
 | |
|             passFile = "/etc/cyberpanel/mysqlPassword"
 | |
| 
 | |
|             try:
 | |
|                 jsonData = json.loads(ProcessUtilities.outputExecutioner('cat %s' % (passFile)))
 | |
| 
 | |
|                 self.mysqluser = jsonData['mysqluser']
 | |
|                 self.mysqlpassword = jsonData['mysqlpassword']
 | |
|                 self.mysqlport = jsonData['mysqlport']
 | |
|                 self.mysqlhost = jsonData['mysqlhost']
 | |
|                 self.remotemysql = 'ON'
 | |
| 
 | |
|                 if self.mysqlhost.find('rds.amazon') > -1:
 | |
|                     self.RDS = 1
 | |
| 
 | |
|                 ## Also set localhost to this server
 | |
| 
 | |
|                 ipFile = "/etc/cyberpanel/machineIP"
 | |
|                 f = open(ipFile)
 | |
|                 ipData = f.read()
 | |
|                 ipAddressLocal = ipData.split('\n', 1)[0]
 | |
| 
 | |
|                 self.LOCALHOST = ipAddressLocal
 | |
|             except BaseException as msg:
 | |
|                 self.remotemysql = 'OFF'
 | |
| 
 | |
|                 if os.path.exists(ProcessUtilities.debugPath):
 | |
|                     logging.CyberCPLogFileWriter.writeToFile('%s. [setupConnection:75]' % (str(msg)))
 | |
| 
 | |
|             logging.CyberCPLogFileWriter.statusWriter(self.extraArgs['tempStatusPath'], 'Removing and re-installing FTP..,5')
 | |
| 
 | |
|             if self.installPureFTPD() == 0:
 | |
|                 logging.CyberCPLogFileWriter.statusWriter(self.extraArgs['tempStatusPath'],
 | |
|                                                           'installPureFTPD failed. [404].')
 | |
|                 return 0
 | |
| 
 | |
|             logging.CyberCPLogFileWriter.statusWriter(self.extraArgs['tempStatusPath'], 'Resetting configurations..,40')
 | |
| 
 | |
|             import sys
 | |
|             sys.path.append('/usr/local/CyberCP')
 | |
|             os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings")
 | |
|             from CyberCP import settings
 | |
| 
 | |
|             logging.CyberCPLogFileWriter.statusWriter(self.extraArgs['tempStatusPath'], 'Configurations reset..,70')
 | |
| 
 | |
|             if self.installPureFTPDConfigurations(settings.DATABASES['default']['PASSWORD']) == 0:
 | |
|                 logging.CyberCPLogFileWriter.statusWriter(self.extraArgs['tempStatusPath'], 'installPureFTPDConfigurations failed. [404].')
 | |
|                 return 0
 | |
| 
 | |
|             if self.startPureFTPD() == 0:
 | |
|                 logging.CyberCPLogFileWriter.statusWriter(self.extraArgs['tempStatusPath'],
 | |
|                                                           'startPureFTPD failed. [404].')
 | |
|                 return 0
 | |
| 
 | |
|             logging.CyberCPLogFileWriter.statusWriter(self.extraArgs['tempStatusPath'], 'Fixing permissions..,90')
 | |
| 
 | |
|             ACLManager.fixPermissions()
 | |
|             logging.CyberCPLogFileWriter.statusWriter(self.extraArgs['tempStatusPath'], 'Completed [200].')
 | |
| 
 | |
|         except BaseException as msg:
 | |
|             final_dic = {'status': 0, 'error_message': str(msg)}
 | |
|             final_json = json.dumps(final_dic)
 | |
|             return HttpResponse(final_json)
 | |
| 
 | |
| def main():
 | |
| 
 | |
|     parser = argparse.ArgumentParser(description='CyberPanel')
 | |
|     parser.add_argument('function', help='Specify a function to call!')
 | |
|     parser.add_argument('--tempStatusPath', help='Path of temporary status file.')
 | |
| 
 | |
|     args = parser.parse_args()
 | |
| 
 | |
|     if args.function == "ResetFTPConfigurations":
 | |
|         extraArgs = {'tempStatusPath': args.tempStatusPath}
 | |
|         ftp = FTPManager(None, extraArgs)
 | |
|         ftp.ResetFTPConfigurations()
 | |
| 
 | |
| if __name__ == "__main__":
 | |
|     main() |