%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /lib/python2.7/site-packages/salt/transport/
Upload File :
Create Path :
Current File : //lib/python2.7/site-packages/salt/transport/tcp.pyc

�
���^c@@s`dZddlmZmZmZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddl
ZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmZddlmZddlm Z m!Z!ddl"m#Z#ddl$Z$ddl%Z$ddl&Z$ddl'Z$ddl(Z$ddl)Z$ddl*Z$ej+r�ddl,Z,nddl-j.Z,ddl/Z/yddl0m1Z1e2Z3WnOe4k
rbe5Z3ydd	l6m7Z7Wn!e4k
r^dd	l8m7Z7nXnXej9o{ej:j;j<�r�e2Z=ne5Z=e=r�ddlZddl>Z>ddl?Z$dd
lm@Z@nejAeB�ZCd�ZDe=rde@fd
��YZEndejFjGjHfd��YZIdejFjJjKjLejFjGjMfd��YZNdejFjJjKjOejFjPjQfd��YZRde$jSjTeUfd��YZVe=r�deVfd��YZWnde$jXjYfd��YZZdejFj[fd��YZ\deUfd��YZ]deUfd��YZ^d e$jSjTeUfd!��YZ_d"ejFjPj`fd#��YZadS($ug
TCP transport classes

Wire protocol: "len(payload) msgpack({'head': SOMEHEADER, 'body': SOMEBODY})"

