Expire and renew AddrCache entries
This commit is contained in:
@@ -1,6 +1,9 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
# A simple milter that has grown quite a bit.
|
# A simple milter that has grown quite a bit.
|
||||||
# $Log$
|
# $Log$
|
||||||
|
# Revision 1.45 2005/12/23 22:34:46 customdesigned
|
||||||
|
# Put guessed result in separate header.
|
||||||
|
#
|
||||||
# Revision 1.44 2005/12/23 21:47:07 customdesigned
|
# Revision 1.44 2005/12/23 21:47:07 customdesigned
|
||||||
# Move Received-SPF header to top.
|
# Move Received-SPF header to top.
|
||||||
#
|
#
|
||||||
@@ -714,43 +717,64 @@ class SPFPolicy(object):
|
|||||||
class AddrCache(object):
|
class AddrCache(object):
|
||||||
time_format = '%Y%b%d %H:%M:%S %Z'
|
time_format = '%Y%b%d %H:%M:%S %Z'
|
||||||
|
|
||||||
def load(self,fname,age=7):
|
def __init__(self,renew=7):
|
||||||
|
self.age = renew
|
||||||
|
|
||||||
|
def load(self,fname,age=0):
|
||||||
|
if not age:
|
||||||
|
age = self.age
|
||||||
self.fname = fname
|
self.fname = fname
|
||||||
cache = {}
|
cache = {}
|
||||||
self.cache = cache
|
self.cache = cache
|
||||||
|
now = time.time()
|
||||||
try:
|
try:
|
||||||
too_old = time.time() - age*24*60*60 # max age in days
|
too_old = now - age*24*60*60 # max age in days
|
||||||
for ln in open(self.fname):
|
for ln in open(self.fname):
|
||||||
try:
|
try:
|
||||||
rcpt,ts = ln.strip().split(None,1)
|
rcpt,ts = ln.strip().split(None,1)
|
||||||
l = time.strptime(ts,AddrCache.time_format)
|
l = time.strptime(ts,AddrCache.time_format)
|
||||||
t = time.mktime(l)
|
t = time.mktime(l)
|
||||||
if t > too_old:
|
if t > too_old:
|
||||||
cache[rcpt.lower()] = None
|
cache[rcpt.lower()] = (t,None)
|
||||||
except:
|
except:
|
||||||
cache[ln.strip().lower()] = None
|
cache[ln.strip().lower()] = (now,None)
|
||||||
except IOError: pass
|
except IOError: pass
|
||||||
|
|
||||||
def has_key(self,sender):
|
def has_key(self,sender):
|
||||||
return self.cache.has_key(sender.lower())
|
try:
|
||||||
|
ts,res = self.cache[sender.lower()]
|
||||||
|
too_old = time.time() - self.age*24*60*60 # max age in days
|
||||||
|
if ts > too_old:
|
||||||
|
return True
|
||||||
|
del self.cache[sender.lower()]
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
return False
|
||||||
|
|
||||||
def __getitem__(self,sender):
|
def __getitem__(self,sender):
|
||||||
return self.cache[sender.lower()]
|
ts,res = self.cache[sender.lower()]
|
||||||
|
too_old = time.time() - self.age*24*60*60 # max age in days
|
||||||
|
if ts > too_old:
|
||||||
|
return res
|
||||||
|
del self.cache[sender.lower()]
|
||||||
|
raise KeyError, sender
|
||||||
|
|
||||||
def __setitem__(self,sender,res):
|
def __setitem__(self,sender,res):
|
||||||
lsender = sender.lower()
|
lsender = sender.lower()
|
||||||
cached = lsender in self.cache
|
now = time.time()
|
||||||
self.cache[lsender] = res
|
cached = self.has_key(sender)
|
||||||
if not cached and not res:
|
if not cached:
|
||||||
s = time.strftime(AddrCache.time_format,time.localtime())
|
self.cache[lsender] = (now,res)
|
||||||
print >>open(self.fname,'a'),sender,s # log who we sent DSNs to
|
if not res:
|
||||||
|
s = time.strftime(AddrCache.time_format,time.localtime(now))
|
||||||
|
print >>open(self.fname,'a'),sender,s # log refreshed senders
|
||||||
|
|
||||||
def __len__(self):
|
def __len__(self):
|
||||||
return len(self.cache)
|
return len(self.cache)
|
||||||
|
|
||||||
cbv_cache = AddrCache()
|
cbv_cache = AddrCache(renew=7)
|
||||||
cbv_cache.load('send_dsn.log',age=7)
|
cbv_cache.load('send_dsn.log',age=7)
|
||||||
auto_whitelist = AddrCache()
|
auto_whitelist = AddrCache(renew=30)
|
||||||
auto_whitelist.load('auto_whitelist.log',age=120)
|
auto_whitelist.load('auto_whitelist.log',age=120)
|
||||||
|
|
||||||
class bmsMilter(Milter.Milter):
|
class bmsMilter(Milter.Milter):
|
||||||
@@ -1587,7 +1611,10 @@ class bmsMilter(Milter.Milter):
|
|||||||
else:
|
else:
|
||||||
self.alter_recipients(self.discard_list,self.redirect_list)
|
self.alter_recipients(self.discard_list,self.redirect_list)
|
||||||
for name,val,idx in self.new_headers:
|
for name,val,idx in self.new_headers:
|
||||||
self.addheader(name,val,idx)
|
try:
|
||||||
|
self.addheader(name,val,idx)
|
||||||
|
except:
|
||||||
|
self.addheader(name,val) # older sendmail can't insheader
|
||||||
|
|
||||||
if self.cbv_needed:
|
if self.cbv_needed:
|
||||||
q = self.cbv_needed
|
q = self.cbv_needed
|
||||||
|
|||||||
Reference in New Issue
Block a user