
    gq                        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m	Z	 d dl
mZ d dlmZmZmZ d dlmZmZmZmZ d dlmZ d dlZd dlZddlmZ eeed	f   ed	   eeeeed   f   Zi d
d
ddddddddddddddddddddddddddddddddd d!dddddd
d"ddd d!d#Z  G d$ d%      Z! G d& d'      Z" G d( d)      Z#y)*    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                   D   e Zd ZdedefdZg g ddfdededededef
d	Zd
edefdZ	dedefdZ
defdZedefd       Zedefd       Zedefd       Zedefd       Zedefd       Zedefd       Zedefd       Zedefd       Zedefd       ZdedefdZy)	Interfaceipreturnc                 d    t        |j                  dd      x}      dk(  r|j                         S y)z
        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)selfr2   r5   s      +/usr/share/netplan/netplan_cli/cli/state.py__extract_maczInterface.__extract_macQ   s0    
 "&&B//w0B6==?"    )NNnd_datanm_dataresolved_data
route_datac                     |j                  dd       _        |j                  dd       _        d|j                  dg       v rdnd _        |j                  dd      j	                          _         j                  |       _        d  _        d  _	        d  _
        g  _        i  _        |xs g }t         fd	|D        d        _        t         fd
|D        d        _         j                  r  j!                   j                         _        d  _        |d   rg  _        |d   D ]  }t%        |d         t%         j                        k(  s(|d   }|d   } j"                  j'                  t)        |dj+                  |D 	cg c]  }	|	j-                  dd       c}	                    d  _        |d   r]g  _        |d   D ]N  }	t%        |	d         t%         j                        k(  s( j.                  j'                  t1        |	d                P g }
d  _        |d   r|
|d   z  }
|d   r|
|d   z  }
|
rg  _        |
D ]  }|j                  d       j                  k(  s#d|j                  d      i}|j                  d      x}r||d<   |j                  d      x}r||d<   |j                  d      x}r||d<   |j                  d      x}r||d<   |j                  d      x}r||d<   |j                  d      x}r||d<   |j                  d      x}r||d<   |j                  d      x}r||d<    j2                  j'                  |        d  _        |j                  d      x}rgt7               } j2                  r j2                  D ]  }|j                  d      dk(  s|j                  d      dk7  s-|j                  d      t8        j:                  k(  sP|j=                  t?        j@                  |d         jB                          g  _        |D ]  }g }t?        jD                  |d          jF                  r|j'                  d!       |j                  d"d#      r|j'                  d"       t?        j@                  |d     d$|d%          }tI        |t>        jJ                        rk|jB                  |v r|j'                  d        j                  j                  d&i       j                  t1        |            x}r|d'k(  r|j'                  d(        j2                  rh j2                  D ]Y  }d|v st?        jD                  |d         t?        jD                  |d          k(  s:|d   d(k(  sCd(|vsH|j'                  d(        n |d    jM                         }|d)|d%   ii}|r|||   d<    j4                  j'                  |        d  _'        |j                  d*i       j                  d+      x}r|jQ                          _'         jS                   j                        xs d, _*        y c c}	w )-NifindexifnameunknownUPflagsDOWN	operstatec              3   H   K   | ]  }|d    j                   k(  s|  yw)IndexN)idx.0xr;   s     r<   	<genexpr>z%Interface.__init__.<locals>.<genexpr>i   s      KAAgJ$((4JaK   ""c              3   H   K   | ]  }|d    j                   k(  s|  yw)deviceNnamerO   s     r<   rR   z%Interface.__init__.<locals>.<genexpr>j   s      MAAhK4994LaMrS   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_kindr6   )+r9   rN   rW   
adminstateupperrK   _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routesro   setr   valueadd	ipaddressip_interfacenetwork
ip_addressis_link_local
isinstanceIPv6Addressr:   iproute_typestripquery_networkctl_networkctl)r;   r2   r?   r@   rA   rB   itripfamilydnsv_routesobjelemvalrg   ra_networksrouteaddrrI   ip_addrip_dsrt   s   `                     r<   __init__z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' rs1v;#dhh-/"1vHa&C&&--i#((jmKnefAJJWXZ_L`KnBo.pq	r
 !% DO"1% 6qt9DHH-OO**3qt956
  a=z!}$Ga=z!}$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{{![[ UE		*-5 %		$9 < %		( 3x~~ E#	(>(>uT{(K(S(ST	U  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   Ycon_namec           	          d }	 t        j                  ddddd|g      }|j                         S # t        $ r9}t	        j
                  dj                  |t        |                   Y d }~|S d }~ww xY w)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_ssidzInterface.query_nm_ssid   sx    	/??N4J$)64$C DD::< 	/OOIPP$c!f. / /	/s   */ 	A1.A,,A1rF   c           	          d }	 t        j                  ddd|gd      }|S # t        $ r9}t        j                  dj                  |t        |                   Y d }~|S d }~ww xY w)N
