File: //proc/thread-self/root/usr/local/CyberCP/postfixSenderPolicy/cacheManager.py
#!/usr/local/CyberCP/bin/python
import os,sys
sys.path.append('/usr/local/CyberCP')
import django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings")
django.setup()
sys.path.append('/usr/local/CyberCP')
from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging
from emailPremium.models import EmailLimits, DomainLimits, Domains, EUsers
class cacheManager:
    domains = {}
    @staticmethod
    def flushCache():
        try:
            for domain, domainOBJ in cacheManager.domains.items():
                domaindb = Domains.objects.get(domain=domain)
                dbDomain = DomainLimits.objects.get(domain=domaindb)
                dbDomain.monthlyUsed = domainOBJ.monthlyUsed
                dbDomain.save()
                for email, emailOBJ in domainOBJ.emails.items():
                    emailID = EUsers.objects.get(email=email)
                    dbEmail = EmailLimits.objects.get(email=emailID)
                    dbEmail.monthlyUsed = emailOBJ.monthlyUsed
                    dbEmail.hourlyUsed = emailOBJ.hourlyUsed
                    dbEmail.save()
        except BaseException as msg:
            logging.writeToFile(str(msg) + ' [cacheManager.flushCache]')
    @staticmethod
    def disableEnableLogs(self, emailAddress, operationValue):
        try:
            domainName = emailAddress.split('@')[1]
            if domainName in cacheManager.domains:
                domainOBJ = cacheManager.domains[domainName]
                if emailAddress in domainOBJ.emails:
                    emailOBJ = domainOBJ.emails[emailAddress]
                    emailOBJ.logStatus = operationValue
        except BaseException as msg:
            logging.writeToFile(str(msg) + ' [cacheManager.disableEnableLogs]')
    @staticmethod
    def purgeLog(command):
        try:
            email = command[2]
            operationVal = int(command[3])
            domain = email.split('@')[1]
            if domain in cacheManager.domains:
                domainOBJ = cacheManager.domains[domain]
                emailOBJ = domainOBJ.emails[email]
                emailOBJ.logStatus = operationVal
        except BaseException as msg:
            logging.writeToFile(str(msg) + ' [cacheManager.purgeLog]')
    @staticmethod
    def purgeLimit(command):
        try:
            email = command[2]
            operationVal = int(command[3])
            domain = email.split('@')[1]
            if domain in cacheManager.domains:
                domainOBJ = cacheManager.domains[domain]
                emailOBJ = domainOBJ.emails[email]
                emailOBJ.limitStatus = operationVal
        except BaseException as msg:
            logging.writeToFile(str(msg) + ' [cacheManager.purgeLimit]')
    @staticmethod
    def purgeLimitDomain(command):
        try:
            domain = command[2]
            operationVal = int(command[3])
            if domain in cacheManager.domains:
                domainOBJ = cacheManager.domains[domain]
                domainOBJ.limitStatus = operationVal
        except BaseException as msg:
            logging.writeToFile(str(msg) + ' [cacheManager.purgeLimitDomain]')
    @staticmethod
    def updateDomainLimit(command):
        try:
            domain = command[2]
            newLimit = int(command[3])
            if domain in cacheManager.domains:
                domainOBJ = cacheManager.domains[domain]
                domainOBJ.monthlyLimits = newLimit
        except BaseException as msg:
            logging.writeToFile(str(msg) + ' [cacheManager.updateDomainLimit]')
    @staticmethod
    def purgeLimitEmail(command):
        try:
            email = command[2]
            monthlyLimit = int(command[3])
            hourlyLimit = int(command[4])
            domain = email.split('@')[1]
            if domain in cacheManager.domains:
                domainOBJ = cacheManager.domains[domain]
                emailOBJ = domainOBJ.emails[email]
                emailOBJ.monthlyLimits = monthlyLimit
                emailOBJ.hourlyLimits = hourlyLimit
        except BaseException as msg:
            logging.writeToFile(str(msg) + ' [cacheManager.purgeLimitEmail]')
    @staticmethod
    def hourlyCleanUP():
        try:
            for domain, domainOBJ in cacheManager.domains.items():
                for email, emailOBJ in domainOBJ.emails.items():
                    emailID = EUsers.objects.get(email=email)
                    dbEmail = EmailLimits.objects.get(email=emailID)
                    dbEmail.hourlyUsed = 0
                    dbEmail.save()
                    dbEmail.hourlyUsed = 0
                    emailOBJ.hourlyUsed = 0
        except BaseException as msg:
            logging.writeToFile(str(msg) + ' [cacheManager.hourlyCleanUP]')
    @staticmethod
    def monthlyCleanUP():
        try:
            for domain, domainOBJ in cacheManager.domains.items():
                domaindb = Domains.objects.get(domain=domain)
                dbDomain = DomainLimits.objects.get(domain=domaindb)
                for email, emailOBJ in domainOBJ.emails.items():
                    emailID = EUsers.objects.get(email=email)
                    dbEmail = EmailLimits.objects.get(email=emailID)
                    dbEmail.monthlyUsed = 0
                    emailOBJ.monthlyUsed = 0
                    dbEmail.hourlyUsed = 0
                    emailOBJ.hourlyUsed = 0
                    dbEmail.save()
                dbDomain.monthlyUsed = 0
                dbDomain.save()
        except BaseException as msg:
            logging.writeToFile(str(msg) + ' [cacheManager.monthlyCleanUP]')
    @staticmethod
    def cleanUP(*args):
        cacheManager.flushCache()
        logging.writeToFile('Email Cleanup Service')
        os._exit(0)
    @staticmethod
    def handlePurgeRequest(command):
        try:
            finalCommand = command.split(' ')
            if finalCommand[1] == 'purgeLog':
                cacheManager.purgeLog(finalCommand)
            elif finalCommand[1] == 'purgeLimit':
                cacheManager.purgeLimit(finalCommand)
            elif finalCommand[1] == 'purgeLimitDomain':
                cacheManager.purgeLimitDomain(finalCommand)
            elif finalCommand[1] == 'updateDomainLimit':
                cacheManager.updateDomainLimit(finalCommand)
            elif finalCommand[1] == 'purgeLimitEmail':
                cacheManager.purgeLimitEmail(finalCommand)
            elif finalCommand[1] == 'hourlyCleanup':
                cacheManager.hourlyCleanUP()
            elif finalCommand[1] == 'monthlyCleanup':
                cacheManager.monthlyCleanUP()
        except BaseException as msg:
            logging.writeToFile(str(msg) + ' [cacheManager.handlePurgeRequest]')