
    ogf:=                         d Z 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lZddl	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mZmZmZ ddlmZ dZd Zd Z G d dee
      Z G d d      Z G d d      Zd Zd Z y)zFail2Ban Developersz^Copyright (c) 2004-2008 Cyril Jaquier, 2012-2014 Yaroslav Halchenko, 2014-2016 Serg G. BresterGPL    N)Thread   )version   )CSocket)
Beautifier)Fail2banCmdLineServerExecutionExceptionExitExceptionlogSysexitoutput)Utilsz
fail2ban> c                  R    t        j                         j                  j                  S N)	threadingcurrent_thread	__class____name__     @/usr/lib/python3/dist-packages/fail2ban/client/fail2banclient.py_thread_namer   ,   s      ",,555r   c                       t        t              S r   )inputPROMPTr   r   r   input_commandr   /   s    fr   c                   |    e Zd Zd Zd Zd ZddZed        ZddZ	ddZ
d Zd	 Zdd
ZddZd Zd ZddZd Zy)Fail2banClientc                     t        j                  |        t        j                  |        d| _        d | _        d | _        y )NT)r
   __init__r   _alive_server_beautifierselfs    r   r"   zFail2banClient.__init__8   s2    4 //$$+$,$r   c                 Z    t        dt        z   dz          t        d       t        d       y )Nz
Fail2Ban vz5 reads log file that contains password failure reportz=and bans the corresponding IP addresses using firewall rules. )r   r   r&   s    r   dispInteractivezFail2banClient.dispInteractive?   s%    	"Y	YZ	HI*r   c                 `    t        d       t        j                  d|z         t        d       y )Nr)   zCaught signal %d. Exiting   )r   r   warningr   )r'   signumframes      r   __sigTERMhandlerzFail2banClient.__sigTERMhandlerD   s"    *..,v56s)r   c                 D    | j                  dg|dk7  r|gng z   gd|      S )NpingFtimeout)_Fail2banClient__processCmd)r'   r5   s     r   __pingzFail2banClient.__pingJ   s5    			VHW]	KL' 
 
 r   c                 h    | j                   r| j                   S t               | _         | j                   S r   )r%   r	   r&   s    r   
beautifierzFail2banClient.beautifierN   s-    	


