
    gq                        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	  S SK
Jr  S SKJrJrJr  S SKJrJrJrJr  S SKJr  S SKrS SKrSSKJr  \\\S	4   \S	   \\\\\S   4   r0 S
S
_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_S S!SSSSSS
S"SSS S!S#.Er  " S$ S%5      r! " S& S'5      r" " S( S)5      r#g)*    N)defaultdict
namedtuple)StringIO)AF_INETAF_INET6	inet_ntop)DictListTypeUnion)parse   )utilsJSONbondbridgedummyzdummy-deviceerspantunneletherethernetgretapipgreip6greloopbacksittuntunnel6	wireguardwlanwifiwwanmodemvethzvirtual-ethernetvlanvrfz	nm-device)r%   r&   vxlanieee80211_radiotapwifis	ethernetsbridgesbondsz
nm-deviceszdummy-devicesmodemsvlansvrfsc                   l   \ rS rSrS\S\4S jr/ / SS4S\S\S\S\S	\4
S
 jjr	S\S\4S jr
S\S\4S jrS\4S jr\S\4S j5       r\S\4S j5       r\S\4S j5       r\S\4S j5       r\S\4S j5       r\S\4S j5       r\S\4S j5       r\S\4S j5       r\S\4S j5       rS\S\4S jrSrg)	InterfaceP   ipreturnc                 f    [        UR                  SS5      =n5      S:X  a  UR                  5       $ g)zy
Extract the MAC address if it's set inside the JSON data and seems to
have the correct format. Return 'None' otherwise.
address    N)lengetlower)selfr3   r6   s      +/usr/share/netplan/netplan_cli/cli/state.py__extract_macInterface.__extract_macQ   s0    
 "&&B//w0B6==?"    )NNnd_datanm_dataresolved_data
