File: //usr/local/CyberCP/plogical/rebuildQuotas.py
import os,sys
sys.path.append('/usr/local/CyberCP')
import django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings")
try:
    django.setup()
except:
    pass
import subprocess
class rebuildQuotas:
    def __init__(self):
        pass
    def Rebuild(self):
        try:
            print("Fixing and rebuilding Quotas...")
            fstab_path = '/etc/fstab'
            rData = open(fstab_path, 'r').read()
            if rData.find('xfs') > -1:
                command  = "mount | grep ' / '"
                try:
                    qResult = subprocess.run(command, capture_output=True, universal_newlines=True, shell=True)
                except:
                    qResult = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True, shell=True)
                if qResult.stdout.find('usrquota') > -1:
                    print("Looks like Quotas are enabled in filesystem, moving on..")
                else:
                    print("Looks like Quotas are not enabled in filesystem, exiting.")
                    print("Please follow this guide to enable Quotas on XFS file system: ")
                    exit(1)
            else:
                command  = "mount | grep quota"
                try:
                    qResult = subprocess.run(command, capture_output=True, universal_newlines=True, shell=True)
                except:
                    qResult = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
                                             universal_newlines=True, shell=True)
                if qResult.stdout.find('usrquota') > -1:
                    print("Looks like Quotas are enabled in filesystem, moving on..")
                else:
                    print("Looks like Quotas are not enabled in filesystem, exiting.")
                    exit(1)
            from websiteFunctions.models import Websites
            for website in Websites.objects.all():
                print(f"Rebuilding quotas for {website.domain}...")
                command = 'chattr -R -i /home/%s/' % (website.domain)
                try:
                    qResult = subprocess.run(command, capture_output=True, universal_newlines=True, shell=True)
                except:
                    qResult = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
                                             universal_newlines=True, shell=True)
                if website.package.enforceDiskLimits:
                    spaceString = f'{website.package.diskSpace}M {website.package.diskSpace}M'
                    command = f'setquota -u {website.externalApp} {spaceString} 0 0 /'
                    print(command)
                    try:
                        qResult = subprocess.run(command, capture_output=True, universal_newlines=True, shell=True)
                    except:
                        qResult = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
                                                 universal_newlines=True, shell=True)
                else:
                    print(f"Ignored {website.domain} because the selected package does not enforce disk limits.")
        except:
            pass
def main():
    rbQ = rebuildQuotas()
    rbQ.Rebuild()
if __name__ == "__main__":
    main()