networkctlstatusz--Ttextz"Cannot query networkctl for {}: {})
subprocesscheck_outputr   r   r   r   r   )r;   rF   outputr   s       r<   r   zInterface.query_networkctl   sn    	!,,lHdF-SZ^_F   	!OO@GGA  ! !	!s   ! 	A#.AA#c                    | j                   | j                  | j                  d}| j                  r| j                  |d<   | j                  r| j                  |d<   | j
                  r| j
                  |d<   | j                  r| j                  |d<   | j                  r| j                  |d<   | j                  r| j                  |d<   | j                  r| j                  |d<   | j                  r| j                  |d	<   | j                  r| j                  |d
<   | j                  r| j                  |d<   | j                  r| j                  |d<   | j                  r| j                  |d<   | j                  r| j                  |d<   | j                   r| j                   |d<   | j"                  r| j"                  |d<   | j$                  r| j$                  |d<   | j&                  |fS )N)indexru   rK   rc   r   tunnel_modebackendr   rx   vendorro   r   r   r   activation_moder   r   r&   
interfaces)rN   ru   rK   rc   r   r   r   	netdef_idrx   r   ro   r   r   r   r   r   r   r&   ry   rW   )r;   jsons     r<   r   z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                 B    | j                   dk(  xr | j                  dk(  S )NrH   ru   rK   r;   s    r<   upzInterface.up  s    $&A4>>T+AAr>   c                 B    | j                   dk(  xr | j                  dk(  S )NrJ   r   r   s    r<   downzInterface.down  s    &(ET^^v-EEr>   c                 X   | j                   r| j                   j                  d      nd }|dk(  r| j                   j                  d      }|dk(  r| j                   j                  d      x}r|}t        j                  |      x}r|S t        j                  dj                  |             y )Nr   noneKindr   zUnknown device type: {})r|   r9   DEVICE_TYPESr   r   r   )r;   nd_typekinddevice_types       r<   rc   zInterface.type  s    )-$''++f%dfggkk&)Ggww{{6**t*&**733;3188ABr>   c                 R    | j                   dk(  r| j                  r| j                  S y )Nr   )rc   r   r   s    r<   r   zInterface.tunnel_mode(  s%    99 T%6%6$$$r>   c                     | j                   r=d| j                   j                  dd      vrd| j                   j                  dd      v ry| j                  rd| j                  j                  dd      v ry	y )
N	unmanaged
SetupStater6   run/systemd/network/10-netplan-NetworkFilenetworkd.run/NetworkManager/system-connections/netplan-filenameNetworkManager)r|   r9   r}   r   s    r<   r   zInterface.backend.  sa    GG477;;|R#@@1TWW[[PR5SSWWITWW[[YcegMhh#r>   c                    | j                   dk(  r@| j                  j                  dd      j                  d      d   j                  d      d   S | j                   dk(  r| j                  j                  d	d      j                  d
      d   j                  d      d   }| j                  j                  dd      dk(  r| j                  | j                  j                  d            }||vrR|j                  d      }|D cg c]  }t        |       }}dj                  |      dz   }t        j                  |      }|r|j                  d|z         d   }|S y c c}w )Nr   r   r6   r   r   z.networkr   r   r   r   z.nmconnectionrc   z802-11-wirelessrW   utf-8;-)r   r|   r9   splitr}   r   encoder   r   r   quote)r;   netdefr   ssid_encodedb
ssid_bytesssid_nm_escapeds          r<   r   zInterface.netdef_id8  sI   <<:%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*=>v% $(;;w#7L2>!?Q#a&!?J!?&)hhz&:S&@O !;;7D#\\#*5a8FM "@s   Ec                     | j                   r:d| j                   v r,| j                   d   r| j                   d   j                         S y )NVendor)r|   r   r   s    r<   r   zInterface.vendorW  s:    77x477*twwx/@778$**,,r>   c                    | j                   dk(  r| j                  dk(  r+| j                  | j                  j	                  dd            S | j
                  j                         D ]  }|j                         }d}t        j                  ||      x}s.|j                  d      }|j                  d      j                  d      j                  d      j                  d	      }|r|c S d c S  y )
