#!/usr/bin/python3 # -*- coding: utf-8 -*- import sys import re import sqlite3 import os.path import ldap import configparser import time import syslog def get_domain(): f = open('/etc/hostname') domain = f.read() f.close() return domain.rstrip() def get_counter(now): db.execute("CREATE TABLE IF NOT EXISTS counter(time integer, cnt integer)") #delete old data cleanup_range(now) #return 1 hour sum counter value db.execute("SELECT sum(cnt) FROM counter") count = db.fetchone()[0] if count: return int(count) else: return 0 def cleanup_range(now): delta = now - 3600 db.execute("DELETE FROM counter WHERE time limit_value: return False else: set_counter(now,mailnum) return True if __name__ == '__main__': try: setting = ConfigParser.SafeConfigParser() setting.read("/var/www/ControlPanel/conf/setting.conf") dbpath = '/var/throttle/throttle.db' f = open("/var/throttle/debug.log","a") syslog.openlog('throttle', syslog.LOG_PID|syslog.LOG_PERROR, syslog.LOG_LOCAL0) # LDAP settings ldaphost = setting.get("ldap", "host") baseDN = setting.get("ldap", "dn_name") username = setting.get("ldap", "base_dn_name") password = setting.get("ldap", "pass") searchFilter = "(uid=*)" data = {} lineRx = re.compile(r'^\s*([^=\s]+)\s*=(.*)$') con = sqlite3.connect(dbpath) db = con.cursor() domain = get_domain() while 1: line = sys.stdin.readline() if not line: break line = line.rstrip() # end of entry if not line: result = check_throttle(data) if result: sys.stdout.write('action=dunno\n\n') sys.stdout.flush() else: sys.stdout.write('action=451 mail rate limit exceeded -- try again later\n\n') sys.stdout.flush() data = {} f.write("\n\n") f.flush() continue # parse line m = lineRx.match(line) if not m: continue # save the string key = m.group(1) value = m.group(2) data[key] = value f.write(line+"\n") con.close() syslog.closelog() f.close() except Exception as e: syslog.syslog(syslog.LOG_INFO, "error: "+str(type(e))+" "+str(e)) sys.stdout.write('action=dunno\n\n') sys.stdout.flush()