+
    €DAiË‰  ã                   ó¬   € ^ RI Ht ^ RIt^ RIt^ RIHtHt ^ RIHt ^ RI	H
t
 ^ RIHtHtHt ^ RIHtHt  ! R R	]P$                  4      t ! R
 R4      tR# )é    )ÚdefaultdictN)ÚAF_INETÚAF_INET6)ÚAbstractSet)ÚNetplanRoute)ÚSystemConfigStateÚNetplanConfigStateÚDEVICE_TYPES)Úis_valid_macaddressÚroute_table_lookupc                   ó&   a € ] tR t^t o R tRtV tR# )ÚDiffJSONEncoderc                óŒ   € \        V\        4      '       d   VP                  4       # \        P                  P                  W4      # ©N)Ú
isinstancer   Úto_dictÚjsonÚJSONEncoderÚdefault)ÚselfÚobjs   &&Ú0/usr/share/netplan/netplan_cli/cli/state_diff.pyr   ÚDiffJSONEncoder.default   s4   € Ü�cœ<×(Ò(Ø—;‘;“=Ð ô ×Ñ×'Ñ'¨Ó2Ð2ó    © N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r   Ú__static_attributes__Ú__classdictcell__©Ú__classdict__s   @r   r   r      s   ø‡ € ÷3ð 3r   r   c                   óÆ  a € ] tR t^&t o RtV 3R lR ltV 3R lR ltR2V 3R lR lltV 3R lR	 ltV 3R
 lR lt	V 3R lR lt
V 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltV 3R  lR! ltV 3R" lR# ltV 3R$ lR% ltV 3R& lR' ltV 3R( lR) ltV 3R* lR+ ltV 3R, lR- ltV 3R. lR/ ltR0tV tR1# )3ÚNetplanDiffStatez­
DiffState is mainly responsible for getting both system's and Netplan's configuration
state, compare them and provide a data-structure containing the differences it found.
c                ó&   <€ V ^8„  d   QhRS[ RS[/# )é   Úsystem_stateÚnetplan_state)r   r	   )Úformatr#   s   "€r   Ú__annotate__ÚNetplanDiffState.__annotate__,   s   ø€ ÷ +ñ +Ñ%6ð +ÑGYñ +r   c                ó,   € Wn         W n        / V n        R # r   )r(   r)   Úroute_lookup_table_names)r   r(   r)   s   &&&r   Ú__init__ÚNetplanDiffState.__init__,   s   € Ø(ÔØ*Ôà(*ˆÖ%r   c                ó    <€ V ^8„  d   QhRS[ /# ©r'   Úreturn©Údict)r*   r#   s   "€r   r+   r,   2   s   ø€ ÷ ñ ¡ñ r   c                ó`  € R/ /pV P                  4       pV P                  4       p\        \        VP	                  4       4      \        VP	                  4       4      ,           4      pV F  p/ VR,          V&   K  	  VP                  4        F$  w  rVVR,          V,          P                  V4       K&  	  VP                  4        F$  w  rVVR,          V,          P                  V4       K&  	  V P                  P                   F*  pVP                  VR,          VP                  ,          R&   K,  	  V# )zs
Return the states of both the system and Netplan in a common representation
that makes it easier to compare them.
Ú
interfacesÚdata_sources)Ú_get_system_interfacesÚ_get_netplan_interfacesÚsetÚlistÚkeysÚitemsÚupdater(   Úinterface_listr8   Úname)r   Ú
full_stateÚsystem_interfacesÚnetplan_interfacesÚall_interfacesÚ	interfaceÚconfigs   &      r   Úget_full_stateÚNetplanDiffState.get_full_state2   s  € ð ˜"ð
ˆ
ð !×7Ñ7Ó9ÐØ!×9Ñ9Ó;Ðô œTÐ"3×"8Ñ"8Ó":Ó;¼dÐCU×CZÑCZÓC\Ó>]Õ]Ó^ˆÛ'ˆIØ24ˆJ�|Õ$ YÓ/ñ (ð "3×!8Ñ!8Ö!:ÑˆIØ�|Õ$ YÕ/×6Ñ6°vÖ>ñ ";ð "4×!9Ñ!9Ö!;ÑˆIØ�|Õ$ YÕ/×6Ñ6°vÖ>ñ "<ð ×*Ñ*×9Ô9ˆIØGP×G]ÑG]ˆJ�|Õ$ Y§^¡^Õ4°^ÓDñ :ð Ðr   c                ó&   <€ V ^8„  d   QhRS[ RS[/# )r'   rF   r3   )Ústrr5   )r*   r#   s   "€r   r+   r,   O   s   ø€ ÷ 'ñ '¡#ð '©tñ 'r   c                ó,  € V P                  4       pV P                  VP                  R/ 4      4      pV'       d    VP                  V4      ;p'       d   W/pM/ pV P                  4       pV P	                  WQ4       VP                  4        F×  w  rVP                  R/ 4      P                  R4      pVP                  R/ 4      P                  R4      pV P                  WaV4      pV P                  WH4       V P                  WH4       V P                  WH4       V P                  WH4       V P                  WH4       V P                  WH4       VR,          P                  V4       KÙ  	  \        \        VR,          P                  4       R R7      4      VR&   V# )aV  
Compare the configuration of interfaces currently found in the system against Netplan configuration.
A number of heuristics are used to eliminate configuration that is automatically set in the system,
such as certain routes and IP addresses. That is necessary because this configuration will not be found
in Netplan. For example, if Netplan is enabling DHCP on an interface and not defining any extra IP addresses,
we don't count the IPs automatically assigned to the interface as a difference. We do though count the eventual
absence of addresses that should be assigned by DHCP as a difference.
r7   r(   ÚidÚindexc                 ó2   € V ^,          P                  R4      # )é   rN   )Úget)Úifaces   &r   Ú<lambda>Ú+NetplanDiffState.get_diff.<locals>.<lambda>u   s   € Ð[`ÐabÕ[c×[gÑ[gÐhoÔ[pr   ©Úkey)rH   Ú_get_comparable_interfacesrQ   Ú_create_new_reportÚ_analyze_missing_interfacesr>   Ú_create_new_ifaceÚ_analyze_ip_addressesÚ_analyze_nameserversÚ_analyze_search_domainsÚ_analyze_mac_addressesÚ_analyze_routesÚ_analyze_parent_linksr?   r5   Úsorted)	r   rF   rB   r7   rG   ÚreportÚ	netdef_idrN   rR   s	   &&       r   Úget_diffÚNetplanDiffState.get_diffO   s_  € ð ×(Ñ(Ó*ˆ
Ø×4Ñ4°Z·^±^ÀLÐRTÓ5UÓVˆ
çØ#Ÿ™¨	Ó2Ð2ˆvÖ2Ø'Ð0‘
à�
à×(Ñ(Ó*ˆà×(Ñ(¨Ô;à!+×!1Ñ!1Ö!3ÑˆIØŸ
™
 >°2Ó6×:Ñ:¸4Ó@ˆIØ—J‘J˜~¨rÓ2×6Ñ6°wÓ?ˆEØ×*Ñ*¨9ÀÓGˆEà×&Ñ& vÔ5Ø×%Ñ% fÔ4Ø×(Ñ(¨Ô7Ø×'Ñ'¨Ô6Ø× Ñ  Ô/Ø×&Ñ& vÔ5à�<Õ ×'Ñ'¨Ö.ñ "4ô  $¤F¨6°,Õ+?×+EÑ+EÓ+GÑMpÔ$qÓrˆˆ|ÑØˆr   c                ó    <€ V ^8„  d   QhRS[ /# r2   r4   )r*   r#   s   "€r   r+   r,   x   s   ø€ ÷ 
ñ 
¡Dñ 
r   c                ó   € R / R/ R/ /# )r7   Úmissing_interfaces_systemÚmissing_interfaces_netplanr   )r   s   &r   rX   Ú#NetplanDiffState._create_new_reportx   s   € à˜"Ø'¨Ø(¨"ð
ð 	
r   c                ó2   <€ V ^8„  d   QhRS[ RS[ RS[RS[/# )r'   rc   rF   rN   r3   )rK   Úintr5   )r*   r#   s   "€r   r+   r,      s)   ø€ ÷ 	
ñ 	
©3ð 	
¹3ð 	
Ásð 	
Étñ 	
r   c                ó   € VR VRVRVR/ R/ //# )rN   rA   rM   r(   r)   r   )r   rc   rF   rN   s   &&&&r   rZ   Ú"NetplanDiffState._create_new_iface   s-   € àØ˜Ø˜	Ø�iØ Ø ðð
ð 	
r   c                ó*   <€ V ^8„  d   QhRS[ RS[ RR/# ©r'   rG   rR   r3   Nr4   )r*   r#   s   "€r   r+   r,   Š   s"   ø€ ÷ >ñ >©Dð >¹ð >À$ñ >r   c                ó  € \        VP                  4       4      ^ ,          pVP                  R/ 4      P                  R. 4       Uu0 uF  qDkK  	  ppV P                  V4      pVP                  R/ 4      P                  RR4      pVP                  R/ 4      P                  RR4      pVP                  R/ 4      P                  R. 4      p\	        4       p	VP                  R/ 4      P                  R/ 4      P                  4        EF²  w  r«\        P                  ! V
4      pVP                  R. 4      p0 RmP                  V4      '       g   V	P                  V
4       RV9   d—   VP                  '       d…   \        VP                  \        P                  4      '       d   RV9  d   V	P                  V
4       \        VP                  \        P                  4      '       d   RV9  d   V	P                  V
4       \        VP                  \        P                  4      '       d   R	R
0P                  V4      '       d   Rp\        VP                  \        P                  4      '       d
   R	V9   d   RpVP                  R/ 4      P                  R4      pRV9   g   EK˜  VRJ g   EK¡  V	P                  V
4       EKµ  	  VP                  V	4      pV	P                  V4      pV'       d   RW#,          R,          R&   V'       d   RW#,          R,          R&   V'       d3   W#,          R,          P!                  R\        \#        V4      4      /4       V'       d5   W#,          R,          P!                  R\        \#        V4      4      /4       R# R# u upi )r   r)   Ú	addressesÚdhcp4FÚdhcp6Ú
link_localr(   ÚflagsÚdhcpÚdynamicÚlinkÚraÚipv4Úipv6Ú	accept_raTÚmissing_dhcp4_addressÚmissing_dhcp6_addressÚmissing_addressesN>   rz   rw   ry   rx   )r<   r=   rQ   Ú_normalize_ip_addressesr;   r>   Ú	ipaddressÚip_interfaceÚintersectionÚaddÚis_link_localr   ÚipÚIPv4AddressÚIPv6AddressÚ
differencer?   ra   )r   rG   rR   rA   r‡   Únetplan_ipsr~   r   ru   Ú
system_ipsÚaddrÚ	addr_datarv   r}   Úpresent_only_in_netplanÚpresent_only_in_systems   &&&             r   r[   Ú&NetplanDiffState._analyze_ip_addressesŠ   sÓ  € Ü�E—J‘J“LÓ! !Õ$ˆØ$*§J¡J¨ÀÓ$C×$GÑ$GÈÐUWÔ$XÓYÑ$X˜b’rÑ$XˆÐYØ×2Ñ2°;Ó?ˆà &§
¡
¨?¸BÓ ?× CÑ CÀGÈUÓ SÐØ &§
¡
¨?¸BÓ ?× CÑ CÀGÈUÓ SÐØ—Z‘Z °Ó4×8Ñ8¸ÀrÓJˆ
Ü“Uˆ
Ø%Ÿz™z¨.¸"Ó=×AÑAÀ+ÈrÓR×XÑX×Z‰OˆDÜ×'Ò'¨Ó-ˆBØ—M‘M '¨2Ó.ˆEò 5×AÑAÀ%×HÒHØ—‘˜tÔ$ð
 ˜Œ 2×#3×#3Ð#3Ü˜bŸe™e¤Y×%:Ñ%:×;Ò;ÀÈjÔ@XØ—N‘N 4Ô(Ü˜bŸe™e¤Y×%:Ñ%:×;Ò;ÀÈjÔ@XØ—N‘N 4Ô(ô ˜"Ÿ%™%¤×!6Ñ!6×7Ò7Ø˜IÐ&×3Ñ3°E×:Ò:Ø,1Ð)Ü˜"Ÿ%™%¤×!6Ñ!6×7Ò7Ø˜U”?Ø,1Ð)ð Ÿ
™
 ?°BÓ7×;Ñ;¸KÓHˆIØ�u�} ¨eÖ!3Ø—‘˜t×$ñE  [ðH #.×"8Ñ"8¸Ó"DÐØ!+×!6Ñ!6°{Ó!CÐç ØCGˆE�K˜Õ'Ð(?Ñ@ç ØCGˆE�K˜Õ'Ð(?Ñ@ç!Ø�K˜Õ(×/Ñ/Ø#¤T¬&Ð1GÓ*HÓ%Ið1ô ÷ #Ø�K˜Õ'×.Ñ.Ø#¤T¬&Ð1HÓ*IÓ%Jð0ö ñ #ùòs Zs   Á
Nc                ó&   <€ V ^8„  d   QhRS[ RS[ /# )r'   r7   r3   r4   )r*   r#   s   "€r   r+   r,   Ê   s   ø€ ÷ ñ ±Tð ¹dñ r   c                óæ   € / pVP                  4        FZ  w  r4VP                  R4      e   VP                  R4      f   K-  VP                  R/ 4      P                  R4      '       g   KV  WBV&   K\  	  V# )aˆ  In order to compare interfaces, they must exist in the system AND in Netplan.
Here we filter out interfaces that don't have a system_state, a netplan_state
or a netdef ID.

There is a special case where the interface will have a system_state and a netdef_id
but will be missing in Netplan. That will happen when the user removes the interface
only from Netplan but doesn't run netplan apply.
r(   r)   rM   )r>   rQ   )r   r7   ÚfilteredrF   rG   s   &&   r   rW   Ú+NetplanDiffState._get_comparable_interfacesÊ   sm   € ð ˆà!+×!1Ñ!1Ö!3ÑˆIØ�z‰z˜.Ó)Ò1°V·Z±ZÀÓ5PÒ5XÙà—:‘:˜n¨bÓ1×5Ñ5°d×;Ò;Ùà"(�YÓñ "4ð ˆr   c                ó&   <€ V ^8„  d   QhRS[ RS[ /# )r'   rr   r3   ©r;   )r*   r#   s   "€r   r+   r,   à   s   ø€ ÷ 	ñ 	±ð 	¹ñ 	r   c                óp   € \        4       pV F%  pV P                  V4      pVP                  V4       K'  	  V# )z\Apply some transformations to IP addresses so their representation
will match the system's.
)r;   Ú_compress_ipv6_addressr…   )r   rr   Únew_ips_setr‡   s   &&  r   r�   Ú(NetplanDiffState._normalize_ip_addressesà   s9   € ô “eˆÛˆBØ×,Ñ,¨RÓ0ˆBØ�O‰O˜BÖñ ð Ðr   c                ó&   <€ V ^8„  d   QhRS[ RS[ /# )r'   Úaddressr3   )rK   )r*   r#   s   "€r   r+   r,   ë   s   ø€ ÷ ñ ©cð ±cñ r   c                ó¦   €  \         P                  ! V4      pRV9   d   VP                  # \        VP                  4      #   \
         d    Tu # i ; i)zÄ
Compress IPv6 addresses to match the system representation
Example: 1:2:0:0::123/64 -> 1:2::123/64
         1:2:0:0::123 -> 1:2::123
If "address" is not an IPv6Address, return the original value
Ú/)r‚   rƒ   Úwith_prefixlenrK   r‡   Ú
ValueError)r   r�   r�   s   && r   r™   Ú'NetplanDiffState._compress_ipv6_addressë   sL   € ð	Ü×)Ò)¨'Ó2ˆDØ�gŒ~Ø×*Ñ*Ð*Ü�t—w‘w“<ÐøÜô 	ØŠNð	ús   ‚(A  «A  Á AÁAc                ó*   <€ V ^8„  d   QhRS[ RS[ RR/# rp   r4   )r*   r#   s   "€r   r+   r,   ú   s"   ø€ ÷ ;ñ ;©4ð ;¹ð ;Àñ ;r   c                ó¨  € \        VP                  4       4      ^ ,          pVP                  R/ 4      P                  R/ 4      p\        VP                  R/ 4      P                  R. 4      4      p\        VP                  R/ 4      P                  R. 4      4      pV Uu0 uF  qtV,          R8X  g   K  VkK  	  ppV Uu0 uF  qtV,          R8X  g   K  VkK  	  p	pV Uu0 uF  qtV,          R8X  g   K  VkK  	  p
pVP                  R/ 4      P                  R	4      R
JpRVP                  R/ 4      P                  R. 4      9   pV'       g   V	'       g	   V
'       dr   VP                  R/ 4      P                  R4      '       d	   Wh,
          pV'       d	   Wi,
          pV Uu0 uF  qwV
9   g   K  VkK  	  ppV'       d   V'       d	   Wm,
          pMäV'       gÝ   VP                  R/ 4      P                  R4      '       dH   V Uu0 uF;  p\	        \
        P                  ! V4      \
        P                  4      '       d   K9  VkK=  	  ppVP                  R/ 4      P                  R4      '       dH   V Uu0 uF;  p\	        \
        P                  ! V4      \
        P                  4      '       d   K9  VkK=  	  ppVP                  V4      pVP                  V4      pV'       d*   W#,          R,          P                  R\        V4      /4       V'       d,   W#,          R,          P                  R\        V4      /4       R# R# u upi u upi u upi u upi u upi u upi )r   r8   Údnsr)   Únameservers_addressesr(   ÚDHCPv4ÚDHCPv6ÚNDiscr}   Fr|   ru   rs   rt   Úmissing_nameservers_addressesN)r<   r=   rQ   r;   r   r‚   Ú
ip_addressrˆ   r‰   rŠ   r?   )r   rG   rR   rA   r8   Únetplan_nameserversÚsystem_nameserversÚnsÚdhcp4_nsÚdhcp6_nsÚndisc_nsÚaccept_ra_enabledÚlink_local_enabledÚlink_local_nsr�   r�   s   &&&             r   r\   Ú%NetplanDiffState._analyze_nameserversú   så  € Ü�E—J‘J“LÓ! !Õ$ˆØ—z‘z .°"Ó5×9Ñ9¸%ÀÓDˆô
 " &§*¡*¨_¸bÓ"A×"EÑ"EÐF]Ð_aÓ"bÓcÐÜ  §¡¨N¸BÓ!?×!CÑ!CÐD[Ð]_Ó!`ÓaÐá!-ÓN¡˜2¸bÕ1AÀXÑ1M—B�B¡ˆÐNÙ!-ÓN¡˜2¸bÕ1AÀXÑ1M—B�B¡ˆÐNÙ!-ÓM¡˜2¸bÕ1AÀWÑ1L—B�B¡ˆÐMð #ŸJ™J ¸Ó;×?Ñ?ÀÓLÐTYÐYÐØ# v§z¡z°/À2Ó'F×'JÑ'JÈ<ÐY[Ó'\Ñ\Ðç—x§8Ø�z‰z˜/¨2Ó.×2Ñ2°7×;Ò;Ø%7Õ%BÐ"÷ !Ø%7Õ%BÐ"á*<ÓOÑ*< BÀhÁŸR˜RÑ*<ˆMÐOß!×&7Ø%7Õ%GÐ"ø÷ 'Ø—:‘:˜o¨rÓ2×6Ñ6°w×?Ò?Ù7Ió *nÑ7I°Ü1;¼I×<PÒ<PÐQSÓ<TÔV_×VkÑVk×1l÷ +-¨"Ñ7IÐ&ð *nà—:‘:˜o¨rÓ2×6Ñ6°w×?Ò?Ù7Ió *nÑ7I°Ü1;¼I×<PÒ<PÐQSÓ<TÔV_×VkÑVk×1l÷ +-¨"Ñ7IÐ&ð *nð #6×"@Ñ"@ÐASÓ"TÐØ!3×!>Ñ!>Ð?RÓ!SÐç!Ø�K˜Õ(×/Ñ/Ø/´Ð6LÓ1Mð1ô ÷ #Ø�K˜Õ'×.Ñ.Ø/´Ð6MÓ1Nð0ö ñ #ùò] OùÚNùÚMùò Pùò*nùò*nsH   ÂL6Â1L6Â=L;ÃL;ÃM Ã1M ÆMÆ)MÇ=6M
È8M
É+6MÊ&Mc                ó*   <€ V ^8„  d   QhRS[ RS[ RR/# rp   r4   )r*   r#   s   "€r   r+   r,   7  s"   ø€ ÷ %ñ %©dð %¹4ð %ÀDñ %r   c                ó|  € \        VP                  4       4      ^ ,          p\        VP                  R/ 4      P                  R. 4      4      p\        VP                  R/ 4      P                  R. 4      4      pVP                  R/ 4      P                  R/ 4      pV Uu0 uF  qvV,          R8X  g   K  VkK  	  ppV Uu0 uF  qvV,          R8X  g   K  VkK  	  p	pV'       g	   V	'       dd   VP                  R/ 4      P                  R4      '       d	   WX,
          pVP                  R/ 4      P                  R	4      R
Jp
V
'       d	   WY,
          pM`V'       gY   VP                  R/ 4      P                  R4      '       g(   VP                  R/ 4      P                  R4      '       d   \        4       pVP	                  V4      pVP	                  V4      pV'       d*   W#,          R,          P                  R\        V4      /4       V'       d,   W#,          R,          P                  R\        V4      /4       R# R# u upi u upi )r   r)   Únameservers_searchr(   r8   Úsearchr§   r¨   rs   r}   Frt   Úmissing_nameservers_searchN)r<   r=   r;   rQ   rŠ   r?   )r   rG   rR   rA   Únetplan_search_domainsÚsystem_search_domainsr8   ÚsÚdhcp4_searchÚdhcp6_searchr²   r�   r�   s   &&&          r   r]   Ú(NetplanDiffState._analyze_search_domains7  sá  € Ü�E—J‘J“LÓ! !Õ$ˆÜ!$ V§Z¡Z°ÀÓ%D×%HÑ%HÐI]Ð_aÓ%bÓ!cÐÜ # F§J¡J¨~¸rÓ$B×$FÑ$FÐG[Ð]_Ó$`Ó aÐØ—z‘z .°"Ó5×9Ñ9¸(ÀBÓGˆÙ#/ÓO¡<˜aÀµ?ÀhÑ3NŸ˜¡<ˆÐOÙ#/ÓO¡<˜aÀµ?ÀhÑ3NŸ˜¡<ˆÐOçŸ<Ø�z‰z˜/¨2Ó.×2Ñ2°7×;Ò;Ø(=Õ(LÐ%ð !'§
¡
¨?¸BÓ ?× CÑ CÀKÓ PÐX]Ð ]Ðß Ø(=Õ(LÐ%ø÷ *Ø—:‘:˜o¨rÓ2×6Ñ6°w×?Ò?À6Ç:Á:ÈoÐ_aÓCb×CfÑCfÐgn×CoÒCoÜ,/«EÐ)à"8×"CÑ"CÐDYÓ"ZÐØ!6×!AÑ!AÐBXÓ!YÐç!Ø�K˜Õ(×/Ñ/Ø,¬dÐ3IÓ.Jð1ô ÷ #Ø�K˜Õ'×.Ñ.Ø,¬dÐ3JÓ.Kð0ö ñ #ùò; PùÚOs   ÂH4Â1H4Â=H9ÃH9c                ó*   <€ V ^8„  d   QhRS[ RS[ RR/# rp   r4   )r*   r#   s   "€r   r+   r,   ^  s"   ø€ ÷ ñ ©Tð ¹$ð À4ñ r   c                ó¸  € \        VP                  4       4      ^ ,          pVP                  R/ 4      P                  R4      pVP                  R/ 4      P                  R4      pV'       d   \        V4      '       g   R# V'       dU   V'       dK   WE8w  dC   W#,          R,          P	                  RV/4       W#,          R,          P	                  RV/4       R# R# R# R# )r   r(   Ú
macaddressr)   NÚmissing_macaddress)r<   r=   rQ   r   r?   )r   rG   rR   rA   Úsystem_macaddressÚnetplan_macaddresss   &&&   r   r^   Ú'NetplanDiffState._analyze_mac_addresses^  s¾   € Ü�E—J‘J“LÓ! !Õ$ˆØ"ŸJ™J ~°rÓ:×>Ñ>¸|ÓLÐØ#ŸZ™Z¨¸Ó<×@Ñ@ÀÓNÐ÷ Ô&9Ð:L×&MÒ&MÙç×!3Ø Ô6Ø•˜NÕ+×2Ñ2Ø(Ð*<ð4ô ð •˜OÕ,×3Ñ3Ø(Ð*;ð5ö ñ	 7ñ "4Ñr   c                ó*   <€ V ^8„  d   QhRS[ RS[ RR/# rp   r4   )r*   r#   s   "€r   r+   r,   q  s"   ø€ ÷ ñ ¡dð ±4ð ¸Dñ r   c                ó~  € \        VP                  4       4      ^ ,          p\        VP                  R/ 4      P                  R. 4      4      p\        VP                  R/ 4      P                  R. 4      4      pV P	                  V4      pV P                  VP                  R/ 4      4      ;p'       d   VP                  V4       VP                  R/ 4      P                  R/ 4       Uu. uF  qwNK  	  ppV P                  WXV4      pVP                  V4      p	VP                  V4      p
V
'       d<   W#,          R,          P                  R\        V
R R7       Uu. uF  q»NK  	  up/4       V	'       d>   W#,          R,          P                  R\        V	R R7       Uu. uF  q»NK  	  up/4       R	# R	# u upi u upi u upi )
r   r)   Úroutesr(   rr   Úmissing_routesc                 ó   € V P                   # r   ©Úto©Úrs   &r   rS   Ú2NetplanDiffState._analyze_routes.<locals>.<lambda>„  s   € Ðcd×cgÒcgr   rU   c                 ó   € V P                   # r   rÍ   rÏ   s   &r   rS   rÑ   ‰  s   € Ðde×dhÒdhr   N)
r<   r=   r;   rQ   Ú_normalize_routesÚ_normalize_gatewaysr?   Ú_filter_system_routesrŠ   ra   )r   rG   rR   rA   Únetplan_routesÚsystem_routesÚnetplan_gatewaysr‡   Úsystem_addressesr�   r�   Úroutes   &&&         r   r_   Ú NetplanDiffState._analyze_routesq  s—  € Ü�E—J‘J“LÓ! !Õ$ˆÜ˜VŸZ™Z¨¸Ó<×@Ñ@ÀÈ2ÓNÓOˆÜ˜FŸJ™J ~°rÓ:×>Ñ>¸xÈÓLÓMˆØ×/Ñ/°Ó?ˆð  $×7Ñ7¸¿
¹
À?ÐTVÓ8WÓXÐXÐÖXØ×!Ñ!Ð"2Ô3ð *0¯©°NÀBÓ)G×)KÑ)KÈKÐY[Ô)\Ó]Ñ)\ 2šBÑ)\ÐÐ]Ø×2Ñ2°=ÐTZÓ[ˆà"0×";Ñ";¸MÓ"JÐØ!.×!9Ñ!9¸.Ó!IÐç!Ø�K˜Õ(×/Ñ/Ø ´fÐ=SÑYgÕ6hÓ"iÑ6h¨U¢5Ñ6hÑ"ið1ô ÷ #Ø�K˜Õ'×.Ñ.Ø ´fÐ=TÑZhÕ6iÓ"jÑ6i¨U¢5Ñ6iÑ"jð0ö ñ #ùò ^ùò #jùò
 #ks   Ã&
F0Å
F5
Æ
F:
c                ó*   <€ V ^8„  d   QhRS[ RS[RR/# )r'   rb   rF   r3   N)r5   rK   )r*   r#   s   "€r   r+   r,   Œ  s"   ø€ ÷ !ñ !±$ð !Á3ð !È4ñ !r   c                óê  a a€ S P                   P                   Uu0 uF  q3kK  	  ppS P                  P                   Uu0 uF"  q3P                  '       g   K  VP                  kK$  	  ppVP                  V4      p\        \        V 3R  lV4      4      p. pS P                  P                   F1  pVP                  V9  g   K  VP                  VP                  4       K3  	  \        V4      p\        V4      pS'       d!   \        V3R lV4      p\        V3R lV4      pS P                  P                  4       pV FU  pS P                   P                  P                  V4      P                  p	R\        P                  ! V	R4      /VR,          V&   KW  	  V FP  pRVP                  V4      P                  RR4      RVP                  V4      P                  R4      /VR,          V&   KR  	  R# u upi u upi )	c                 óh   <€ SP                   P                  P                  V 4      P                  R 8g  # )Úwifis)r)   ÚnetdefsrQ   Útype)Úir   s   &€r   rS   Ú>NetplanDiffState._analyze_missing_interfaces.<locals>.<lambda>“  s(   ø€ ¨T×-?Ñ-?×-GÑ-G×-KÑ-KÈAÓ-N×-SÑ-SÐW^Ò-^r   c                 ó   <€ V S8H  # r   r   ©râ   rF   s   &€r   rS   rã   ž  s	   ø€ ¨A°ªNr   c                 ó   <€ V S8H  # r   r   rå   s   &€r   rS   rã   Ÿ  s	   ø€ ¨1°	ª>r   rá   Úotherrh   rN   ri   N)r)   rà   r(   r@   rc   rŠ   r<   ÚfilterÚappendrA   ra   Úget_datarQ   rá   r
   )
r   rb   rF   rR   rD   Úsystem_interfaces_netdef_idsÚnetplan_onlyÚsystem_onlyr(   Ú
iface_types
   f&f       r   rY   Ú,NetplanDiffState._analyze_missing_interfacesŒ  s«  ù€ Ø15×1CÑ1C×1KÒ1KÓLÑ1K¨šeÑ1KÐÐLØEI×EVÑEV×EeÒEeÓ'yÑEe¸E×ixÕix¬¨¯¬ÑEeÐ$Ð'yà)×4Ñ4Ð5QÓRˆô œFÔ#^Ð`lÓmÓnˆàˆØ×&Ñ&×5Ô5ˆEØ�‰Ð&8Ö8Ø×"Ñ" 5§:¡:Ö.ñ 6ô ˜lÓ+ˆÜ˜[Ó)ˆçÜ!Ô":¸LÓIˆLÜ Ô!9¸;ÓGˆKà×(Ñ(×1Ñ1Ó3ˆã!ˆEØ×+Ñ+×3Ñ3×7Ñ7¸Ó>×CÑCˆJàœ×(Ò(¨°WÓ=ð:ˆFÐ.Õ/°Ó6ñ "ó !ˆEà˜×(Ñ(¨Ó/×3Ñ3°F¸GÓDØ˜×)Ñ)¨%Ó0×4Ñ4°WÓ=ð;ˆFÐ/Õ0°Ó7ó !ùò9 MùÚ'ys   ›
G+¿G0ÁG0c                ó*   <€ V ^8„  d   QhRS[ RS[ RR/# rp   r4   )r*   r#   s   "€r   r+   r,   ¯  s'   ø€ ÷ &_ñ &_©Dð &_¹ð &_À$ñ &_r   c                ó  € \        VP                  4       4      ^ ,          pVP                  R/ 4      P                  R4      VP                  R/ 4      P                  R4      .pVP                  R/ 4      P                  R4      VP                  R/ 4      P                  R4      .pVP                  R/ 4      P                  R4      VP                  R/ 4      P                  R4      .pVP                  R/ 4      P                  R. 4      VP                  R/ 4      P                  R. 4      .pVRR.8w  df   V^ ,          V^,          8w  dQ   V^ ,          '       d   V^ ,          W#,          R,          R&   V^,          '       d   V^,          W#,          R,          R&   VRR.8w  df   V^ ,          V^,          8w  dQ   V^ ,          '       d   V^ ,          W#,          R,          R	&   V^,          '       d   V^,          W#,          R,          R	&   VRR.8w  df   V^ ,          V^,          8w  dQ   V^ ,          '       d   V^ ,          W#,          R,          R
&   V^,          '       d   V^,          W#,          R,          R
&   V. . .8w  d‡   \        V^ ,          4      p\        V^,          4      p	W‰8w  d[   W˜,
          ;p
'       d   \        V
4      W#,          R,          R&   W‰,
          ;p'       d   \        V4      W#,          R,          R&   R# R# R# R# )zo
Analyse if interfaces such as bonds, bridges and VRFs are correctly attached to their
members and vice versa.
r(   Úbondr)   ÚbridgeÚvrfr7   NÚmissing_bond_linkÚmissing_bridge_linkÚmissing_vrf_linkÚmissing_interfaces)r<   r=   rQ   r;   )r   rG   rR   rA   rò   ró   rô   r7   ÚsystemÚnetplanÚmissing_systemÚmissing_netplans   &&&         r   r`   Ú&NetplanDiffState._analyze_parent_links¯  sœ  € ô
 �E—J‘J“LÓ! !Õ$ˆØ—
‘
˜>¨2Ó.×2Ñ2°6Ó:¸F¿J¹JÀÐXZÓ<[×<_Ñ<_Ð`fÓ<gÐhˆØ—*‘*˜^¨RÓ0×4Ñ4°XÓ>ÀÇ
Á
È?Ð\^Ó@_×@cÑ@cÐdlÓ@mÐnˆØ�z‰z˜.¨"Ó-×1Ñ1°%Ó8¸&¿*¹*À_ÐVXÓ:Y×:]Ñ:]Ð^cÓ:dÐeˆØ—j‘j °Ó4×8Ñ8¸ÀrÓJÈFÏJÉJÐWfÐhjÓLk×LoÑLoÐp|ð  Aó  MBð  Cˆ
à�D˜$�<Ô D¨¥G¨t°A­wÔ$6Ø�A�wŒwØDHÈÅG�•˜OÕ,Ð-@ÑAØ�A�wŒwØCGÈÅ7�•˜NÕ+Ð,?Ñ@à�d˜D�\Ô! f¨Q¥i°6¸!µ9Ô&<Ø�a�yŒyØFLÈQÅi�•˜OÕ,Ð-BÑCØ�a�yŒyØEKÈAÅY�•˜NÕ+Ð,AÑBà�4˜�,Ô 3 q¥6¨S°­VÔ#3Ø�1�vŒvØCFÀqÅ6�•˜OÕ,Ð-?Ñ@Ø�1�vŒvØBEÀaÅ&�•˜NÕ+Ð,>Ñ?à˜"˜b˜Ô!Ü˜ A�Ó'ˆFÜ˜* Q�-Ó(ˆGàÔ Ø%,Õ%5Ð5�>Ö5ÜHLÈ^ÓH\�E•K Õ/Ð0DÑEà&,Õ&6Ð6�?Ö6ÜIMÈoÓI^�E•K Õ0Ð1EÓFñ 7ñ	 !ñ	 "r   c                ó&   <€ V ^8„  d   QhRS[ RS[ /# )r'   rÊ   r3   r—   )r*   r#   s   "€r   r+   r,   ×  s   ø€ ÷ ñ ©ð ±ñ r   c                ó(  € \        4       pV EF   pVP                  \        P                  8X  d   V P	                  R4      Vn        V P                  VP                  4      Vn        V P                  VP                  4      Vn        V P                  VP                  4      Vn        VP                  R8w  dF   VP                  P                  R4      pV^,          R8X  g   V^,          R8X  d   V^ ,          Vn        VP                  V4       EK  	  V# )z^Apply some transformations to Netplan routes so their representation
will match the system's.
Úmainr   rŸ   Ú32Ú128)r;   Útabler   Ú_TABLE_UNSPEC_Ú$_default_route_tables_name_to_numberr™   rÎ   Ú	from_addrÚviaÚsplitr…   )r   rÊ   Únew_routes_setrÚ   Ú	ip_prefixs   &&   r   rÓ   Ú"NetplanDiffState._normalize_routes×  sÕ   € ô ›ˆÜˆEà�{‰{œl×9Ñ9Ô9Ø"×GÑGÈÓO�”ð ×2Ñ2°5·8±8Ó<ˆEŒHØ"×9Ñ9¸%¿/¹/ÓJˆEŒOØ×3Ñ3°E·I±IÓ>ˆEŒIð �x‰x˜9Ô$Ø!ŸH™HŸN™N¨3Ó/�	Ø˜Q•< 4Ô'¨9°Q­<¸5Ô+@Ø(¨�|�E”Hà×Ñ˜u×%ñ# ð& Ðr   c                ó6   <€ V ^8„  d   QhRS[ RS[S[,          /# )r'   rG   r3   )r5   r   r   )r*   r#   s   "€r   r+   r,   ñ  s    ø€ ÷ 6ñ 6©$ð 6±;¹|Õ3Lñ 6r   c                óê  € \        4       pV P                  P                  4       pVP                  R4      pVP	                  4        Uu. uF  pVP                  R4      V8X  g   K  VNK  	  ppV UUu. uF  qUP                  R. 4       F  qwNK  	  K  	  pppVP                  R4      ;p	'       Ed   V Uu. uF[  pVP                  R4      R8X  g   K  VP                  R4      \
        P                  8X  g   KA  VP                  R4      R8X  g   KY  VNK]  	  p
p\        RV	\
        P                  RR	7      p\        V
4      ^8X  d]   V
^ ,          P                  R
4      ;p'       d   W·n	        V
^ ,          P                  R4      ;p'       d   V P                  V4      Vn        VP                  V4       VP                  R4      ;p'       Ed   V Uu. uF[  pVP                  R4      R8X  g   K  VP                  R4      \        P                  8X  g   KA  VP                  R4      R8X  g   KY  VNK]  	  p
pV P                  V4      p\        RV\        P                  RR	7      p\        V
4      ^8X  d]   V
^ ,          P                  R
4      ;p'       d   W·n	        V
^ ,          P                  R4      ;p'       d   V P                  V4      Vn        VP                  V4       V# u upi u uppi u upi u upi )af  Convert the gateway4 and gateway6 properties to NetplanRoutes.
The only information stored by these properties is the destination IP for
the default route. Networkd and Network Manager will set a default metric
for it when the route is installed. As we have no control over it, there
will always be a diff. The same is true for the route table number.
To avoid the noise in the diff report when these properties are used,
we use the following heuristic: if there is one and only one static default
route in the system and gateway4 and/or gateway6 are used, we set the same
metric and table as found in the system.
rM   rÊ   Úgateway4rÎ   r   ÚfamilyÚprotocolÚstatic)rÎ   r  r  r  Úmetricr  Úgateway6)r;   r(   rê   rQ   Úvaluesr   Úvaluer   Úlenr  r  r  r…   r   r™   )r   rG   Ú
routes_setrC   rF   rR   ÚifacesrÚ   rÊ   r  Údefault_routesr  r  r  s   &&            r   rÔ   Ú$NetplanDiffState._normalize_gatewaysñ  s›  € ô “Uˆ
Ø ×-Ñ-×6Ñ6Ó8ÐØ—J‘J˜tÓ$ˆ	à%6×%=Ñ%=Ô%?ó 3Ñ%?˜EØ—Y‘Y˜t“_¨	Ñ1÷ �%Ñ%?ˆð 3á%+ÔQ¡V˜E¿¹À8ÈRÖ9P°’%Ñ9P‘%¡VˆÑQà—z‘z *Ó-Ð-ˆ8×-Ù17ó E±¨Ø!&§¡¨4£°IÑ!=ô $à"'§)¡)¨HÓ"5¼¿¹Ñ"Fô $ð #(§)¡)¨JÓ"7¸8Ñ"C÷ $˜e±ˆNð Eô
 ! I°8ÄGÇMÁMÐ\dÔeˆEä�>Ó" aÔ'Ø+¨AÕ.×2Ñ2°8Ó<Ð<�6Ö<Ø#)”LØ*¨1Õ-×1Ñ1°'Ó:Ð:�5Ö:Ø"&×"KÑ"KÈEÓ"R�E”Kà�N‰N˜5Ô!à—z‘z *Ó-Ð-ˆ8×-Ù17ó E±¨Ø!&§¡¨4£°IÑ!=ô $à"'§)¡)¨HÓ"5¼¿¹Ñ"Gô $ð #(§)¡)¨JÓ"7¸8Ñ"C÷ $˜e±ˆNð Eð ×2Ñ2°8Ó<ˆHä  I°8ÄHÇNÁNÐ]eÔfˆEä�>Ó" aÔ'Ø+¨AÕ.×2Ñ2°8Ó<Ð<�6Ö<Ø#)”LØ*¨1Õ-×1Ñ1°'Ó:Ð:�5Ö:Ø"&×"KÑ"KÈEÓ"R�E”Kà�N‰N˜5Ô!àÐùòO3ùãQùòEùò EsB   ÁK Á%K Á2"K%Â5K+Ã!K+Ã8K+ÄK+ÇK0Ç-!K0ÈK0È+K0c                óR   <€ V ^8„  d   QhRS[ S[,          RS[S[,          RS[RS[/# )r'   r×   rÙ   rG   r3   )r   r   r<   rK   r5   r;   )r*   r#   s   "€r   r+   r,   )  s7   ø€ ÷ 6ñ 6±;¹|Õ3Lð 6Ñ`dÑehÕ`ið 6Ñswð 6Ñ|ñ 6r   c                ó   € V Uu. uF,  p\        \        P                  ! V4      P                  4      NK.  	  pp\	        \        R V4      4      pV Uu. uF,  p\        \        P                  ! V4      P                  4      NK.  	  ppVP                  R/ 4      P                  R. 4      p\        4       pV EFJ  p	V	P                  R8X  dD   V	P                  R8w  d3   \        P                  ! V	P                  4      P                  '       g   KX  V	P                  R8X  d   Kk  VP                  R/ 4      P                  R4      p
V	P                  R8X  d	   V
R	Jd   K¥  V	P                  R8w  d…   \        P                  ! V	P                  4      pVP                  '       dS   V	P                  \        P                  8X  d   R
V9   d   EK  V	P                  \         P                  8X  d   RV9   d   EK:  V	P                  R8X  dV   V	P"                  R8X  dE   V	P                  V9   g1   \        P                  ! V	P                  4      P$                  '       d   EK   V	P                  \        P                  8X  d&   V	P"                  R8X  d   V	P                  R8X  d   EKä  V	P                  \        P                  8X  d7   V	P                  R8w  d&   V	P                  V9   g   V	P                  V9   d   EK9  VP'                  V	4       EKM  	  V# u upi u upi )ac  
Some routes found in the system are installed automatically/dynamically without
being configured in Netplan.
Here we implement some heuristics to remove these routes from the list we want
to compare. We do that because these type of routes will probably never be found in the
Netplan configuration so there is no point in comparing them against Netplan.
c                 ó   € V R 8g  # )z	fe80::/64r   )Úns   &r   rS   Ú8NetplanDiffState._filter_system_routes.<locals>.<lambda>4  s	   € ¨q°KÒ/?r   r)   ru   ry   r   rw   r}   rz   Fr|   r{   ÚhostÚlocalÚ	multicastzff00::/8)rK   r‚   rƒ   Únetworkr<   rè   r‡   rQ   r;   ÚscoperÎ   r†   r  r  r   r  r   rá   Úis_loopbackr…   )r   r×   rÙ   rG   r‡   Úlocal_networksrr   ru   rÊ   rÚ   r}   Úroute_tos   &&&&        r   rÕ   Ú&NetplanDiffState._filter_system_routes)  sE  € ñ M]Ó]ÑL\Àbœ#œi×4Ò4°RÓ8×@Ñ@ÖAÑL\ˆÐ]äœfÑ%?ÀÓPÓQˆÙBRÓSÑBR¸B”Sœ×/Ò/°Ó3×6Ñ6Ö7ÑBRˆ	ÐSØ—Z‘Z °Ó4×8Ñ8¸ÀrÓJˆ
Ü“ˆÜ"ˆEà�{‰{˜fÔ$¨¯©°YÔ)>Äy×G]ÒG]Ð^c×^fÑ^fÓGg×Gu×GuÐGuÙð �~‰~ Ô'Ùð Ÿ
™
 ?°BÓ7×;Ñ;¸KÓHˆIØ�~‰~ Ô%¨)¸5Ó*@Ùð �x‰x˜9Ô$Ü$×1Ò1°%·(±(Ó;�Ø×)×)Ð)Ø—|‘|¤x§~¡~Ô5¸&ÀJÔ:NÚ Ø—|‘|¤w§}¡}Ô4¸À:Ô9MÚ ð —‘˜vÔ%¨%¯*©*¸Ô*?Ø—X‘X Ô*¬i×.DÒ.DÀUÇXÁXÓ.N×.Z×.ZÐ.ZÚð �|‰|œxŸ~™~Ô-°%·*±*ÀÔ2KÐPU×PXÑPXÐ\fÔPfÚð —‘¤§¡Ô.°5·>±>ÀTÔ3IØŸ™ ^Ô3°u·x±xÀ9Ô7LÚà�J‰J�u×ñM #ðN ˆùò[ ^ùò Ts   …2LÁ2Lc                ó    <€ V ^8„  d   QhRS[ /# r2   r4   )r*   r#   s   "€r   r+   r,   a  s   ø€ ÷ Pñ P©ñ Pr   c                ót  € V P                   P                  4       p/ pV P                  P                  P	                  4        EFÜ  w  r4/ pR RV//WS&   WS,          R ,          p\
        P                  ! VP                  R4      VR&   VP                  VR&   VP                  VR&   VP                  VR&   VP                  e   VP                  VR&   VP                   Uu. uF  qwNK  	  ppV'       dj   / VR&   V F^  p/ p	VP                  '       d   VP                  V	R	&   VP                  '       d   VP                  V	R
&   RV	/VR,          \        V4      &   K`  	  \!        VP"                  4      ;p
'       d   W¦R&   \!        VP$                  4      ;p'       d   W¶R&   \!        VP&                  4      ;p'       d   WÆR&   VP(                  ;p'       d   WÖR&   VP*                  ;p'       d   WæR&   VP,                  ;p'       d   WöR&   VP.                  P                  R4      ;p'       d   VP0                  VR&   VP.                  P                  R4      ;p'       d   VP0                  VR&   VP.                  P                  R4      ;p'       d   VP0                  VR&   W19  dm   RpVP	                  4        F7  w  ppVP                  R4      ;p'       g   K!  VV8X  g   K*  RpWS,          VV&   K9  	  V'       g   VP3                  V4       EKÈ  EKË  VP3                  V4       EKß  	  V P5                  V4       V# u upi )r)   rM   rç   rá   rs   rt   ru   r}   rr   ÚlabelÚlifetimerv   r¦   r¸   rÊ   r  r  rÃ   ró   rò   rô   FT)r(   rê   r)   rà   r>   r
   rQ   rá   rs   rt   ru   r}   rr   r+  r,  rK   r<   Únameserver_addressesÚnameserver_searchrÊ   Ú	_gateway4Ú	_gateway6rÃ   ÚlinksrM   r?   Ú_netplan_state_find_parents)r   rC   r7   rF   rG   rR   Ú	iface_refr�   rr   rv   Únameserversr¹   rÊ   r  r  Úmacró   rò   rô   Ú
found_somerV   r  rc   s   &                      r   r:   Ú(NetplanDiffState._get_netplan_interfacesa  sû  € Ø ×-Ñ-×6Ñ6Ó8ÐØˆ
Ø!%×!3Ñ!3×!;Ñ!;×!AÑ!A×!CÑˆIàˆEØ /°$¸	Ð1BÐCˆEÑØÕ(¨Õ9ˆIä ,× 0Ò 0°·±¸gÓ FˆI�fÑà!'§¡ˆI�gÑØ!'§¡ˆI�gÑà&,×&7Ñ&7ˆI�lÑ#à×ÑÒ+Ø)/×)9Ñ)9�	˜+Ñ&à*0×*:Ò*:Ó;Ñ*: $šÑ*:ˆIÐ;ßØ)+�	˜+Ñ&Û%�DØ�EØ—z—z�zØ)-¯©˜˜g™Ø—}—}�}Ø,0¯M©M˜˜jÑ)Ø9@À%Ð8H�I˜kÕ*¬3¨t«9Ó5ñ &ô # 6×#>Ñ#>Ó?Ð?ˆ{Ö?Ø5@Ð1Ñ2ä˜f×6Ñ6Ó7Ð7ˆvÖ7Ø28Ð.Ñ/ä˜fŸm™mÓ,Ð,ˆvÖ,Ø&,˜(Ñ#à!×+Ñ+Ð+ˆxÖ+Ø(0˜*Ñ%à!×+Ñ+Ð+ˆxÖ+Ø(0˜*Ñ%à×'Ñ'Ð'ˆsÖ'Ø*-˜,Ñ'àŸ™×)Ñ)¨(Ó3Ð3ˆvÖ3Ø&,§i¡i�	˜(Ñ#à—|‘|×'Ñ'¨Ó/Ð/ˆtÖ/Ø$(§G¡G�	˜&Ñ!à—l‘l×&Ñ& uÓ-Ð-ˆsÖ-Ø#&§6¡6�	˜%Ñ àÔ1ð #�
Ø"3×"9Ñ"9Ö";‘J�C˜Ø$)§I¡I¨d£OÐ3�y×3Ð3Ø$¨	Ö1Ø)-˜JØ.3Õ.>˜J s›Oñ	 #<÷ "Ø×%Ñ% e×,ò "ð ×!Ñ! %×(ñU "DðX 	×(Ñ(¨Ô4ØÐùò{ <s   Ã
L5c                ó$   <€ V ^8„  d   QhRS[ RR/# )r'   r7   r3   Nr4   )r*   r#   s   "€r   r+   r,   ³  s   ø€ ÷ Qñ Q±dð Q¸tñ Qr   c                ó  € \        \        4      pVP                  4        F¬  w  r4VR,          P                  R4      ;p'       d   W%,          P	                  V4       VR,          P                  R4      ;p'       d   W%,          P	                  V4       VR,          P                  R4      ;p'       g   K•  W%,          P	                  V4       K®  	  VP                  4        F   w  r6\        V4      W,          R,          R&   K"  	  R# )z)Associates interfaces with their parents r)   ró   rò   rô   r7   N)r   r;   r>   rQ   r…   r<   )r   r7   ÚparentsrF   rG   ry   Úmemberss   &&     r   r2  Ú,NetplanDiffState._netplan_state_find_parents³  sÑ   € äœcÓ"ˆØ!+×!1Ñ!1Ö!3ÑˆIØ˜oÕ.×2Ñ2°8Ó<Ð<ˆtÖ<Ø•×!Ñ! )Ô,Ø˜oÕ.×2Ñ2°6Ó:Ð:ˆtÖ:Ø•×!Ñ! )Ô,Ø˜oÕ.×2Ñ2°5Ó9Ð9ˆt×9Ð9Ø•×!Ñ! )Ö,ñ "4ð #*§-¡-¦/ÑˆIÜCGÈÃ=ˆJÕ! /Õ2°<Ó@ó #2r   c                ó    <€ V ^8„  d   QhRS[ /# r2   r4   )r*   r#   s   "€r   r+   r,   Á  s   ø€ ÷ 4ñ 4©ñ 4r   c                ó²  € / pV P                   P                  4       P                  4        EF"  w  r#VR 8X  d   K  VP                  R4      pRRV//W&   VP                  R4      ;p'       d   WQV,          R,          R&   W,          R,          pVP                  R4      ;p'       d   WvR&   / pVP                  R. 4       Fo  p	\	        V	P                  4       4      ^ ,          p
V	P                  V
4      P                  R4      pV
 RV 2pRV	P                  V
4      P                  R. 4      /WŒ&   Kq  	  V'       d   W†R&   VP                  R	4      ;p'       d   WÖR
&   VP                  R4      ;p'       d   WæR&   VP                  R4      ;p'       d%   V Uu. uF  pV P                  V4      NK  	  upVR&   VP                  R4      ;p'       d   VVR&   VP                  R4      ;p'       d   VVR&   VP                  R4      ;p'       d   VVR&   VP                  R4      ;p'       d   VVR&   VP                  R4      ;p'       g   EK  VVR&   EK%  	  V# u upi )znetplan-global-staterá   r(   rM   rN   rr   ÚprefixrŸ   rv   Údns_addressesr¦   Ú
dns_searchr¸   rÊ   rÃ   r7   rò   ró   rô   )r(   rê   r>   rQ   r<   r=   Ú_system_route_to_netplan)r   r7   rF   rG   Údevice_typerc   r3  rN   rr   r�   r‡   r?  Ú	full_addrr4  r¹   rÊ   rÚ   r5  Úuplink_interfacesrò   ró   rô   s   &                     r   r9   Ú'NetplanDiffState._get_system_interfacesÁ  sM  € Øˆ
à!%×!2Ñ!2×!;Ñ!;Ó!=×!CÑ!C×!EÑˆIØÐ2Ô2Ùà Ÿ*™* VÓ,ˆKØ%3°f¸kÐ5JÐ$KˆJÑ!à"ŸJ™J tÓ,Ð,ˆyÖ,Ø>G˜9Õ% nÕ5°dÑ;à"Õ-¨nÕ=ˆIàŸ
™
 7Ó+Ð+ˆuÖ+Ø%*˜'Ñ"àˆIØŸ
™
 ;°Ö3�Ü˜$Ÿ)™)›+Ó& qÕ)�ØŸ™ "›×)Ñ)¨(Ó3�Ø!˜d ! F 8Ð,�	à(/°·±¸"³×1AÑ1AÀ'È2Ó1NÐ'O�	Ó$ñ 4÷ Ø)2˜+Ñ&à$Ÿj™j¨Ó9Ð9ˆ{Ö9Ø5@Ð1Ñ2àŸ™ LÓ1Ð1ˆvÖ1Ø28Ð.Ñ/àŸ™ HÓ-Ð-ˆvÖ-ÙY_Ó&`ÑY_ÐPU t×'DÑ'DÀUÖ'KÑY_Ñ&`�	˜(Ñ#à—j‘j Ó.Ð.ˆsÖ.Ø*-�	˜,Ñ'à$*§J¡J¨|Ó$<Ð<Ð Ö<Ø*;�	˜,Ñ'à—z‘z &Ó)Ð)ˆtÖ)Ø$(�	˜&Ñ!àŸ™ HÓ-Ð-ˆvÖ-Ø&,�	˜(Ñ#à—j‘j Ó'Ð'ˆs×'Ñ'Ø#&�	˜%Ô ñ_ "Fðb Ðùò# 'as   ÆIc                ó&   <€ V ^8„  d   QhRS[ RS[/# )r'   Úsystem_router3   )r5   r   )r*   r#   s   "€r   r+   r,   ÷  s   ø€ ÷ %ñ %±Tð %¹lñ %r   c                óF  € / pVP                  R 4      ;p'       d   W2R &   VP                  R4      ;p'       d   WBR&   VP                  R4      ;p'       d   WRR&   VP                  R4      ;p'       d   WbR&   VP                  R4      ;p'       d   WrR&   VP                  R4      ;p'       d   W‚R&   VP                  R4      ;p	'       d   W’R&   VP                  R4      ;p
'       d   W¢R&   VP                  R	4      ;p'       d   V P                  V4      VR	&   \        R
/ VB # )r  rÎ   r  Úfromr  r  r$  rá   r  r  r   )rQ   r  r   )r   rH  rÚ   r  rÎ   r  r  r  r$  Ú
route_typer  r  s   &&          r   rB  Ú)NetplanDiffState._system_route_to_netplan÷  s)  € Øˆà!×%Ñ% hÓ/Ð/ˆ6Ö/Ø$�(‰OØ×!Ñ! $Ó'Ð'ˆ2Ö'Ø�$‰KØ×"Ñ" 5Ó)Ð)ˆ3Ö)Ø�%‰LØ$×(Ñ(¨Ó0Ð0ˆ9Ö0Ø!*�+ÑØ!×%Ñ% hÓ/Ð/ˆ6Ö/Ø$�(‰OØ ×$Ñ$ WÓ-Ð-ˆ5Ö-Ø"�'‰NØ%×)Ñ)¨&Ó1Ð1ˆ:Ö1Ø&�&‰MØ#×'Ñ'¨
Ó3Ð3ˆ8Ö3Ø (�*ÑØ ×$Ñ$ WÓ-Ð-ˆ5Ö-Ø!×FÑFÀuÓMˆE�'‰NäÑ$˜eÑ$Ð$r   c                ó&   <€ V ^8„  d   QhRS[ RS[/# )r'   rA   r3   )rK   rl   )r*   r#   s   "€r   r+   r,     s   ø€ ÷ :ñ :¹ð :Áñ :r   c                ó¾   € VP                  4       '       d   \        V4      # V P                  '       g   \        4       V n        V P                  P	                  V^ 4      # )r   )Úisdigitrl   r.   r   rQ   )r   rA   s   &&r   r  Ú5NetplanDiffState._default_route_tables_name_to_number  sG   € Ø�<‰<�>Š>Ü�t“9Ðà×,×,Ð,Ü,>Ó,@ˆDÔ)à×,Ñ,×0Ñ0°°qÓ9Ð9r   )r)   r.   r(   N)Ú )r   r   r   r   Ú__doc__r/   rH   rd   rX   rZ   r[   rW   r�   r™   r\   r]   r^   r_   rY   r`   rÓ   rÔ   rÕ   r:   r2  r9   rB  r  r    r!   r"   s   @r   r%   r%   &   s   ø‡ € ñ÷
+ð +÷ð ÷:'ò '÷R
ð 
÷	
ð 	
÷>ð >÷@ð ÷,	ð 	÷ð ÷;ð ;÷z%ð %÷Nð ÷&ð ÷6!ð !÷F&_ð &_÷Pð ÷46ð 6÷p6ð 6÷pPð P÷dQð Q÷4ð 4÷l%ð %÷0:ö :r   r%   )Úcollectionsr   r‚   r   Úsocketr   r   Útypingr   Únetplan.netdefr   Únetplan_cli.cli.stater   r	   r
   Únetplan_cli.cli.utilsr   r   r   r   r%   r   r   r   Ú<module>rY     s@   ðõ$ $Û Û ß $Ý å 'ß UÑ Uß Iô3�d×&Ñ&ô 3÷p:ó p:r   