Nr!   r   rW   r6   z!^Wi-?Fi access point: (.*) \(.*\)r   latin1zunicode-escaper   )rc   r   r   r}   r9   r   
splitlinesr   rematchgroupr   decode)r;   linekeyr   r   s        r<   r   zInterface.ssid]  s    99||//))$''++fb*ABB
 ((335 
2zz|:HHS$//5/ ;;q>D
  ;;x0778HIPPQYZaabijD#'41T1
2 r>   c                 D   | j                   dk(  rl| j                  j                         D ]N  }|j                         }d}|j	                  |      s'|t        |      d  j                         }|dk7  r|c S d c S  y | j                   dk(  r| j                  d   dk(  rdS d S y )Nr   zActivation Policy: r   r   autoconnectnomanual)r   r   r   r   
startswithr8   r}   )r;   r   r   modes       r<   r   zInterface.activation_modes  s    <<:% ((335 :zz|+??3'C	?002D#'4<49T9:  \\--#ww}5=8G4Gr>   datac                 L   i }|j                  dg       x}rOi |d<   |D ]E  }t        j                  t        |d               }t	        |j
                        }|d   }||d   |<   G |j                  dg       x}ri |d<   |D ]  }	|	d   }
|	d   }||d   |
<    |j                  dg       x}rxi |d	<   |D ]n  }t        j                  t        |d               }|d
   }t        j                  t	        |j
                        d| z         }t	        |      }|d   }||d	   |<   p |S )NDNSr   AddressConfigSourceSearchDomainssearchDomain	Addressesro   PrefixLengthrm   )r9   r   r   bytesr   r2   )r;   r   sourcesro   r   r   addr_strsourcedomainsr   domainr2   rr   	full_addrs                 r<   r~   zInterface._find_data_sources  sk   
  ++9+GEN  2 --eC	N.CDtww<^,+1x(	2 hh3373 "GH! 3)/,2!&)3 b1191#%GK  8 --eByM.BCN+%223tww<AfX,3NO	y>N+17$X.8 r>   N)__name__
__module____qualname__dictr   rw   r   tupler   r   r   r   propertyboolr   r   rc   r   r   r   r   r   r   r~    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                   ^   e Zd ZdZddZedefd       Zedede	fd       Z
ededefd	       Zedefd
       Zedefd       Zedefd       Zedefd       Zedefd       Zedefd       Zedefd       Zededee   fd       Zedee   ddfd       Zedefd       ZdefdZy)SystemConfigStatez- Collects the system's network configuration Nc                    t        j                  d      slt        j                  d      r*t        j                  d       t        j                  d       t        j                  d       t        j                  ddgd       | j                         }| j                         }|r|s*t        j                  d       t        j                  d       | j                         }| j                         \  }}| j                         \  }}	|D 
cg c]  }
t        |
||||	f||f       c}
| _        | j!                  | j                         | j                  D 
cg c]  }
|
j"                  dk7  s|
 }}
