
    g1              	          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Zd dlm	Z	 ddl
mZ d dlmZmZ dZdZdZd	Zd
dddd ddddZeeefZd Zd Zd ZdedefdZd Zd ZdedefdZdeddfdZd7dZ d7ded ed!e!fd"Z"d# Z#d$ Z$d% Z%d& Z&d' Z'd( Z(d) Z)d* Z*d7d+Z+dede	e   fd,Z,dede	e   fd-Z-dee   fd.Z.dede	e   fd/Z/d0efd1Z0d2ede!fd3Z1de2fd4Z3 G d5 d6ejh                        Z5y)8    N)Optional   )ConfigurationError)NetDefinitionNetplanExceptionzNetworkManager.servicez+snap.network-manager.networkmanager.servicez/etc/iproute2/rt_tablesz/usr/share/iproute2/rt_tablesunspecdefaultmainlocal         )r   r   r   r   r   r	   r
   r   c                  B    t         j                  j                  dd      S )NNETPLAN_GENERATE_PATHz/usr/libexec/netplan/generate)osenvironget     +/usr/share/netplan/netplan_cli/cli/utils.pyget_generator_pathr   +   s    ::>>13RSSr   c                  b    t        j                  dddt        gt         j                        dk(  S )N	systemctl--quiet
is-enabled)stderrr   )
subprocesscallNM_SNAP_SERVICE_NAMEDEVNULLr   r   r   is_nm_snap_enabledr!   /   s*    ??KLBVW`j`r`rswxxxr   c                 t    t        j                  dg| z   t         j                  t         j                         y )Nnmclistdoutr   r   
check_callr    argss    r   r#   r#   3   s)     7)d*:3E3EjN`N`ar   r)   returnc                 8    t        j                  dg| z   d      S )Nr#   Ttext)r   check_outputr(   s    r   	nmcli_outr/   9   s     ""G9t#3$??r   c                  \    	 t        dg       y# t        t        j                  f$ r Y yw xY w)z"Check if NetworkManager is runninggeneralTF)r#   OSErrorr   SubprocessErrorr   r   r   
nm_runningr4   ?   s1    ykZ//0 s    ++c                 F   t        j                  d      }t               }| D ]p  }t        |d      5 }|D ]T  }|j	                  |      }|s|j                  t        t        j                  ||j                  d                          n d d d        r |S # 1 sw Y   ~xY w)Nz^interface-name=(.*)$r   )	recompilesetopenmatchupdatefnmatchfiltergroup)pathsdevicespat
interfacespathflinems           r   nm_interfacesrI   I   s    
**,
-CJ $_ 	 IIdO%%c'..!''!**M&NO	 	 	 	s   BA BB 		interfacec           	          t        dddddd| g      }|j                         j                  d      }|d   }|d	k7  r|S d
S )Nz-mtabularz-fzGENERAL.CONNECTIONdeviceshow
r7   z-- )r/   stripsplit)rJ   outputlines
connections       r   nm_get_connection_for_interfacerV   W   sN    i/CXvW`abFLLN  &EqJ#t+:33r   rU   c                 T    	 t        dd| g       y # t        j                  $ r Y y w xY w)NrU   up)r#   r   CalledProcessError)rU   s    r   nm_bring_interface_uprZ   ^   s.    |T:./(( s    ''c                 ^    t               rt        | t        g|      S t        | t        g|      S N)r!   r   r   NM_SERVICE_NAME)actionsyncs     r   systemctl_network_managerr`   e   s/     "6!7>>Vo.55r   r^   servicesr_   c                     t        |      dk\  r>d| g}|s|j                  d       |j                  |       t        j                  |       y y )Nr7   r   z
--no-block)lenappendextendr   r'   )r^   ra   r_   commands       r   r   r   m   sF    
8}'NN<(x g& r   c                     t               } t        j                  g dd      }|j                         D ]Q  }|j	                         j                  d      }|d   j                         s6|d   dvs>| j                  |d          S | S )N)
networkctlz
--no-pagerz--no-legendTr,    r   )	unmanagedlinger)r:   r   r.   
splitlinesrQ   rR   	isnumericadd)rD   outrG   ss       r   networkd_interfacesrr   y   s{    J

!
!"MTX
YC  !JJLs#Q4>>"-D DNN1Q4 ! r   c                  2    t        j                  ddg       y )Nrh   reloadr   r'   r   r   r   networkctl_reloadrv      s    <23r   c                 h    t        |       dk\  r$t        j                  ddgt        |       z          y y )Nr7   rh   reconfigure)rc   r   r'   list)rD   s    r   networkctl_reconfigurerz      s0    
:!|];d:>NNO r   c                 >    t        j                  ddd| g      dk(  ryy)z4Return True if at least one matching unit is runningr   r   z	is-activer   TF)r   r   )unit_patterns    r   systemctl_is_activer}      s"    Y\JKqPr   c                     t        j                  dd| gt         j                  t         j                  d      }|j                  dkD  rd|j                  v ryy)z5Return True if output is "masked" or "masked-runtime"r   r   Tr%   r   r-   r   maskedF)r   runPIPE
returncoder%   r|   ress     r   systemctl_is_maskedr      sH    
..+|\B *
"$C ~~h#**4r   c                     t        j                  dd| gt         j                  t         j                  d      }|j                  dk7  ryy)z7Return True if returncode is other than "not-found" (4)r   r   Tr      F)r   r   r   r   r   s     r   systemctl_is_installedr      s=    
..+|\B *
"$C ~~r   c                  2    t        j                  g d       y)zEReload systemd unit files from disk and re-calculate its dependencies)r   zdaemon-reloadz--no-ask-passwordNru   r   r   r   systemctl_daemon_reloadr      s    MNr   c                 t    t        j                  ddd| gt         j                  t         j                         y)z8Flush all IP addresses of a given interface via iproute2ipaddrflushr$   Nr&   )ifaces    r   ip_addr_flushr      s*    4%8ASAS\f\n\nor   c           	         t         j                  j                  d|       }|rx	 t        t         j                  j                  |d            5 }|j	                         j                         }|dk7  r!t        j                  d| |       	 d d d        y 	 d d d        	 t         j                  j                  t         j                  j                  |dd            }t         j                  j                  |      }|S # 1 sw Y   ixY w# t        $ r*}t        j                  d| t        |             Y d }~y d }~ww xY w# t        $ r+}t        j                  d| |t        |             Y d }~y d }~ww xY w)	Nz/sys/class/net	operstatedownz'device %s operstate is %s, not changingz$Cannot determine operstate of %s: %srM   driverz0Cannot replug %s: cannot read link %s/device: %s)r   rE   joinr;   readrQ   loggingdebugIOErrorerrorstrrealpathbasename)rJ   	only_downdevdirrF   stateer   driver_names           r   get_interface_driver_namer      s'   WW\\*I6F	bggll6;78  A(F?MM"KYX]^	   " !!"'',,vx"JKgg&&v.
 !   
  	MM@)SQRVT	  H)U[]`ab]cdsN   )D <C;	D D AD= ;D D 	D: D55D:=	E1!E,,E1c                    d }	 t        j                  dd| g      j                  d      }|j                  d      }t	        |      dk(  r/t        |d   j                               r|d   j                         }|S # t        $ r |cY S w xY w)Nethtoolz-Putf-8z: r   r7   )r   r.   decoderR   rc   is_valid_macaddressrQ   	Exception)rJ   macrp   rR   s       r   _get_permanent_macaddressr      s    
C%%y$	&BCJJ7S		$u:?258>>3CD(.."C J  
s   A5A; ;B	B	c                     	 t        d|  d      5 }|j                         j                         cd d d        S # 1 sw Y   y xY w# t        $ r Y y w xY w)Nz/sys/class/net/z/address)r;   r   rQ   r   )rJ   rF   s     r   _get_macaddressr      sP    OI;h78 	$A668>>#	$ 	$ 	$ s*   A 9	A AA A 	AAc                      	 t        j                  g d      j                  d      } t        j                  |       }|D cg c]  }|d   	 c}S c c}w # t
        $ r g cY S w xY w)N)r   z--jsonlinkr   ifname)r   r.   r   jsonloadsr   )rp   out_jsonr   s      r   get_interfacesr      s\    %%&>?FFwO::c?-56Eh666 	s#   ?A AA A A#"A#c                 6    t        |       }|st        |       }|S r\   )r   r   )rJ   r   s     r   get_interface_macaddressr      s    
#I
.Ci(Jr   rD   c                     t        t              sJ j                  sJ t        t	        fd|             }t        |      dk7  rt        j                  |       y |d   S )Nc                 P    j                  | t        |       t        |             S )N)
iface_nameiface_driver	iface_mac)_match_interfacer   r   )itfnetdefs    r   <lambda>z%find_matching_iface.<locals>.<lambda>   s*    f&=&=237.s3 '> '5 r   r7   r   )
isinstancer   
_has_matchry   r?   rc   r   info)rD   r   matchess    ` r   find_matching_ifacer      sg    fm,,,6 5 7AB CG 7|qW1:r   
macaddressc                 6    d}t        j                  ||       d uS )NzT^[a-fA-F0-9][a-fA-F0-9](:[a-fA-F0-9][a-fA-F0-9]){5}((:[a-fA-F0-9][a-fA-F0-9]){14})?$)r8   r<   )r   MAC_PATTERNs     r   r   r      s    hK88K,D88r   c                     i } t         }t        j                  j                  |      st        }	 t        |d      5 }|D ]]  }|j                         }t        |      dk(  s"|d   j                         s6|d   | t        |d         <   t        |d         | |d   <   _ 	 d d d        | S # 1 sw Y   | S xY w# t        $ r" t        j                  d| d       t        cY S w xY w)Nr6   r   r   r7   zCannot open 'z' for reading)NEW_RT_TABLES_PATHr   rE   existsOLD_RT_TABLES_PATHr;   rR   rc   rn   intr   r   r   RT_TABLES_DEFAULT)lookup_tablerE   	rt_tablesrG   
split_lines        r   route_table_lookupr     s    LD77>>$!
!$_ 	E	! E!ZZ\
z?a'JqM,C,C,E7A!}LZ]!3425jm2DLA/	E	E 	E   !tfN;<  !s:   B6 $B) B)4*B)B6 )B3.B6 3B6 6(C! C!c                   8    e Zd Zd	dZd Zd Zd Zd Zd Zd Z	y)
NetplanCommandc                 X   || _         || _        || _        || _        d | _        d| _        d| _        d | _        i | _        d | _	        d | _
        t        j                  t        j                  d   d||d      | _        | j                  j!                  ddd	       | j                  j!                  d
