
    g1              	          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rSrSrS	rS
SSSS SSSS.r\\\4rS rS rS rS\S\4S jrS rS rS\S\4S jrS\SS4S jrS7S jr S7S\S \S!\!4S" jjr"S# r#S$ r$S% r%S& r&S' r'S( r(S) r)S* r*S7S+ jr+S\S\	\   4S, jr,S\S\	\   4S- jr-S\\   4S. jr.S\S\	\   4S/ jr/S0\4S1 jr0S2\S\!4S3 jr1S\24S4 jr3 " S5 S6\Rh                  5      r5g)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    [         R                  R                  SS5      $ )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                  ^    [         R                  " SSS[        /[         R                  S9S:H  $ )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                 p    [         R                  " S/U -   [         R                  [         R                  S9  g )Nnmclistdoutr   r   
check_callr    argss    r   r#   r#   3   s)     7)d*:3E3EjN`N`ar   r)   returnc                 4    [         R                  " S/U -   SS9$ )Nr#   Ttext)r   check_outputr(   s    r   	nmcli_outr/   9   s     ""G9t#3$??r   c                  ^     [        S/5        g! [        [        R                  4 a     gf = f)z"Check if NetworkManager is runninggeneralTF)r#   OSErrorr   SubprocessErrorr   r   r   
nm_runningr4   ?   s1    ykZ//0 s    ,,c                 f   [         R                  " S5      n[        5       nU  Hx  n[        US5       nU HZ  nUR	                  U5      nU(       d  M  UR                  [        [        R                  " XR                  S5      5      5      5          O   S S S 5        Mz     U$ ! , (       d  f       M  = f)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1%%c'..''!**M&NO  _   _s   B!AB!!
B0		interfacec           	          [        SSSSSSU /5      nUR                  5       R                  S5      nUS   nUS	:w  a  U$ 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                 V     [        SSU /5        g ! [        R                   a     g f = f)NrU   up)r#   r   CalledProcessError)rU   s    r   nm_bring_interface_uprZ   ^   s.    |T:./(( s    ((c                 h    [        5       (       a  [        U [        /U5      $ [        U [        /U5      $ N)r!   r   r   NM_SERVICE_NAME)actionsyncs     r   systemctl_network_managerr`   e   s2     "6!7>>Vo.55r   r^   servicesr_   c                     [        U5      S:  aD  SU /nU(       d  UR                  S5        UR                  U5        [        R                  " U5        g g )Nr7   r   z
--no-block)lenappendextendr   r'   )r^   ra   r_   commands       r   r   r   m   sF    
8}'NN<(x g& r   c                  &   [        5       n [        R                  " / SQSS9nUR                  5        H[  nUR	                  5       R                  S5      nUS   R                  5       (       d  M<  US   S;  d  MG  U R                  US   5        M]     U $ )N)
networkctlz
--no-pagerz--no-legendTr,    r   )	unmanagedlinger)r:   r   r.   
splitlinesrQ   rR   	isnumericadd)rD   outrG   ss       r   networkd_interfacesrr   y   sy    J

