
    /I_f                         S SK r S SKrS SKrS SKr S SKJr   " S S\5      r	 " S S\
5      rg! \\4 a	    S SKJr   N'f = f)    N)
BaseObjectc                   8    \ rS rSrS rS rS rS rS rS r	Sr
g	)
IO$   c                 0    [         R                  " U 5        g )N)r   __init__)selfs    /usr/share/ifupdown2/lib/io.pyr   IO.__init__%   s    D!    c           	      @    U R                   R                  SU< SU< 35        [        US5       nUR                  U5        S S S 5        g! , (       d  f       g= f! [         a6  nU R                   R                  SU< S[        U5      < 35         S nAgS nAff = f)N	writing "
" to file wTzerror while writing to file z: F)loggerinfoopenwriteIOErrorwarningstr)r	   pathstringfes        r
   write_to_fileIO.write_to_file(   su    	KKFDIJdCA ! ! 	KKcRSf UV	s4   /A AA 
AA A 
B',BBc                 6    U R                  SU< SU< 35        g)Nr   r   Tlog_info_dry_run)r	   r   r   s      r
   write_to_file_dry_runIO.write_to_file_dry_run2   s    VTJKr   c                      U R                   R                  SU-  5        [        US5       nUR                  5       R	                  S5      sS S S 5        $ ! , (       d  f       g = f! [
         a     g f = f)Nreading '%s'r
)r   r   r   readlinestrip	Exceptionr	   r   r   s      r
   read_file_onelineIO.read_file_oneline6   sX    	KK^d23dCAzz|))$/ ! 		s.   *A& A	A& 
A#A& #A& &
A32A3c                 ,    U R                  SU-  5        g )Nzreading "%s"r   )r	   r   s     r
   read_file_oneline_dry_runIO.read_file_oneline_dry_run>   s    .56r   c                      U R                   R                  SU-  5        [        US5       nUR                  5       sSSS5        $ ! , (       d  f       g= f! [         a     gf = f)z)read file and return lines from the file r$   r%   N)r   r   r   	readlinesr)   r*   s      r
   	read_fileIO.read_fileB   sM    	KK^d23dCA{{} ! 		s-   *A A	A 
AA A 
A$#A$ N)__name__
__module____qualname____firstlineno__r   r   r!   r+   r.   r2   __static_attributes__r4   r   r
   r   r   $   s     "r   r   c                   >    \ rS rSrSr\S 5       r\S 5       rS rSr	g)SocketIOL   zb
Helper class to provide common TX/RX methods for socket
communication to both client and daemon.
c                 $   [         R                   " / U // 5      nU(       ap  US   (       ae  US   S   U :X  aX  S[        U5      -  n[        R                  " X15      n[        R                  " S[        U5      5      nU R	                  XT-   5        gggg)z
We don't send raw data over the socket, we pack it with the length
(first 4 bytes) then with the data. That way the the transfer is more
reliable
   r   z=%ds=IN)selectlenstructpacksendall)_socketdatareadyfrmt
packed_msg
packed_hdrs         r
   tx_dataSocketIO.tx_dataR   sx     b7)R0U1X%(1+"8CI%DT0JT3z?;JOOJ34	 #9X5r   c                    [         R                   " U // / 5      nU(       a  US   (       a  US   S   U :X  a  U R                  S5      nU(       d  [        S5      e[        U5      S:  a  [        S5      e[        R
                  " SU5      S   nU R                  U5      n[        U5      U:  a0  X@R                  U[        U5      -
  5      -   n[        U5      U:  a  M0  [        R                  " U5      $ g)z
Reading data from socket. Unpacking the packets sent by "tx_data"
first 4 bytes are the length of the following data. The data should
be in json format
r      zrx_json_packet: socket closedz%rx_json_packet: invalid data receivedr?   N)r@   recvr)   rA   rB   unpackjsonloads)rE   rG   header_datadata_lenrF   s        r
   rx_json_packetSocketIO.rx_json_packet`   s     wiR0U1X%(1+"8!,,q/K ?@@;!# GHH}}T;7:H<<)Dd)h&ll8c$i+?@@ d)h& ::d##r   c           
          [         R                  " SUR                  [        R                  U R
                  [         R                  " S5      5      5      $ )z^
Returns tuple of (pid, uid, gid) of connected AF_UNIX stream socket
:param _socket:
:return:
3i)rB   rP   
getsockoptsocket
SOL_SOCKETSO_PEERCREDcalcsize)r	   rE   s     r
   get_socket_peer_credSocketIO.get_socket_peer_cred|   s=     }}T7#5#5f6G6GIYIY[a[j[jko[p#qrrr   r4   N)
r5   r6   r7   r8   __doc__staticmethodrK   rU   r^   r9   r4   r   r
   r;   r;   L   s5    
 5 5  6sr   r;   )rQ   rB   rZ   r@   ifupdown2.lib.base_objectsr   ImportErrorModuleNotFoundErrorlib.base_objectsr   objectr;   r4   r   r
   <module>rg      sQ   2    ,5
% %P6sv 6sY 	() ,+,s   / A A 