ó
Ý#2Nc           @   sü   d  Z  d Z d Z d Z d Z d d l m Z 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 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 f  d „  ƒ  YZ d e f d „  ƒ  YZ d S(   s   Cyril Jaquiers   $Revision: 748 $s5   $Date: 2009-08-31 16:14:02 +0200 (Mon, 31 Aug 2009) $s    Copyright (c) 2004 Cyril Jaquiert   GPLiÿÿÿÿ(   t   Lockt   RLock(   t   Jails(   t   Transmitter(   t   AsyncServer(   t   AsyncServerException(   t   versionNs   fail2ban.servert   Serverc           B   sú  e  Z d  Z e d „ Z d „  Z e 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 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- „  Z0 d. „  Z1 d/ „  Z2 d0 „  Z3 d1 „  Z4 d2 „  Z5 d3 „  Z6 d4 „  Z7 d5 „  Z8 d6 „  Z9 RS(7   s   /var/run/fail2ban/fail2ban.pidc         C   s~   t  ƒ  |  _ t ƒ  |  _ t ƒ  |  _ | |  _ t |  ƒ |  _ t	 |  j ƒ |  _
 d  |  _ d  |  _ |  j d ƒ |  j d ƒ d  S(   Ni   t   STDOUT(   R   t   _Server__loggingLockR   t   _Server__lockR   t   _Server__jailst   _Server__daemonR   t   _Server__transmR   t   _Server__asyncServert   Nonet   _Server__logLevelt   _Server__logTargett   setLogLevelt   setLogTarget(   t   selft   daemon(    (    s$   /usr/share/fail2ban/server/server.pyt   __init__*   s    			c         C   s   t  j d | ƒ |  j ƒ  d  S(   Ns   Caught signal %d. Exiting(   t   logSyst   debugt   quit(   R   t   signumt   frame(    (    s$   /usr/share/fail2ban/server/server.pyt   __sigTERMhandler7   s    c         C   sé  t  j d t j ƒ t j t j |  j ƒ t j t j |  j ƒ t j d ƒ |  j	 r¡ t  j d ƒ |  j
 ƒ  } | r… t  j d ƒ q¡ t  j d ƒ t d ƒ ‚ n  yK t  j d t j ƒ t t j d ƒ } | j d t j ƒ  ƒ | j ƒ  Wn$ t k
 r} t  j d	 | ƒ n Xt  j d
 ƒ y |  j j | | ƒ Wn# t k
 r\} t  j d | ƒ n Xy( t  j d t j ƒ t j t j ƒ Wn$ t k
 r«} t  j d | ƒ n Xt  j d ƒ z |  j j ƒ  t j ƒ  Wd  |  j j ƒ  Xd  S(   Ns   Starting Fail2ban vi?   s   Starting in daemon modes   Daemon starteds   Could not create daemons   Creating PID file %st   ws   %s
s   Unable to create PID file: %ss   Starting communications   Could not start server: %ss   Remove PID file %ss   Unable to remove PID file: %ss   Exiting Fail2ban(   R   t   infoR   t   signalt   SIGTERMt   _Server__sigTERMhandlert   SIGINTt   ost   umaskR   t   _Server__createDaemont   errort   ServerInitializationErrorR   R   t   PID_FILEt   opent   writet   getpidt   closet   IOErrorR   t   startR   t   removet   OSErrorR
   t   acquiret   loggingt   shutdownt   release(   R   t   sockt   forcet   rett   pidFilet   e(    (    s$   /usr/share/fail2ban/server/server.pyR/   ;   sB    	c         C   s   |  j  ƒ  |  j j ƒ  d  S(   N(   t   stopAllJailR   t   stop(   R   (    (    s$   /usr/share/fail2ban/server/server.pyR   j   s    
c         C   s   |  j  j | | ƒ d  S(   N(   R   t   add(   R   t   namet   backend(    (    s$   /usr/share/fail2ban/server/server.pyt   addJailo   s    c         C   s   |  j  j | ƒ d  S(   N(   R   R0   (   R   R>   (    (    s$   /usr/share/fail2ban/server/server.pyt   delJailr   s    c         C   sN   z9 |  j  j ƒ  |  j | ƒ s8 |  j j | ƒ j ƒ  n  Wd  |  j  j ƒ  Xd  S(   N(   R   R2   t   isAliveR   t   getR/   R5   (   R   R>   (    (    s$   /usr/share/fail2ban/server/server.pyt	   startJailu   s
    c         C   s[   zF |  j  j ƒ  |  j | ƒ rE |  j j | ƒ j ƒ  |  j | ƒ n  Wd  |  j  j ƒ  Xd  S(   N(   R   R2   RB   R   RC   R<   RA   R5   (   R   R>   (    (    s$   /usr/share/fail2ban/server/server.pyt   stopJail}   s    c         C   sM   z8 |  j  j ƒ  x$ |  j j ƒ  D] } |  j | ƒ q  WWd  |  j  j ƒ  Xd  S(   N(   R   R2   R   t   getAllRE   R5   (   R   t   jail(    (    s$   /usr/share/fail2ban/server/server.pyR;   †   s
    c         C   s   |  j  j | ƒ j ƒ  S(   N(   R   RC   RB   (   R   R>   (    (    s$   /usr/share/fail2ban/server/server.pyRB   Ž   s    c         C   s   |  j  j | ƒ j | ƒ t S(   N(   R   RC   t   setIdlet   True(   R   R>   t   value(    (    s$   /usr/share/fail2ban/server/server.pyt   setIdleJail‘   s    c         C   s   |  j  j | ƒ j ƒ  S(   N(   R   RC   t   getIdle(   R   R>   (    (    s$   /usr/share/fail2ban/server/server.pyt   getIdleJail•   s    c         C   s   |  j  j | ƒ j | ƒ d  S(   N(   R   t	   getFiltert   addIgnoreIP(   R   R>   t   ip(    (    s$   /usr/share/fail2ban/server/server.pyRO   ™   s    c         C   s   |  j  j | ƒ j | ƒ d  S(   N(   R   RN   t   delIgnoreIP(   R   R>   RP   (    (    s$   /usr/share/fail2ban/server/server.pyRQ   œ   s    c         C   s   |  j  j | ƒ j ƒ  S(   N(   R   RN   t   getIgnoreIP(   R   R>   (    (    s$   /usr/share/fail2ban/server/server.pyRR   Ÿ   s    c         C   s    |  j  j | ƒ j | t ƒ d  S(   N(   R   RN   t
   addLogPathRI   (   R   R>   t   fileName(    (    s$   /usr/share/fail2ban/server/server.pyRS   ¢   s    c         C   s   |  j  j | ƒ j | ƒ d  S(   N(   R   RN   t
   delLogPath(   R   R>   RT   (    (    s$   /usr/share/fail2ban/server/server.pyRU   ¥   s    c         C   s/   g  |  j  j | ƒ j ƒ  D] } | j ƒ  ^ q S(   N(   R   RN   t
   getLogPatht   getFileName(   R   R>   t   m(    (    s$   /usr/share/fail2ban/server/server.pyRV   ¨   s    c         C   s   |  j  j | ƒ j | ƒ d  S(   N(   R   RN   t   setFindTime(   R   R>   RJ   (    (    s$   /usr/share/fail2ban/server/server.pyRY   ¬   s    c         C   s   |  j  j | ƒ j ƒ  S(   N(   R   RN   t   getFindTime(   R   R>   (    (    s$   /usr/share/fail2ban/server/server.pyRZ   ¯   s    c         C   s   |  j  j | ƒ j | ƒ d  S(   N(   R   RN   t   addFailRegex(   R   R>   RJ   (    (    s$   /usr/share/fail2ban/server/server.pyR[   ²   s    c         C   s   |  j  j | ƒ j | ƒ d  S(   N(   R   RN   t   delFailRegex(   R   R>   t   index(    (    s$   /usr/share/fail2ban/server/server.pyR\   µ   s    c         C   s   |  j  j | ƒ j ƒ  S(   N(   R   RN   t   getFailRegex(   R   R>   (    (    s$   /usr/share/fail2ban/server/server.pyR^   ¸   s    c         C   s   |  j  j | ƒ j | ƒ d  S(   N(   R   RN   t   addIgnoreRegex(   R   R>   RJ   (    (    s$   /usr/share/fail2ban/server/server.pyR_   »   s    c         C   s   |  j  j | ƒ j | ƒ d  S(   N(   R   RN   t   delIgnoreRegex(   R   R>   R]   (    (    s$   /usr/share/fail2ban/server/server.pyR`   ¾   s    c         C   s   |  j  j | ƒ j ƒ  S(   N(   R   RN   t   getIgnoreRegex(   R   R>   (    (    s$   /usr/share/fail2ban/server/server.pyRa   Á   s    c         C   s   |  j  j | ƒ j | ƒ d  S(   N(   R   RN   t   setMaxRetry(   R   R>   RJ   (    (    s$   /usr/share/fail2ban/server/server.pyRb   Ä   s    c         C   s   |  j  j | ƒ j ƒ  S(   N(   R   RN   t   getMaxRetry(   R   R>   (    (    s$   /usr/share/fail2ban/server/server.pyRc   Ç   s    c         C   s   |  j  j | ƒ j | ƒ d  S(   N(   R   t	   getActiont	   addAction(   R   R>   RJ   (    (    s$   /usr/share/fail2ban/server/server.pyRe   Ë   s    c         C   s   |  j  j | ƒ j ƒ  S(   N(   R   Rd   t   getLastAction(   R   R>   (    (    s$   /usr/share/fail2ban/server/server.pyRf   Î   s    c         C   s   |  j  j | ƒ j | ƒ d  S(   N(   R   Rd   t	   delAction(   R   R>   RJ   (    (    s$   /usr/share/fail2ban/server/server.pyRg   Ñ   s    c         C   s)   |  j  j | ƒ j | ƒ j | | ƒ d  S(   N(   R   Rd   t   setCInfo(   R   R>   t   actiont   keyRJ   (    (    s$   /usr/share/fail2ban/server/server.pyRh   Ô   s    c         C   s"   |  j  j | ƒ j | ƒ j | ƒ S(   N(   R   Rd   t   getCInfo(   R   R>   Ri   Rj   (    (    s$   /usr/share/fail2ban/server/server.pyRk   ×   s    c         C   s&   |  j  j | ƒ j | ƒ j | ƒ d  S(   N(   R   Rd   t   delCInfo(   R   R>   Ri   Rj   (    (    s$   /usr/share/fail2ban/server/server.pyRl   Ú   s    c         C   s   |  j  j | ƒ j | ƒ d  S(   N(   R   Rd   t
   setBanTime(   R   R>   RJ   (    (    s$   /usr/share/fail2ban/server/server.pyRm   Ý   s    c         C   s   |  j  j | ƒ j | ƒ S(   N(   R   RN   t   addBannedIP(   R   R>   RJ   (    (    s$   /usr/share/fail2ban/server/server.pyt   setBanIPà   s    c         C   s   |  j  j | ƒ j ƒ  S(   N(   R   Rd   t
   getBanTime(   R   R>   (    (    s$   /usr/share/fail2ban/server/server.pyRp   ã   s    c         C   s&   |  j  j | ƒ j | ƒ j | ƒ d  S(   N(   R   Rd   t   setActionStart(   R   R>   Ri   RJ   (    (    s$   /usr/share/fail2ban/server/server.pyRq   æ   s    c         C   s   |  j  j | ƒ j | ƒ j ƒ  S(   N(   R   Rd   t   getActionStart(   R   R>   Ri   (    (    s$   /usr/share/fail2ban/server/server.pyRr   é   s    c         C   s&   |  j  j | ƒ j | ƒ j | ƒ d  S(   N(   R   Rd   t   setActionStop(   R   R>   Ri   RJ   (    (    s$   /usr/share/fail2ban/server/server.pyRs   ì   s    c         C   s   |  j  j | ƒ j | ƒ j ƒ  S(   N(   R   Rd   t   getActionStop(   R   R>   Ri   (    (    s$   /usr/share/fail2ban/server/server.pyRt   ï   s    c         C   s&   |  j  j | ƒ j | ƒ j | ƒ d  S(   N(   R   Rd   t   setActionCheck(   R   R>   Ri   RJ   (    (    s$   /usr/share/fail2ban/server/server.pyRu   ò   s    c         C   s   |  j  j | ƒ j | ƒ j ƒ  S(   N(   R   Rd   t   getActionCheck(   R   R>   Ri   (    (    s$   /usr/share/fail2ban/server/server.pyRv   õ   s    c         C   s&   |  j  j | ƒ j | ƒ j | ƒ d  S(   N(   R   Rd   t   setActionBan(   R   R>   Ri   RJ   (    (    s$   /usr/share/fail2ban/server/server.pyRw   ø   s    c         C   s   |  j  j | ƒ j | ƒ j ƒ  S(   N(   R   Rd   t   getActionBan(   R   R>   Ri   (    (    s$   /usr/share/fail2ban/server/server.pyRx   û   s    c         C   s&   |  j  j | ƒ j | ƒ j | ƒ d  S(   N(   R   Rd   t   setActionUnban(   R   R>   Ri   RJ   (    (    s$   /usr/share/fail2ban/server/server.pyRy   þ   s    c         C   s   |  j  j | ƒ j | ƒ j ƒ  S(   N(   R   Rd   t   getActionUnban(   R   R>   Ri   (    (    s$   /usr/share/fail2ban/server/server.pyRz     s    c         C   s¢   z |  j  j ƒ  d } x% |  j j ƒ  D] } | | d 7} q& Wt | ƒ } | d k sg | | d  } n  d |  j j ƒ  f d | f g } | SWd  |  j  j ƒ  Xd  S(   Nt    s   , i    i   s   Number of jails	   Jail list(   R   R2   R   RF   t   lent   sizeR5   (   R   t   jailListRG   t   lengthR8   (    (    s$   /usr/share/fail2ban/server/server.pyt   status  s    c         C   s   |  j  j | ƒ j ƒ  S(   N(   R   RC   t	   getStatus(   R   R>   (    (    s$   /usr/share/fail2ban/server/server.pyt
   statusJail  s    c         C   s®   z™ |  j  j ƒ  | |  _ t j } | d k r: t j } nH | d k rR t j } n0 | d k rj t j } n | d k r‚ t j } n  t j	 d ƒ j
 | ƒ Wd  |  j  j ƒ  Xd  S(   Ni    i   i   i   t   fail2ban(   R
   R2   R   R3   t   DEBUGt   FATALt   ERRORt   WARNINGt   INFOt	   getLoggert   setLevelR5   (   R   RJ   t   logLevel(    (    s$   /usr/share/fail2ban/server/server.pyR   $  s    		c         C   s-   z |  j  j ƒ  |  j SWd  |  j  j ƒ  Xd  S(   N(   R
   R2   R   R5   (   R   (    (    s$   /usr/share/fail2ban/server/server.pyt   getLogLevel;  s    c         C   sµ  z |  j  j ƒ  t j d ƒ } | d k rd t j d ƒ } t j j j } t j j d d | ƒ} n¢ | d k r… t j t j	 ƒ } n | d k r¦ t j t j
 ƒ } n` y& t | d ƒ j ƒ  t j | ƒ } Wn7 t k
 rt j d	 | ƒ t j d
 |  j ƒ t SXx: t j d ƒ j D]& } t j d ƒ j | ƒ | j ƒ  qW| j | ƒ t j d ƒ j | ƒ |  j d  k s’t j d | t j f ƒ n  | |  _ t SWd  |  j  j ƒ  Xd  S(   Ns4   %(asctime)s %(name)-16s: %(levelname)-6s %(message)st   SYSLOGs(   %(name)-16s: %(levelname)-6s %(message)ss   /dev/logt   facilityR	   t   STDERRt   as   Unable to log to s   Logging to previous target Rƒ   s-   Changed logging target to %s for Fail2ban v%s(   R
   R2   R3   t	   Formattert   handlerst   SysLogHandlert
   LOG_DAEMONt   StreamHandlert   syst   stdoutt   stderrR*   R-   t   FileHandlerR.   R   R'   R   R   t   FalseR‰   t   removeHandlert   setFormattert
   addHandlerR   R   RI   R5   (   R   t   targett	   formatterRŽ   t   hdlrt   handler(    (    s$   /usr/share/fail2ban/server/server.pyR   H  s<    		c         C   s-   z |  j  j ƒ  |  j SWd  |  j  j ƒ  Xd  S(   N(   R
   R2   R   R5   (   R   (    (    s$   /usr/share/fail2ban/server/server.pyt   getLogTargetr  s    c         C   sz  y t  j ƒ  } Wn  t k
 r2 } | j | j f SX| d k r¾ t  j ƒ  t j t j t j ƒ y t  j ƒ  } Wn  t k
 r‘ } | j | j f SX| d k r® t  j	 d ƒ qË t  j
 d ƒ n t  j
 d ƒ y t  j d ƒ } Wn t t f k
 rý d } n Xx< t d | ƒ D]+ } y t  j | ƒ Wqt k
 r8qXqWt  j d t  j ƒ t  j d t  j ƒ t  j d t  j ƒ t S(   s¤    Detach a process from the controlling terminal and run it in the
			background as a daemon.
		
			http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/278731
		i    t   /t   SC_OPEN_MAXi   s	   /dev/null(   R$   t   forkR1   t   errnot   strerrort   setsidR    t   SIGHUPt   SIG_IGNt   chdirt   _exitt   sysconft   AttributeErrort
   ValueErrort   rangeR-   R*   t   O_RDONLYt   O_RDWRRI   (   R   t   pidR:   t   maxfdt   fd(    (    s$   /usr/share/fail2ban/server/server.pyt   __createDaemony  s8    	

(:   t   __name__t
   __module__R)   Rš   R   R"   R/   R   R@   RA   RD   RE   R;   RB   RK   RM   RO   RQ   RR   RS   RU   RV   RY   RZ   R[   R\   R^   R_   R`   Ra   Rb   Rc   Re   Rf   Rg   Rh   Rk   Rl   Rm   Ro   Rp   Rq   Rr   Rs   Rt   Ru   Rv   Rw   Rx   Ry   Rz   R€   R‚   R   RŒ   R   R¢   R&   (    (    (    s$   /usr/share/fail2ban/server/server.pyR   &   sn   	/																																																		*	R(   c           B   s   e  Z RS(    (   R·   R¸   (    (    (    s$   /usr/share/fail2ban/server/server.pyR(   Â  s   (   t
   __author__t   __version__t   __date__t   __copyright__t   __license__t	   threadingR   R   t   jailsR   t   transmitterR   t   asyncserverR   R   t   commonR   R3   t   logging.handlersR–   R$   R    R‰   R   R   t	   ExceptionR(   (    (    (    s$   /usr/share/fail2ban/server/server.pyt   <module>   s   <ÿ 