\$			r   c                    d }	 | j                   }d}|D ]  }|j                  |       	 |st        | j                  d   |      }n|dk7  r|j	                  |       | j                  d   dkD  rt        j                  dd|       |j                  |      }|d	   d	k(  rAt        j                  dd
|d          |s|d	   dv rbt        |j                  |d                nDt        j                  d|d   j                         |rt        |j                  |d                d} 	 |r	 |j                          |sd	   dv rt$        j&                  j)                          |S # t        j                  $ r}	|s| j                  d   dkD  r;|s|d	   dk7  r| j                  |	|d	   dk(         nt        j                  dd||	       Y d }	~	 |rQ	 |j                          n?# t         $ r3}	|s| j                  d   dkD  rt        j"                  |	       Y d }	~	nd }	~	ww xY w|s|d	   dv rt$        j&                  j)                          yyd }	~	wt         $ r}	|s| j                  d   dkD  r=| j                  d   dkD  rt        j*                  |	       nt        j                  |	       Y d }	~	 |rQ	 |j                          n?# t         $ r3}	|s| j                  d   dkD  rt        j"                  |	       Y d }	~	nd }	~	ww xY w|s|d	   dv rt$        j&                  j)                          yyd }	~	ww xY w# t         $ r4}	|s| j                  d   dkD  rt        j"                  |	       Y d }	~	*d }	~	ww xY w# |rQ	 |j                          n?# t         $ r3}	|s| j                  d   dkD  rt        j"                  |	       Y d }	~	nd }	~	ww xY w|sd	   dv rt$        j&                  j)                          w w xY w)NTsocketr4   r3   verboser      zCMD: %rr   zOK : %rr   )echoserver-statuszNOK: %rFr2   z -- %s failed -- %r)r9   setInputCmdr   _conf
settimeoutr   logsendr   beautifyerrorargsbeautifyErrorr;   _Fail2banClient__logSocketErrorclose	Exceptiondebugsysstdoutflush	exception)
r'   cmdshowRetr5   clientr9   	streamRetcretes
             r   __processCmdzFail2banClient.__processCmdU   se   &-:9  q1tzz(+W=f
R- 

9!jjIq!;;q>SA!jjIs1v&	AaD55j!!#a&)*ll9c!fkk*	j&&s1v./i% F \\^ 122JJ	1 << 4::i(1,	AaDFNQ!/zz!*Aq1 \\^ 4::i(1,ll1o 122JJ 3  4::i(1,	I		"||A \\^ 4::i(1,ll1o 122JJ 3  4::i(1,ll1o \\^ 4::i(1,ll1o 122JJ 3s   %M- C:E$$M- +L- $L*7AIM- G 	H()HHL*AL%$M- ,J= =	K9)K44K9%L**M- -	M*6)M%%M*-O*1NO*	N>)N94O*9N>>,O*c                 `   	 t        j                  | j                  d   t         j                        rt        j                  | j                  d   t         j                        r6|rt        j                  |       y t        j                  d|rd|z  nd       y t        j                  d| j                  d          y t        j                  d| j                  d          y # t        $ rB}t        j                  d| j                  d          t        j                  |       Y d }~y d }~ww xY w)Nr;   z*%sUnable to contact server. Is it running?z[%s] r)   z3Permission denied to socket: %s, (you must be root)z6Failed to access socket path: %s. Is fail2ban running?z*Exception while checking socket access: %s)osaccessrA   F_OKW_OKr   rF   rK   )r'   	prevError	errorOnlyrW   s       r   __logSocketErrorzFail2banClient.__logSocketError   s    ii

8$bgg. 
yyH%rww/ll9ll? ))r3 \\  $

8 46 LL  

8 
 	<<<zz(	<<??s*   A9C" <C" #C" >#C" "	D-+8D((D-c                 *   | j                         rt        j                  d       y | j                         \  }}|sy | j                  d   sBt
        j                  j                  | j                  d         rt        j                  d       y d|gdggS )NzServer already runningforcer;   zLFail2ban seems to be in unexpected state (not running but the socket exists)zserver-streamr?   )_Fail2banClient__pingr   rF   
readConfigrA   rZ   pathexists)r'   rV   streams      r   __prepareStartServerz#Fail2banClient.__prepareStartServer   s|    	[[]	<<()
 !+#v	
 
G	

80D!E	<<^_
F
#o%6	77r   c                     || _         y r   )r$   r'   ss     r   _set_serverzFail2banClient._set_server   s	    $,r   c                    ddl m} | j                         }d| _        |sy	 |r.|j	                  | j
                         | j                  |d      syt               }| j                  ||       d| _	        |j                  | j
                  d| j                        | _        |j                  dd      s8| j                  r!| j                  j                          d | _        t        d       y# t         $ r  t"        $ rn}t%        d       t'        j(                  d	|rd
ndz          | j
                  d   dkD  rt'        j*                  |       nt'        j(                  |       Y d }~yd }~ww xY w)Nr   )Fail2banServerTF)phaserg   doner,   r)   z Exception while starting server 
background
foregroundr<   )fail2banserverrn   #_Fail2banClient__prepareStartServerr#   startServerAsyncrA   ,_Fail2banClient__processStartStreamAfterWaitdictconfigureServerdaemonstartServerDirectrl   r$   getquitr   r   rK   r   r   rF   rP   )r'   rq   rn   rg   ro   rW   s         r   __startServerzFail2banClient.__startServer   s0   ,$$&&$+	
##DJJ/--fe< FEuV4DK!33DJJtGWGWXDL99VU#
lldl	#Y 
 
 		 	":	<<2jlVbcd
