
    Bd:=                        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 dS )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                  <    t          j                    j        j        S N)	threadingcurrent_thread	__class____name__     @/usr/lib/python3/dist-packages/fail2ban/client/fail2banclient.py_thread_namer   ,   s     "",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dS )Fail2banClientc                     t          j        |            t          j        |            d| _        d | _        d | _        d S )NT)r
   __init__r   _alive_server_beautifierselfs    r   r"   zFail2banClient.__init__8   s?    4   /$$+$,$r   c                 v    t          dt          z   dz              t          d           t          d           d S )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?   s9    	"Y	YZZZ	HIII*****r   c                 p    t          d           t          j        d|z             t          d           d S )Nr)   zCaught signal %d. Exiting   )r   r   warningr   )r'   signumframes      r   __sigTERMhandlerzFail2banClient.__sigTERMhandlerD   s2    ***.,v5666s)))))r   皙?c                 N    |                      dg|dk    r|gng z   gd|          S )NpingFtimeout)_Fail2banClient__processCmd)r'   r6   s     r   __pingzFail2banClient.__pingJ   s>    			VHW]]		KL' 
 
 
 r   c                 R    | j         r| j         S t                      | _         | j         S r   )r%   r	   r&   s    r   
beautifierzFail2banClient.beautifierN   s+    	 

\\$		r   Tr4   c                 ^   d }	 | j         }d}|D ]}|                    |           	 |st          | j        d         |          }n|dk    r|                    |           | j        d         dk    rt          j        dd|           |                    |          }|d	         d	k    rQt          j        dd
|d                    |s
|d	         dv r(t          |	                    |d                              nLt          j
        d|d         j                   |r(t          |                    |d                              d}:# t          j
        $ r}	|s| j        d         dk    rF|s|d	         dk    r!|                     |	|d	         dk               nt          j        dd||	           Y d }	~	 |rT	 |                                 n># t           $ r1}	|s| j        d         dk    rt          j        |	           Y d }	~	nd }	~	ww xY w|s
|d	         dv r t$          j                                         dS dS d }	~	wt           $ r}	|s| j        d         dk    r:| j        d         dk    rt          j        |	           nt          j
        |	           Y d }	~	 |rT	 |                                 n># t           $ r1}	|s| j        d         dk    rt          j        |	           Y d }	~	nd }	~	ww xY w|s
|d	         dv r t$          j                                         dS dS d }	~	ww xY w	 |rT	 |                                 n># t           $ r1}	|s| j        d         dk    rt          j        |	           Y d }	~	nd }	~	ww xY w|s
|d	         dv rt$          j                                         n# |rT	 |                                 n># t           $ r1}	|s| j        d         dk    rt          j        |	           Y d }	~	nd }	~	ww xY w|s
|d	         dv rt$          j                                         w w xY w|S )NTsocketr5   r4   verboser      zCMD: %rr   zOK : %rr   )echoserver-statuszNOK: %rFr3   z -- %s failed -- %r)r:   setInputCmdr   _conf
settimeoutr   logsendr   beautifyerrorargsbeautifyErrorr<   _Fail2banClient__logSocketErrorclose	Exceptiondebugsysstdoutflush	exception)
r'   cmdshowRetr6   clientr:   	streamRetcretes
             r   __processCmdzFail2banClient.__processCmdU   s   &-:9    q1 !tz(+W===ff
R--   
9!!jIq!!!;;q>>SA!jIs1v&&&	 +AaD555j!!#a&))***l9c!fk***	 0j&&s1v..///i<    24:i(1,,	 2AaDFNNQ!////z!*Aq111EEEE  \\^^^^    4:i(1,,l1ooo  1222J 32     4:i(1,,	I		"	"|AEEEE  \\^^^^    4:i(1,,l1ooo  1222J 325 F  \\^^^^    4:i(1,,l1ooo  1222J  \\^^^^    4:i(1,,l1ooo  1222J 3	s   #N' DE	N' 	L"AH:1N' 9G 
H	'HH	:L"ALN' J1 1
K,;'K''K,L""N' )L> >
M9'M44M9'P*+O ?P* 
O;
'O61P*6O;;/P*r)   Fc                 8   	 t          j        | j        d         t           j                  rt          j        | j        d         t           j                  r6|rt          j        |           d S t          j        d|rd|z  nd           d S t          j        d| j        d                    d S t          j        d| j        d                    d S # t          $ r?}t          j        d| j        d                    t          j        |           Y d }~d S 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accessrB   F_OKW_OKr   rG   rL   )r'   	prevError	errorOnlyrX   s       r   __logSocketErrorzFail2banClient.__logSocketError   sM   i
8$bg..  
yH%rw// 	6 3l9l? )1)r3 3 3 3 3 \  $
8 46 6 6 6 6 L  
8     
   	<<z(  	<?????????s*   A*C .C  C . C 
D4DDc                 4   |                                  rt          j        d           d S |                                 \  }}|sd S | j        d         s@t
          j                            | j        d                   rt          j        d           d S 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   rG   
