Develop and Download Open Source Software

Browse Subversion Repository

Diff of /pwfilter/trunk/pwfilter/pwfilter.py

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 49 by ykimura, Sun Apr 22 10:01:25 2012 UTC revision 50 by ykimura, Mon May 7 13:30:44 2012 UTC
# Line 202  class HostCache: Line 202  class HostCache:
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()
# Line 214  class HostCache: Line 216  class HostCache:
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
# Line 226  class HostCache: Line 228  class HostCache:
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)
# Line 235  class HostCache: Line 237  class HostCache:
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):
# Line 254  class HostCache: Line 260  class HostCache:
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:
# Line 264  class HostCache: Line 271  class HostCache:
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:
# Line 288  class HostCache: Line 296  class HostCache:
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  ###外部###############  ###外部###############
# Line 619  class myMilter(Milter.Base): Line 627  class myMilter(Milter.Base):
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:
# Line 668  class myMilter(Milter.Base): Line 676  class myMilter(Milter.Base):
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, '', '')
# Line 762  class myMilter(Milter.Base): Line 770  class myMilter(Milter.Base):
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:
# Line 775  class myMilter(Milter.Base): Line 783  class myMilter(Milter.Base):
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]):
# Line 794  class myMilter(Milter.Base): Line 802  class myMilter(Milter.Base):
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
# Line 874  class myMilter(Milter.Base): Line 882  class myMilter(Milter.Base):
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
# Line 1180  class myMilter(Milter.Base): Line 1188  class myMilter(Milter.Base):
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:

Legend:
Removed from v.49  
changed lines
  Added in v.50

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26