jja
Q
LLO
s   /C- BC- -E-?A$E((E-Nc                    |rfd}|| j                   d<   t        t        j                  | d|f      }d|_        |j                          |][t        j                  fd| j                   d   d       t        j                  d	d
       j                  dd      st        d      ydd<   t        j                  d	d       || j                         }%|rdndxd<   d<   t        j                  d	d       |sy:t        j                  fddd       |rdndd<   t        j                  d	d       | j                  |d      }|d<   |S )Nc                  >    d d<   t        j                  dd        y )NTstart-readyr=     server phase %s)r   rC   ro   s   r   _server_readyz5Fail2banClient.configureServer.<locals>._server_ready   s     U=ZZ&.r   onstartF)targetrG   Tc                  ,     j                  dd       d uS )Nreadyr{   r   s   r   <lambda>z0Fail2banClient.configureServer.<locals>.<lambda>   s    599Wd34? r   r5   gMbP?r=   r   startz$Async configuration of server failedz  client phase %sr   c                  ,     j                  dd       d uS )Nr   r   r   s   r   r   z0Fail2banClient.configureServer.<locals>.<lambda>  s    %))M48D r         ?	configurerp   )rA   r   r    rx   ry   r   r   wait_forr   rC   r{   r   rt   rv   )r'   nonsyncro   rg   r   thrV   s     `    r   rx   zFail2banClient.configureServer   sb   / *DJJyn44D%PV;WX22988:n*	NN?IAVX]^
JJq%u-99We$#$JKK

5>	::a$e,^%%'6
.4d%@5>E'N	::a$e,	

>>Dc5Q!'U5	::a$e,**659#
5=	*r   c                    t        |t              st        |      }t        |      dk(  r+|d   dk(  r#| j                  | j                  d         }|sy|S t        |      dk\  r|d   dk(  rt        |      dkD  rddg|dd | j                  |      S | j                  j                  d	d      rt        d
       | j                  dg       | j                  d      st        j                  d       y| j                  j                  d	d      r:t        d       | j                          | j                  | j                        }||S | j                  j                  d	d      rt        d       | j                  dg      S t        |      dk\  r|d   dk(  rg }t        |      dk\  rW|d   dv r|j                  |d          |d= n)t        |      dkD  rt        j                  d|dd         ynt        |      dk\  rW| j                  d      rt        |      dk(  s|d   dk(  rd}| j!                         \  }}n|d   }| j!                  |      \  }}|sy| j                  j                  d	d      rt        d       | j#                  d|||ggd      S t        j                  d       yt        |      dkD  r(|d   dk(  r | j#                  |gt%        |d               S | j#                  |g      S )Nr   r   r   rq   Frestartreload	--restartinteractivez  ## stop ... stopzCould not stop serverz  ## load configuration ... z  ## start ... r   )r   z--unbanz--if-existsz%Unexpected argument(s) for reload: %rr3   r4   z--allz  ## reload ... TzCould not find serverr2   )
isinstancelistlen_Fail2banClient__startServerrA   _Fail2banClient__processCommandr{   r   _Fail2banClient__waitOnServerr   rF   	resetConfinitCmdLine_argvappendrc   rd   r6   float)r'   rQ   rV   optsjailrg   s         r   __processCommandzFail2banClient.__processCommand  s   	C		c3X]s1v(			DJJ|4	53

:
3x1}Q9,	#hl+&C!H  %%
jjnn]E*
&"


e
$
LL()
jjnn]E*
)*NN