readConfigrB   r[   pathexists)r'   rW   streams      r   __prepareStartServerz#Fail2banClient.__prepareStartServer   s    	[[]] 	<()))
$ !!+#v	 
$ 
G	 
80D!E!E 	<^___
$F
#o%6	77r   c                     || _         d S r   )r$   r'   ss     r   _set_serverzFail2banClient._set_server   s    $,,,r   c                    ddl m} |                                 }d| _        |sdS 	 |r3|                    | j                   |                     |d          sdS nt                      }|                     ||           d| _	        |
                    | j        d| j                  | _        |                    dd          s6| j        r | j                                         d | _        t          d           n# t           $ r  t"          $ ro}t%          d           t'          j        d	|rd
ndz              | j        d         dk    rt'          j        |           nt'          j        |           Y d }~dS d }~ww xY wdS )Nr   )Fail2banServerTF)phaserh   doner,   r)   z Exception while starting server 
background
foregroundr=   )fail2banserverro   #_Fail2banClient__prepareStartServerr#   startServerAsyncrB   ,_Fail2banClient__processStartStreamAfterWaitdictconfigureServerdaemonstartServerDirectrm   r$   getquitr   r   rL   r   r   rG   rQ   )r'   rr   ro   rh   rp   rX   s         r   __startServerzFail2banClient.__startServer   s   ,,,,,,$$&&&$+	 
% ##DJ///--fe<< E FFEuV444DK!33DJtGWXXDL99VU##  
ldl	#YYY	 	 	 		   	":::	<2j6bllVbcddd
ja
Q
LOOO
%%%%% 
s   2C; BC; ;E>A$E99E>Nc                    |rfd}|| j         d<   t          t          j        | d|f          }d|_        |                                 |a_t          j        fd| j         d         d           t          j	        d	d
           
                    dd          st          d          dS dd<   t          j	        d	d           ||                                 }$|rdndxd<   d<   t          j	        d	d           |sdS 8t          j        fddd           |rdndd<   t          j	        d	d           |                     |d          }|d<   |S )Nc                  >    d d<   t          j        dd            d S )NTstart-readyr>     server phase %s)r   rD   rp   s   r   _server_readyz5Fail2banClient.configureServer.<locals>._server_ready   s(     U=Z&.....r   onstartF)targetrH   Tc                  4                          dd           d uS )Nreadyr|   r   s   r   <lambda>z0Fail2banClient.configureServer.<locals>.<lambda>   s    599Wd334? r   r6   gMbP?r>   r   startz$Async configuration of server failedz  client phase %sr   c                  4                          dd           d uS )Nr   r   r   s   r   r   z0Fail2banClient.configureServer.<locals>.<lambda>  s    %))M488D r         ?	configurerq   )rB   r   r    ry   rz   r   r   wait_forr   rD   r|   r   ru   rw   )r'   nonsyncrp   rh   r   thrW   s     `    r   ry   zFail2banClient.configureServer   s    / / / / / *DJyn4D%PV;WXXX22988:::n*	N????IAVX]^^^