route_datac                   ^  UR                  SS5      T l        UR                  SS5      T l        SUR                  S/ 5      ;   a  SOST l        UR                  SS5      R	                  5       T l        T R                  U5      T l        S T l        S T l	        S T l
        / T l        0 T l        U=(       d    / n[        U 4S	 jU 5       S 5      T l        [        U 4S
 jU 5       S 5      T l        T R                  (       a   T R!                  T R                  5      T l        S T l        US   (       a  / T l        US    H  n[%        US   5      [%        T R                  5      :X  d  M*  US   nUS   nT R"                  R'                  [)        USR+                  U V	s/ s H  oR-                  SS5      PM     sn	5      5      5        M     S T l        US   (       aa  / T l        US    HQ  n	[%        U	S   5      [%        T R                  5      :X  d  M*  T R.                  R'                  [1        U	S   5      5        MS     / n
S T l        US   (       a  XS   -  n
US   (       a  XS   -  n
U
(       GaA  / T l        U
 GH3  nUR                  S5      T R                  :X  d  M%  SUR                  S5      0nUR                  S5      =n(       a  XS'   UR                  S5      =n(       a  XS'   UR                  S5      =n(       a  XS'   UR                  S5      =n(       a  XS'   UR                  S5      =n(       a  XS'   UR                  S5      =n(       a  XS'   UR                  S5      =n(       a  XS'   UR                  S5      =n(       a  XS'   T R2                  R'                  U5        GM6     S T l        UR                  S5      =n(       Ga  [7        5       nT R2                  (       a  T R2                   H  nUR                  S5      S:X  d  M  UR                  S5      S:w  d  M1  UR                  S5      [8        R:                  :X  d  MV  UR=                  [>        R@                  " US   5      RB                  5        M     / T l        U GH  n/ n[>        RD                  " US    5      RF                  (       a  UR'                  S!5        UR                  S"S#5      (       a  UR'                  S"5        [>        R@                  " US     S$US%    35      n[I        U[>        RJ                  5      (       as  URB                  U;   a  UR'                  S5        T R                  R                  S&0 5      R                  [1        U5      5      =n(       a  US':X  a  UR'                  S(5        T R2                  (       au  T R2                   He  nSU;   d  M  [>        RD                  " US   5      [>        RD                  " US    5      :X  d  MA  US   S(:X  d  ML  S(U;  d  MT  UR'                  S(5          O   US    RM                  5       nUS)US%   00nU(       a  UUU   S'   T R4                  R'                  U5        GM     S T l'        UR                  S*0 5      R                  S+5      =n(       a  URQ                  5       T l'        T RS                  T R                  5      =(       d    S,T l*        g s  sn	f )-NifindexifnameunknownUPflagsDOWN	operstatec              3   P   >#    U  H  oS    TR                   :X  d  M  Uv   M     g7f)IndexN)idx.0xr<   s     r=   	<genexpr>%Interface.__init__.<locals>.<genexpr>i   s      KAgJ$((4Jaa   &	&c              3   P   >#    U  H  oS    TR                   :X  d  M  Uv   M     g7f)deviceNnamerQ   s     r=   rT   rU   j   s      MAhK4994LaarV   r   r      r@   bigdevtodstfamilygatewayviaprefsrcfrommetrictypescopeprotocoltable	addr_inforadefaultlocallinkdynamicF/	prefixlen	addressesDHCPv6dhcpprefixlinkinfo	info_kindr7   )+r:   rP   rZ   
adminstateupperrM   _Interface__extract_mac
macaddressr   r   r&   membersdata_sourcesnextndnm_find_data_sourcesdns_addressesintappendr   jointo_bytes
dns_searchstrroutesrr   setr   valueadd	ipaddressip_interfacenetwork
ip_addressis_link_local
isinstanceIPv6Addressr;   iproute_typestripquery_networkctl_networkctl)r<   r3   rA   rB   rC   rD   itripfamilydnsv_routesobjelemvalrj   ra_networksrouteaddrrK   ip_addrip_dsrw   s   `                     r=   __init__Interface.__init__Z   s   y"-)4	'+rvvgr/B'Bt ff[)<BBD#11"5	"$ -RKKTRMMtT 77 $ 7 7 @D $(!#D$Q's1v;#dhh-/"1vHa&C&&--i#((jmKnjmefJJWXZ_L`jmKnBo.pq	 (
 !% DO"1%qt9DHH-OO**3qt95 &
  a=!}$Ga=!}$GDK775>TYY. #''%.1D!ggh//s/),X!ggi00s0&)U!ggi00s0'*V!ggh//s/),X!ggfo-s-'*V!ggg..s.(+W!ggj11s1+.Z(!ggg..s.(+WKK&&t,' *  ${++9+%K{{![[E		*-5 %		$9 < %		( 3x~~ E#	(>(>uT{(K(S(ST	 )  DN! ''W6DDLL(88Iu--LL+ $00DM?!DDUCV1WXgy'<'<==+5T* $ 1 1 5 5k2 F J J3w< XXuX H,!LL0;;!%"eO ) 4 4U6] CyG[G[\`ah\iGj j$Z0F:vU?R %V 4 % "- w---/(D,=!>?-2DM'*%%d+? "B "&z2.22;??9? ) 1D !% 5 5dii @ FBq Los   [#con_namec           	          S n [         R                  " SSSSSU/5      nUR                  5       $ ! [         a:  n[        R
                  " SR                  U[        U5      5      5         S nAU$ S nAff = f)Nz--get-valuesz802-11-wireless.ssidconshowidz+Cannot query NetworkManager SSID for {}: {})r   	nmcli_outr   	Exceptionloggingwarningformatr   )r<   r   ssides       r=   query_nm_ssidInterface.query_nm_ssid   sx    	/??N4J$)64$C DD::< 	/OOIPP$c!f. / /	/s   +0 
A4/A//A4rH   c           	          S n [         R                  " SSSU/SS9nU$ ! [         a:  n[        R                  " SR                  U[        U5      5      5         S nAU$ S nAff = f)N
networkctlstatusz--Ttextz"Cannot query networkctl for {}: {})
subprocesscheck_outputr   r   r   r   r   )r<   rH   outputr   s       r=   r   Interface.query_networkctl   sn    	!,,lHdF-SZ^_F   	!OO@GGA  ! !	!s    
A#/AA#c                 f   U R                   U R                  U R                  S.nU R                  (       a  U R                  US'   U R                  (       a  U R                  US'   U R
                  (       a  U R
                  US'   U R                  (       a  U R                  US'   U R                  (       a  U R                  US'   U R                  (       a  U R                  US'   U R                  (       a  U R                  US'   U R                  (       a  U R                  US	'   U R                  (       a  U R                  US
'   U R                  (       a  U R                  US'   U R                  (       a  U R                  US'   U R                  (       a  U R                  US'   U R                  (       a  U R                  US'   U R                   (       a  U R                   US'   U R"                  (       a  U R"                  US'   U R$                  (       a  U R$                  US'   U R&                  U4$ )N)indexrx   rM   rf   r   tunnel_modebackendr   r{   vendorrr   r   r   r   activation_moder   r   r&   
interfaces)rP   rx   rM   rf   r   r   r   	netdef_idr{   r   rr   r   r   r   r   r   r   r&   r|   rZ   )r<   jsons     r=   r   Interface.json   s   XX//
 9999DL9999DL"&"2"2D<<"llDO>>DJ??!%D;;![[DN>> $D$($6$6D!??!%D;;![[DN&*&:&:D"#;;![[DN9999DL88((DK<<!%D		4  r@   c                 L    U R                   S:H  =(       a    U R                  S:H  $ )NrJ   rx   rM   r<   s    r=   upInterface.up  s    $&A4>>T+AAr@   c                 L    U R                   S:H  =(       a    U R                  S:H  $ )NrL   r   r   s    r=   downInterface.down  s    &(ET^^v-EEr@   c                 |   U R                   (       a  U R                   R                  S5      OS nUS:X  a  U R                   R                  S5      nUS:X  a$  U R                   R                  S5      =n(       a  Un[        R                  U5      =n(       a  U$ [        R                  " SR                  U5      5        g )Nr   noneKindr   zUnknown device type: {})r   r:   DEVICE_TYPESr   r   r   )r<   nd_typekinddevice_types       r=   rf   Interface.type  s    )-$''++f%dfggkk&)Ggww{{6**t*&**733;3188ABr@   c                 ^    U R                   S:X  a  U R                  (       a  U R                  $ g )Nr   )rf   r   r   s    r=   r   Interface.tunnel_mode(  s%    99 T%6%6$$$r@   c                    U R                   (       aA  SU R                   R                  SS5      ;  a!  SU R                   R                  SS5      ;   a  gU R                  (       a!  SU R                  R                  SS5      ;   a  g	g )
N	unmanaged
SetupStater7   run/systemd/network/10-netplan-NetworkFilenetworkd.run/NetworkManager/system-connections/netplan-filenameNetworkManager)r   r:   r   r   s    r=   r   Interface.backend.  sa    GG477;;|R#@@1TWW[[PR5SSWWITWW[[YcegMhh#r@   c                    U R                   S:X  a@  U R                  R                  SS5      R                  S5      S   R                  S5      S   $ U R                   S:X  Ga  U R                  R                  S	S5      R                  S
5      S   R                  S5      S   nU R                  R                  SS5      S:X  a  U R                  U R                  R                  S5      5      nX!;  aV  UR                  S5      nU Vs/ s H  n[        U5      PM     nnSR                  U5      S-   n[        R                  " U5      nU(       a  UR                  SU-   5      S   nU$ g s  snf )Nr   r   r7   r   r   z.networkr   r   r   r   z.nmconnectionrf   z802-11-wirelessrZ   utf-8;-)r   r   r:   splitr   r   encoder   r   r   quote)r<   netdefr   ssid_encodedb
ssid_bytesssid_nm_escapeds          r=   r   Interface.netdef_id8  sH   <<:%77;;}b177133466;eJ6GK K\\--WW[[R066@BBCEEJU?E[\]_Fww{{62&*;;))$''++f*=>% $(;;w#7L2>!?,Q#a&,J!?&)hhz&:S&@O !;;7D#\\#*5a8FM "@s   E(c                     U R                   (       aA  SU R                   ;   a1  U R                   S   (       a  U R                   S   R                  5       $ g )NVendor)r   r   r   s    r=   r   Interface.vendorW  s:    77x477*twwx/@778$**,,r@   c                    U R                   S:X  a  U R                  S:X  a+  U R                  U R                  R	                  SS5      5      $ U R
                  R                  5        H  nUR                  5       nSn[        R                  " X!5      =n(       d  M4  UR                  S5      nUR                  S5      R                  S5      R                  S5      R                  S	5      nU(       a  Us  $ S s  $    g )
Nr!   r   rZ   r7   z!^Wi-?Fi access point: (.*) \(.*\)r   latin1zunicode-escaper   )rf   r   r   r   r:   r   
splitlinesr   rematchgroupr   decode)r<   linekeyr   r   s        r=   r   Interface.ssid]  s    99||//))$''++fb*ABB
 ((335zz|:HHS//5/ ;;q>D
  ;;x0778HIPPQYZaabijD#'41T1 6 r@   c                 Z   U R                   S:X  at  U R                  R                  5        HU  nUR                  5       nSnUR	                  U5      (       d  M-  U[        U5      S  R                  5       nUS:w  a  Us  $ S s  $    g U R                   S:X  a  U R                  S   S:X  a  S$ S $ g )Nr   zActivation Policy: r   r   autoconnectnomanual)r   r   r   r   
startswithr9   r   )r<   r   r   modes       r=   r   Interface.activation_modes  s    <<:% ((335zz|+??3''C	?002D#'4<49T9 6  \\--#ww}5=8G4Gr@   datac                 v   0 nUR                  S/ 5      =n(       aQ  0 US'   U HF  n[        R                  " [        US   5      5      n[	        UR
                  5      nUS   nXrS   U'   MH     UR                  S/ 5      =n(       a  0 US'   U H  n	U	S   n
U	S   nXrS   U
'   M     UR                  S/ 5      =n(       a{  0 US	'   U Hp  n[        R                  " [        US   5      5      nUS
   n[        R                  " [	        UR
                  5      SU 3-   5      n[	        U5      nUS   nXrS	   U'   Mr     U$ )NDNSr   AddressConfigSourceSearchDomainssearchDomain	Addressesrr   PrefixLengthrp   )r:   r   r   bytesr   r3   )r<   r  sourcesrr   r   r   addr_strsourcedomainsr  domainr3   ru   	full_addrs                 r=   r   Interface._find_data_sources  sV   
  ++9+GEN  --eC	N.CDtww<^,+1x(	 ! hh3373 "GH!)/,2!&) " b1191#%GK  --eByM.BCN+%223tww<AfX,3NO	y>N+17$X.   r@   )r   rr   rx   r   r   r}   r   r   rP   r   r{   r|   rZ   r   r   rM   r   r&   N)__name__
__module____qualname____firstlineno__dictr   rz   r   tupler   r   r   r   propertyboolr   r   rf   r   r   r   r   r   r   r   __static_attributes__ r@   r=   r1   r1   P   s      24R(4,yG4 yG$ yGd yG %yGBGyGv	c 	c 	s s &!d &!P BD B B Fd F F c   S  
    3  <   
 c  *   #t # #r@   r1   c                      \ rS rSrSrSS jr\S\4S j5       r\S\	S\
4S j5       r\S	\S\4S
 j5       r\S\4S j5       r\S\4S j5       r\S\4S j5       r\S\4S j5       r\S\4S j5       r\S\4S j5       r\S\4S j5       r\S\S\\   4S j5       r\S\\   SS4S j5       r\S\4S j5       rS\4S jrSrg)SystemConfigStatei  z,Collects the system's network configuration Nc                   ^ [         R                  " S5      (       dv  [         R                  " S5      (       a,  [        R                  " S5        [
        R                  " S5        [        R                  " S5        [         R                  " SS/S5        U R                  5       nU R                  5       nU(       a  U(       d,  [        R                  " S5        [
        R                  " S5        U R                  5       nU R                  5       u  pgU R                  5       u  pU V
s/ s H  n
[        XXXU	4Xg45      PM     sn
U l        U R!                  U R                  5        U R                   V
s/ s H  oR"                  S:w  d  M  U
PM     nn
U R%                  U5      nT(       a!  ['        U4S	 jU R                   5       S 5      /nU Vs/ s H	  oc  M  UPM     nnT(       aA  U/ :X  a;  [        R                  " S
R)                  T5      5        [
        R                  " S5        SUU R+                  5       S.0U l        U(       a  U R                  OUnU H$  n
U
R/                  5       u  mnXR,                  T'   M&     g s  sn
f s  sn
f s  snf )Nzsystemd-networkd.servicez^'netplan status' depends on networkd, but systemd-networkd.service is masked. Please start it.r   z3systemd-networkd.service is not active. Starting...startTz,Could not query iproute2 or systemd-networkdrL   c              3   J   >#    U  H  oR                   T:X  d  M  Uv   M     g 7fNrY   )rR   itfrH   s     r=   rT   -SystemConfigState.__init__.<locals>.<genexpr>  s     W-@cHHPVDVcc-@s   #	#zCould not find interface {}znetplan-global-state)onlinenameservers)r   systemctl_is_activesystemctl_is_maskedr   errorsysexitdebug	systemctlquery_iproute2query_networkdquery_nmquery_routesquery_resolvedr1   interface_listcorrelate_members_and_uplinkrM   query_online_stater~   r   resolvconf_jsonstater   )r<   rH   alliproute2r   nmcliroute4route6r   r   r'  filteredonline_stater   itf_iterr   s    `              r=   r   SystemConfigState.__init__  s!   (()CDD(()CDD 1 2 MMOPOOG&@%A4H &&(&&(xMMHIHHQK **,$($7$7$9! GOPFNs  )z?Z*0)9 ;FNP 	))$*=*=> $(#6#6R#6C--6:QC#6R..x8 WT-@-@WY]^_H%-BXTDXBh"nMM7>>vFGHHQK #&#335%

 +.4&&8C((*KFC!$JJv 9P S Cs   %J 0JJJ
J
r4   c                 4   / / S S.n [        S5       nUR                  5       nSU;   a  SUS'   OSU;   a  SUS'   U/UR                  5       -    He  nUR                  S5      (       a  US	==   UR	                  5       S
S  -  ss'   UR                  S5      (       d  MO  UR	                  5       S
S  US'   Mg     S S S 5        U$ ! , (       d  f       U$ = f! [
         a9  n[        R                  " SR                  [        U5      5      5         S nAU$ S nAff = f)N)rr   r  r  z/etc/resolv.confz/# This is /run/systemd/resolve/stub-resolv.confstubr  z*# This is /run/systemd/resolve/resolv.confcompat
nameserverrr   r   r  z!Cannot parse /etc/resolv.conf: {})
openreadline	readlinesr  r   r   r   r   r   r   )clsresf	firstliner   r   s         r=   r:  !SystemConfigState.resolvconf_json  s    
	P()QJJL	D	Q"(CKAYN"*CK&K!++-7D|44K(DJJL,<<(x00(,

QR(8H	 8 * 
 *) 
  	POO?FFs1vNOO
	Ps;   C BCC8C 
CC C 
D.DDr   c                    U H  nUR                   (       d  M  UR                  (       d  M)  UR                  (       d  M<  UR                  (       d  MO  / nUR                   HC  n[	        UR                  5       5      S   u  pVSU;  d  SUS   ;  d  M2  UR                  U5        ME     UR                   Vs/ s H  owR                  SS 5      S:X  d  M  UPM     nnU(       d  M  U(       d  M  UR                  (       d  M    g   gs  snf )Nr   rK   rn   r^   rl   TF)r   rr   r   r   listitemsr   r:   )	rL  r   r'  non_local_ipsr   r3   extrarS   default_routess	            r=   r9  $SystemConfigState.query_online_state  s     Cvvv#---CJJJ3;L;L;L "MMD $TZZ\ 21 5IBe+vU7^/K%,,R0 * .1ZZ!ZZ55t;LPY;Y!Z!Z =^^8I8I8I   "[s   5DD
cmd_outputc                 .    [         R                  " U5      $ r&  r   loadsrL  rX  s     r=   process_generic!SystemConfigState.process_generic  s    zz*%%r@   c                     S n [         R                  " / SQSS9nU R                  U5      nU$ ! [         a9  n[        R
                  " SR                  [        U5      5      5         S nAU$ S nAff = f)N)r3   -d-jr   Tr   z(Cannot query iproute2 interface data: {})r   r   r]  r   r   criticalr   r   rL  r  r   r   s       r=   r2   SystemConfigState.query_iproute2  su    	X$112L7;=F&&v.D   	XGNNsSTvVWW	X   (. 
A1.A,,A1c                 4    [         R                  " U5      S   $ )N
InterfacesrZ  r\  s     r=   process_networkd"SystemConfigState.process_networkd  s    zz*%l33r@   c                     S n [         R                  " SS/SS9nU R                  U5      nU$ ! [         a9  n[        R
                  " SR                  [        U5      5      5         S nAU$ S nAff = f)Nr   --json=shortTr   z(Cannot query networkd interface data: {})r   r   rh  r   r   rb  r   r   rc  s       r=   r3   SystemConfigState.query_networkd  sy    	X$11<2P7;=F''/D   	XGNNsSTvVWW	Xre  c           
          / nUR                  5        HU  nUR                  S5      nUS   (       a  US   OS nU(       d  M.  UR                  UUS   US   US   US   US   S.5        MW     U$ )	N:r   r   r[            )rX   rZ   uuidr   rf   r   )r   r   r   )rL  rX  r  r   r   r]   s         r=   
process_nmSystemConfigState.process_nm*  s{    ))+DJJsOE#Ah%(DCs!!!H!!H %a!!H#(8 	 , r@   c                     S n [         R                  " / SQ5      nU R                  U5      nU$ ! [         a9  n[        R
                  " SR                  [        U5      5      5         S nAU$ S nAff = f)N)z-tz-fz*DEVICE,NAME,UUID,FILENAME,TYPE,AUTOCONNECTr   r   z.Cannot query NetworkManager interface data: {})r   r   rs  r   r   r0  r   r   rc  s       r=   r4  SystemConfigState.query_nm;  sr    	[// +: ;F >>&)D   	[MMJQQRUVWRXYZZ	[s   )/ 
A2.A--A2c                     S nS n [         R                  " / SQSS9nU R                  U5      n[         R                  " / SQSS9nU R                  U5      nU(       a*  U H$  nUR                  S[        R                  05        M&     U(       a*  U H$  nUR                  S[        R                  05        M&     X4$ ! [         a8  n[        R
                  " SR                  [        U5      5      5         S nANS nAff = f)N)r3   r`  ra  z-4r   r   ri   r<  Tr   )r3   r`  ra  z-6r   r   ri   r<  z$Cannot query iproute2 route data: {}r`   )r   r   r]  r   r   r0  r   r   updater   r   r   )rL  data4data6output4output6r   r   s          r=   r5  SystemConfigState.query_routesG  s    	Q%223l8<>G--g6E%223l8<>G--g6E h67 h78 ~  	QMM@GGAOPP	Qs   AB; ;
C=.C88C=c                    S nS n [         R                  " S5      nUc  [        S5      e[        R                  " USSSSSSS	S
S/
SS9n[
        R                  " U5      nUR                  S0 /5      S   nUR                  S0 5      R                  S5      S:X  d   S5       eUR                  S0 5      R                  S5      nUR                  S0 5      R                  S5      S:X  d   S5       eUR                  S0 5      R                  S5      nX4$ ! [         a,  n[        R                  " S[        U5      5         S nAX4$ S nAff = f)Nbusctlzmissing busctl utilityrk  callz--systemzorg.freedesktop.resolve1z/org/freedesktop/resolve1zorg.freedesktop.DBus.PropertiesGetAllsz org.freedesktop.resolve1.ManagerTr   r  r   r  rf   za(iiay)zDNS address type doesn't matchDomainsza(isb)zDNS search type doesn't matchz"Cannot query resolved DNS data: %s)shutilwhichRuntimeErrorr   r   r   r[  r:   r   r   r0  r   )rL  rr   r  r  json_outrM  r  errs           r=   r6   SystemConfigState.query_resolved_  sX   		J\\(+F~"#;<<!..+,233 H **X&C776B4(+D 88E2&**62i?bAbb?+//7I 88Ir*..v6(BdDddBXXi,008F ""  	JMM>CII""	Js   D	D 
E EErH   c           	      T   / nSn [         R                  " SSSSSSU/SS	9n[        R                  " U5      nU H#  nUR                  UR                  S5      5        M%     U$ ! [         a:  n[        R                  " S
R                  [        U5      5      5        / s SnA$ SnAff = f)zNReturn a list containing the interfaces that are members of a bond/bridge/vrf Nr3   r`  ra  rn   r   masterTr   zCannot query bridge: {}rH   )r   r   r   r   r   r   r   r   r[  r   r:   )rL  rH   r|   r   r   output_jsonmembers          r=   query_membersSystemConfigState.query_members}  s     	,,tT668VD4QF jj(!FNN6::h/0 "   	OO5<<SVDEI	s   A# #
B'-/B"B'"B'c                   ^	 / SQm	0 n[        [        5      n[        U	4S jU5       Hb  nU R                  UR                  5      nU H0  n[        SSS/5      nU" UR                  UR                  5      X&'   M2     XSUR                  '   Md     U H  nUR                  UR                  5      =n(       ac  UR                  S:X  a  UR                  Ul        UR                  S:X  a  UR                  Ul	        UR                  S:X  a  UR                  Ul
        UR                  T	;   d  M  UR                  UR                  5      =n(       d  M  XTl        M     g	)
z
Associate interfaces with their members and parent interfaces.
If an interface is a member of a bond/bridge/vrf, identify which interface
if a member of. If an interface has members, identify what are the members.
)r   r   r&   c                 "   > U R                   T;   $ r&  )rf   )iuplink_typess    r=   <lambda>@SystemConfigState.correlate_members_and_uplink.<locals>.<lambda>  s    !&&L*@r@   MemberrZ   rf   r   r   r&   N)r   rR  filterr  rZ   r   rf   r:   r   r   r&   r|   )
rL  r   members_to_uplinkuplink_to_members	interfacer|   r  member_tupleuplinkr  s
            @r=   r8  .SystemConfigState.correlate_members_and_uplink  s    1'- @*MI''	7G!)(VV4DE,8,X!) " 18inn- N $I*..y~~>>v>;;(*'-{{I$;;&(%+[[IN;;%'$*KKIM~~-/33INNCC7C(/% $r@   c                 ,    [        U R                  5      $ r&  )r9   r7  r   s    r=   number_of_interfaces&SystemConfigState.number_of_interfaces  s    4&&''r@   c                     U R                   $ r&  )r;  r   s    r=   get_dataSystemConfigState.get_data  s    zzr@   )r7  r;  )NF) r  r  r  r  __doc__r   classmethodr  r:  rR  r  r9  r   r   r]  r2  rh  r3  rs  r4  r  r5  r6  r
   r  r1   r8  r  r   r  r  r  r   r@   r=   r"  r"    s   76%p   . D T   & & & & t   4T 4 4 t   t    	 	 	 U  . #u # #: 3 49  " 0d9o 0$ 0 0: (c ( ($ r@   r"  c                   >    \ rS rSrSrS	S jrS\4S jrS\4S jr	Sr
g)
NetplanConfigStatei  z-Collects the Netplan's network configuration c                 \   [         R                  " 5       nUR                  U5        [         R                  " 5       nUR	                  U5        UR
                  U l        [        5       U l        US:X  a  UR                  U R                  S9  g UR                  S5      (       d  SR                  SU45      n[        R                  " SU5      nU Vs/ s H  oUR                  SS5      PM     nn[        5       nUR                  US9  [         R                  " XU R                  5        g s  snf )Nr<  )output_filer   .z	(?<!\\)\.z\.)netplanParserload_yaml_hierarchyStateimport_parser_resultsnetdefsr   r;  
_dump_yamlr  r   r   r   replace_dump_yaml_subtree)r<   subtreerootdirparsernp_stater   tmp_ins          r=   r   NetplanConfigState.__init__  s    !""7+==?&&v.''Z
eDJJ7%%i00((Iw#78hh|W5G<CDGD||E3/GGDZFF3&&w

C	 Es   D)r4   c                 6    U R                   R                  5       $ r&  )r;  getvaluer   s    r=   __str__NetplanConfigState.__str__  s    zz""$$r@   c                 ^    [         R                  " U R                  R                  5       5      $ r&  )yaml	safe_loadr;  r  r   s    r=   r  NetplanConfigState.get_data  s    ~~djj11344r@   )r  r;  N)r<  rp   )r  r  r  r  r  r   r   r  r  r  r  r   r@   r=   r  r    s#    8D2% %5$ 5r@   r  )$r   r   r   r   r  r   r.  collectionsr   r   ior   socketr   r   r   typingr	   r
   r   r   urllibr   r  r  r7   r   r   r   floatr  r   r   r1   r"  r  r   r@   r=   <module>r     s  (    	   
 /  / / * *    T#v+Vc3tT$ZOP$
F$h$ ^$ h	$
 Z$ h$ X$ h$ 
$ 
8$ h$ 
8$ x$ $ F$  G!$" #$$  ! #G$NV Vr
I IX 5  5r@   