4::
&C
Z
jjnn]E*



	
**
3x1}Q8+
4	SQ
1v88	[[Q	QC1ll:CGD
 
SQ kk"k
3x1}A')T??$[S&FT??4([S&zz~~mU+xtV<=tDD
LL()
3x!|A&(


SE5Q=

99 

SE
""r   c                    d}	 | j                         st        j                  d       y | j                  | }|s-| j                  r!| j                  j                          d | _        |S # t        $ rY}| j
                  d   dkD  rt        j                  |       t        j                  d| j
                  d   z   dz          Y d }~d }~ww xY w)NFz%Could not find server, waiting failedr<   r   zQCould not start server. Maybe an old socket file is still present. Try to remove r;   zR. If you used fail2ban-client to start the server, adding the -x option will do it)	r   r   rF   r6   r   rA   rP   r$   r|   )r'   rG   rV   rW   s       r   __processStartStreamAfterWaitz,Fail2banClient.__processStartStreamAfterWaitZ  s    #2




LL89			D	!3 
<<4<	* 
" 2
jja
Q	<< ::h'(+11 2 22s   %A* A* *	C3ACCc                 H    | j                   d   }t        j                         }t        j                  dd||f       d fd}t	         j                   d         5 } j
                  r |       }||k(  r
	 d d d        yt        j                         |z
  }t        j                  dd|       |d	kD  r|j                          ||k\  rt        d
      t        dz  |dkD  rdnd      t        j                          j
                  rd d d        y# 1 sw Y   yxY w)Nr5   r=   z__waitOnServer: %rgy?c                      t         j                  j                   j                  d         xr  j	                        S )Nr;   r4   )rZ   re   rf   rA   rc   )r'   sltimes   r   r   z/Fail2banClient.__waitOnServer.<locals>.<lambda>x  s-    

8 45U$++f+:U r   r<   Tz  wait-time: %sr   zFailed to start serverr   g?r   皙?F)
rA   timer   rC   
VisualWaitr#   	heartbeatr   minsleep)	r'   alivemaxtime	starttimetestvisrunfwaittimer   s	   `       @r   __waitOnServerzFail2banClient.__waitOnServerq  s   _ZZ	"7iik)**Q$ug&67&	U$$**Y'( C	6Du}	 
 yy{Y&H
JJq#X.!|]]_7#$<==!HsNS<FJJv 
  
!  
s   !DB
DD!c                    i }t               dk(  r]t        j                  t        j                  fD ]:  }t        j                  |      ||<   t        j                  || j
                         < 	 | j                  W| j                  |      }|D|r7	 d| _        |j                         D ]  \  }}t        j                  ||        yt        d      | j                  }| j                  j                  dd      r	 dd l}	 d}t!        |      dkD  r| j#                  |      }|r|j%                  d       | j'                          	 t)               }|d	k(  s|d
k(  r7	 d| _        |j                         D ]  \  }}t        j                  ||        y|dk(  r| j+                          n*|dk(  s%	 | j#                  t-        j.                  |             nt!        |      dk  rG| j+                          	 d| _        |j                         D ]  \  }}t        j                  ||        y| j#                  |      d| _        |j                         D ]  \  }}t        j                  ||        S 	 d| _        |j                         D ]  \  }}t        j                  ||        y # t        $ r t        d      w xY w# t0        $ rH}	| j                  d   dkD  rt3        j4                  |	       nt3        j6                  |	       Y d }	~	8d }	~	ww xY w# t8        t:        f$ r t=        d        w xY w# t0        $ r|}	| j                  d   dkD  rt3        j4                  |	       nt3        j6                  |	       Y d }	~	d| _        |j                         D ]  \  }}t        j                  ||        yd }	~	ww xY w# d| _        |j                         D ]  \  }}t        j                  ||        w xY w)N_MainThreadFTzInit of command line failedr   r   zReadline not availableztab: completer   r|   helpr)   r<   r   )r   signalSIGTERMSIGINT	getsignal_Fail2banClient__sigTERMhandlerr   r   r#   itemsr   _argsrA   r{   readlineImportErrorr   r   parse_and_bindr*   r   	dispUsageshlexsplitrK   r   rP   rF   EOFErrorKeyboardInterruptr   )
r'   argv_prev_signalsrk   rV   shrG   r   rQ   rW   s
             r   r   zFail2banClient.start  s   -^}$^^V]]+ ,q''*M!
