ó
ì$Sc           @   sð   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    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 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, „  Z/ d- „  Z0 d. „  Z1 d/ „  Z2 d0 „  Z3 d1 „  Z4 d2 „  Z5 d3 „  Z6 d4 „  Z7 d5 „  Z8 d6 „  Z9 d7 „  Z: d8 „  Z; d9 „  Z< d: „  Z= d; „  Z> RS(<   c         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   __sigTERMhandler5   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  yE t  j d | ƒ t | d ƒ } | j d t j ƒ  ƒ | j ƒ  Wn$ t k
 r} t  j d	 | ƒ n Xt  j d
 ƒ y |  j j | | ƒ Wn# t k
 rV} t  j d | ƒ n Xy" t  j d | ƒ t j | ƒ Wn$ t k
 rŸ} t  j d | ƒ n Xt  j d ƒ d  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   t   opent   writet   getpidt   closet   IOErrorR   t   startR   t   removet   OSError(   R   t   sockt   pidfilet   forcet   rett   pidFilet   e(    (    s$   /usr/share/fail2ban/server/server.pyR.   9   s:    	c         C   sG   |  j  j ƒ  |  j ƒ  z |  j j ƒ  t j ƒ  Wd  |  j j ƒ  Xd  S(   N(   R   t   stopt   stopAllJailR
   t   acquiret   loggingt   shutdownt   release(   R   (    (    s$   /usr/share/fail2ban/server/server.pyR   b   s    
c         C   s   |  j  j | | ƒ d  S(   N(   R   t   add(   R   t   namet   backend(    (    s$   /usr/share/fail2ban/server/server.pyt   addJailv   s    c         C   s   |  j  j | ƒ d  S(   N(   R   R/   (   R   R>   (    (    s$   /usr/share/fail2ban/server/server.pyt   delJaily   s    c         C   sN   z9 |  j  j ƒ  |  j | ƒ s8 |  j j | ƒ j ƒ  n  Wd  |  j  j ƒ  Xd  S(   N(   R   R9   t   isAliveR   t   getR.   R<   (   R   R>   (    (    s$   /usr/share/fail2ban/server/server.pyt	   startJail|   s
    c         C   sl   t  j d | ƒ zF |  j j ƒ  |  j | ƒ rV |  j j | ƒ j ƒ  |  j | ƒ n  Wd  |  j j	 ƒ  Xd  S(   Ns   Stopping jail %s(
   R   R   R   R9   RB   R   RC   R7   RA   R<   (   R   R>   (    (    s$   /usr/share/fail2ban/server/server.pyt   stopJail„   s    c         C   sZ   t  j d ƒ z8 |  j j ƒ  x$ |  j j ƒ  D] } |  j | ƒ q- WWd  |  j j ƒ  Xd  S(   Ns   Stopping all jails(   R   R   R   R9   R   t   getAllRE   R<   (   R   t   jail(    (    s$   /usr/share/fail2ban/server/server.pyR8   Ž   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 | ƒ d  S(   N(   R   RN   t
   addLogPath(   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   setIgnoreCommand(   R   R>   RJ   (    (    s$   /usr/share/fail2ban/server/server.pyR[   »   s    c         C   s   |  j  j | ƒ j ƒ  S(   N(   R   RN   t   getIgnoreCommand(   R   R>   (    (    s$   /usr/share/fail2ban/server/server.pyR\   ¾   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.pyRa   Ê   s    c         C   s   |  j  j | ƒ j | ƒ d  S(   N(   R   RN   t   delIgnoreRegex(   R   R>   R_   (    (    s$   /usr/share/fail2ban/server/server.pyRb   Í   s    c         C   s   |  j  j | ƒ j ƒ  S(   N(   R   RN   t   getIgnoreRegex(   R   R>   (    (    s$   /usr/share/fail2ban/server/server.pyRc   Ð   s    c         C   s   |  j  j | ƒ j | ƒ d  S(   N(   R   RN   t	   setUseDns(   R   R>   RJ   (    (    s$   /usr/share/fail2ban/server/server.pyRd   Ó   s    c         C   s   |  j  j | ƒ j ƒ  S(   N(   R   RN   t	   getUseDns(   R   R>   (    (    s$   /usr/share/fail2ban/server/server.pyRe   Ö   s    c         C   s   |  j  j | ƒ j | ƒ d  S(   N(   R   RN   t   setMaxRetry(   R   R>   RJ   (    (    s$   /usr/share/fail2ban/server/server.pyRf   Ù   s    c         C   s   |  j  j | ƒ j ƒ  S(   N(   R   RN   t   getMaxRetry(   R   R>   (    (    s$   /usr/share/fail2ban/server/server.pyRg   Ü   s    c         C   s   |  j  j | ƒ j | ƒ d  S(   N(   R   t	   getActiont	   addAction(   R   R>   RJ   (    (    s$   /usr/share/fail2ban/server/server.pyRi   à   s    c         C   s   |  j  j | ƒ j ƒ  S(   N(   R   Rh   t   getLastAction(   R   R>   (    (    s$   /usr/share/fail2ban/server/server.pyRj   ã   s    c         C   s   |  j  j | ƒ j | ƒ d  S(   N(   R   Rh   t	   delAction(   R   R>   RJ   (    (    s$   /usr/share/fail2ban/server/server.pyRk   æ   s    c         C   s)   |  j  j | ƒ j | ƒ j | | ƒ d  S(   N(   R   Rh   t   setCInfo(   R   R>   t   actiont   keyRJ   (    (    s$   /usr/share/fail2ban/server/server.pyRl   é   s    c         C   s"   |  j  j | ƒ j | ƒ j | ƒ S(   N(   R   Rh   t   getCInfo(   R   R>   Rm   Rn   (    (    s$   /usr/share/fail2ban/server/server.pyRo   ì   s    c         C   s&   |  j  j | ƒ j | ƒ j | ƒ d  S(   N(   R   Rh   t   delCInfo(   R   R>   Rm   Rn   (    (    s$   /usr/share/fail2ban/server/server.pyRp   ï   s    c         C   s   |  j  j | ƒ j | ƒ d  S(   N(   R   Rh   t
   setBanTime(   R   R>   RJ   (    (    s$   /usr/share/fail2ban/server/server.pyRq   ò   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   Rh   t   removeBannedIP(   R   R>   RJ   (    (    s$   /usr/share/fail2ban/server/server.pyt
   setUnbanIPø   s    c         C   s   |  j  j | ƒ j ƒ  S(   N(   R   Rh   t
   getBanTime(   R   R>   (    (    s$   /usr/share/fail2ban/server/server.pyRv   û   s    c         C   s&   |  j  j | ƒ j | ƒ j | ƒ d  S(   N(   R   Rh   t   setActionStart(   R   R>   Rm   RJ   (    (    s$   /usr/share/fail2ban/server/server.pyRw   þ   s    c         C   s   |  j  j | ƒ j | ƒ j ƒ  S(   N(   R   Rh   t   getActionStart(   R   R>   Rm   (    (    s$   /usr/share/fail2ban/server/server.pyRx     s    c         C   s&   |  j  j | ƒ j | ƒ j | ƒ d  S(   N(   R   Rh   t   setActionStop(   R   R>   Rm   RJ   (    (    s$   /usr/share/fail2ban/server/server.pyRy     s    c         C   s   |  j  j | ƒ j | ƒ j ƒ  S(   N(   R   Rh   t   getActionStop(   R   R>   Rm   (    (    s$   /usr/share/fail2ban/server/server.pyRz     s    c         C   s&   |  j  j | ƒ j | ƒ j | ƒ d  S(   N(   R   Rh   t   setActionCheck(   R   R>   Rm   RJ   (    (    s$   /usr/share/fail2ban/server/server.pyR{   
  s    c         C   s   |  j  j | ƒ j | ƒ j ƒ  S(   N(   R   Rh   t   getActionCheck(   R   R>   Rm   (    (    s$   /usr/share/fail2ban/server/server.pyR|     s    c         C   s&   |  j  j | ƒ j | ƒ j | ƒ d  S(   N(   R   Rh   t   setActionBan(   R   R>   Rm   RJ   (    (    s$   /usr/share/fail2ban/server/server.pyR}     s    c         C   s   |  j  j | ƒ j | ƒ j ƒ  S(   N(   R   Rh   t   getActionBan(   R   R>   Rm   (    (    s$   /usr/share/fail2ban/server/server.pyR~     s    c         C   s&   |  j  j | ƒ j | ƒ j | ƒ d  S(   N(   R   Rh   t   setActionUnban(   R   R>   Rm   RJ   (    (    s$   /usr/share/fail2ban/server/server.pyR     s    c         C   s   |  j  j | ƒ j | ƒ j ƒ  S(   N(   R   Rh   t   getActionUnban(   R   R>   Rm   (    (    s$   /usr/share/fail2ban/server/server.pyR€     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   R9   R   RF   t   lent   sizeR<   (   R   t   jailListRG   t   lengthR4   (    (    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
   R9   R   R:   t   DEBUGt   FATALt   ERRORt   WARNINGt   INFOt	   getLoggert   setLevelR<   (   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
   R9   R   R<   (   R   (    (    s$   /usr/share/fail2ban/server/server.pyt   getLogLevelS  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
 ƒ } nc y) t | d ƒ j ƒ  t j j | ƒ } Wn7 t k
 rt j d	 | ƒ t j d
 |  j ƒ t SXx„ t j d ƒ j d  d  d … D]c } t j d ƒ j | ƒ y | j ƒ  | j ƒ  Wq)t t f k
 r‹t j d k rŒ‚  qŒq)Xq)W| j | ƒ t j d ƒ j | ƒ |  j d  k	 rßt j d | t j f ƒ n  | |  _ t SWd  |  j  j ƒ  Xd  S(   NsA   %(asctime)s %(name)-16s[%(process)d]: %(levelname)-7s %(message)st   SYSLOGs0   %(name)s[%(process)d]: %(levelname)s %(message)ss   /dev/logt   facilityR	   t   STDERRt   as   Unable to log to s   Logging to previous target R‰   iÿÿÿÿi   i   i   s-   Changed logging target to %s for Fail2ban v%s(   i   i   i   (    R
   R9   R:   t	   Formattert   handlerst   SysLogHandlert
   LOG_DAEMONt   StreamHandlert   syst   stdoutt   stderrR)   R,   t   RotatingFileHandlerR-   R   R'   R   R   t   FalseR   t   removeHandlert   flusht
   ValueErrort   KeyErrort   version_infot   setFormattert
   addHandlerR   R   RI   R<   (   R   t   targett	   formatterR”   t   hdlrt   handler(    (    s$   /usr/share/fail2ban/server/server.pyR   `  sD    &
		c         C   s-   z |  j  j ƒ  |  j SWd  |  j  j ƒ  Xd  S(   N(   R
   R9   R   R<   (   R   (    (    s$   /usr/share/fail2ban/server/server.pyt   getLogTarget“  s    c         C   si   |  j  d k r: x$ t j d ƒ j D] } | j ƒ  q" Wd Sx$ t j d ƒ j D] } | j ƒ  qM Wd Sd  S(   NR•   R	   R“   R‰   s   rolled overt   flushed(   s   STDERRs   STDOUTs   SYSLOG(   R   R:   R   R˜   t
   doRolloverR¢   (   R   R«   (    (    s$   /usr/share/fail2ban/server/server.pyt	   flushLogsš  s    c         C   sz  t  j  t  j t  j ƒ y t j ƒ  } Wn  t k
 rH } | j | j f SX| d k r¾ 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   SIGHUPt   SIG_IGNR$   t   forkR0   t   errnot   strerrort   setsidt   chdirt   _exitt   sysconft   AttributeErrorR£   t   rangeR,   R)   t   O_RDONLYt   O_RDWRRI   (   R   t   pidR6   t   maxfdt   fd(    (    s$   /usr/share/fail2ban/server/server.pyt   __createDaemon¥  s8    	

(?   t   __name__t
   __module__R    R   R"   R.   R   R@   RA   RD   RE   R8   RB   RK   RM   RO   RQ   RR   RS   RU   RV   RY   RZ   R[   R\   R]   R^   R`   Ra   Rb   Rc   Rd   Re   Rf   Rg   Ri   Rj   Rk   Rl   Ro   Rp   Rq   Rs   Ru   Rv   Rw   Rx   Ry   Rz   R{   R|   R}   R~   R   R€   R†   Rˆ   R   R’   R   R¬   R¯   R&   (    (    (    s$   /usr/share/fail2ban/server/server.pyR   &   sx   	)					
																																																		3		R(   c           B   s   e  Z RS(    (   RÃ   RÄ   (    (    (    s$   /usr/share/fail2ban/server/server.pyR(   ò  s   (   t
   __author__t   __copyright__t   __license__t	   threadingR   R   t   jailsR   t   transmitterR   t   asyncserverR   R   t   commonR   R:   t   logging.handlersRœ   R$   R    R   R   R   t	   ExceptionR(   (    (    (    s$   /usr/share/fail2ban/server/server.pyt   <module>   s   <ÿ Í