Jq%u---99We$$ L#$JKKK
$
5>	:a$e,,,^%%''6
.4&?dd%@5>E'N	:a$e,,,	 
%
>DDDDc5QQQ!'2U5	:a$e,,,**6599#
5=	*r   c                 ,   t          |t                    st          |          }t          |          dk    r2|d         dk    r&|                     | j        d                   }|sdS |S t          |          dk    rE|d         dk    r8t          |          dk    rddg|dd<   |                     |          S | j                            d	d          rt          d
           |                     dg           |                     d          st          j
        d           dS | j                            d	d          rAt          d           |                                  |                     | j                  }||S | j                            d	d          rt          d           |                     dg          S t          |          dk    r_|d         dk    rRg }t          |          dk    ro|d         dv r|                    |d                    |d= n3t          |          dk    rt          j
        d|dd                     dS nt          |          dk    o|                     d          rt          |          dk    s|d         dk    rd}|                                 \  }}n |d         }|                     |          \  }}|sdS | j                            d	d          rt          d           |                     d|||ggd          S t          j
        d           dS t          |          dk    r7|d         dk    r+|                     |gt%          |d                             S |                     |g          S )Nr   r   r   rr   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: %rr4   r5   z--allz  ## reload ... TzCould not find serverr3   )
isinstancelistlen_Fail2banClient__startServerrB   _Fail2banClient__processCommandr|   r   _Fail2banClient__waitOnServerr   rG   	resetConfinitCmdLine_argvappendrd   re   r7   float)r'   rR   rW   optsjailrh   s         r   __processCommandzFail2banClient.__processCommand  s   	C		 	c3XX]]s1v((			DJ|4	5	53
 5
