
#2Nc           @   sO  d  Z  d Z d Z d Z d Z d d l m Z d d l m Z d d l	 m
 Z
 d d	 l m Z d d
 l m Z d d l m Z m Z m Z d d l Z d d l Z d d l Z d d l Z d d l Z e j d  Z d e
 f d     YZ d e f d     YZ d d l Z d f  d     YZ d d l Z d d l Z d f  d     YZ  d S(   s   Cyril Jaquiers   $Revision: 752 $s5   $Date: 2009-09-01 23:21:30 +0200 (Tue, 01 Sep 2009) $s    Copyright (c) 2004 Cyril Jaquiert   GPLi(   t   FailManager(   t
   FailTicket(   t
   JailThread(   t   DateDetector(   t   MyTime(   t	   FailRegext   Regext   RegexExceptionNs   fail2ban.filtert   Filterc           B   s   e  Z d    Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z	 d   Z
 d	   Z d
   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z RS(   c         C   sv   t  j |   | |  _ t   |  _ t   |  _ t   |  _ d |  _ g  |  _	 t
   |  _ |  j j   t j d  d  S(   Nip  s   Created Filter(   R   t   __init__t   jailR   t   failManagert   listt   _Filter__failRegext   _Filter__ignoreRegext   _Filter__findTimet   _Filter__ignoreIpListR   t   dateDetectort   addDefaultTemplatet   logSyst   debug(   t   selfR   (    (    s$   /usr/share/fail2ban/server/filter.pyR
   6   s    			c         C   sG   y  t  |  } |  j j |  Wn  t k
 rB } t j |  n Xd  S(   N(   R   R   t   appendR   R   t   error(   R   t   valuet   regext   e(    (    s$   /usr/share/fail2ban/server/filter.pyt   addFailRegexQ   s
    c         C   s7   y |  j  | =Wn" t k
 r2 t j d |  n Xd  S(   Ns7   Cannot remove regular expression. Index %d is not valid(   R   t
   IndexErrorR   R   (   R   t   index(    (    s$   /usr/share/fail2ban/server/filter.pyt   delFailRegexY   s
    	c         C   s4   t    } x$ |  j D] } | j | j    q W| S(   N(   R   R   R   t   getRegex(   R   t	   failRegexR   (    (    s$   /usr/share/fail2ban/server/filter.pyt   getFailRegexe   s    	c         C   sG   y  t  |  } |  j j |  Wn  t k
 rB } t j |  n Xd  S(   N(   R   R   R   R   R   R   (   R   R   R   R   (    (    s$   /usr/share/fail2ban/server/filter.pyt   addIgnoreRegexr   s
    c         C   s7   y |  j  | =Wn" t k
 r2 t j d |  n Xd  S(   Ns7   Cannot remove regular expression. Index %d is not valid(   R   R   R   R   (   R   R   (    (    s$   /usr/share/fail2ban/server/filter.pyt   delIgnoreRegexy   s
    	c         C   s4   t    } x$ |  j D] } | j | j    q W| S(   N(   R   R   R   R    (   R   t   ignoreRegexR   (    (    s$   /usr/share/fail2ban/server/filter.pyt   getIgnoreRegex   s    	c         C   s.   | |  _  |  j j |  t j d |  d  S(   Ns   Set findtime = %s(   R   R   t
   setMaxTimeR   t   info(   R   R   (    (    s$   /usr/share/fail2ban/server/filter.pyt   setFindTime   s    	c         C   s   |  j  S(   N(   R   (   R   (    (    s$   /usr/share/fail2ban/server/filter.pyt   getFindTime   s    c         C   s%   |  j  j |  t j d |  d  S(   Ns   Set maxRetry = %s(   R   t   setMaxRetryR   R(   (   R   R   (    (    s$   /usr/share/fail2ban/server/filter.pyR+      s    c         C   s   |  j  j   S(   N(   R   t   getMaxRetry(   R   (    (    s$   /usr/share/fail2ban/server/filter.pyR,      s    c         C   s   t  d   d  S(   Ns   run() is abstract(   t	   Exception(   R   (    (    s$   /usr/share/fail2ban/server/filter.pyt   run   s    c         C   s)   t  j    } |  j j t | |   | S(   N(   t   timeR   t
   addFailureR   (   R   t   ipt   unixTime(    (    s$   /usr/share/fail2ban/server/filter.pyt   addBannedIP   s    c         C   s)   t  j d | d  |  j j |  d  S(   Ns   Add s    to ignore list(   R   R   R   R   (   R   R1   (    (    s$   /usr/share/fail2ban/server/filter.pyt   addIgnoreIP   s    c         C   s)   t  j d | d  |  j j |  d  S(   Ns   Remove s    from ignore list(   R   R   R   t   remove(   R   R1   (    (    s$   /usr/share/fail2ban/server/filter.pyt   delIgnoreIP   s    c         C   s   |  j  S(   N(   R   (   R   (    (    s$   /usr/share/fail2ban/server/filter.pyt   getIgnoreIP   s    c         C   s   x |  j  D] } | d k r" q
 n  | j d d  } t |  d k rY | j d d  n  t | d  | d <y4 t j | d | d  } t j | | d  } Wn3 t k
 r t j |  } | | k r
 t	 Sq
 n X| | k r
 t	 Sq
 Wt
 S(   Nt    t   /i   t   32i    (   R   t   splitt   lent   insertt   longt   DNSUtilst   cidrR-   t   dnsToIpt   Truet   False(   R   R1   t   it   st   at   bt   ips(    (    s$   /usr/share/fail2ban/server/filter.pyt   inIgnoreIPList   s$    c         C   s   y | j  d  } Wn t k
 r, | } n X|  j j |  } | rr | j   } | | j    | | j   } n | } | } |  j | |  S(   Ns   utf-8(   t   decodet   UnicodeDecodeErrorR   t	   matchTimet   groupt   startt   endt   findFailure(   R   t   linet   lt	   timeMatcht   timeLinet   logLine(    (    s$   /usr/share/fail2ban/server/filter.pyt   processLine   s    
!c         C   s   x |  j  |  D] } | d } | d } t j d | | f  | t j   |  j   k  r t j d | t j   |  j   f  Pn  |  j |  r t j d |  q n  t j d |  |  j j t	 | |   q Wd  S(   Ni    i   s&   Processing line with time:%s and ip:%ss#   Ignore line since time %s < %s - %ss	   Ignore %ss   Found %s(
   RV   R   R   R   R/   R*   RI   R   R0   R   (   R   RQ   t   elementR1   R2   (    (    s$   /usr/share/fail2ban/server/filter.pyt   processLineAndAdd  s    

		c         C   s5   x. |  j  D]# } | j |  | j   r
 t Sq
 Wt S(   N(   R   t   searcht
   hasMatchedRB   RC   (   R   RQ   R%   (    (    s$   /usr/share/fail2ban/server/filter.pyt
   ignoreLine"  s
    c   
      C   s
  t    } |  j |  r | Sx |  j D] } | j |  | j   r& |  j j |  } | d  k r t j	 d | d d | d d d  qyM | j
   } t j |  } | r x! | D] } | j | | g  q WPn  Wqt k
 r }	 t j |	  qXq& q& W| S(   Ns   Found a match for 's	   ' but no s   valid date/time found for 's   '. Please contact the s(   author in order to get support for this t   format(   R   R[   R   RY   RZ   R   t   getUnixTimet   NoneR   R   t   getHostR?   t   textToIpR   R   R   (
   R   RT   RU   t   failListR!   t   datet   hostt   ipMatchR1   R   (    (    s$   /usr/share/fail2ban/server/filter.pyRP   0  s(    	&c         C   s.   d |  j  j   f d |  j  j   f g } | S(   Ns   Currently faileds   Total failed(   R   t   sizet   getFailTotal(   R   t   ret(    (    s$   /usr/share/fail2ban/server/filter.pyt   statusW  s    (   t   __name__t
   __module__R
   R   R   R"   R#   R$   R&   R)   R*   R+   R,   R.   R3   R4   R6   R7   RI   RV   RX   R[   RP   Rh   (    (    (    s$   /usr/share/fail2ban/server/filter.pyR	   .   s,   								
				
											't
   FileFilterc           B   sS   e  Z d    Z e d  Z d   Z d   Z d   Z d   Z d   Z	 d   Z
 RS(   c         C   s   t  j |  |  g  |  _ d  S(   N(   R	   R
   t   _FileFilter__logPath(   R   R   (    (    s$   /usr/share/fail2ban/server/filter.pyR
   _  s    c         C   s#   t  | |  } |  j j |  d  S(   N(   t   FileContainerRl   R   (   R   t   patht   tailt	   container(    (    s$   /usr/share/fail2ban/server/filter.pyt
   addLogPathi  s    c         C   s>   x7 |  j  D], } | j   | k r
 |  j  j |  d  Sq
 Wd  S(   N(   Rl   t   getFileNameR5   (   R   Rn   t   log(    (    s$   /usr/share/fail2ban/server/filter.pyt
   delLogPathr  s    c         C   s   |  j  S(   N(   Rl   (   R   (    (    s$   /usr/share/fail2ban/server/filter.pyt
   getLogPath}  s    c         C   s.   x' |  j  D] } | j   | k r
 t Sq
 Wt S(   N(   Rl   Rr   RB   RC   (   R   Rn   Rs   (    (    s$   /usr/share/fail2ban/server/filter.pyt   containsLogPath  s    c         C   s.   x' |  j  D] } | j   | k r
 | Sq
 Wd  S(   N(   Rl   Rr   R^   (   R   Rn   Rs   (    (    s$   /usr/share/fail2ban/server/filter.pyt   getFileContainer  s    c         C   s   |  j  |  } | d  k r0 t j d |  t Sy | j   Wn2 t k
 rr } t j d |  t j |  t SX| j   } x9 | d k s |  j	   s Pn  |  j
 |  | j   } q W| j   t S(   Ns   Unable to get failures in s   Unable to open %sR8   (   Rw   R^   R   R   RC   t   openR-   t	   exceptiont   readlinet	   _isActiveRX   t   closeRB   (   R   t   filenameRp   R   RQ   (    (    s$   /usr/share/fail2ban/server/filter.pyt   getFailures  s$    
c         C   sK   t  j |   } g  |  j   D] } | j   ^ q } | j d | f  | S(   Ns	   File list(   R	   Rh   Ru   Rr   R   (   R   Rg   t   mRn   (    (    s$   /usr/share/fail2ban/server/filter.pyRh     s    %(   Ri   Rj   R
   RC   Rq   Rt   Ru   Rv   Rw   R~   Rh   (    (    (    s$   /usr/share/fail2ban/server/filter.pyRk   ]  s   	
							Rm   c           B   s8   e  Z e d   Z d   Z d   Z d   Z d   Z RS(   c         C   s   | |  _  | |  _ d  |  _ t |  } t j | j    } | j |  _	 zY | j
   } t j |  j   |  _ | r | j d d  | j   |  _ n	 d |  _ Wd  | j   Xd  S(   Ni    i   (   t   _FileContainer__filenamet   _FileContainer__tailR^   t   _FileContainer__handlerRx   t   ost   fstatt   filenot   st_inot   _FileContainer__inoRz   t   md5t   newt   digestt   _FileContainer__hasht   seekt   tellt   _FileContainer__posR|   (   R   R}   Ro   t   handlert   statst	   firstLine(    (    s$   /usr/share/fail2ban/server/filter.pyR
     s    			c         C   s   |  j  S(   N(   R   (   R   (    (    s$   /usr/share/fail2ban/server/filter.pyRr     s    c         C   s   t  |  j  |  _ |  j j   } t j | t j | t j B |  j j   } t j	 |  j
   } t j |  j j    } |  j | k s |  j | j k r t j d |  j  | |  _ | j |  _ d |  _ n  |  j j |  j  d  S(   Ns   Log rotation detected for %si    (   Rx   R   R   R   t   fcntlt   F_SETFDt
   FD_CLOEXECRz   R   R   R   R   R   R   R   R   R   R(   R   R   (   R   t   fdR   t   myHashR   (    (    s$   /usr/share/fail2ban/server/filter.pyRx     s    !	c         C   s    |  j  d  k r d S|  j  j   S(   NR8   (   R   R^   Rz   (   R   (    (    s$   /usr/share/fail2ban/server/filter.pyRz     s    c         C   s>   |  j  d  k s: |  j  j   |  _ |  j  j   d  |  _  n  d  S(   N(   R   R^   R   R   R|   (   R   (    (    s$   /usr/share/fail2ban/server/filter.pyR|     s    (   Ri   Rj   RC   R
   Rr   Rx   Rz   R|   (    (    (    s$   /usr/share/fail2ban/server/filter.pyRm     s
   			R?   c           B   s   e  Z e j d   Z d   Z e e  Z d   Z e e  Z d   Z e e  Z d   Z	 e e	  Z	 d   Z
 e e
  Z
 d   Z e e  Z d   Z e e  Z RS(   s   ^(?:\d{1,3}\.){3}\d{1,3}$c         C   sE   y t  j |   d SWn) t  j k
 r@ t j d |   t   SXd S(   s_    Convert a DNS into an IP address using the Python socket module.
			Thanks to Kevin Drapel.
		i   s0   Unable to find a corresponding IP address for %sN(   t   sockett   gethostbyname_ext   gaierrorR   t   warnR   (   t   dns(    (    s$   /usr/share/fail2ban/server/filter.pyRA     s    	c         C   s$   t  j j |   } | r | Sd Sd S(   sC    Search if an IP address if directly available and return
			it.
		N(   R?   t   IP_CREt   matchR^   (   t   textR   (    (    s$   /usr/share/fail2ban/server/filter.pyt   searchIP  s    c         C   sG   |  j  d d  } y t j | d  t SWn t j k
 rB t SXd S(   s$    Return true if str is a valid IP
		R9   i   i    N(   R;   R   t	   inet_atonRB   R   RC   (   t   stringRE   (    (    s$   /usr/share/fail2ban/server/filter.pyt	   isValidIP!  s    c         C   s   t    } t j |   } | d k sU | j d  } t j |  rU | j |  qU n  | s t j |   } x | D] } | j |  qq Wn  | S(   s/    Return the IP of DNS found in a given text.
		i    N(   R   R?   R   R^   RM   R   R   RA   (   R   t   ipListt   plainIPt
   plainIPStrR1   R   (    (    s$   /usr/share/fail2ban/server/filter.pyR`   -  s    	c         C   s    d } | | ?| @t  j |   @S(   sK    Convert an IP address string with a CIDR mask into a 32-bit
			integer.
		l    (   R?   t   addr2bin(   RD   t   nt   MASK(    (    s$   /usr/share/fail2ban/server/filter.pyR@   @  s    c         C   s   t  j d t j |    d S(   s;    Convert a string IPv4 address into an unsigned integer.
		s   !Li    (   t   structt   unpackR   R   (   R   (    (    s$   /usr/share/fail2ban/server/filter.pyR   J  s    c         C   s   t  j t j d |    S(   s<    Convert a numeric IPv4 address into string n.n.n.n form.
		s   !L(   R   t	   inet_ntoaR   t   pack(   t   addr(    (    s$   /usr/share/fail2ban/server/filter.pyt   bin2addrQ  s    (   Ri   Rj   t   ret   compileR   RA   t   staticmethodR   R   R`   R@   R   R   (    (    (    s$   /usr/share/fail2ban/server/filter.pyR?     s   	
								(!   t
   __author__t   __version__t   __date__t   __copyright__t   __license__t   failmanagerR   t   ticketR   t
   jailthreadR   t   datedetectorR   t   mytimeR   t	   failregexR   R   R   t   loggingR   R   R   R/   t	   getLoggerR   R	   Rk   R   Rm   R   R   R?   (    (    (    s$   /usr/share/fail2ban/server/filter.pyt   <module>   s&   <	 0aA