
!UJ                 @   s   d  Z  d Z d d l Z d d l Z d d l Z d d l Z d d l Z d d   Z d d   Z Gd d	   d	 e	  Z
 Gd
 d   d e j  Z d d   Z d d   Z d S)z<Cyril Jaquier, Arturo 'Buanzo' Busleiman, Yaroslav HalchenkoZGPL    Nc              C   s/   t  j   d d  \ }  } |  j t |  f S)z+ Consistently format exception information N   )sysexc_info__name__str)Zclaexc r   2/usr/lib/python3/dist-packages/fail2ban/helpers.pyformatExceptionInfo   s    r
   c             C   ss   t  j j |   } | j d  r1 | d d  } | t d d g  k ro t  j j t  j j |    d | } | S)zaCustom function to include directory name if filename is too common

	Also strip .py at the end
	z.pyN   base__init__.)ospathbasenameendswithsetdirname)sr   r   r   r	   	mbasename*   s    &r   c               @   s1   e  Z d  Z d Z d d d  Z d d   Z d S)	TraceBackz7Customized traceback to be included in debug messages
	Fc             C   s   d |  _  | |  _ d S)zInitialize TrackBack metric

		Parameters
		----------
		compress : bool
		  if True then prefix common with previous invocation gets
		  replaced with ...
		 N)_TraceBack__prev_TraceBack__compress)selfcompressr   r   r	   r   ;   s    		zTraceBack.__init__c       	      C   s:  t  j d d  d  d  } d d   | D } d d   | D } | d g } xZ | d d   D]H } | d | d d k r | d d d	 | d 7<q` | j |  q` Wd
 j d d   | D  } |  j r6| } t j j |  j | f  } t	 j
 d d |  } | d k r-d | t |  d   } | |  _ | S)Nlimitd   r   c             S   sC   g  |  ]9 } t  | d   t j j | d   t | d  g  q S)r      )r   r   r   r   r   ).0xr   r   r	   
<listcomp>J   s   	 z&TraceBack.__call__.<locals>.<listcomp>c             S   sG   g  |  ]= } | d  d k p, | d j  d  s | d  | d g  q S)r   unittestlogging.__init__r    z	/unittestr   )r$   r%   )r   )r!   er   r   r	   r#   K   s   	 r   r    z,%s>c             S   s.   g  |  ]$ } d  t  | d  | d f  q S)z%s:%sr   r    )r   )r!   r"   r   r   r	   r#   V   s   	z>[^>]*$r   z...r)   )	tracebackextract_stackappendjoinr   r   r   commonprefixr   resublen)	r   ZftbentriesZentries_outentryZsftbZ	prev_nextZcommon_prefixZcommon_prefix2r   r   r	   __call__G   s$    		zTraceBack.__call__N)r   
__module____qualname____doc__r   r4   r   r   r   r	   r   7   s   r   c               @   s.   e  Z d  Z d Z d d   Z d d   Z d S)FormatterWithTraceBackz}Custom formatter which expands %(tb) and %(tbc) with tracebacks

	TODO: might need locking in case of compressed tracebacks
	c             O   s>   t  j j |  | d | | d | k } t d |  |  _ d  S)Nfmtz%(tbc)sr   )logging	Formatterr   r   _tb)r   r9   argskwargsr   r   r   r	   r   j   s    zFormatterWithTraceBack.__init__c             C   s)   |  j    | _ | _ t j j |  |  S)N)r<   Ztbctbr:   r;   format)r   recordr   r   r	   r@   o   s    zFormatterWithTraceBack.formatN)r   r5   r6   r7   r   r@   r   r   r   r	   r8   e   s   r8   c             C   s0   d |  k r# d |  j  d  d }  t j |   S)zBGet logging.Logger instance with Fail2Ban logger name convention
	r   zfail2ban.%sr    r)   )
rpartitionr:   	getLogger)namer   r   r	   rC   t   s    rC   c             C   s,   t  d  j d d d t j |  | |  S)z>Except hook used to log unhandled exceptions to Fail2Ban log
	Zfail2banz Unhandled exception in Fail2Ban:r   T)rC   Zcriticalr   __excepthook__)exctypevaluer*   r   r   r	   
excepthook|   s    rH   )
__author__Z__license__r   r   r*   r/   r:   r
   r   objectr   r;   r8   rC   rH   r   r   r   r	   <module>   s   .