:
3xx1}}Q9,,	#hhll+&C!H  %%%
jnn]E** 
&"""


e
$
$ 
L()))5
jnn]E** 
)***NN


4:
&
&C
Z
jnn]E** 



	
*
**
3xx1}}Q8++
4	SQ
1v888	[[Q	QC1l:CGDDDU
 
SQ kk"k 
3xx1}}A'))T??$$[S&&FT??4(([S& Ez~~mU++  xtV<=tDDD
L()))5
3xx!||A&((


SE5Q==

9
99 

SE
"
""r   c                    d}	 |                                  st          j        d           dS  | j        | }na# t          $ rT}| j        d         dk    rt          j        |           t          j        d| j        d         z   dz              Y d }~nd }~ww xY w|s'| j        r | j                                         d | _        |S )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   rG   r7   r   rB   rQ   r$   r}   )r'   rH   rW   rX   s       r   __processStartStreamAfterWaitz,Fail2banClient.__processStartStreamAfterWaitZ  s   #2




 
L89995		D	!33	! 2 2 2
ja
Q	< :h'(+11 2 2 2 2 2 2 2 22 
  <4<	*s   (9 
9 
BA
BBc                 ^    | j         d         }t          j                    }t          j        dd||f           d fd}t	           j         d                   5 } j        r |            }||k    r	 d d d            dS t          j                    |z
  }t          j        dd|           |d	k    r|                                 ||k    rt          d
          t          dz  |dk    rdnd          t          j	                    j        d d d            n# 1 swxY w Y   dS )Nr6   r>   z__waitOnServer: %rgy?c                      t           j                             j        d                   o                               S )Nr<   r5   )r[   rf   rg   rB   rd   )r'   sltimes   r   r   z/Fail2banClient.__waitOnServer.<locals>.<lambda>x  s/    
8 455U$++f+:U:U r   r=   Tz  wait-time: %sr   zFailed to start serverr   g?r   r1   F)
rB   timer   rD   
VisualWaitr#   	heartbeatr   minsleep)	r'   alivemaxtime	starttimetestvisrunfwaittimer   s	   `       @r   __waitOnServerzFail2banClient.__waitOnServerq  s   _Z	"7ikk)*Q$ug&6777&	U	U	U	U	U$$*Y'(( C	 466Du}}	       
 y{{Y&H
Jq#X...!||]]___7#$<===!HsNNSS<<FJv 
                 
s   D"BD""D&)D&c                 J   i }t                      dk    rLt          j        t          j        fD ]3}t          j        |          ||<   t          j        || j                   4	 | j        a|                     |          }|J|r9	 d| _        |	                                D ]\  }}t          j        ||           dS t          d          | j        }| j                            dd          r	 dd l}n# t          $ r t          d          w xY w	 d}t!          |          dk    r|                     |          }|r|                    d           |                                  	 t)                      }|d	k    s|d
k    r9	 d| _        |	                                D ]\  }}t          j        ||           dS |dk    r|                                  n|dk    sz	 |                     t-          j        |                     nQ# t0          $ rD}	| j        d         dk    rt3          j        |	           nt3          j        |	           Y d }	~	nd }	~	ww xY wn# t8          t:          f$ r t=          d            w xY wt!          |          dk     rM|                                  	 d| _        |	                                D ]\  }}t          j        ||           dS |                     |          d| _        |	                                D ]\  }}t          j        ||           S n# t0          $ r{}	| j        d         dk    rt3          j        |	           nt3          j        |	           Y d }	~	d| _        |	                                D ]\  }}t          j        ||           dS d }	~	ww xY w	 d| _        |	                                D ]\  }}t          j        ||           d S # d| _        |	                                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   _argsrB   r|   readlineImportErrorr   r   parse_and_bindr*   r   	dispUsageshlexsplitrL   r   rQ   rG   EOFErrorKeyboardInterruptr   )
r'   argv_prev_signalsrl   rW   shrH   r   rR   rX   s
             r   r   zFail2banClient.start  s   -^^}$$^V]+ , ,q'**M!
M!T*++++:
j


4
 
 C
 d 4;##%%  uq"
M!R e $$ABBB *4 jnn]E** #'>____ > > >#$<===>SD		A!!$''c o...
__s
--3&==6 4;##%%  uq"
M!R 7 --r						u{3//	0	0	0	0 	 	 	Jy!A%%

1




,q///		$ '(   BZZZ

 4yy1}}	^^ 4;##%%  uq"
M!R    && 4;##%%  uq"
M!RG6 
   
ja
Q
LOOO
%%%4;##%%  uq"
M!R 7D 4;##%%  uq"
M!R  4;##%%  uq"
M!Rs   " L) ;2L) .C3 2L) 3DL) A1I ;!I 'H I 
I:I	I II L) "I::*L) L) (O* )
N.3:N)-O* )N..O* *8P")r1   )Tr4   )r)   F)T)TNN)TN)r   
__module____qualname__r"   r*   r   rd   propertyr:   r7   rJ   ru   rm   r   ry   r   rw   r   r   r   r   r   r    r    6   s+           
        (0 0 0 0d   28 8 8$  ' ' ' 'T) ) ) )bF# F# F#R  .   4A A A A Ar   r    c                   4    e Zd ZdZdZdZd
dZd Zd Zd Z	d	S )_VisualWaitzJSmall progress indication (as "wonderful visual") during waiting process
	r   r   
   c                     || _         d S 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         rPt          j                            ddd| j        z   z  z   dz              t          j                                         d S d S )N #   )posrN   rO   writer   rP   r'   rH   s     r   __exit__z_VisualWait.__exit__  s[    	X :D#r$+~./4555: r   c                    | j         s-t          j                            dd| j        z  z   dz              | xj         | j        z  c_         | j        dk    r| j         dk    rdnd}nd}t          j                            |           t          j                                         | j         | j        k    r	d	| _        dS | j         d
k     r	d| _        dS dS )z&Show or step for progress indicator
		z

INFO   [#r   z] Waiting on the server...[8Cr   r   z #[1Dz# [2Dz
[1D# [2Dr4   r   N)r   rN   rO   r   r   deltarP   rk   s     r   r   z_VisualWait.heartbeat  s     
 _:MS_58]]^^^((dj((	Z!^^hll{{111*1*	X4:::x!||4::: |r   N)r   )
r   r   r   __doc__r   r   r"   r   r   r   r   r   r   r   r     si         	
           r   r   c                   $    e Zd ZdZd Zd Zd ZdS )_NotVisualWaitz8Mockup for invisible progress indication (not verbose)
	c                     | S r   r   r&   s    r   r   z_NotVisualWait.__enter__  r   r   c                     d S r   r   r   s     r   r   z_NotVisualWait.__exit__      $r   c                     d S r   r   r&   s    r   r   z_NotVisualWait.heartbeat  r   r   N)r   r   r   r   r   r   r   r   r   r   r   r     sK                 r   r   c                 B    | dk    rt          |i |nt                      S )z3Wonderful visual progress indication (if verbose)
	r   )r   r   )r=   rH   kwargss      r   r   r     s*     )0!T$V$$$9I9IIr   c                     t                      }|                    |           rt          d           d S t          d           d S )Nr   r,   )r    r   r   )r   rT   s     r   exec_command_liner     s?    



LL q'''''s)))))r   )!
__author____copyright____license__r[   r   r   r<   rN   r   r   r   r   csocketr   r:   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 6 6  V V V V V_f V V Vr       :       J J J    r   