diff --git a/plogical/IncScheduler.py b/plogical/IncScheduler.py index 0cb5561be..720ad6eb4 100644 --- a/plogical/IncScheduler.py +++ b/plogical/IncScheduler.py @@ -1045,24 +1045,24 @@ def CalculateAndUpdateDiskUsage(): spaceString = f'{website.package.diskSpace}M {website.package.diskSpace}M' command = f'setquota -u {website.externalApp} {spaceString} 0 0 /' ProcessUtilities.executioner(command) - # if config['DiskUsagePercentage'] >= 100: - # command = 'chattr -R +i /home/%s/' % (website.domain) - # ProcessUtilities.executioner(command) - # - # command = 'chattr -R -i /home/%s/logs/' % (website.domain) - # ProcessUtilities.executioner(command) - # - # command = 'chattr -R -i /home/%s/.trash/' % (website.domain) - # ProcessUtilities.executioner(command) - # - # command = 'chattr -R -i /home/%s/backup/' % (website.domain) - # ProcessUtilities.executioner(command) - # - # command = 'chattr -R -i /home/%s/incbackup/' % (website.domain) - # ProcessUtilities.executioner(command) - # else: - # command = 'chattr -R -i /home/%s/' % (website.domain) - # ProcessUtilities.executioner(command) + if config['DiskUsagePercentage'] >= 100: + command = 'chattr -R +i /home/%s/' % (website.domain) + ProcessUtilities.executioner(command) + + command = 'chattr -R -i /home/%s/logs/' % (website.domain) + ProcessUtilities.executioner(command) + + command = 'chattr -R -i /home/%s/.trash/' % (website.domain) + ProcessUtilities.executioner(command) + + command = 'chattr -R -i /home/%s/backup/' % (website.domain) + ProcessUtilities.executioner(command) + + command = 'chattr -R -i /home/%s/incbackup/' % (website.domain) + ProcessUtilities.executioner(command) + else: + command = 'chattr -R -i /home/%s/' % (website.domain) + ProcessUtilities.executioner(command) ## Calculate bw usage diff --git a/plogical/upgrade.py b/plogical/upgrade.py index b3af93ac0..0bb094efc 100755 --- a/plogical/upgrade.py +++ b/plogical/upgrade.py @@ -3517,6 +3517,210 @@ def upgrade(branch): if os.path.exists(Upgrade.LogPathNew): os.remove(Upgrade.LogPathNew) + @staticmethod + def installQuota(): + try: + + if Upgrade.FindOperatingSytem() == CENTOS7 or Upgrade.FindOperatingSytem() == CENTOS8\ + or Upgrade.FindOperatingSytem() == openEuler20 or Upgrade.FindOperatingSytem() == openEuler22: + command = "yum install quota -y" + Upgrade.executioner(command, command, 0, True) + + if Upgrade.edit_fstab('/', '/') == 0: + print("Quotas will not be abled as we failed to modify fstab file.") + return 0 + + + command = 'mount -o remount /' + Upgrade.executioner(command, command, 0, True) + + command = 'mount -o remount /' + mResult = subprocess.run(command, capture_output=True, text=True, shell=True) + if mResult.returncode != 0: + fstab_path = '/etc/fstab' + backup_path = fstab_path + '.bak' + if os.path.exists(fstab_path): + os.remove(fstab_path) + shutil.copy(backup_path, fstab_path) + + print("Re-mount failed, restoring original FSTab and existing quota setup.") + return 0 + + + + ## + + if Upgrade.FindOperatingSytem() == Ubuntu22 or Upgrade.FindOperatingSytem() == Ubuntu18 \ + or Upgrade.FindOperatingSytem() == Ubuntu20: + print("Install Quota on Ubuntu") + command = 'apt update -y' + Upgrade.executioner(command, command, 0, True) + + command = 'apt install quota -y' + Upgrade.executioner(command, command, 0, True) + + command = "find /lib/modules/ -type f -name '*quota_v*.ko*'" + + + if subprocess.check_output(command,shell=True).decode("utf-8").find("quota/") == -1: + command = "sudo apt install linux-image-extra-virtual -y" + Upgrade.executioner(command, command, 0, True) + + if Upgrade.edit_fstab('/', '/') == 0: + print("Quotas will not be abled as we are are failed to modify fstab file.") + return 0 + + command = 'mount -o remount /' + mResult = subprocess.run(command, capture_output=True, text=True, shell=True) + if mResult.returncode != 0: + fstab_path = '/etc/fstab' + backup_path = fstab_path + '.bak' + if os.path.exists(fstab_path): + os.remove(fstab_path) + shutil.copy(backup_path, fstab_path) + + print("Re-mount failed, restoring original FSTab and existing quota setup.") + return 0 + + command = 'quotacheck -ugm /' + Upgrade.executioner(command, command, 0, True) + + #### + + command = "find /lib/modules/ -type f -name '*quota_v*.ko*'" + iResult = subprocess.run(command, capture_output=True, text=True, shell=True) + print(repr(iResult.stdout)) + + # Only if the first command works, run the rest + + if iResult.returncode == 0: + command = "echo '{}' | sed -n 's|/lib/modules/\\([^/]*\\)/.*|\\1|p' | sort -u".format(iResult.stdout) + result = subprocess.run(command, capture_output=True, text=True, shell=True) + fResult = result.stdout.rstrip('\n') + print(repr(result.stdout.rstrip('\n'))) + + command = 'uname -r' + ffResult = subprocess.run(command, capture_output=True, text=True, shell=True) + ffResult = ffResult.stdout.rstrip('\n') + + command = f"apt-get install linux-modules-extra-{ffResult}" + Upgrade.executioner(command, command, 0, True) + + ### + + command = f'modprobe quota_v1 -S {ffResult}' + Upgrade.executioner(command, command, 0, True) + + command = f'modprobe quota_v2 -S {ffResult}' + Upgrade.executioner(command, command, 0, True) + + command = f'quotacheck -ugm /' + Upgrade.executioner(command, command, 0, True) + + command = f'quotaon -v /' + Upgrade.executioner(command, command, 0, True) + + return 1 + + except BaseException as msg: + print("[ERROR] installQuota. " + str(msg)) + return 0 + + @staticmethod + def edit_fstab(mount_point, options_to_add): + + try: + retValue = 1 + # Backup the original fstab file + fstab_path = '/etc/fstab' + backup_path = fstab_path + '.bak' + + if not os.path.exists(backup_path): + shutil.copy(fstab_path, backup_path) + + # Read the fstab file + with open(fstab_path, 'r') as file: + lines = file.readlines() + + # Modify the appropriate line + WriteToFile = open(fstab_path, 'w') + for i, line in enumerate(lines): + + if line.find('\t') > -1: + parts = line.split('\t') + else: + parts = line.split(' ') + + print(parts) + try: + if parts[1] == '/' and parts[3].find('usrquota,grpquota') == -1 and len(parts[3]) > 4: + + ### if xfx dont move forward for now + if line.find('xfs') > -1: + retValue = 0 + WriteToFile.write(line) + continue + ### + + parts[3] = f'{parts[3]},usrquota,grpquota' + finalString = '\t'.join(parts) + print(finalString) + WriteToFile.write(finalString) + + elif parts[1] == '/': + + ### if xfx dont move forward for now + if line.find('xfs') > -1: + retValue = 0 + WriteToFile.write(line) + continue + ### + + for ii, p in enumerate(parts): + if p.find('defaults') > -1 or p.find('discard') > -1: + parts[ii] = f'{parts[ii]},usrquota,grpquota' + finalString = '\t'.join(parts) + print(finalString) + WriteToFile.write(finalString) + else: + WriteToFile.write(line) + except: + WriteToFile.write(line) + + WriteToFile.close() + + return retValue + except: + return 0 + + + @staticmethod + def FixCurrentQuoatasSystem(): + fstab_path = '/etc/fstab' + + data = open(fstab_path, 'r').read() + + if data.find("usrquota,grpquota") > -1: + print("Quotas already enabled.") + + + if Upgrade.installQuota() == 1: + + print("We will attempt to bring new Quota system to old websites.") + from websiteFunctions.models import Websites + for website in Websites.objects.all(): + + command = 'chattr -R -i /home/%s/' % (website.domain) + Upgrade.executioner(command, command, 0, True) + + if website.package.enforceDiskLimits: + spaceString = f'{website.package.diskSpace}M {website.package.diskSpace}M' + command = f'setquota -u {website.externalApp} {spaceString} 0 0 /' + Upgrade.executioner(command, command, 0, True) + + else: + print("Quotas can not be enabled continue to use chhtr.") + def main(): parser = argparse.ArgumentParser(description='CyberPanel Installer')