dt        j"                  	       |s^| j                  j%                  ddd      | _        | j&                  j)                  ddd      }|j+                  | j,                         y y )NFr   ri   T)progdescriptionadd_helpz--debug
store_truezEnable debug messages)r^   helpz--breakpointzAvailable commandsrP   
subcommand)titlemetavardestr   zShow this help message)r   r   )func)
command_idr   leaf_commandtesting_argsr   
breakpointcommandclasssubcommandsr   r   argparseArgumentParsersysargvparseradd_argumentSUPPRESSadd_subparsers
subparsers
add_parserset_defaultsprint_usage)selfr   r   leafr   p_helps         r   __init__zNetplanCommand.__init__  s%   $& 

 	--chhqk:3V:E7;= 	  <&= 	! 	?  &.&7&7 	! 	9"kk88?SAC, 9 XDO__//<T5M 0 OF T%5%56 r   c                     || _         y r\   )r   )r   r)   s     r   r=   zNetplanCommand.update8  s	    
r   c                     | j                   j                  | j                  |       \  }| _        | j                  s9| j                  s,t        dt        j                         | j                          y y y )N)r)   	namespacezYou need to specify a commandfile)	r   parse_known_argsr   r   r   printr   r   r   )r   nss     r   
parse_argszNetplanCommand.parse_args;  sW    554::QU5VDJt'8'81

