
    =Ki+\                     V   S SK r S SKJrJr  S SKrS SKrS SKrS SKrS SKrS SK	r	S SK
r
S SKrS SKrS SKJrJrJr  S SKJrJr  S SKJrJrJrJr  S SKJr  S SKJr  S rSrS	rS
rSr  " S S5      r! " S S5      r"\RF                  " SS/5      r$ " S S5      r%SS jr&SS jr'S r(S r)S r*g)    N)ApiExceptionApiValueError)	urlencodeurlparse
urlunparse)StringIOBytesIO)	WebSocketABNFenableTrace"WebSocketConnectionClosedException)urlsafe_b64decode)should_bypass_proxies            c                        \ rS rSrS rS rSrg)
_IgnoredIO+   c                     g N )self_xs     ]/var/www/html/dynamic-report/venv/lib/python3.13/site-packages/kubernetes/stream/ws_client.pywrite_IgnoredIO.write,   s        c                     [        S5      e)Nz_Tried to read_all() from a WSClient configured to not capture. Did you mean `capture_all=True`?)	TypeErrorr   s    r   getvalue_IgnoredIO.getvalue/   s    yzzr   r   N)__name__
__module____qualname____firstlineno__r   r#   __static_attributes__r   r   r   r   r   +   s    {r   r   c                       \ rS rSrSS jrSS jrSS jrSS jrS rSS jr	SS	 jr
SS
 jrSS jrSS jrSS jrS rS rS rSS jrSS jr\S 5       rS rSrg)WSClient3   c                     SU l         0 U l        XPl        U R                  (       d  SOSU l        U(       a+  U R                  (       d
  [	        5       O	[        5       U l        O[        5       U l        [        XU5      U l	        SU l         SU l
        g)a
  A websocket client with support for channels.

    Exec command uses different channels for different streams. for
example, 0 is stdin, 1 is stdout and 2 is stderr. Some other API calls
like port forwarding can forward different pods' streams to different
channels.
F
   
TN)
_connected	_channelsbinarynewliner   r	   _allr   create_websocketsock_returncode)r   configurationurlheaderscapture_allr2   s         r   __init__WSClient.__init__4   sb      #';;tE*.++
79DI"DI$]A	r   c                 ^    U R                  US9  XR                  ;   a  U R                  U   $ g)zDPeek a channel and return part of the input,
empty string otherwise.timeout )updater1   )r   channelr@   s      r   peek_channelWSClient.peek_channelH   s.     	G$nn$>>'**r   c                     XR                   ;  a  U R                  X5      nOU R                   U   nXR                   ;   a  U R                   U	 U$ )zRead data from a channel.)r1   rD   )r   rC   r@   rets       r   read_channelWSClient.read_channelP   sE    ..(##G5C..)Cnn$w'
r   Nc                 ^   Uc  [        S5      n[        R                  " 5       nU R                  5       (       a  [        R                  " 5       U-
  U:  a  XR                  ;   al  U R                  U   nU R                  U;   aM  UR                  U R                  5      nUSU nXES-   S nU(       a  X@R                  U'   U$ U R                  U	 U$ U R                  U[        R                  " 5       -
  U-   S9  U R                  5       (       a  [        R                  " 5       U-
  U:  a  M  gggg)zRead a line from a channel.Ninfr   r?   )floattimeis_openr1   r3   findrB   )r   rC   r@   startdataindexrG   s          r   readline_channelWSClient.readline_channelZ   s    ?ElG		llnnu!4w!>..(~~g.<<4' IIdll3Ev,Ca>D26w/ J !NN73JKK499;!6!>K@ llnnu!4w!>n!>nr   c                 D   [         R                  =(       a    [        U5      [         R                  :H  nU(       a  [        R
                  O[        R                  n[        U5      nU(       a  [         R                  " US5      nXR-   nU R                  R                  XdS9  g)zWrite data to a channel.ascii)opcodeN)
sixPY3typebinary_typer   OPCODE_BINARYOPCODE_TEXTchrr6   send)r   rC   rQ   r2   rW   channel_prefixpayloads          r   write_channelWSClient.write_channelm   sj     :T$Z3??:'-##43C3CW __^WEN '		w.r   c                 *    U R                  [        US9$ )z$Same as peek_channel with channel=1.r?   )rD   STDOUT_CHANNELr   r@   s     r   peek_stdoutWSClient.peek_stdoutz          AAr   c                 *    U R                  [        US9$ )z$Same as read_channel with channel=1.r?   )rH   re   rf   s     r   read_stdoutWSClient.read_stdout~   ri   r   c                 *    U R                  [        US9$ )z(Same as readline_channel with channel=1.r?   )rS   re   rf   s     r   readline_stdoutWSClient.readline_stdout       $$^W$EEr   c                 *    U R                  [        US9$ )z$Same as peek_channel with channel=2.r?   )rD   STDERR_CHANNELrf   s     r   peek_stderrWSClient.peek_stderr   ri   r   c                 *    U R                  [        US9$ )z$Same as read_channel with channel=2.r?   )rH   rr   rf   s     r   read_stderrWSClient.read_stderr   ri   r   c                 *    U R                  [        US9$ )z(Same as readline_channel with channel=2.r?   )rS   rr   rf   s     r   readline_stderrWSClient.readline_stderr   rp   r   c                     U R                   R                  5       nU R                   R                  5       U l         0 U l        U$ )ac  Return buffered data received on stdout and stderr channels.
This is useful for non-interactive call where a set of command passed
to the API call and their result is needed after the call is concluded.
Should be called after run_forever() or update()

TODO: Maybe we can process this and return a more meaningful map with
channels mapped for each input.
)r4   r#   	__class__r1   )r   outs     r   read_allWSClient.read_all   s6     ii  "II'')	
r   c                     U R                   $ )z&True if the connection is still alive.)r0   r"   s    r   rN   WSClient.is_open   s    r   c                 0    U R                  [        U5        g)z)The same as write_channel with channel=0.N)rb   STDIN_CHANNEL)r   rQ   s     r   write_stdinWSClient.write_stdin   s    =$/r   c                    U R                  5       (       d  gU R                  R                  (       d  SU l        g[	        [
        S5      (       a  [
        R                  " 5       nUR                  U R                  R                  [
        R                  5        Ub  US-  nUR                  U5      nUR                  U R                  R                  5        O2[
        R
                  " U R                  R                  4SSU5      u  n  nU(       GaZ  U R                  R                  S5      u  pVU[        R                  :X  a  SU l        gU[        R                  :X  d  U[        R                  :X  a  UR                  n[         R"                  (       a#  U R$                  (       d  UR'                  SS5      n[)        U5      S	:  a  US
   n[         R"                  (       a  U R$                  (       d  [+        U5      nUS	S nU(       aa  U[,        [.        4;   a  U R0                  R3                  U5        XR4                  ;  a  XpR4                  U'   gU R4                  U==   U-  ss'   ggggg)z@Update channel buffers with at most one complete frame of input.NFpolli  r   Tzutf-8replacer   r   )rN   r6   	connectedr0   hasattrselectr   registerPOLLIN
unregisterrecv_data_framer   OPCODE_CLOSEr\   r]   rQ   rX   rY   r2   decodelenordre   rr   r4   r   r1   )	r   r@   r   r_op_codeframerQ   rC   s	            r   rB   WSClient.update   s   ||~~yy""#DO 66"";;=DMM$))..&--8"5 		'"AOODIINN+mm"BG5GAq! !YY66t<NG$+++"'D...'T=M=M2Mzz774;;;;w	:Dt9q="1gGwwt{{"%g,8D"~~&FF !IIOOD1"..86:NN73 NN73t;3  !	 3N r   c                    U(       a  [         R                   " 5       nU R                  5       (       az  [         R                   " 5       U-
  U:  a]  U R                  U[         R                   " 5       -
  U-   S9  U R                  5       (       a  [         R                   " 5       U-
  U:  a  M[  ggggU R                  5       (       a'  U R                  SS9  U R                  5       (       a  M&  gg)z^Wait till connection is closed or timeout reached. Buffer any input
received during this time.r?   N)rM   rN   rB   )r   r@   rP   s      r   run_foreverWSClient.run_forever   s     IIKE,,..TYY[5%87%BWtyy{%:U%BD ,,..TYY[5%87%B.%B. ,,..D) ,,..r   c                 &   U R                  5       (       a  gU R                  cc  U R                  [        5      n[        R
                  " U5      nUS   S:X  a  SU l        U R                  $ [        US   S   S   S   5      U l        U R                  $ )zQ
The return code, A None value indicates that the process hasn't
terminated yet.
NstatusSuccessr   detailscausesmessage)rN   r7   rH   ERROR_CHANNELyaml	safe_loadint)r   errs     r   
returncodeWSClient.returncode   s     <<>>'''6nnS)x=I-'(D$ ### (+3y>(+CA+Fy+Q'RD$###r   c                 n    SU l         U R                  (       a  U R                  R                  " S0 UD6  gg)z
close websocket connection.
FNr   )r0   r6   close)r   kwargss     r   r   WSClient.close   s*      99IIOO%f% r   )r4   r1   r0   r7   r2   r3   r6   )F)r   r   )r%   r&   r'   r(   r<   rD   rH   rS   rb   rg   rk   rn   rs   rv   ry   r~   rN   r   rB   r   propertyr   r   r)   r   r   r   r+   r+   3   ss     (A&/BBFBBF02<h	* $ $"&r   r+   
WSResponserQ   c                   V    \ rS rSrS r\S 5       rS rS rS r	 " S S5      r
S	 rS
rg)PortForwardi  c                 P   Xl         0 U l        [        U5       H#  u  p4U R                  X45      U R                  U'   M%     [        R
                  " SSR                  U Vs/ s H  n[        U5      PM     sn5      -  U R                  S9nSUl	        UR                  5         gs  snf )a  A websocket client with support for port forwarding.

Port Forward command sends on 2 channels per port, a read/write
data channel and a read only error channel. Both channels are sent an
initial frame containing the port number that channel is associated with.
z!Kubernetes port forward proxy: %sz, )nametargetTN)	websocketlocal_ports	enumerate_Port	threadingThreadjoinstr_proxydaemonrP   )r   r   portsixport_numberportproxys          r   r<   PortForward.__init__  s     #(/OB,0JJr,GD[)  0
   4tyyX]A^X]PT#d)X]A^7__;;
 	 B_s    B#c                 .    U R                   R                  $ r   )r   r   r"   s    r   r   PortForward.connected  s    ~~'''r   c                 h    XR                   ;  a  [        S5      eU R                   U   R                  $ NzInvalid port number)r   
ValueErrorsocketr   r   s     r   r   PortForward.socket  s1    ...233,333r   c                 h    XR                   ;  a  [        S5      eU R                   U   R                  $ r   )r   r   errorr   s     r   r   PortForward.error$  s1    ...233,222r   c                 z    U R                   R                  5        H  nUR                  R                  5         M     g r   )r   valuesr   r   )r   r   s     r   r   PortForward.close)  s+    $$++-DKK .r   c                   .    \ rS rSrS r " S S5      rSrg)PortForward._Porti-  c                     X l         [        R                  " US-  5      U l        [        R
                  " 5       u  o0l        U R                  U5      U l        SU l        S U l	        g )Nr   r   )
r   rX   int2byterC   r   
socketpairpython_SocketrQ   r   )r   r   r   ss       r   r<   PortForward._Port.__init__.  sO    *<<Q/DL
 $..0NA{ ,,q/DKDIDJr   c                   &    \ rS rSrS rS rS rSrg)PortForward._Port._SocketiC  c                     Xl         g r   _socket)r   r   s     r   r<   "PortForward._Port._Socket.__init__D  s    %r   c                 .    [        U R                  U5      $ r   )getattrr   )r   r   s     r   __getattr__%PortForward._Port._Socket.__getattr__G  s    t||T22r   c                     U[         R                  :X  a  U[         R                  :X  a  g U R                  R	                  XU5        g r   )r   IPPROTO_TCPTCP_NODELAYr   
setsockopt)r   leveloptnamevalues       r   r   $PortForward._Port._Socket.setsockoptJ  s6     F...7f>P>P3P''>r   r   N)r%   r&   r'   r(   r<   r   r   r)   r   r   r   r   r   C  s    &3?r   r   )rC   rQ   r   r   r   r   N)r%   r&   r'   r(   r<   r   r)   r   r   r   r   r   -  s    	*	? 	?r   r   c                    / n/ n0 nU R                   R                  5        Hp  nUR                  U5        UR                  S5        UR                  U5        UR                  S5        UR                  R	                  S5        XCUR                  '   Mr     Sn / n/ nU R
                  R                  (       a=  UR                  U R
                  5        U(       a  UR                  U R
                  5        SnU R                   R                  5        H  nUR                  R                  5       S:w  d  M#  U R
                  R                  (       aK  UR                  UR                  5        UR                  (       a  UR                  UR                  5        SnM  UR                  (       a  UR                  UR                  5        SnM  UR                  R                  5         M     U(       a=  U R
                  R                  (       a  U(       d  U R
                  R                  5         g [        R                  " Xg/ 5      u  pnU	 GH-  nXR
                  :X  Gar  SnU(       Gae   U R
                  R                  S5      u  pU[        R                  :X  Ga  UR                  (       d  [        S5      e[         R"                  " UR                  5      nU[%        U5      :  a  [        SU-  5      eUU   nUU   (       a  US-  (       a_  UR&                  c  SUl        U=R&                  UR                  S	S  R)                  5       -  sl        UR                  R                  5         OU=R                  UR                  S	S  -  sl        O[%        UR                  5      S
:w  a  [        S5      e[         R"                  " UR                  S	S 5      [         R"                  " UR                  SS
 5      S-  -   nUUR*                  :w  a  [        SU-  5      eSUU'   OAU[        R,                  [        R.                  [        R0                  4;  a  [        SU-  5      e[3        U R
                  R4                  [6        R8                  5      (       a)  U R
                  R4                  R;                  5       (       d  SnU(       a  GMb  GM  GM  X<   nUR                  R                  5       S:w  d  GM  UR                  R=                  S5      nU(       aF  U[        R>                  " UR@                  U-   [        R                  5      RC                  5       -  nGM  UR                  R                  5         GM0     U
 H  nXR
                  :X  a,  U R
                  R4                  RE                  U5      nUUS  nM>  X<   nUR                  R                  5       S:w  d  Mb  UR                  RE                  UR                  5      nUR                  US  Ul        M     GM  ! [         a?    U R                   R                  5        H  nUR                  R                  5         M        g f = f)NFTr   zUnexpected frame data sizezUnexpected channel number: %sr   rA   r   r   z*Unexpected initial channel frame data size   z3Unexpected port number in initial channel frame: %szUnexpected websocket opcode: %si   )#r   r   appendr   setblockingr   r   filenorQ   r   r   r   r   r   r\   RuntimeErrorrX   byte2intr   r   r   r   OPCODE_PINGOPCODE_PONGr   
isinstancer6   ssl	SSLSocketpendingrecvcreate_framerC   formatr_   )r   channel_portschannel_initializedr   r   kubernetes_datarlistwlistlocal_all_closedr   wr   r6   r   rW   r   rC   r   rQ   sents                       r   r   PortForward._proxyR  s    $$++-D  &&&u-  &&&u-KK##D)'+$ . EE~~''T^^,"LL0#((//1;;%%'2-~~//T[[199!LL5+0(99!LL5/4, KK--/ 2  )A)Ao$$&mmE"5GA!>>)"G!#,0NN,J,J4,PMF
 "T%7%77#(::&23O&P P&)ll5::&>G&#m*<<&23RU\3\&] ]#0#9D27;#*Q;'+zz'957
$(JJ%**QR.2G2G2I$IJ$(KK$5$5$7$(IIAB$?I#&uzz?a#7*6(T+& %& /2ll5::a?.Ks||\a\f\fghij\kOlorOr.s#.$2B2B#B*6(]`k(k+& %& @D 3G <#D,<,<d>N>NPTPaPa+bb"./PSY/Y"ZZ *4>>+>+> N NSWSaSaSfSfSnSnSpSp&+GI "'L ',D{{))+r1#{{//<+t/@/@ $t 3 $ 2 20 %fh'O
 !KK--/e f >>)>>..33ODD&5de&<O&,D{{))+r1#{{//		:$(IIde$4	 Y >  B #(,(8(8(?(?(A $ 1 1 3 )B"#s   &XAY&%Y&)r   r   N)r%   r&   r'   r(   r<   r   r   r   r   r   r   r   r)   r   r   r   r   r     s;    , ( (4
3
 "? "?Jc5r   r   c                    [        U 5      n[        U5      nUR                  S:X  a  SUS'   OUR                  S:X  a  SUS'   U(       al  / nU HO  u  pVUS:X  a2  [        U[        5      (       a  U H  nUR	                  XW45        M     M=  UR	                  XV45        MQ     U(       a  [        U5      US'   [        U5      $ )Nhttpwsr   httpswsscommandr   )r   listschemer   r   r   r   )r9   query_params
parsed_urlpartsquerykeyr   r  s           r   get_websocket_urlr    s    #JEF"a			g	%a&JCiJud$;$;$GLL#0  % c\* '  'E!Her   c                 P   [        S5        / nU(       a  SU;   a  UR                  SUS   -  5        U(       a  SU;   a  UR                  SUS   -  5        OUR                  S5        UR                  S5      (       ag  U R                  (       aV  [        R
                  U R                  =(       d    [        R                  " 5       S.nU R                  b  U R                  US	'   OS
[        R                  0nU R                  (       a  U R                  US'   U R                  (       a  U R                  US'   U R                  (       a  U R                  US'   [        USS9nSU0nU R                  (       d  U R                   (       a  [#        X`X5      nUR$                  " U40 UD6  U$ )NFauthorizationzauthorization: %szsec-websocket-protocolzsec-websocket-protocol: %sz)sec-websocket-protocol: v4.channel.k8s.iozwss://)	cert_reqsca_certscheck_hostnamer  certfilekeyfileserver_hostname)ssloptskip_utf8_validationheader)r   r   
startswith
verify_sslr   CERT_REQUIREDssl_ca_certcertifiwhereassert_hostname	CERT_NONE	cert_filekey_filetls_server_namer
   r   proxy_headerswebsocket_proxycareconnect)r8   r9   r:   r  ssl_optsr   connect_opts          r   r5   r5     sn    F?g-MM-0HHI+w62678 	9 	AB
~~hM$<$<**%11DW]]_
 ((4)6)F)FH%&/,66+44$$&3&C&C"#FI	6K m99)+cSc)[)r   c                 p   UR                   (       a,  U R                  SUR                   R                  S5      05        UR                  (       a=  [	        UR                  5      nU R                  UR
                  UR                  S.5        UR                  (       a  UR                  R                  5        H{  u  pVUS:X  d  M  UR                  S5      (       d  M%  UR                  5       S   n[        U5      R                  5       R                  S5      nU R                  SUS	   US   405        M}     U $ )
zVAn internal function to be called in api-client when a websocket
create is requested.
http_no_proxy,)http_proxy_hosthttp_proxy_portzproxy-authorizationBasicr   :http_proxy_authr   )no_proxyrB   splitr   r   hostnamer   r+  itemsr   r   r   )	r/  r8   r9   r:   	proxy_urlr  r   b64valueauths	            r   r,  r,    s     _m.D.D.J.J3.OQR]001	y/A/AV_VdVdef""&44::<IC++0@0@0I0I ;;=+(299;AA#F""$5Qa7I#KL	 =
 r   c                    [        X#R                  S5      5      nUR                  S5      nUR                  SS5      nUR                  SS5      nUR                  SS5      nUR                  SS	5      n [        XXGUS
9n	U(       d  U	$ U	R                  US9  U	R	                  5       n
U(       a  [        U
5      $ [        SSR                  U
5      -  5      $ ! [        [        [        4 a  n[        S[        U5      S9eSnAff = f)zAn internal function to be called in api-client when a websocket
connection is required. method, url, and kwargs are the parameters of
apiClient.request method.r  r:   _request_timeout<   _preload_contentTr;   r2   F)r2   r?   z%srA   r   r   reasonN)r  getr+   r   r~   r   r   	ExceptionKeyboardInterrupt
SystemExitr   r   )r8   _methodr9   r   r:   r@  rB  r;   r2   clientalles               r   websocket_callrM  	  s    
 CN!;
<Cjj#Gzz"4b9zz"4d;**]D1KZZ%(F4-g6RM#34ooc?"dRWWS\122(*5 4!CF334s$   5C 	0C :C D,C??Dc                 <   UR                  S5      n/ nU Hr  u  pgUS:X  d  M  UR                  S5       HP  n [        U5      n	SU	s=:  a  S:  d  O  [	        SU-  5      eX;   a  [	        SU-  5      eUR                  U	5        MR     Mt     U(       d  [	        S	5      e[        X$5      nUR                  S
5      n
 [        XU
5      n[        X5      $ ! [         a    [	        SU-  5      ef = f! [        [        [        4 a  n[        S[        U5      S9eSnAff = f)zAn internal function to be called in api-client when a websocket
connection is required for port forwarding. args and kwargs are the
parameters of apiClient.request method.r  r   r2  zInvalid port number: %sr   i   z+Port number must be between 0 and 65536: %szDuplicate port numbers: %sz"Missing required parameter `ports`r:   rC  N)rE  r9  r   r   r   r   r  r5   r   rF  rG  rH  r   r   )r8   rI  r9   r   r  r   paramr   r   r   r:   r   rL  s                r   portforward_callrP  "  s$   
 ::n-LE$GC(J"%d)K K/%/'(UX\(\]]''(Dt(KLL[) ) % @AA
C
.Cjj#G4$]A	9,, " J'(AD(HIIJ  (*5 4!CF334s#   C;C. C+.DDDr   )+syskubernetes.client.restr   r   r$  collectionsr   r   r   r   rM   rX   r   six.moves.urllib.parser   r   r   r   r	   r   r
   r   r   r   base64r   requests.utilsr   r   re   rr   r   RESIZE_CHANNELr   r+   
namedtupler   r   r  r5   r,  rM  rP  r   r   r   <module>rY     s     >     
   
  C B ! V V $ 0{ {K& K&\ ##L6(;
q5 q5h((T&424r   