
    /I_                     l   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	r	S SK
r
 S SKJr  S SKJr  S SKJrJr  S SKJrJr  S SKJr   " S S\R<                  5      r " S	 S
\R@                  5      r! " S S\5      r"g! \\4 a%    S SKJr  S SKJr  S SKJrJr  S SKJrJr  S SKJr   Nbf = f)    N)SocketIO)Status)
LogManagerroot_logger)ExitWithStatusExitWithStatusAndError)Parsec                       \ rS rSrSrS rSrg)LogRecordStreamHandler8   z~
Handler for a streaming logging request.
This basically logs the record using whatever logging policy is configured
locally.
c                     U R                   R                  S5      n[        U5      S:  a  g[        R                  " SU5      S   nU R                   R                  U5      n[        U5      U:  a:  XR                   R                  U[        U5      -
  5      -   n[        U5      U:  a  M:  [
        R                  " [        R                  " U5      5      n[
        R                  " UR                  5      R                  U5        GM  )zm
Handle multiple requests - each expected to be a 4-byte length,
followed by the LogRecord in pickle format.
   z>Lr   N)
connectionrecvlenstructunpackloggingmakeLogRecordpickleloads	getLoggernamehandle)selfchunkslenrecords       '/usr/share/ifupdown2/ifupdown/client.pyr   LogRecordStreamHandler.handle?   s    
 OO((+E5zA~==u-a0DOO((.Ee*t# 4 4TCJ5F GG e*t# **6<<+>?Ffkk*11&9      N)__name__
__module____qualname____firstlineno____doc__r   __static_attributes__r"   r!   r   r   r   8   s    :r!   r   c                   @    \ rS rSrSrSrS\\R                  4S jr	Sr
g)LogRecordSocketReceiverR   a  
Simple TCP socket-based logging receiver. In ifupdown2d context, the running
daemon is the "sender" and the client is the "receiver". The TCPServer is
setup on the client/receiver side, the daemon will connect to the server to
transmit and stream LogRecord to a socket.
T	localhostc                 H    [         R                  R                  XU4U5        g N)socketserver	TCPServer__init__)r   hosthandlerports       r   r1    LogRecordSocketReceiver.__init__[   s     	''TlGDr!   r"   N)r#   r$   r%   r&   r'   allow_reuse_addressr   r   DEFAULT_TCP_LOGGING_PORTr1   r(   r"   r!   r   r*   r*   R   s&      *44	Er!   r*   c                   2    \ rS rSrS rS rS rS rS rSr	g)	Clientd   c                    [         R                  " U 5        [        5       U l        S U l        Xl        [        U5      nUR                  5         UR                  5       U l	        [        R                  " 5       R                  U R                  5        [        R                  " S5        [        R                  " [        R                   [        R"                  5      U l         U R$                  R'                  S5        [:        R:                  " [:        R<                  U R>                  5        [:        R:                  " [:        R@                  U R>                  5        [:        R:                  " [:        RB                  U R>                  5         [        RD                  U l"         U R$                  RS                  [        RT                  U RP                  S5        U R[                  U R$                  5      u  U l.          nU R\                  S:  a2  U R+                  5         [_        [4        R6                  R`                  SS9e[        R                  " SU R\                  -  5        g ! [        R(                   aW    U R+                  5         [,        R.                  R1                  SUS   -  5        [3        [4        R6                  R8                  S9ef = f! [F         aW    [H        RJ                  " 5       S   n[L        RN                  " SU5      (       a  SU l(        S	U l"         GN}S
U l(        SU l"         GNf = f! [V         a,  nU R+                  5         [W        S[Y        U5      -  5      eS nAff = f)Nzstarting ifupdown2 client...z/var/run/ifupdown2d/udsz
    ERROR: %s could not connect to ifupdown2 daemon

    Try starting ifupdown2 daemon with:
    sudo systemctl start ifupdown2

    To configure ifupdown2d to start when the box boots:
    sudo systemctl enable ifupdown2

r   )statusr   z^(ppc|powerpc)               zsetsockopt: %sz"could not get ifupdown2 daemon PID)r<   messagez3connection to ifupdown2d successful (server pid %s))1r   r1   r*   socket_receiverstdinargvr	   validateget_argsargsr   get_instancestart_client_loggingr   infosocketAF_UNIXSOCK_STREAMudsconnecterror_Client__shutdownsysstderrwriter   r   r9   STATUS_COULD_NOT_CONNECTsignalSIGINT_Client__signal_handlerSIGTERMSIGQUITSO_PEERCREDAttributeErrorosunameresearchSO_PASSCRED
setsockopt
SOL_SOCKET	Exceptionstrget_socket_peer_cred
daemon_pidr   STATUS_NO_PID)r   rE   
args_parsemachinee_s         r   r1   Client.__init__e   s   $
  78
	 4[
 '')	!66tyyA78==1C1CD	PHH67 	fmmT%:%:;fnnd&;&;<fnnd&;&;<	&%11D	7HH 1 143C3CQG
 !% 9 9$(( CA??QOO(}}22< 
 	NQUQ`Q``aW || 
	POOJJ + .2!W5 6 !(N(NOO
	P$  		& hhjmGyy*G44#% #% #% #% 		&  	7OO,s1v566	7s>    I 	K 5L0 A+K	AL-L-,L-0
M&:'M!!M&c                      U R                   R                  5         S U l          U R                  R	                  5         S U l        g ! [         a     N/f = f! [         a     g f = fr.   )rO   closere   rC   server_closer   s    r   
__shutdownClient.__shutdown   sb    	HHNNDH	  --/#'D 	  		
  		s"   !A !A 
AA
A#"A#c                 h    U R                   S:  a"  [        R                  " U R                   U5        gg)zForward all signals to daemon r   N)rh   r^   kill)r   sigframes      r   __signal_handlerClient.__signal_handler   s%    ??QGGDOOS) r!   c                     [        U R                  S5      (       a9  U R                  R                  S:X  a  [        R                  R                  5       $ gg)zK
If stdin data is provided we need to store it to forward it to the
daemon
interfacesfile-N)hasattrrH   r|   rS   rD   readrr   s    r   __get_stdinClient.__get_stdin   sB    
 499.//DII4L4LPS4S99>>## 5T/r!   c                     U R                  U R                  [        R                  " U R                  U R                  5       S.5      5        U R                  R                  5         U R                  R                  5         U R                  U R                  5      nU(       a  [        R                  R                  UR                  SS5      5        [        R                  R                  UR                  SS5      5        UR                  S[        R                   R"                  5      nO[        R                   R"                  nUU R%                  5         $ ! U R%                  5         f = f)N)rE   rD   stdout rT   r<   )tx_datarO   jsondumpsrE   _Client__get_stdinrC   handle_requestrq   rx_json_packetrS   r   rU   getrT   r   r9   STATUS_EMPTYrR   )r   responser<   s      r   run
Client.run   s    	LL4::		))+/ $    //1  --/
 **4884H

  h!;<

  h!;<!h0J0JK33OODOOs   EE E*)rb   r\   rH   rE   rh   rC   rD   rO   N)
r#   r$   r%   r&   r1   rR   rY   r   r   r(   r"   r!   r   r9   r9   d   s    Lb\
*
$r!   r9   )#r   r   r/   r   logging.handlersr^   r`   rS   r   rL   rW   ifupdown2.lib.ior   ifupdown2.lib.statusr   ifupdown2.lib.logr   r   ifupdown2.lib.exceptionsr   r   ifupdown2.ifupdown.argvr	   ImportErrorModuleNotFoundError
lib.statuslib.iolib.loglib.exceptionsifupdown.argvStreamRequestHandlerr   r0   r*   r9   r"   r!   r   <module>r      s   2      	 	 
   $)+9O-:\>> :4El44 E$DX Dk 	() $!/E#$s   "B *B32B3