MM!T**+,:
jj


4
 C
d 4;##% uq"
MM!Re $$ABB **4 jjnn]E*>SD	A!!$'co.
_s
-3&=6 4;##% uq"
MM!R7 -r					u{{3/	0  	. 4y1}	^^ 4;##% uq"
MM!R   & 4;##% uq"
MM!RG 	D 4;##% uq"
MM!RS  >#$<==>&  	JJy!A%


1

,,q/		
 '( BZ
 
 
jja
Q
LLO
4;##% uq"
MM!R 4;##% uq"
MM!Rs   .!L. 3L. :J# ?AL L +$J; L L. &L. #J88L. ;	L=LL LL L++L. .	N37=N.4N6 .N33N6 67O-)r   )Tr3   )r)   F)T)TNN)TN)r   
__module____qualname__r"   r*   r   rc   propertyr9   r6   rI   rt   rl   r   rx   r   rv   r   r   r   r   r   r    r    6   sb    
  0d28$'T)bF#R.4Ar   r    c                   2    e Zd ZdZdZdZd	dZd Zd Zd Z	y)
_VisualWaitzJSmall progress indication (as "wonderful visual") during waiting process
	r   r   c                     || _         y r   )maxpos)r'   r   s     r   r"   z_VisualWait.__init__  s	    $+r   c                     | S r   r   r&   s    r   	__enter__z_VisualWait.__enter__      	+r   c                     | j                   rTt        j                  j                  ddd| j                  z   z  z   dz          t        j                  j                          y y )N #   )posrM   rN   writer   rO   r'   rG   s     r   __exit__z_VisualWait.__exit__  sG    	XX::D#r$++~./45:: r   c                    | j                   s2t        j                  j                  dd| j                  z  z   dz          | xj                   | j
                  z  c_         | j
                  dkD  r| j                   dkD  rdnd}nd}t        j                  j                  |       t        j                  j                          | j                   | j                  kD  rd	| _        y| j                   d
k  rd| _        yy)z&Show or step for progress indicator
		z

INFO   [#r   z] Waiting on the server...[8Cr   r   z #[1Dz# [2Dz
[1D# [2Dr3   r   N)r   rM   rN   r   r   deltarO   rj   s     r   r   z_VisualWait.heartbeat  s     
::MS_58]]^((djj(	ZZ!^hhl{11**1**	XX4:xx!|4: r   N)
   )
r   r   r   __doc__r   r   r"   r   r   r   r   r   r   r   r     s%    	
r   r   c                   "    e Zd ZdZd Zd Zd Zy)_NotVisualWaitz8Mockup for invisible progress indication (not verbose)
	c                     | S r   r   r&   s    r   r   z_NotVisualWait.__enter__  r   r   c                      y r   r   r   s     r   r   z_NotVisualWait.__exit__      r   c                      y r   r   r&   s    r   r   z_NotVisualWait.heartbeat  r   r   N)r   r   r   r   r   r   r   r   r   r   r   r     s    r   r   c                 6    | dkD  rt        |i |S t               S )z3Wonderful visual progress indication (if verbose)
	r   )r   r   )r<   rG   kwargss      r   r   r     s"     )0!T$V$I9IIr   c                 h    t               }|j                  |       rt        d       y t        d       y )Nr   r,   )r    r   r   )r   rS   s     r   exec_command_liner     s$    


LLq's)r   )!
__author____copyright____license__rZ   r   r   r;   rM   r   r   r   r   csocketr   r9   r	   fail2bancmdliner
   r   r   r   r   r   server.utilsr   r   r   r   r    r   r   r   r   r   r   r   <module>r      s   & #
p 	    
      "  !	6V_f Vr : Jr   