C (9r   c                    | j                   r%| j                   j                  | j                         | j                  rd| j                  v r| j	                          | j
                  r
t                | j                          y )Nr   )r   r=   r   r   r   r   r   r   s    r   run_commandzNetplanCommand.run_commandB  sZ    $$TZZ0 4::!5??L		r   c                     | j                   j                  t        j                         t        j                  t
        j                         y )Nr   )r   
print_helpr   r   exitr   EX_USAGEr  s    r   r   zNetplanCommand.print_usageN  s+    CJJ/r   c                     |       }i | j                   |<   || j                   |   d<   || j                   |   d<   |j                  r!t        j                  j	                  dd       sy | j
                  j                  |j                  |j                  |j                  d      }|j                  |j                  |       || j                   |   d<   y )NclassinstanceENABLE_TEST_COMMANDSF)r   r   r   )r   r   r   )r   r   r   r   r   r   r   r   r   r   r   )r   namer   r	  ps        r   _add_subparser_from_classz(NetplanCommand._add_subparser_from_classR  s    >!#*.w'-5z*::>>"8$?OO&&x':':3;3G3G,4,@,@05 ' 7 	
HLLx@+,x(r   c                     dd l }|j                  |      D ]:  \  }}|j                  |      st        |t              s)| j                  ||       < y )Nr   )inspect
getmembersisclass
issubclassr   r  )r   
submodulesr  r  objs        r   _import_subcommandsz"NetplanCommand._import_subcommandsd  sH     ++J7 	:ID#s#
3(G..tS9	:r   N)TF)
__name__
__module____qualname__r   r=   r   r  r   r  r  r   r   r   r   r     s%    78
-$:r   r   )F)6r   r   r   r   r   r>   r8   r   typingr   configmanagerr   netplanr   r   r]   r   r   r   r   RuntimeErrorconfig_errorsr   r!   r#   ry   r   r/   r4   rI   rV   rZ   r`   boolr   rr   rv   rz   r}   r   r   r   r   r   r   r   r   r   r   r   dictr   	Namespacer   r   r   r   <module>r!     s  $  	     	   . 3 +D . 4  yvG S#M  $%5|DTyb@D @S @4s 4s 4c d 6	'c 	'T 	' 	'4P
O
p
.
 
# 
s x} S	   D  9C 9D 9
D ,N:X'' N:r   