| 202 |
# 更新回数 |
# 更新回数 |
| 203 |
# アクセス回数 |
# アクセス回数 |
| 204 |
|
|
| 205 |
def __init__(self, fname=None, maxcnt=7): |
def __init__(self, fname=None, maxcnt=7, maxrng=1000): |
| 206 |
self.maxcnt = maxcnt |
self.maxcnt = maxcnt |
| 207 |
|
self.maxrng = maxrng |
| 208 |
|
self.rngcnt = 0 |
| 209 |
self.cache = {} |
self.cache = {} |
| 210 |
self.fname = fname |
self.fname = fname |
| 211 |
self.lock = threading.Lock() |
self.lock = threading.Lock() |
| 216 |
#finally: |
#finally: |
| 217 |
# self.lock.release() |
# self.lock.release() |
| 218 |
|
|
| 219 |
def hostcheck(self, hostname): |
def hostcheck(self, hostname, dyn): |
| 220 |
with self.lock: |
with self.lock: |
| 221 |
if not self.cache.has_key(hostname): |
if not self.cache.has_key(hostname): |
| 222 |
return None |
return None |
| 228 |
return True |
return True |
| 229 |
if ac > 0: |
if ac > 0: |
| 230 |
ac = 0 |
ac = 0 |
| 231 |
if dc >= self.maxcnt: |
if (not dyn) and (dc <= self.maxcnt): |
| 232 |
dc += 1 |
dc += 1 |
| 233 |
et = now + dc*24*60*60 |
et = now + dc*24*60*60 |
| 234 |
self.cache[hostname] = (et, dc, ac) |
self.cache[hostname] = (et, dc, ac) |
| 237 |
def hostadd(self, hostname): |
def hostadd(self, hostname): |
| 238 |
with self.lock: |
with self.lock: |
| 239 |
if not self.cache.has_key(hostname): |
if not self.cache.has_key(hostname): |
| 240 |
et = time.time() + 24*60*60 |
if self.rngcnt < self.maxrng: |
| 241 |
dc = 1 |
et = time.time() + 24*60*60 |
| 242 |
ac = 0 |
dc = 1 |
| 243 |
|
ac = 0 |
| 244 |
|
self.cache[hostname] = (et, dc, ac) |
| 245 |
|
self.rngcnt +=1 |
| 246 |
else: |
else: |
| 247 |
et, dc, ac = self.cache[hostname] |
et, dc, ac = self.cache[hostname] |
| 248 |
ac += 1 |
ac += 1 |
| 249 |
self.cache[hostname] = (et, dc, ac) |
self.cache[hostname] = (et, dc, ac) |
| 250 |
|
|
| 251 |
def hostdel(self, hostname): |
def hostdel(self, hostname): |
| 252 |
with self.lock: |
with self.lock: |
| 253 |
if self.cache.has_key(hostname): |
if self.cache.has_key(hostname): |
| 254 |
del self.cache[hostname] |
del self.cache[hostname] |
| 255 |
|
self.rngcnt -=1 |
| 256 |
|
|
| 257 |
|
|
| 258 |
def load(self, fname=None, maxcnt=0): |
def load(self, fname=None, maxcnt=0): |
| 260 |
self.maxcnt = maxcnt |
self.maxcnt = maxcnt |
| 261 |
if fname: |
if fname: |
| 262 |
self.fname = fname |
self.fname = fname |
| 263 |
|
self.rngcnt = 0 |
| 264 |
self.cache = {} |
self.cache = {} |
| 265 |
try: |
try: |
| 266 |
with open(self.fname) as fp: |
with open(self.fname) as fp: |
| 271 |
dc = int(dcnt) |
dc = int(dcnt) |
| 272 |
ac = int(acnt) |
ac = int(acnt) |
| 273 |
self.cache[hostname] = (et, dc, ac) |
self.cache[hostname] = (et, dc, ac) |
| 274 |
|
self.rngcnt +=1 |
| 275 |
except: |
except: |
| 276 |
continue |
continue |
| 277 |
except: |
except: |
| 296 |
pass |
pass |
| 297 |
|
|
| 298 |
## (システムに合わせて修正が必要です) ## |
## (システムに合わせて修正が必要です) ## |
| 299 |
dsnerror = HostCache(fname="/var/log/pwmail/dsnerror.log", maxcnt=30) |
dsnerror = HostCache(fname="/var/log/pwmail/dsnerror.log", maxcnt=10) |
| 300 |
|
|
| 301 |
|
|
| 302 |
###外部############### |
###外部############### |
| 627 |
return (rv, rm, rt) |
return (rv, rm, rt) |
| 628 |
|
|
| 629 |
|
|
| 630 |
def HostCheck(self, Hname, ipad): |
def HostCheck(self, Hname, ipad, dyn): |
| 631 |
## ホスト名部分のキープ #################################### |
## ホスト名部分のキープ #################################### |
| 632 |
hcheck = dsnerror.hostcheck(Hname) |
hcheck = dsnerror.hostcheck(Hname, dyn) |
| 633 |
if hcheck: |
if hcheck: |
| 634 |
ipok = (None, '', '') |
ipok = (None, '', '') |
| 635 |
else: |
else: |
| 676 |
if fqdncheck(self.Cname): |
if fqdncheck(self.Cname): |
| 677 |
self.Cfqdn = True |
self.Cfqdn = True |
| 678 |
self.Cdynip = dynip(self.Cname, self.IP) |
self.Cdynip = dynip(self.Cname, self.IP) |
| 679 |
self.Cipok = self.HostCheck(IPname, self.IP) |
self.Cipok = self.HostCheck(IPname, self.IP, self.Cdynip) |
| 680 |
if (not self.Cipok[0]) and (self.Cname != IPname): |
if (not self.Cipok[0]) and (self.Cname != IPname): |
| 681 |
self.Cipok = self.HostCheck(self.Cname, self.IP) |
self.Cipok = self.HostCheck(self.Cname, self.IP, self.Cdynip) |
| 682 |
else: |
else: |
| 683 |
self.Cfqdn = False |
self.Cfqdn = False |
| 684 |
self.Cipok = (None, '', '') |
self.Cipok = (None, '', '') |
| 770 |
|
|
| 771 |
if self.Cipok[0]: |
if self.Cipok[0]: |
| 772 |
if eq_domain_check(self.Cname, self.Hname): #type1 |
if eq_domain_check(self.Cname, self.Hname): #type1 |
| 773 |
wHipok = self.HostCheck(self.Hname, self.IP) |
wHipok = self.HostCheck(self.Hname, self.IP, self.Hdynip) |
| 774 |
if wHipok[0]: |
if wHipok[0]: |
| 775 |
self.Hipok = wHipok |
self.Hipok = wHipok |
| 776 |
else: |
else: |
| 783 |
Hdmain = Hdmain[pos + 1:] |
Hdmain = Hdmain[pos + 1:] |
| 784 |
if fqdnjp.search(Hdmain): |
if fqdnjp.search(Hdmain): |
| 785 |
if eq_domain_check(self.Cname, Hdmain): #type2 |
if eq_domain_check(self.Cname, Hdmain): #type2 |
| 786 |
wHipok = self.HostCheck(Hdmain, self.IP) |
wHipok = self.HostCheck(Hdmain, self.IP, self.Hdynip) |
| 787 |
if wHipok[0]: |
if wHipok[0]: |
| 788 |
self.Hipok = wHipok |
self.Hipok = wHipok |
| 789 |
else: |
else: |
| 790 |
self.Hipok = (True, self.Cipok[1], wHipok[2]) |
self.Hipok = (True, self.Cipok[1], wHipok[2]) |
| 791 |
return Milter.CONTINUE |
return Milter.CONTINUE |
| 792 |
|
|
| 793 |
self.Hipok = self.HostCheck(self.Hname, self.IP) |
self.Hipok = self.HostCheck(self.Hname, self.IP, self.Hdynip) |
| 794 |
# 送信ホスト名の記述ミスの回避 |
# 送信ホスト名の記述ミスの回避 |
| 795 |
if (not self.Hipok[0]): |
if (not self.Hipok[0]): |
| 796 |
if (self.Hname != heloname): |
if (self.Hname != heloname): |
| 797 |
self.Hipok = self.HostCheck(heloname, self.IP) |
self.Hipok = self.HostCheck(heloname, self.IP, self.Hdynip) |
| 798 |
|
|
| 799 |
# 送信ホスト名の記述ミスの回避 |
# 送信ホスト名の記述ミスの回避 |
| 800 |
if (not self.Hipok[0]): |
if (not self.Hipok[0]): |
| 802 |
pos = Hdmain.find('.') |
pos = Hdmain.find('.') |
| 803 |
Hdmain = Hdmain[pos + 1:] |
Hdmain = Hdmain[pos + 1:] |
| 804 |
if fqdnjp.search(Hdmain): |
if fqdnjp.search(Hdmain): |
| 805 |
self.Hipok = self.HostCheck(Hdmain, self.IP) |
self.Hipok = self.HostCheck(Hdmain, self.IP, self.Hdynip) |
| 806 |
|
|
| 807 |
if self.Hipok[0] == None: |
if self.Hipok[0] == None: |
| 808 |
self.PWmsg = self.PWmsg + "ngHipok " # error |
self.PWmsg = self.PWmsg + "ngHipok " # error |
| 882 |
if self.Fdynip: |
if self.Fdynip: |
| 883 |
self.PWmsg = self.PWmsg + "Fdynip " # error |
self.PWmsg = self.PWmsg + "Fdynip " # error |
| 884 |
|
|
| 885 |
self.Fipok = self.HostCheck(self.Fd, self.IP) |
self.Fipok = self.HostCheck(self.Fd, self.IP, self.Fdynip) |
| 886 |
if self.Fipok[0] == None: |
if self.Fipok[0] == None: |
| 887 |
self.PWmsg = self.PWmsg + "ngFipok " # error not(MX/A) |
self.PWmsg = self.PWmsg + "ngFipok " # error not(MX/A) |
| 888 |
return Milter.CONTINUE |
return Milter.CONTINUE |
| 1188 |
if self.HFdynip: |
if self.HFdynip: |
| 1189 |
self.PWmsg = self.PWmsg + "HFdynip " |
self.PWmsg = self.PWmsg + "HFdynip " |
| 1190 |
|
|
| 1191 |
self.HFipok = self.HostCheck(dn, self.IP) |
self.HFipok = self.HostCheck(dn, self.IP, self.HFdynip) |
| 1192 |
if self.HFipok[0] == None: |
if self.HFipok[0] == None: |
| 1193 |
self.PWmsg = self.PWmsg + "ngHFipok " |
self.PWmsg = self.PWmsg + "ngHFipok " |
| 1194 |
elif self.HFipok[0] == False: |
elif self.HFipok[0] == False: |