Files
CyberPanel/postfixSenderPolicy/accept_traffic.py

114 lines
5.0 KiB
Python
Raw Normal View History

2018-06-30 15:29:56 +05:00
#!/usr/local/CyberCP/bin/python2
import os,sys
sys.path.append('/usr/local/CyberCP')
import django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings")
django.setup()
import threading as multi
from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging
from policyConstraint import policyConstraints
from emailPremium.models import DomainLimits, EmailLimits, EmailLogs
from mailServer.models import Domains, EUsers
import time
from cacheManager import cacheManager
limitThreads = multi.BoundedSemaphore(10)
class HandleRequest(multi.Thread):
2018-06-30 15:29:56 +05:00
cleaningPath = '/home/cyberpanel/purgeCache'
def __init__(self, conn):
multi.Thread.__init__(self)
self.connection = conn
def run(self):
limitThreads.acquire()
dataComplete = ""
try:
try:
while True:
2018-06-30 15:29:56 +05:00
# Wait for a connection
if os.path.exists(HandleRequest.cleaningPath):
readFromFile = open(HandleRequest.cleaningPath, 'r')
command = readFromFile.read()
cacheManager.handlePurgeRequest(command)
readFromFile.close()
logging.writeToFile(command + 'nCommand')
os.remove(HandleRequest.cleaningPath)
Data = self.connection.recv(64)
if Data:
if len(Data) < 64:
dataComplete = dataComplete + Data
2018-06-30 15:29:56 +05:00
self.manageRequest(dataComplete)
dataComplete = ''
else:
dataComplete = dataComplete + Data
else:
self.connection.close()
2018-06-30 15:29:56 +05:00
break
finally:
# Clean up the connection
self.connection.close()
finally:
limitThreads.release()
def manageRequest(self, completeData):
try:
completeData = completeData.split('\n')
for items in completeData:
tempData = items.split('=')
2018-06-30 15:29:56 +05:00
if tempData[0] == 'sender':
emailAddress = tempData[1]
2018-06-30 15:29:56 +05:00
domainName = emailAddress.split('@')[1]
elif tempData[0] == 'recipient':
destination = tempData[1]
if domainName in cacheManager.domains:
domainObj = cacheManager.domains[domainName]
emailObj = domainObj.findEmailOBJ(emailAddress)
else:
domain = Domains.objects.get(domain=domainName)
domainLTS = DomainLimits.objects.get(domain=domain)
newDomain = policyConstraints(domainName, domainLTS.monthlyLimit, domainLTS.monthlyUsed, domainLTS.limitStatus)
cacheManager.domains[domainName] = newDomain
domainObj = newDomain
emailObj = newDomain.findEmailOBJ(emailAddress)
#logging.writeToFile('Domain Limit Status: ' + str(domainObj.limitStatus))
#logging.writeToFile('Email Limit Status: ' + str(domainObj.limitStatus))
#logging.writeToFile('Email Monthly Limit: ' + str(emailObj.monthlyLimits))
#logging.writeToFile('Email Monthly Used: ' + str(emailObj.monthlyUsed))
if domainObj.limitStatus == 1 and emailObj.limitStatus == 1:
2018-06-30 15:29:56 +05:00
if domainObj.monthlyLimits <= domainObj.monthlyLimits or emailObj.monthlyLimits <= emailObj.monthlyUsed or emailObj.hourlyLimits <= emailObj.hourlyUsed:
logging.writeToFile(emailAddress + ' either exceeded monthly or hourly sending limit.')
self.connection.sendall('action=defer_if_permit Service temporarily unavailable\n\n')
else:
email = EUsers.objects.get(email=emailAddress)
if emailObj.logStatus == 1:
logEntry = EmailLogs(email=email, destination=destination, timeStamp=time.strftime("%I-%M-%S-%a-%b-%Y"))
logEntry.save()
emailObj.monthlyUsed = emailObj.monthlyUsed + 1
emailObj.hourlyUsed = emailObj.hourlyUsed + 1
2018-06-30 15:29:56 +05:00
domainObj.monthlyUsed = domainObj.monthlyUsed + 1
self.connection.sendall('action=dunno\n\n')
else:
email = EUsers.objects.get(email=emailAddress)
if emailObj.logStatus == 1:
logEntry = EmailLogs(email=email, destination=destination,
timeStamp=time.strftime("%I-%M-%S-%a-%b-%Y"))
logEntry.save()
emailObj.monthlyUsed = emailObj.monthlyUsed + 1
emailObj.hourlyUsed = emailObj.hourlyUsed + 1
self.connection.sendall('action=dunno\n\n')
except BaseException, msg:
2018-06-30 15:29:56 +05:00
logging.writeToFile(completeData)
self.connection.sendall('action=dunno\n\n')
logging.writeToFile(str(msg))