i(tabsolute_importtprint_functiontunicode_literalsN(tsix(tqueue(tSaltReqTimeoutErrortSaltClientError(titer_transport_opts(tRSA(t
PKCS1_OAEP(t$SignalHandlingMultiprocessingProcesscC@sttd�r|jdt�r�|jtjtjd�ttd�rBttd�r�|jdd�}|dkr�|jtjtjt	|��q�nttd	�r�|jd
d�}|dkr�|jtjtj
t	|��q�nttd�rB|jdd�}|dkr?|jtjtjt	|��q?qBnttd
�r	|jdd�}|jdd�}|dks�|dkr�|dkr�d}n|dkr�d}n|jtj
dt	|d�t	|d�f�q�q	q|jtjtjd�ndS(u<
    Ensure that TCP keepalives are set for the socket.
    uSO_KEEPALIVEu
tcp_keepaliveiuSOL_TCPuTCP_KEEPIDLEutcp_keepalive_idlei����iuTCP_KEEPCNTutcp_keepalive_cntu
TCP_KEEPINTVLutcp_keepalive_intvluSIO_KEEPALIVE_VALSi i�N(thasattrtsockettgettFalset
setsockoptt
SOL_SOCKETtSO_KEEPALIVEtSOL_TCPtTCP_KEEPIDLEtinttTCP_KEEPCNTt
TCP_KEEPINTVLtioctltSIO_KEEPALIVE_VALS(tsocktoptsttcp_keepalive_idlettcp_keepalive_cntttcp_keepalive_intvl((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyt_set_tcp_keepaliveRsD		tLoadBalancerServercB@sJeZdZdZd�Zd�Zd�Zd�Zd�Zd�Z	RS(u3
        Raw TCP server which runs in its own process and will listen
        for incoming connections. Each incoming connection will be
        sent via multiprocessing queue to the workers.
        Since the queue is shared amongst workers, only one worker will
        handle a given connection.
        i�cK@s5tt|�j|�||_||_d|_dS(N(tsuperRt__init__Rtsocket_queuetNonet_socket(tselfRR"tkwargs((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR!�s		cC@s9t|_|j|d|dd|dd|d�dS(Nuoptsusocket_queuet	log_queueu	log_queuetlog_queue_levelulog_queue_level(tTruet	_is_childR!(R%tstate((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyt__setstate__�s	

cC@s,i|jd6|jd6|jd6|jd6S(Nuoptsusocket_queueu	log_queueulog_queue_level(RR"R'R((R%((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyt__getstate__�s



cC@s?|jdk	r;|jjtj�|jj�d|_ndS(N(R$R#tshutdownRt	SHUT_RDWRtclose(R%((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR0�s
cC@s|j�dS(N(R0(R%((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyt__del__�scC@stjtjtj�|_|jjtjtjd�t|j|j�|jj	d�|jj
|jdt|jd�f�|jj|j
�x|try5|jj�\}}|jj||ftd�Wq�tjk
r}tjj|�tjkrq�n�q�Xq�WdS(u1
            Start the load balancer
            iu	interfaceuret_portN(RtAF_INETtSOCK_STREAMR$RRtSO_REUSEADDRRRtsetblockingtbindRtlistentbacklogR)tacceptR"tputR#terrorttornadotutilterrno_from_exceptionterrnotECONNABORTED(R%t
connectiontaddresste((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pytrun�s*	 (
t__name__t
__module__t__doc__R8R!R,R-R0R1RD(((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR�s	
					tAsyncTCPReqChannelcB@s�eZdZej�Zd�Zed��Zd�Z	d�Z
d�Zd�Zd�Z
ejjddd	d
��Zejjdd	d��Zejjdd	d��Zejjdd	ed
��ZRS(uX
    Encapsulate sending routines to tcp.

    Note: this class returns a singleton
    cK@s|jd�ptjjj�}||jkrFtj�|j|<n|j|}|j||�}|j|�}|dkr�t
jd|�tj
|�}|j||�||_|||<d|_tj�|_n/|j�|jd7_WdQXt
jd|�|S(uA
        Only create one instance of channel per __key()
        uio_loopu*Initializing new AsyncTCPReqChannel for %siNu"Re-using AsyncTCPReqChannel for %s(R
R<tiolooptIOLooptcurrenttinstance_maptweakreftWeakValueDictionaryt_AsyncTCPReqChannel__keyR#tlogtdebugtobjectt__new__t__singleton_init__t
_instance_keyt	_refcountt	threadingtRLockt_refcount_lock(tclsRR&tio_looptloop_instance_maptkeytobj((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyRS�s$!
	
	
cK@sEd|kr|d|d<n|d|d|d|jdd�fS(Nu
master_uriupki_diruiducryptuaes(R
(RZRR&((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyt__key�scK@sdS(N((R%RR&((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR!
sc	K@s\t|�|_tjj|j�|_|jdd�|_|jd�pZtj	j
j�|_|jdkr�tjj
|jd|j�|_n|jd�}tj|jd�}|jjdd	�\}}|t|�f|_t|_t|jd
|j|t|�fdi|jd6|d6|jjd�d6|jjd
�d6�|_dS(Nucryptuaesuio_loopuclearR[uresolveru
master_uriu:itargsR&u	source_ipusource_ret_portusource_port(tdictRtsalttpayloadtSerialtserialR
tcryptR<RIRJRKR[t	AsyncAuthtauthturlparsetnetloctrsplitRtmaster_addrRt_closingtSaltMessageClientPooltmessage_client(R%RR&tresolvertparsetmaster_hosttmaster_port((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyRTs $$	cC@s�|jr
dS|jdkrU|j�|jd8_WdQXtjd|jj�dStjd|jj�t|_|jj	�|j
|jjkr�|jj|j
}|j|kr�||j=n|s�|jj|j
=q�ndS(Niu2This is not the last %s instance. Not closing yet.uClosing %s instance(
RmRVRYRPRQt	__class__RER)RoR0R[RLRU(R%R\((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR0's$	

	

cC@s\|j�d|_WdQXy|j�Wn.tjk
rW}|jtjkrX�qXnXdS(Ni(RYRVR0RR;R?tEBADF(R%texc((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR1Ds
cC@si|jd6|d6S(Nuencuload(Rf(R%tload((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyt
_package_loadPs
ii<cc@s|jjs|jj�Vn|jj|j|jjj|��d|�V}|jj�}t	r|j
|dtj�}n"t
j|�}|j|d�}tjj|j|�}	|	j||�}
tjr�tjjj|
�}
ntjj|
��dS(Nttimeoutukey(Rht
authenticatedtauthenticateRotsendRxt	crypticletdumpstget_keystHAS_M2tprivate_decryptRtpkcs1_oaep_paddingR	tnewtdecryptRbRft	CrypticleRtloadsRtPY3t	transporttframetdecode_embedded_strsR<tgentReturn(R%RwtdictkeyttriesRytretR]taestciphertpcrypttdata((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyt!crypted_transfer_decode_dictentryVs1	c#@s�tjj���fd��}�jjs>�jj�Vny |�V}tjj|��WnAtjj	k
r��jj�V|�V}tjj|��nXdS(u�
        In case of authentication errors, try to renegotiate authentication
        and retry the method.
        Indeed, we can fail too early in case of a master restart during a
        minion state execution call
        c3@s��jj�j�jjj���d��V}|rp�jjj|�}tjrpt	j
jj|�}qpnt
jj|��dS(NRy(RoR|RxRhR}R~R�RR�RbR�R�R�R<R�R�(R�(RwR%Ry(s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyt_do_transferos'
	N(
R<R�t	coroutineRhRzR{R�RbRftAuthenticationError(R%RwR�RyR�R�((RwR%Rys6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyt_crypted_transfergs!

cc@s8|jj|j|�d|�V}tjj|��dS(NRy(RoR|RxR<R�R�(R%RwR�RyR�((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyt_uncrypted_transfer�s"cc@s�yN|jdkr1|j|d|d|�V}n|j|d|d|�V}Wn#tjjk
rstd��nXtjj|��dS(u^
        Send a request, return a future which will complete when we send the message
        uclearR�RyuConnection to master lostN(	RfR�R�R<tiostreamtStreamClosedErrorRR�R�(R%RwR�RytrawR�((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR|�s N(RERFRGRMtWeakKeyDictionaryRLRStclassmethodROR!RTR0R1RxR<R�R�R#R�R�R�RR|(((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyRH�s"								 		tAsyncTCPPubChannelcB@s}eZd�Zd�Zd�Zd�Zejjd��Z	ejjd��Z
d�Zejjd��Zd�Z
RS(	cK@s�||_tjj|j�|_|jdd�|_|jd�pTtjj	j
�|_t|_
t|_t|_tjjjdd|jdt�|_dS(Nucryptuaesuio_loopuminionRR7(RRbRcRdReR
RfR<RIRJRKR[Rt	connectedRmt_reconnectedtutilsteventt	get_event(R%RR&((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR!�s	$				cC@s9|jr
dSt|_t|d�r5|jj�ndS(Numessage_client(RmR)RRoR0(R%((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR0�s
		cC@s|j�dS(N(R0(R%((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR1�scC@si|jd6|d6S(Nuencuload(Rf(R%Rw((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyRx�s
c#@s*i�jdd6|d6�tjj��fd��}|sL�jjr�d}xm|�jdks{�jddkr�y�jj�VPWqUtk
r�}tj	|�|d7}qUXqUWny |�V}tjj
|��WnAtjj
k
r%�jj�V|�V}tjj
|��nXdS(u�
        Send the minion id to the master so that the master may better
        track the connection state of the minion.
        In case of authentication errors, try to renegotiate authentication
        and retry the method.
        uidutokc3@s`�j�jjj���}tjjj|dd�}�j	j
|�Vtjj
t��dS(Ntheader(RxRhR}R~RbR�R�t	frame_msgR#Rotwrite_to_streamR<R�R�R)(tmsgtpackage(RwR%(s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR��siutcp_authentication_retriesiN(RR<R�R�RhRzR{RRPRQR�RbRfR�(R%ttokt
force_authR�tcountRvR�((RwR%s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pytsend_id�s$)


cc@s�|jr
dS|j|j|j�Vt|_|jji|jdd6d�|jr�|jj	d�dkr�dj
|jdtj��}t
jjj|jddgd�}nDdj
|jdtj��}t
jjj|jddgd	�}i|jdd6d
d6dd6|jd
6|d6|d6}t
jjjt|jf�}zhy|j|dd�WnJt
jjk
r�tjd�n'tk
r�tjdtj��nXWd~Xn	t|_dS(Numasteru__master_connectedu__roleusyndicuSyndic {0} started at {1}uidustartuMinion {0} started at {1}uminionu
_minion_eventucmdupretagutokudatautagRyi<uEfire_master failed: master could not be contacted. Request timed out.ufire_master failed: %s(RmR�R�R�R)R�R�t
fire_eventRR
tformatttimetasctimeRbR�ttagifyR#tasynchronoustSyncWrapperRHR|t
exceptionsRRPtinfot	Exceptiont	tracebackt
format_exc(R%tresultR�ttagRwtreq_channel((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pytconnect_callback�sL				

	


cC@s;|jr
dSt|_|jji|jdd6d�dS(Numasteru__master_disconnected(RmRR�R�R�R(R%((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pytdisconnect_callbacks			cc@s\ytjj|jd|j�|_|jjd�|_|jjsV|jj	�Vn|jjrt
|jd|j|jdt|jjd�fdi|jd6|j
d6|jd	6|jjd
�d
6|jjd�d6�|_|jj�Vt|_nWnStk
r�n@tk
rW}d
tj|�krXtdj|���qXnXdS(NR[RbR`u	master_ipupublish_portR&uio_loopuconnect_callbackudisconnect_callbacku	source_ipusource_publish_portusource_portu	-|RETRY|-u Unable to sign_in to master: {0}(RbRfRgRR[Rht	gen_tokenR�RzR{RnRtcredsR�R�R
RotconnectR)R�tKeyboardInterruptR�Rt	text_typeRR�(R%Rv((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR�"s*!	)



c@sJ�dkr�jj��Stjj��fd��}�jj|�S(u.
        Register an on_recv callback
        c3@s`t|t�sBtj|�}tjrBtjjj	|�}qBn�j
|�V}�|�dS(N(t
isinstanceRatmsgpackR�RR�RbR�R�R�t_decode_payload(tbodyR�(tcallbackR%(s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyt
wrap_callbackBs	N(R#Roton_recvR<R�R�(R%R�R�((R�R%s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR�;s
(RERFR!R0R1RxR<R�R�R�R�R�R�R�(((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR��s				"6		tTCPReqServerChannelcB@s_eZdZd�Zed��Zd�Zd�Zd�Zd�Z	e
jjd��Z
RS(icC@s&tjjjj||�d|_dS(N(RbR�tservertReqServerChannelR!R#R$(R%R((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR!SscC@s|jS(N(R$(R%((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyRWscC@s3|jdk	rsy|jjtj�Wn1tjk
rY}|jtjkrPqZ|�nX|jj�d|_nt	|j
d�r�y|j
j�Wq/tk
r�}tj
dt|��q/Xnjt	|j
d�r/y|j
j�Wq/tjk
r+}|jdkr�ntj
dt|��q/XndS(Nushutdownu4TCPReqServerChannel close generated an exception: %sustopi	(R$R#R.RR/R;R?tENOTCONNR0Rt
req_serverR�RPt	exceptiontstrtstop(R%Rv((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR0[s*

cC@s|j�dS(N(R0(R%((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR1uscC@s�tjjjjj||�trStj�|_	|j
td|j|j	f�n�tj
jj�s�tjtjtj�|_|jjtjtjd�t|j|j�|jjd�|jj|jdt|jd�f�ndS(uB
        Pre-fork we need to create the zmq router device
        R`iiu	interfaceuret_portN(RbR�tmixinsRhtAESReqServerMixintpre_forktUSE_LOAD_BALANCERtmultiprocessingtQueueR"tadd_processRRR�tplatformt
is_windowsRR2R3R$RRR4RR5R6R(R%tprocess_manager((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR�xsc
C@s�||_||_tjj|j�|_tjjj	|j��$t
rvt|j|j
d|jjd��|_n�tjjj�rtjtjtj�|_|jjtjtjd�t|j|j�|jjd�|jj|jdt|jd�f�nt|j
d|jjd�d|j�|_|jj|j�|jj|j �WdQXtj!j"j#j$j%|||�dS(	u�
        After forking we need to create all of the local sockets to listen to the
        router

        payload_handler: function to call with your payloads
        tssl_optionsussliiu	interfaceuret_portR[N(&tpayload_handlerR[RbRcRdRReR�R�tcurrent_ioloopR�tLoadBalancerWorkerR"thandle_messageR
R�R�R�RR2R3R$RRR4RR5R6RtSaltMessageServert
add_socketR7R8R�R�RhR�t	post_fork(R%R�R[((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR��s(				-c
	c@s�yAy|j|�}WnBtk
rZ|jtjjjdd|��tjj	��nXt
|t�s�t
|jd�t�r�|jtjjjdd|��Vtjj	��nyg|djdd�}t
d�|krtjd|�|j|jjd	��tjj	��nWnRtk
rttjd
|�|j|jjdj|���tjj	��nX|dd
kr�|jdi�jd�dkr�|jtjjj|j|d�d|��Vtjj	��ny|j|�V\}}WnLtk
rP}|jd�tjddt�|j�tjj	��nX|jdd�}|dkr�|jtjjj|d|��n�|dkr�|jtjjj|jj|�d|��no|dkr|jtjjj|j||d|d�d|��n'tjd|�|jd�|j�Wnktjj	k
r]�nRtjjk
r�tjddt�n)tk
r�}	tjd|	dt�nXtjj	��dS(uG
        Handle incoming messages from underylying tcp streams
        ubad loadR�uloadupayload and load must be a dictuiduuu+Payload contains an id with a null byte: %su!bad load: id contains a null byteu"Payload contains non-string id: %su bad load: id {0} is not a stringuencuclearucmdu_authu&Some exception handling minion payloadu-Some exception handling a payload from miniontexc_infoufunusendu
send_clearusend_privateukeyutgtuUnknown req_fun %su&Server-side exception handling payloadu"Connection was unexpectedly closedu!Unexpected exception occurred: %sN(R�R�twriteRbR�R�R�R<R�R�R�RaR
R�RPR;R|ReR~t	TypeErrorR�t_authR�R)R0R}t_encrypt_privateR�R�(
R%tstreamR�Rctid_R�treq_optsRCtreq_funRv((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR��sf
")
"1

%1


(RERFR8R!tpropertyRR0R1R�R�R<R�R�R�(((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR�Os					R�cB@s>eZdZd�Zejjd��Zd�Zd�Z	RS(u{
    Raw TCP server which will receive all of the TCP streams and re-assemble
    messages that are sent through to us
    cO@se|jdd�p!tjjj�}tt|�j||�||_	g|_
||_t|_
dS(Nuio_loop(tpopR#R<RIRJRKR R�R!R[tclientstmessage_handlerRt_shutting_down(R%R�R`R&R[((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR!�s$			cc@sBtjd|�|jj||f�tj�}y�x�tr�|jddt�V}|j|�xY|D]Q}t	j
r�tjj
j|�}n|d}|jj|j|||d�qhWq8WWnytjjk
r�tjd|�|j||f�n@tk
r=}tjd|�|j||f�|j�nXdS(	uP
        Handle incoming streams and add messages to the incoming queue
        uReq client %s connecteditpartialuheadubodyureq client disconnected %suother master-side exception: %sN(RPttraceR�tappendR�tUnpackerR)t
read_bytestfeedRR�RbR�R�R�R[tspawn_callbackR�R<R�R�t
remove_clientR�R0(R%R�RBtunpackert
wire_bytest
framed_msgR�RC((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyt
handle_stream�s(	

	
,cC@s9y|jj|�Wntk
r4tjd�nXdS(Nu/Message server client was not in list to remove(R�tremovet
ValueErrorRPR�(R%tclient((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR�s
cC@s�|jr
dSt|_x4|jD])}|\}}|j�|j|�q Wy|j�Wn+tjk
r�}|jdkr��q�nXdS(u+
        Shutdown the whole server
        Ni	(	R�R)R�R0R�R�RR;R?(R%titemRRBRv((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR. s		
(
RERFRGR!R<R�R�R�R�R.(((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR��s
		R�cB@s)eZdZd�Zd�Zd�ZRS(u�
        This will receive TCP connections from 'LoadBalancerServer' via
        a multiprocessing queue.
        Since the queue is shared amongst workers, only one worker will handle
        a given connection.
        cO@s]tt|�j|||�||_tj�|_tjd|j�|_	|j	j
�dS(Nttarget(R R�R!R"RWtEventt_stoptThreadtsocket_queue_threadtthreadtstart(R%R"R�R`R&((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR!:s
	cC@s|jj�|jj�dS(N(RtsetRtjoin(R%((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR�Bs
cC@s�yvxotrty|jjtd�\}}Wn*tjk
rW|jj�rPqqnX|jj|j	||�qWWnt
tfk
r�nXdS(Ni(R)R"R
RtEmptyRtis_setR[R�t_handle_connectionR�t
SystemExit(R%t
client_socketRB((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyRFs		(RERFRGR!R�R(((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR�3s		tTCPClientKeepAlivecB@s#eZdZdd�Zd�ZRS(uN
    Override _create_stream() in TCPClient to enable keep alive support.
    cC@s&||_tt|�jd|�dS(NRp(RR RR!(R%RRp((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR!\s	cK@sotjtjtj�}t||j�tjj|d|�}tjdkr\|j	|�S||j	|�fS(u�
        Override _create_stream() in TCPClient.

        Tornado 4.5 added the kwargs 'source_ip' and 'source_port'.
        Due to this, use **kwargs to swallow these and any future
        kwargs to maintain compatibility.
        tmax_buffer_sizei(i(
RR2R3RRR<R�tIOStreamtversion_infoR�(R%RtaftaddrR&RR�((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyt_create_stream`s
		
N(RERFRGR#R!R(((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyRXsRncB@s_eZdZddd�Zd�Zd�Zejj	d��Z
d�Zd�Zd�Z
RS(	ud
    Wrapper class of SaltMessageClient to avoid blocking waiting while writing data to socket.
    cC@s)tt|�jt|d|d|�dS(NR`R&(R RnR!tSaltMessageClient(R%RR`R&((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR!xscC@s|j�dS(N(R0(R%((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR1{scC@s+x|jD]}|j�q
Wg|_dS(N(tmessage_clientsR0(R%Ro((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR0~scc@sYg}x$|jD]}|j|j��qWx|D]}|Vq4Wtjjd��dS(N(RR�R�R<R�R�R#(R%tfuturesRotfuture((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR��s
	cO@s(x!|jD]}|j||�q
WdS(N(RR�(R%R`R&Ro((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR��scO@s,t|jdd��}|dj||�S(NR]cS@s
t|j�S(N(tlent
send_queue(tx((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyt<lambda>�si(tsortedRR|(R%R`R&R((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR|�scO@s/t|jdd��}|djj||�S(NR]cS@s
t|j�S(N(RR(R((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR�si(R Rt_streamR�(R%R`R&R((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR��sN(RERFRGR#R!R1R0R<R�R�R�R�R|R�(((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyRnts					RcB@s�eZdZddddddd�Zd�Zd�Zd�Zd�Ze	j
jd��Ze	j
jd��Z
e	j
jd��Zd	�Zd
�Zd�Zd�Zdded
�ZRS(u*
    Low-level message sending client
    c

	C@s||_||_||_||_|	|_||_||_|pTtjj	j
�|_tj
jj|j��t|d|�|_WdQXd|_td�|_g|_i|_i|_d|_d|_t|_|j�|_tjj �|_!|jj"|j#�dS(NRpiiiI�i���($Rthosttportt	source_iptsource_portR�R�R<RIRJRKR[RbR�R�R�Rt_tcp_clientt_midRt
_max_messagesRtsend_future_maptsend_timeout_mapR#t_read_until_futuret_on_recvRRmR�t_connecting_futuret
concurrenttFuturet_stream_return_futureR�t_stream_return(
R%RR"R#R[RpR�R�R$R%((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR!�s*														cC@s#|jdk	r|jj�ndS(N(R[R#R�(R%((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyt
_stop_io_loop�sc@sl�jr
dSt�_t�d�r7�jj�r7z�y�tjjj�}�j	j
��jj��jdk	r��jj�r��jj�n�j	tjjjdt�ks��jj�r��j	j�j�fd���j	j�q�nWn)tk
r$}tjdt|��nXWd|j
�Xn�jj�d�_	d�_d�_d�_dS(Nu_streamtinstancec@s
�j�S(N(R2(R(R%(s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR�su/Exception caught in SaltMessageClient.close: %s(RmR)RR!tclosedR<RIRJRKR[tmake_currentR0R+R#tdoneR�RR0t
add_futureR	R�RPR�R�R&R�R�(R%t	orig_loopRC((R%s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR0�s4		

!	
			cC@s|j�dS(N(R0(R%((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR1�sc@s�t�d�r+�jj�r+�j}nYtjj�}|�_�jj�j��j	dk	r��fd�}|j|�n|S(u@
        Ask for this client to reconnect to the origin
        u_connecting_futurec@s&|j�}�jj�j|�dS(N(R�R[tadd_callbackR�(Rtresponse(R%(s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyt
handle_future�sN(RR-R6R<R.R/R[R9t_connectR�R#tadd_done_callback(R%RR;((R%s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR��s	cc@sx
tr|jrPny�i}|js1|jrmtjdkr]i|jd6|jd6}qmtjd�ntj	j
j|j��9|j
j|j|jd|jjd�|�V|_WdQX|jjt�PWqtk
r}tjd	|�tjjd
�VqXqWdS(u6
        Try to connect for the rest of time!
        iiu	source_ipusource_portuGIf you need a certain source IP/port, consider upgrading Tornado >= 4.5R�usslNu.TCP Message Client encountered an exception %ri(ii(R)RmR$R%R<RRPtwarningRbR�R�R�R[R&R�R"R#RR
R!R-t
set_resultR�twarnR�tsleep(R%R&Rv((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR<s(		
	c	c@sz�x;|jr@|jj�s5|jj�tk	r@|jVqWtj�}x�|js�y�|jjddt�|_	|j	V}|j
|�x�|D]�}tjr�t
jjj|�}n|d}|d}|jd�}||jkr|jj|�j|�|j|�q�|jdk	rB|jj|j||�q�tjd|�q�WWqPtjjk
r
}tjd|j |j!�x'tj"|j�D]}|j#|�q�Wi|_|jr�dS|j$r�|j$�n|jj�r�|j%�|_n|jVqPt&k
r?d|j'kr6tj(d	�q�t)�qPt*k
r�}tjd
dt�x'tj"|j�D]}|j#|�qtWi|_|jr�dS|j$r�|j$�n|jj�r�|j%�|_n|jVqPXqPWWd|j+jt�XdS(NiR�uheadubodyumidu7Got response for message_id %s that we are not trackingu*tcp stream to %s:%s closed, unable to recvudetect_modeu[There was an error trying to use TCP transport; attempting to fallback to another transportuException parsing responseR�(,RmR-R6R�R)R�R�R!R�R+R�RR�RbR�R�R�R
R)R�R?tremove_message_timeoutR,R#R[R�RPR;R<R�R�RQR"R#t
itervaluest
set_exceptionR�R�R�RR�RR�R0(	R%R�R�R�R�R�t
message_idRCR((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR1%sj



	

			

				
cc@s0x1|jj�s(|jj�tk	r3|jVqWx�t|j�dkr+|jd\}}y|jj|�V|jd=Wq7tj	j
k
r'}||jkr�|jj|�j
|�n|j|�|jd=|jr�dS|jr�|j�n|jj�r|j�|_n|jVq7Xq7WdS(Ni(R-R6R�R)RRR!R�R<R�R�R)R�RDRBRmR�R�(R%RERRC((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyt_stream_sendgs&(

		
cC@snt}x^|j|jkrf|j|jkrT|rBtd��nd|_t}q	|jd7_q	W|jS(Nu"Unable to find available messageidi(RR'R)R(R�R)(R%twrap((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyt_message_id�s		c@s4�dkr�|_n�fd�}||_dS(uU
        Register a callback for received messages (that we didn't initiate)
        c@s�|�dS(N((R�R�(R�(s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyt	wrap_recv�sN(R#R,(R%R�RI((R�s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR��scC@s9||jkrdS|jj|�}|jj|�dS(N(R*R�R[tremove_timeout(R%RERy((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyRB�scC@sQ||jkr|j|=n||jkrM|jj|�jtd��ndS(NuMessage timed out(R*R)R�RDR(R%RE((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyttimeout_message�s

c
@s�j�}i|d6}tjj�}�dk	rV��fd�}|j|�n|�j|<�jjd�t	kr�d}n|dk	r��j
j|�j|�}	|	�j
|<nt�j�dkr��j
j�j�n�jj|tjjj|d|�f�|S(u9
        Send given message, and return a future
        umidc@s#|j�}�jj�|�dS(N(R�R[R9(RR:(R�R%(s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR;�sudetect_modeiiR�N(RHR<R.R/R#R=R)RR
R)R[t
call_laterRKR*RRR�RFR�RbR�R�R�(
R%R�RyR�R�RER�RR;tsend_timeout((R�R%s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR|�s 

	+N(RERFRGR#R!R2R0R1R�R<R�R�R<R1RFRHR�RBRKRR|(((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR�s 		*		B				t
SubscribercB@s)eZdZd�Zd�Zd�ZRS(u=
    Client object for use with the TCP publisher server
    cC@s1||_||_t|_d|_d|_dS(N(R�RBRRmR#R+R�(R%R�RB((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR!�s
				cC@sg|jr
dSt|_|jj�sc|jj�|jdk	rc|jj�rc|jj�qcndS(N(	RmR)R�R4R0R+R#R6R�(R%((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR0�s		
cC@s|j�dS(N(R0(R%((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR1�s(RERFRGR!R0R1(((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyRN�s		t	PubServercB@sqeZdZd	d�Zd�Zd�Zd�Zd�Ze	j
jd��Zd�Z
e	j
jd��ZRS(
u
    TCP publisher
    cC@stt|�jd|jd��||_||_t|_t�|_	t
jj|j�|_
i|_t|_|jjdt�r�t}x2t|j�D]!\}}|dkr�t}q�q�W|r�t|_q�n|jrt
jjjdd|jdt�|_ndS(NR�usslupresence_eventsutcpumasterRR7(R ROR!R
R[RRRmR
R�RbtmastertAESFuncst	aes_funcstpresenttpresence_eventsR)RR�R�R�(R%RR[ttcp_onlyR�t_((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR!�s("					
		cC@s|jr
dSt|_dS(N(RmR)(R%((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR0s	cC@s|j�dS(N(R0(R%((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR1scC@s�|j}||jkr5|j|}|j|�n�|h|j|<|jr�i|gd6gd6}|jj|tjjjdd��it	|jj
��d6}|jj|tjjjdd��ndS(Nunewulostuchangeupresenceupresent(R�RStaddRTR�R�RbR�R�tlisttkeys(R%RR�R�R�((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyt_add_client_presents	
	

		cC@s�|j}|dks$||jkr(dS|j|}||krEdS|j|�t|�dkr�|j|=|jr�igd6|gd6}|jj|tj	jj
dd��it|jj��d6}|jj|tj	jj
dd��q�ndS(Niunewulostuchangeupresenceupresent(
R�R#RSR�RRTR�R�RbR�R�RXRY(R%RR�R�R�((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyt_remove_client_presents&	


	

		c	c@s�tj�}x�|js�y%|jjddt�|_|jV}|j|�x�|D]�}tj	r{t
jjj
|�}n|d}|ddkr�qTnt
jj|jt
jjjddj�}|j|d�}tj	r�t
jjj
|�}n|jj|d|d	�sqTn|d|_|j|�qTWWqtjjk
r�}tjd
|j�|j �|j!|�|j"j#|�Pqt$k
r�}tj%ddt�qqXqWdS(
NiR�ubodyuencuaesusecretuloaduidutoku'tcp stream to %s closed, unable to recvuException parsing responseR�(&R�R�RmR�R�R)R+R�RR�RbR�R�R�RfR�RRPtSMastertsecretstvalueR�RRt
verify_minionR�RZR<R�R�RPRQRBR0R[R�tdiscardR�R;(	R%RR�R�R�R�R}RwRC((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyt_stream_read>s<


	
,	


cC@sItjd|�t||�}|jj|�|jj|j|�dS(NuSubscriber at %s connected(RPR�RNR�RWR[R�Ra(R%R�RBR((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR�asc	C@s�tjd|�tjjj|d�}g}d|kr�|d}x|D]�}||jkr�x{|j|D]Y}y,|jj|�}|j	j
|d��Wqotjj
k
r�|j|�qoXqoWqLtjd|�qLWngxd|jD]Y}y,|jj|�}|j	j
|d��Wq�tjj
k
rH|j|�q�Xq�WxH|D]@}tjd|j�|j�|j|�|jj|�qTWtjd�dS(	Nu!TCP PubServer sending payload: %supayloadu	topic_lstcS@stS(N(R)(tf((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR{suPublish target %s not connectedcS@stS(N(R)(Rb((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR�su0Subscriber at %s has disconnected from publisheru)TCP PubServer finished publishing payload(RPRQRbR�R�R�RSR�R�R[R7R<R�R�R�R�RBR0R[R`R�(	R%R�RVRct	to_removet	topic_lstttopicRRb((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pytpublish_payloadhs4




N(RERFRGR#R!R0R1RZR[R<R�R�RaR�Rf(((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyRO�s				#	tTCPPubServerChannelcB@sGeZdZd�Zd�Zd�Zd�Zdd�Zd�Z	RS(i�cC@sF||_tjj|j�|_tjjj|�|_d|_
dS(N(RRbRcRdReR�tminionst	CkMinionst	ckminionsR#R[(R%R((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR!�s	cC@s(|dtjj_|j|d�dS(Nusecretsuopts(RbRPR\R]R!(R%R+((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR,�scC@si|jd6tjjjd6S(Nuoptsusecrets(RRbRPR\R](R%((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR-�s
cK@sPtjjj|jj�|jd�}|dk	rJtjj	j
|�n|jd�}|dk	r{tjj	j|�ntjj	j|�|j
dkr�tjjj�|_
nt|jd|j
�}tjtjtj�}|jtjtjd�t||j�|jd�|j|jdt|jd�f�|j|j�|j |�|jjdd	�d
kr�t|jjdd��}nt!j"j#|jd
d�}tj$j%j&|d|j
d|j'�}tj(d|�tjj)j*d��|j+�WdQXy|j
j+�Wn't,t-fk
rKtjj	j.�nXdS(uK
        Bind to the interface specified in the configuration file
        u	log_queueulog_queue_levelR[iiu	interfaceupublish_portuipc_modeuutcputcp_master_publish_pulli�usock_dirupublish_pull.ipcR�uStarting the Salt Puller on %siN(/RbR�tprocesstappendproctitleRtRER
R#RPtsetupt!set_multiprocessing_logging_queuet!set_multiprocessing_logging_leveltsetup_multiprocessing_loggingR[R<RIRJRKRORRR2R3RRR4RR5R6RR7R8R�tostpathRR�tipctIPCMessageServerRfR�tfilest	set_umaskR	R�Rt shutdown_multiprocessing_logging(R%R&R'R(t
pub_serverRtpull_urit	pull_sock((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyt_publish_daemon�s@
'
	cC@s|j|jd|�dS(u�
        Do anything necessary pre-fork. Since this is on the master side this will
        primarily be used to create IPC channels and create our daemon process to
        do the actual publishing
        R&N(R�R{(R%R�R&((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyR��sc
C@s�idd6}tjj|jtjjjddj�}|j|�|d<|jdr�t	j
j|jdd�}tj
d�tjj||d�|d	<n|jjd
d�dkr�t|jjd
d��}nt	j
j|jdd�}tjjjtjjj|f�}|j�i|jj|�d6}|ddkr�t|dtj�r�|jj|dd|d�}|d}	tj
d|	�|	|d<q�|d|d<n|j|�dS(u+
        Publish "load" to minions
        uaesuencusecretuloadusign_pub_messagesupki_diru
master.pemuSigning data packetusiguipc_modeuutcputcp_master_publish_pulli�usock_dirupublish_pull.ipcupayloadutgt_typeulistutgtttgt_typeuminionsuPublish Side Match: %su	topic_lstN(RbRfR�RRPR\R]R^R~RqRrRRPRQtsign_messageR
RR�R�R�R�RstIPCMessageClientR�ReR�Rtstring_typesRjt
check_minionsR|(
R%RwRcR}tmaster_pem_pathRytpub_socktint_payloadt_rest	match_ids((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pytpublish�s0
,

 



N(
RERFR8R!R,R-R{R#R�R�(((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyRg�s				4(bRGt
__future__RRRR?tloggingRRqRMR�RWR�t
salt.cryptRbtsalt.utils.asynchronoustsalt.utils.eventtsalt.utils.filestsalt.utils.platformtsalt.utils.processtsalt.utils.verifytsalt.payloadtsalt.exceptionstsalt.transport.frametsalt.transport.ipctsalt.transport.clienttsalt.transport.servertsalt.transport.mixins.authtsalt.extRtsalt.ext.six.movesRRRtsalt.transportRR<ttornado.tcpserverttornado.genttornado.concurrentttornado.tcpclientttornado.netutilttornado.iostreamtPY2Riturllib.parseRqR�tM2CryptoRR)R�tImportErrorRtCryptodome.CipherR	t
Crypto.CipherR�R�R�R�R�R�ttornado.utilR
t	getLoggerRERPRRR�Rt
ReqChannelRHR�RhtAESPubClientMixintAsyncPubChannelR�R�R�R�R�t	tcpservert	TCPServerRRR�R�t	tcpclientt	TCPClientRtMessageClientPoolRnRRNROtPubServerChannelRg(((s6/usr/lib/python2.7/site-packages/salt/transport/tcp.pyt<module>s�	


		7N�.�.�A%(�+�

Zerion Mini Shell 1.0