ó
ì$Sc           @   sù   d  Z  d Z d Z d d l m Z m Z 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 d d l Z d d l Z d d l Z e j d ƒ Z d e
 j f d	 „  ƒ  YZ d
 e	 j f d „  ƒ  YZ d e f d „  ƒ  YZ d S(   s   Cyril Jaquiers    Copyright (c) 2004 Cyril Jaquiert   GPLiÿÿÿÿ(   t   dumpst   loadst   HIGHEST_PROTOCOL(   t   helpersNs   fail2ban.servert   RequestHandlerc           B   s2   e  Z d  Z d „  Z d „  Z d „  Z d „  Z RS(   s   <F2B_END_COMMAND>c         C   s9   t  j j |  | ƒ | |  _ g  |  _ |  j t j ƒ d  S(   N(   t   asynchatt
   async_chatt   __init__t   _RequestHandler__transmittert   _RequestHandler__buffert   set_terminatorR   t
   END_STRING(   t   selft   connt   transmitter(    (    s)   /usr/share/fail2ban/server/asyncserver.pyR   ,   s    		c         C   s   |  j  j | ƒ d  S(   N(   R
   t   append(   R   t   data(    (    s)   /usr/share/fail2ban/server/asyncserver.pyt   collect_incoming_data3   s    c         C   s[   t  d j |  j ƒ ƒ } |  j j | ƒ } t | t ƒ } |  j | t j	 ƒ |  j
 ƒ  d  S(   Nt    (   R   t   joinR
   R	   t   proceedR   R   t   pushR   R   t   close_when_done(   R   t   message(    (    s)   /usr/share/fail2ban/server/asyncserver.pyt   found_terminator<   s
    c         C   sP   t  j ƒ  \ } } t j d t | ƒ ƒ t j t j ƒ  j ƒ  ƒ |  j ƒ  d  S(   Ns"   Unexpected communication error: %s(	   R   t   formatExceptionInfot   logSyst   errort   strt	   tracebackt
   format_exct
   splitlinest   close(   R   t   e1t   e2(    (    s)   /usr/share/fail2ban/server/asyncserver.pyt   handle_errorH   s    (   t   __name__t
   __module__R   R   R   R   R$   (    (    (    s)   /usr/share/fail2ban/server/asyncserver.pyR   (   s
   				t   AsyncServerc           B   sJ   e  Z d  „  Z d „  Z d „  Z d „  Z d „  Z d „  Z e e ƒ Z RS(   c         C   s/   t  j j |  ƒ | |  _ d |  _ t |  _ d  S(   Ns   /var/run/fail2ban/fail2ban.sock(   t   asyncoret
   dispatcherR   t   _AsyncServer__transmittert   _AsyncServer__sockt   Falset   _AsyncServer__init(   R   R   (    (    s)   /usr/share/fail2ban/server/asyncserver.pyR   V   s    		c         C   s   t  S(   N(   R,   (   R   (    (    s)   /usr/share/fail2ban/server/asyncserver.pyt   writable_   s    c         C   sz   y |  j  ƒ  \ } } Wn@ t j k
 r: t j d ƒ d  St k
 rX t j d ƒ d  SXt j | ƒ t | |  j	 ƒ d  S(   Ns   Socket errors
   Type error(
   t   acceptt   socketR   R   t   warningt	   TypeErrorR'   t   _AsyncServer__markCloseOnExecR   R*   (   R   R   t   addr(    (    s)   /usr/share/fail2ban/server/asyncserver.pyt   handle_acceptb   s    c         C   s(  | |  _  t j j | ƒ rZ t j d ƒ | rK t j d ƒ t j | ƒ qZ t d ƒ ‚ n  |  j	 t
 j t
 j ƒ |  j ƒ  y |  j | ƒ Wn$ t k
 r± t d |  j  ƒ ‚ n Xt j |  j
 ƒ |  j d ƒ t |  _ t j d k rt j d ƒ t j d	 t ƒ n t j d
 ƒ t j d	 t ƒ d  S(   Ns$   Fail2ban seems to be already runnings   Forcing execution of the servers   Server already runnings   Unable to bind socket %si   i   i   s>   Detected Python 2.6 or greater. asyncore.loop() not using pollt   use_polls/   NOT Python 2.6/3.* - asyncore.loop() using poll(   i   i   (   R+   t   ost   patht   existsR   R   t   warnt   removet   AsyncServerExceptiont   create_socketR0   t   AF_UNIXt   SOCK_STREAMt   set_reuse_addrt   bindt	   ExceptionR'   R3   t   listent   TrueR-   t   syst   version_infot   debugR(   t   loopR,   (   R   t   sockt   force(    (    s)   /usr/share/fail2ban/server/asyncserver.pyt   startv   s*    	
	c         C   sc   |  j  r |  j ƒ  n  t j j |  j ƒ rR t j d |  j ƒ t j |  j ƒ n  t j d ƒ d  S(   Ns   Removed socket file s   Socket shutdown(	   R-   R!   R7   R8   R9   R+   R   RG   R;   (   R   (    (    s)   /usr/share/fail2ban/server/asyncserver.pyt   stop—   s    	c         C   sB   |  j  ƒ  } t j | t j ƒ } t j | t j | t j Bƒ d  S(   N(   t   filenot   fcntlt   F_GETFDt   F_SETFDt
   FD_CLOEXEC(   RI   t   fdt   flags(    (    s)   /usr/share/fail2ban/server/asyncserver.pyt   __markCloseOnExec¨   s    (	   R%   R&   R   R.   R5   RK   RL   R3   t   staticmethod(    (    (    s)   /usr/share/fail2ban/server/asyncserver.pyR'   T   s   					!		R<   c           B   s   e  Z RS(    (   R%   R&   (    (    (    s)   /usr/share/fail2ban/server/asyncserver.pyR<   ±   s   (   t
   __author__t   __copyright__t   __license__t   pickleR   R   R   t   commonR   R(   R   R0   R7   t   loggingRE   R   RN   t	   getLoggerR   R   R   R)   R'   RB   R<   (    (    (    s)   /usr/share/fail2ban/server/asyncserver.pyt   <module>   s   `,]