!
!"MTX
YC JJLs#Q4>>"-D DNN1Q4  ! r   c                  4    [         R                  " SS/5        g )Nrh   reloadr   r'   r   r   r   networkctl_reloadrv      s    <23r   c                 l    [        U 5      S:  a%  [        R                  " SS/[        U 5      -   5        g g )Nr7   rh   reconfigure)rc   r   r'   list)rD   s    r   networkctl_reconfigurerz      s0    
:!|];d:>NNO r   c                 B    [         R                  " SSSU /5      S:X  a  gg)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                     [         R                  " SSU /[         R                  [         R                  SS9nUR                  S:  a  SUR                  ;   a  gg)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                     [         R                  " SSU /[         R                  [         R                  SS9nUR                  S:w  a  gg)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                  4    [         R                  " / SQ5        g)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                 p    [         R                  " SSSU /[         R                  [         R                  S9  g)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           	         [         R                  R                  SU 5      nU(       ay   [        [         R                  R                  US5      5       nUR	                  5       R                  5       nUS:w  a!  [        R                  " SX5         S S S 5        g  S S S 5         [         R                  R                  [         R                  R                  USS5      5      n[         R                  R                  U5      nU$ ! , (       d  f       Nn= f! [         a+  n[        R                  " SU [        U5      5         S nAg S nAff = f! [         a+  n[        R                  " SX[        U5      5         S nAg S nAff = f)	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8A(F?MM"KY^	 98" 9!!"'',,vx"JKgg&&v.
 ! 98
  	MM@)SQRVT	  H)]`ab]cdsT   )D =DD D "AE
 
DD D 
E!EE

E?!E::E?c                 (   S n [         R                  " SSU /5      R                  S5      nUR                  S5      n[	        U5      S:X  a4  [        US   R                  5       5      (       a  US   R                  5       nU$ ! [         a    Us $ f = f)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D(.."C J  
s   A<B BBc                      [        SU  S35       nUR                  5       R                  5       sS S S 5        $ ! , (       d  f       g = f! [         a     g f = f)Nz/sys/class/net/z/address)r;   r   rQ   r   )rJ   rF   s     r   _get_macaddressr      sG    OI;h78A668>># 988 s+   A
 9	A
 
AA
 A
 

AAc                       [         R                  " / SQ5      R                  S5      n [        R                  " U 5      nU Vs/ s H  o"S   PM	     sn$ s  snf ! [
         a    / s $ f = f)N)r   z--jsonlinkr   ifname)r   r.   r   jsonloadsr   )rp   out_jsonr   s      r   get_interfacesr      s^    %%&>?FFwO::c?-56XEhX666 	s$   AA AA A A('A(c                 @    [        U 5      nU(       d  [        U 5      nU$ r\   )r   r   )rJ   r   s     r   get_interface_macaddressr      s    
#I
.Ci(Jr   rD   c                    ^ [        T[        5      (       d   eTR                  (       d   e[        [	        U4S jU 5      5      n[        U5      S:w  a  [        R                  " U5        g US   $ )Nc                 J   > TR                  U [        U 5      [        U 5      S9$ )N)
iface_nameiface_driver	iface_mac)_match_interfacer   r   )itfnetdefs    r   <lambda>%find_matching_iface.<locals>.<lambda>   s(    f&=&=237.s3 '> '5r   r7   r   )
isinstancer   
_has_matchry   r?   rc   r   info)rD   r   matchess    ` r   find_matching_ifacer      sj    fm,,,,6 5 7AB CG 7|qW1:r   
macaddressc                 6    Sn[         R                  " X5      S L$ )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                     0 n [         n[        R                  R                  U5      (       d  [        n [        US5       nU He  nUR                  5       n[        U5      S:X  d  M$  US   R                  5       (       d  M>  US   U [        US   5      '   [        US   5      XS   '   Mg     S S S 5        U $ ! , (       d  f       U $ = f! [         a#    [        R                  " SU S35        [        s $ f = f)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>>$!
!$_	!!ZZ\
z?a'JqM,C,C,E,E7A!}LZ]!3425jm2DLA/	 "   _   !tfN;<  !s;   C  #B6'B6+B6,C 6
C C C *C54C5c                   B    \ rS rSrSS jrS rS rS rS rS r	S r
S	rg
)NetplanCommandi  c                 <   Xl         X l        X0l        X@l        S U l        SU l        SU l        S U l        0 U l        S U l	        S U l
        [        R                  " [        R                  S   < SU< 3USS9U l        U R                  R!                  SSSS	9  U R                  R!                  S
S[        R"                  S	9  U(       dU  U R                  R%                  SSSS9U l        U R&                  R)                  SSSS9nUR+                  U R,                  S9  g g )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__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                     Xl         g r\   )r   )r   r)   s     r   r=   NetplanCommand.update8  s    
r   c                     U R                   R                  U R                  U S9u  ol        U R                  (       d;  U R                  (       d)  [        S[        R                  S9  U R                  5         g g g )N)r)   	namespacezYou need to specify a commandfile)	r   parse_known_argsr   r   r   printr   r   r   )r   nss     r   
parse_argsNetplanCommand.parse_args;  sU    554::QU5VJt'8'81

C (9r   c                 (   U R                   (       a%  U R                   R                  U R                  5        U R                  (       a   SU R                  ;   a  U R	                  5         U R
                  (       a
  [        5         U R                  5         g )Nr   )r   r=   r   r   r   r   r   r   s    r   run_commandNetplanCommand.run_commandB  sZ    $$TZZ0 4::!5??L		r   c                     U R                   R                  [        R                  S9  [        R                  " [
        R                  5        g )Nr   )r   
print_helpr   r   exitr   EX_USAGEr  s    r   r   NetplanCommand.print_usageN  s+    CJJ/r   c                    U" 5       n0 U R                   U'   XR                   U   S'   X0R                   U   S'   UR                  (       a&  [        R                  R	                  SS 5      (       d  g U R
                  R                  UR                  UR                  UR                  SS9nUR                  UR                  US9  X@R                   U   S'   g )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_class(NetplanCommand._add_subparser_from_classR  s    >!#*.w'-5z*::>>"8$??OO&&x':':3;3G3G,4,@,@05 ' 7 	
HLLx@+,x(r   c                     SS K nUR                  U5       HE  u  p4UR                  U5      (       d  M  [        U[        5      (       d  M4  U R                  X45        MG     g )Nr   )inspect
getmembersisclass
issubclassr   r  )r   
submodulesr  r  objs        r   _import_subcommands"NetplanCommand._import_subcommandsd  sE     ++J7IDs##
3(G(G..t9 8r   )r   r   r   r   r   r   r   r   r   r   r   r   r   N)TF)__name__
__module____qualname____firstlineno__r   r=   r  r  r   r  r  __static_attributes__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   