| j%                  |      }r t'        fd	| j                  D        d       g}|D cg c]  }||	 }}r>|g k(  r9t        j                  d
j)                               t        j                  d       d|| j+                         di| _        |r| j                  n|}|D ]$  }
|
j/                         \  }|| j,                  <   & y c c}
w c c}
w c c}w )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-networkdrJ   c              3   B   K   | ]  }|j                   k(  s|  y wNrV   )rP   itfrF   s     r<   rR   z-SystemConfigState.__init__.<locals>.<genexpr>  s     WcCHHPVDVcWs   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_uplinkrK   query_online_stater{   r   resolvconf_jsonstater   )r;   rF   alliproute2r   nmcliroute4route6r   r   r  filteredonline_stater   itf_iterr   s    `              r<   r   zSystemConfigState.__init__  s*   (()CD(()CD 1 2 MMOPOOG&@%A4H &&(&&(xMMHIHHQK **,$($7$7$9!z GOP?B  )hz?Z*0&)9 ; P 	))$*=*=> $(#6#6RC#--6:QCRR..x8 WT-@-@WY]^_H%-BT1ADBBh"nMM7>>vFGHHQK #&#335%

 +.4&&8 	%C((*KFC!$DJJv	%9P S Cs   I
I+I(I0Ir3   c                    g g d d}	 t        d      5 }|j                         }d|v rd|d<   n	d|v rd|d<   |g|j                         z   D ]Y  }|j                  d      r|d	xx   |j	                         d
d  z  cc<   |j                  d      sD|j	                         d
d  |d<   [ 	 d d d        |S # 1 sw Y   |S xY w# t
        $ r8}t        j                  dj                  t        |                   Y d }~|S d }~ww xY w)N)ro   r   r   z/etc/resolv.confz/# This is /run/systemd/resolve/stub-resolv.confstubr   z*# This is /run/systemd/resolve/resolv.confcompat
nameserverro   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&  z!SystemConfigState.resolvconf_json  s    
	P() 9QJJL	D	Q"(CKAYN"*CK&K!++-7 9D|4K(DJJL,<<(x0(,

QR(8H	99 
9 
  	POO?FFs1vNOO
	Ps;   B? A;B2B2(B? 2B<7B? <B? ?	D -C;;D r   c                    |D ]  }|j                   s|j                  s|j                  s*|j                  s7g }|j                  D ]>  }t	        |j                               d   \  }}d|vsd|d   vs.|j                  |       @ |j                  D cg c]  }|j                  dd       dk(  s| }}|s|s|j                  s y yc c}w )Nr   rI   rk   r[   ri   TF)r   ro   r   r   listitemsr   r9   )	r7  r   r  non_local_ipsr   r2   extrarQ   default_routess	            r<   r%  z$SystemConfigState.query_online_state  s      		 Cvv#--CJJ3;L;L "MM 1D $TZZ\ 21 5IBe+vU7^/K%,,R01 .1ZZ!Z155t;LPY;Y!!Z!Z ^8I8I		   "[s   C2C
cmd_outputc                 ,    t        j                  |      S r  r   loadsr7  rA  s     r<   process_genericz!SystemConfigState.process_generic  s    zz*%%r>   c                     d }	 t        j                  g dd      }| j                  |      }|S # t        $ r8}t	        j
                  dj                  t        |                   Y d }~|S d }~ww xY w)N)r2   -d-jr   Tr   z(Cannot query iproute2 interface data: {})r   r   rF  r   r   criticalr   r   r7  r   r   r   s       r<   r  z SystemConfigState.query_iproute2  su    	X$112L7;=F&&v.D   	XGNNsSTvVWW	X   *0 	A1-A,,A1c                 2    t        j                  |      d   S )N
InterfacesrC  rE  s     r<   process_networkdz"SystemConfigState.process_networkd  s    zz*%l33r>   c                     d }	 t        j                  ddgd      }| j                  |      }|S # t        $ r8}t	        j
                  dj                  t        |                   Y d }~|S d }~ww xY w)Nr   --json=shortTr   z(Cannot query networkd interface data: {})r   r   rO  r   r   rJ  r   r   rK  s       r<   r  z SystemConfigState.query_networkd  sy    	X$11<2P7;=F''/D   	XGNNsSTvVWW	XrL  c           
          g }|j                         D ]I  }|j                  d      }|d   r|d   nd }|s#|j                  ||d   |d   |d   |d   |d   d       K |S )	N:r   r   rX            )rU   rW   uuidr   rc   r   )r   r   r   )r7  rA  r   r   r   rZ   s         r<   
process_nmzSystemConfigState.process_nm*  s~    ))+ 	DJJsOE#Ah%(DC!!!H!!H %a!!H#(8 		 r>   c                     d }	 t        j                  g d      }| j                  |      }|S # t        $ r8}t	        j
                  dj                  t        |                   Y d }~|S d }~ww xY w)N)z-tz-fz*DEVICE,NAME,UUID,FILENAME,TYPE,AUTOCONNECTr   r   z.Cannot query NetworkManager interface data: {})r   r   rX  r   r   r  r   r   rK  s       r<   r   zSystemConfigState.query_nm;  sr    	[// +: ;F >>&)D   	[MMJQQRUVWRXYZZ	[s   (. 	A/-A**A/c                    d }d }	 t        j                  g dd      }| j                  |      }t        j                  g dd      }| j                  |      }|r(|D ]#  }|j                  dt        j                  i       % |r(|D ]#  }|j                  dt        j                  i       % ||fS # t        $ r7}t	        j
                  dj                  t        |                   Y d }~d }~ww xY w)N)r2   rH  rI  z-4r   r   rf   r(  Tr   )r2   rH  rI  z-6r   r   rf   r(  z$Cannot query iproute2 route data: {}r]   )r   r   rF  r   r   r  r   r   updater   r   r   )r7  data4data6output4output6r   r   s          r<   r!  zSystemConfigState.query_routesG  s    	Q%223l8<>G--g6E%223l8<>G--g6E  8h678 9h789u~  	QMM@GGAOPP	Qs   AB2 2	C2;-C--C2c                    d }d }	 t        j                  d      }|t        d      t        j                  |ddddddd	d
dg
d      }t        j                  |      }|j                  di g      d   }|j                  di       j                  d      dk(  sJ d       |j                  di       j                  d      }|j                  di       j                  d      dk(  sJ d       |j                  di       j                  d      }||fS # t        $ r,}t        j                  dt        |             Y d }~||fS d }~ww xY w)Nbusctlzmissing busctl utilityrQ  callz--systemzorg.freedesktop.resolve1z/org/freedesktop/resolve1zorg.freedesktop.DBus.PropertiesGetAllsz org.freedesktop.resolve1.ManagerTr   r   r   r   rc   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   rD  r9   r   r   r  r   )r7  ro   r   ra  json_outr8  r   errs           r<   r"  z SystemConfigState.query_resolved_  s\   		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 6""  	JMM>CII6""	Js   DD 	EE  ErF   c           	      N   g }d}	 t        j                  dddddd|gd	      }t        j                  |      }|D ]"  }|j                  |j                  d             $ |S # t        $ r9}t        j                  d
j                  t        |                   g cY d}~S d}~ww xY w)zO Return a list containing the interfaces that are members of a bond/bridge/vrf Nr2   rH  rI  rk   r   masterTr   zCannot query bridge: {}rF   )r   r   r   r   r   r   r   r   rD  r   r9   )r7  rF   ry   r   r   output_jsonmembers          r<   query_memberszSystemConfigState.query_members}  s     	,,tT668VD4QF jj(! 	1FNN6::h/0	1   	OO5<<SVDEI	s   A" "	B$+.BB$B$c                   	 g d	i }t        t              }t        	fd|      D ]a  }| j                  |j                        }|D ]0  }t        dddg      } ||j                  |j                        ||<   2 |||j                  <   c |D ]  }|j                  |j                        x}r`|j                  dk(  r|j                  |_        |j                  dk(  r|j                  |_	        |j                  dk(  r|j                  |_
        |j                  	v s|j                  |j                        x}s||_         y	)
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                      | j                   v S r  )rc   )iuplink_typess    r<   <lambda>z@SystemConfigState.correlate_members_and_uplink.<locals>.<lambda>  s    !&&L*@ r>   MemberrW   rc   r   r   r&   N)r   r<  filterro  rW   r   rc   r9   r   r   r&   ry   )
r7  r   members_to_uplinkuplink_to_members	interfacery   rn  member_tupleuplinkrs  s
            @r<   r$  z.SystemConfigState.correlate_members_and_uplink  s2    1'- @*M 	8I''	7G! Y)(VV4DE,8,X!&)Y 18inn-	8 $ 	0I*..y~~>>v>;;(*'-{{I$;;&(%+[[IN;;%'$*KKIM~~-/33INNCC7C(/I%	0r>   c                 ,    t        | j                        S r  )r8   r#  r   s    r<   number_of_interfacesz&SystemConfigState.number_of_interfaces  s    4&&''r>   c                     | j                   S r  )r'  r   s    r<   get_datazSystemConfigState.get_data  s    zzr>   )NF)r  r  r  __doc__r   classmethodr	  r&  r<  r  r%  r   r   rF  r  rO  r  rX  r   r
  r!  r"  r
   ro  r1   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                   0    e Zd ZdZddZdefdZdefdZy)NetplanConfigStatez. Collects the Netplan's network configuration c                 R   t        j                         }|j                  |       t        j                         }|j	                  |       |j
                  | _        t               | _        |dk(  r|j                  | j                         y |j                  d      sdj                  d|f      }t        j                  d|      }|D cg c]  }|j                  dd       }}t               }|j                  |       t        j                  ||| j                         y c c}w )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   zNetplanConfigState.__init__  s    !""7+==?&&v.''Z
eDJJ7%%i0((Iw#78hh|W5G<CDDt||E3/DGDZFF3&&w

C	 Es   D$r3   c                 6    | j                   j                         S r  )r'  getvaluer   s    r<   __str__zNetplanConfigState.__str__  s    zz""$$r>   c                 \    t        j                  | j                  j                               S r  )yaml	safe_loadr'  r  r   s    r<   r  zNetplanConfigState.get_data  s    ~~djj11344r>   N)r(  rm   )	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   rf  r   r  collectionsr   r   ior   socketr   r   r   typingr	   r
   r   r   urllibr   r  r  r6   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>   