Ë
    x[h„S  ã                   ó6  — d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlmZ d dl	m
Z
mZmZ d dlmZmZmZ d dlmZ  ej&                  e«      Zg d¢Zg d¢Zg d	¢Zd
„ Zd„ Zdd„Zd„ Z e
j:                  d«      d„ «       Zd„ Z G d„ dej@                  «      Z dd„Z!y)é    N)Úsuppress)ÚOptional)ÚperformanceÚsubpÚutil)ÚParserErrorÚrendererÚsubnet_is_ipv6)ÚNetworkState)zpre-upÚupzpost-upÚdownzpre-downz	post-down)Úbridge_ageingÚbridge_bridgeprioÚ	bridge_fdÚbridge_gcinitÚbridge_helloÚbridge_maxageÚbridge_maxwaitÚ
bridge_stp)ÚaddressÚnetmaskÚ	broadcastÚnetworkÚmetricÚgatewayÚpointtopointÚmediaÚmtuÚhostnameÚ
leasehoursÚ	leasetimeÚvendorÚclientÚbootfileÚserverÚhwaddrÚproviderÚframeÚnetnumÚendpointÚlocalÚttlc                 óD  — g }g d¢}|j                  «       D ]}  \  }}|dk(  rŒ|dk(  r|d   ›d|d   ›�}|sŒ!||v sŒ&t        |t        «      rdj                  |«      }d|v r|j	                  dd«      }|j                  d	j                  ||«      «       Œ t        |«      S )
N)
r   r   r   r   r   Úpointopointr   ÚscopeÚ
dns_searchÚdns_nameserversr   r   ú/Úprefixú Ú_ú-ú    {0} {1})ÚitemsÚ
isinstanceÚlistÚjoinÚreplaceÚappendÚformatÚsorted)ÚifaceÚsubnetÚcontentÚ	valid_mapÚkeyÚvalues         ú3/usr/lib/python3/dist-packages/cloudinit/net/eni.pyÚ_iface_add_subnetrG   A   s­   € Ø€Gò€Ið —l‘l“nò 
=‰
ˆˆUØ�)ÒØØ�)ÒØ% iÓ0°&¸Ò2BÐCˆEÚ�S˜IÒ%Ü˜%¤Ô&ØŸ™ ›�Ø�c‰zØ—k‘k # sÓ+�Ø�N‰N˜=×/Ñ/°°UÓ;Õ<ð
=ô �'‹?Ðó    c           
      óP  — |dk7  rg S g }g d¢}g d¢}ddi}| d   dvr|j                  d«       | j                  «       D ]Ü  \  }}t        |t        «      r	| |   rdnd	}|r||v rŒ&|d
k(  r#|r!||k7  rt        j                  d| d   ||«       ŒN||v r9|D ]3  }	|j                  dj                  |j                  ||«      |	«      «       Œ5 Œ‹t        |t        «      rdj                  |«      }|j                  dj                  |j                  ||«      |«      «       ŒÞ t        |«      S )Nr   )	ÚcontrolÚ	device_idÚdriverÚindexÚinetÚmodeÚnameÚsubnetsÚtype)Úbridge_pathcostÚbridge_portprioÚbridge_waitportÚmac_addressÚ	hwaddressrR   )ÚbondÚbridgeÚ
infinibandÚvlanÚonÚoffr   zZNetwork config: ignoring %s device-level mtu:%s because ipv4 subnet-level mtu:%s provided.rP   r7   r4   )r=   r8   r9   ÚboolÚLOGÚwarningr>   Úgetr:   r;   r?   )
r@   rM   Úipv4_subnet_mturB   Ú
ignore_mapÚmultiline_keysÚrenamesrD   rE   Úvs
             rF   Ú_iface_add_attrsrg   _   sD  € ð �‚zØˆ	Ø€Gò
€Jò€Nð ˜kÐ*€GØˆV�}ÐDÑDØ×Ñ˜-Ô(à—k‘k“mò K‰
ˆˆUä�eœTÔ"Ø! #šJ‘D¨EˆEÙ˜˜zÑ)ØØ�%Š<™OØ˜Ò'Ü—‘ð:à˜&‘MØØ#ôð Ø�.Ñ Øò O�Ø—‘˜}×3Ñ3°G·K±KÀÀSÓ4IÈ1ÓMÕNðOàÜ�eœTÔ"Ø—H‘H˜U“OˆEØ�‰�}×+Ñ+¨G¯K©K¸¸SÓ,AÀ5ÓIÕJð-Kô0 �'‹?ÐrH   c                 ó@  — | d   }| d   }|dk(  rd}n|dv rd|z   }nd|z   }| j                  «       }|j                  ||dœ«        dj                  di |¤Ž d	j                  di |¤Žg}|r2| j                  d
«      r!|j	                   dj                  di |¤Ž«       |S )NrP   rJ   Úauto)Úhotplugzallow-z
# control-)ÚfullnameÚcverbz{cverb} {fullname}ziface {fullname} {inet} {mode}rV   z    hwaddress {mac_address}© )ÚcopyÚupdater>   ra   r=   )r@   rM   Úrender_hwaddressrk   rJ   rl   ÚsubstÚliness           rF   Ú_iface_start_entryrs   ›   s¾   € Ø�V‰}€Hà�IÑ€GØ�&ÒØ‰Ø	�LÑ	 Ø˜7Ñ"‰à˜wÑ&ˆà�J‰J‹L€EØ	‡L�L˜h°Ñ7Ô8ð 	$Ð×#Ñ#Ñ, eÑ,Ø/Ð(×/Ñ/Ñ8°%Ñ8ð€Eñ ˜EŸI™I mÔ4Ø�‰Ð9Ð2×9Ñ9ÑB¸EÑBÔCà€LrH   c                 ó*  — d}|j                  «       D �]F  }|j                  «       }|j                  d«      rŒ&|j                  d«      }|d   }|dk(  �r]|d   }|j                  d«      s t        j
                  j                  ||«      }t        j                  |«      D �]  }	t	        j                  |	«      }
|
D �cg c]u  }t        j
                  j                  t        j
                  j                  |	|«      «      r6t        j                  d|«      � t        j
                  j                  |	|«      ‘Œw }
}|
D ]o  }t        j                  |«      j                  «       }t        j
                  j                  |«      }t        | |t        j
                  j!                  |«      |«       Œq �Œ �ŒŸ|d	k(  rÏ|d   }|j                  d«      s t        j
                  j                  ||«      }t        j                  |«      D ]  }	t#        |	d
«      5 }|j%                  «       j                  «       }ddd«       t        j
                  j                  |	«      }t        | t        j
                  j!                  |«      |«       Œ� �Œs|dk(  r|dd D ]  }|| vrd|i| |<   d| |   d<   Œ �Œ—|dk(  rB|dd \  }}}|| vrd|i| |<   nd| |   v rt'        d|›d|›d�«      ‚|| |   d<   || |   d<   |}�ŒÞ|dk(  r|d   dk(  r|d   }n|d   }|| |   d<   �Œ |t(        v r|d   | |   |<   �Œ|t*        v r:|| |   vrg | |   |<   | |   |   j-                  dj                  |dd «      «       �ŒW|j                  d«      r}d| |   vri | |   d<   |dk(  r1g | |   d   d<   |dd D ]  }| |   d   d   j-                  |«       Œ �Œ­|dk(  s�Œ´g | |   d   d<   |dd D ]  }| |   d   d   j-                  |«       Œ �Œå|j                  d«      �rd| |   vri | |   d<   |t.        v r#|j1                  dd d«      }|d   | |   d   |<   �Œ1|d!k(  r1g | |   d   d"<   |dd D ]  }| |   d   d"   j-                  |«       Œ �Œg|d#k(  r6|d   j3                  «       d$k(  r|d   | |   d   d$<   �Œ’|d   | |   d   d$<   �Œ¢|d%k(  r+d&| |   d   vri | |   d   d&<   |d   | |   d   d&   |d   <   �ŒÒ|d'k(  s�ŒÙd(| |   d   vri | |   d   d(<   |d   | |   d   d(   |d   <   �Œ|j                  d)«      s�Œd*| |   vri | |   d*<   |j1                  d)d d«      }|d   | |   d*   |<   �ŒI | j5                  «       D ]  }d| |   vsŒd+| |   d<   Œ yc c}w # 1 sw Y   �ŒZxY w),a~  Parses the file contents, placing result into ifaces.

    '_source_path' is added to every dictionary entry to define which file
    the configuration information came from.

    :param ifaces: interface dictionary
    :param contents: contents of interfaces file
    :param src_dir: directory interfaces file was located
    :param src_path: file path the `contents` was read
    Nú#r4   r   zsource-directoryé   r2   z^[a-zA-Z0-9_-]+$ÚsourceÚrri   Ú_source_pathTr@   é   Úfamilyz
Interface z* can only be defined once. Re-defined in 'z'.ÚmethodrW   Úetheré   zdns-Údnsz
dns-searchÚsearchzdns-nameserversÚnameserversÚbridge_rY   Ú Úbridge_portsÚportsÚ	bridge_hwÚmacrS   ÚpathcostrT   Úportpriozbond-rX   F)Ú
splitlinesÚstripÚ
startswithÚsplitÚosÚpathr;   ÚglobÚlistdirÚisfileÚreÚmatchr   Úload_text_fileÚabspathÚ_parse_deb_config_dataÚdirnameÚopenÚreadr   ÚNET_CONFIG_OPTIONSÚNET_CONFIG_COMMANDSr=   ÚNET_CONFIG_BRIDGE_OPTIONSr<   ÚlowerÚkeys)ÚifacesÚcontentsÚsrc_dirÚsrc_pathÚcurrifÚliner�   ÚoptionÚparsed_src_dirÚexpanded_pathÚdir_contentsr�   ÚentryÚsrc_dataÚ	abs_entryÚnew_src_pathÚfpÚabs_pathr@   r{   r|   ÚvalÚdomainr%   Úbridge_optionÚbond_options                             rF   r—   r—   ³   sQ  € ð €FØ×#Ñ#Ó%ó r;ˆØ�z‰z‹|ˆØ�?‰?˜3ÔØØ—
‘
˜3“ˆØ�q‘ˆØÐ'Ó'Ø" 1™XˆNØ!×,Ñ,¨SÔ1Ü!#§¡§¡¨g°~Ó!F�Ü!%§¡¨>Ó!:ó �Ü!Ÿz™z¨-Ó8�ð !-ö àäŸ™Ÿ™¤r§w¡w§|¡|°MÀ4Ó'HÔIÜŸH™HÐ%7¸Ó>ÐJô	 —G‘G—L‘L °Õ5ð �ð  ð *ò �EÜ#×2Ñ2°5Ó9×?Ñ?ÓA�HÜ "§¡§¡°Ó 6�IÜ*Ø ¬"¯'©'¯/©/¸)Ó*DÀiõòòð  �xÒØ  ™8ˆLØ×*Ñ*¨3Ô/Ü!Ÿw™wŸ|™|¨G°\ÓB�Ü!%§¡¨<Ó!8ò �Ü˜-¨Ó-ð 1°Ø!Ÿw™w›yŸ™Ó0�H÷1äŸ7™7Ÿ?™?¨=Ó9�Ü&Ø˜H¤b§g¡g§o¡o°hÓ&?Àõò	ð �vÒØ˜q˜r˜ò -�Ø Ñ&ð '¨ð%�F˜5‘Mð )-��u‘˜fÒ%ò-ð �wÒØ$)¨!¨A JÑ!ˆE�6˜6Ø˜FÑ"ð # Hð!��u’ð ˜V E™]Ñ*Ý!â-2²Hð>óð ð '-ˆF�5‰M˜(Ñ#Ø&,ˆF�5‰M˜(Ñ#ØŠFØ�{Ò"Ø�Q‰x˜7Ò"Ø˜A‘h‘à˜A‘h�Ø*-ˆF�6‰N˜;Ó'ØÔ)Ñ)Ø%*¨1¡XˆF�6‰N˜6Ó"ØÔ*Ñ*Ø˜V F™^Ñ+Ø)+��v‘˜vÑ&Ø�6‰N˜6Ñ"×)Ñ)¨#¯(©(°5¸¸°9Ó*=Ö>Ø×Ñ˜vÔ&Ø˜F 6™NÑ*Ø(*��v‘˜uÑ%Ø˜Ò%Ø24��v‘˜uÑ% hÑ/Ø# A B˜iò C�FØ˜6‘N 5Ñ)¨(Ñ3×:Ñ:¸6ÕBòCàÐ,Ô,Ø79��v‘˜uÑ% mÑ4Ø# A B˜iò H�FØ˜6‘N 5Ñ)¨-Ñ8×?Ñ?ÀÕGòHà×Ñ˜yÕ)Ø˜v f™~Ñ-Ø+-��v‘˜xÑ(ØÔ2Ñ2Ø &§¡¨y¸"¸aÓ @�Ø:?À¹(��v‘˜xÑ(¨Ó7Ø˜>Ò)Ø46��v‘˜xÑ(¨Ñ1Ø" 1 2˜Yò D�EØ˜6‘N 8Ñ,¨WÑ5×<Ñ<¸UÕCòDà˜;Ò&ð
 ˜‘8—>‘>Ó# uÒ,Ø6;¸A±h�F˜6‘N 8Ñ,¨UÓ3à6;¸A±h�F˜6‘N 8Ñ,¨UÓ3ØÐ,Ò,Ø V¨F¡^°HÑ%=Ñ=Ø;=�F˜6‘N 8Ñ,¨ZÑ8ØAFÀqÁ��v‘˜xÑ(¨Ñ4°U¸1±XÓ>ØÐ,Ô,Ø V¨F¡^°HÑ%=Ñ=Ø;=�F˜6‘N 8Ñ,¨ZÑ8ØAFÀqÁ��v‘˜xÑ(¨Ñ4°U¸1±XÓ>Ø×Ñ˜wÖ'Ø˜V F™^Ñ+Ø)+��v‘˜vÑ&Ø Ÿ.™.¨°"°aÓ8ˆKØ27¸±(ˆF�6‰N˜6Ñ" ;Ó/ðer;ðf —‘“ò *ˆØ˜ ™Ò&Ø$)ˆF�5‰M˜&Ò!ñ*ùòO ÷&1ñ 1ús   Â=A:VÈVÖVzConverting eni datac                 ó:   — i }t        || dd¬«       t        |«      S )z=Return a network config representation of what is in eni_dataN)r¢   r£   )r—   Ú_ifaces_to_net_config_data)Úeni_datar    s     rF   Úconvert_eni_datar·   7  s"   € ð €FÜ˜6 8°TÀDÕIÜ% fÓ-Ð-rH   c                 ó  — i }| j                  «       D ]Ô  \  }}|j                  d«      d   }||vr"|dk(  rd}nd}||g dœ||<   d|v r|d   ||   d<   ||d	   d
œ}|j                  d«      rd|d<   nd|d<   |j                  d	«      dk(  r|d   |d<   dD ]  }||v sŒ||   ||<   Œ d|v r&dD ]!  }||d   v sŒ|d   |   sŒ|d   |   |d|z   <   Œ# ||   d   j                  |«       ŒÖ dt	        |«      D �	cg c]  }	||	   ‘Œ	 c}	dœS c c}	w )zÂReturn network config that represents the ifaces data provided.
    ifaces = _parse_deb_config_data(...)
    config = ifaces_to_net_config_data(ifaces)
    state = parse_net_config_data(config).ú:r   ÚloÚloopbackÚphysical)rR   rP   rQ   rW   rV   r|   )Ú_orig_eni_namerR   ri   rJ   ÚmanualÚstaticr   )r   r   r   r   )r�   r€   Údns_rQ   rv   )ÚversionÚconfig)r8   Ú	partitionra   r=   r?   )
r    ÚdevsrP   ÚdataÚdevnameÚdtyperA   Úcopy_keyÚnÚds
             rF   rµ   rµ   ?  sn  € ð
 €DØ—l‘l“nò 0‰
ˆˆdà—.‘. Ó% aÑ(ˆØ˜$ÑØ˜$ŠØ"‘à"�Ø%*°GÈÑKˆD�‰Mð ˜dÑ"Ø/3°KÑ/@��W‘˜mÑ,Ø$(°$°x±.ÑAˆØ�8‰8�FÔØ &ˆF�9Òà (ˆF�9Ñà�8‰8�HÓ Ò)Ø $ Y¡ˆF�9Ñà;ò 	2ˆHØ˜4ÒØ#'¨¡>��xÒ ð	2ð �D‰=Ø.ò 8�Ø˜˜U™Ò#¨¨U©°A«Ø)-¨e©°Q©�F˜6 A™:Ò&ð8ð 	ˆW‰�iÑ ×'Ñ'¨Õ/ð=0ð@ ´f¸T³lÖ$C° T¨!£WÒ$CÑDÐDùÒ$Cs   Ã8D	c                   óP   — e Zd ZdZdd„Zdd„Zdd„Zdd„Z	 	 ddede	e
   d	dfd
„Zy)ÚRendererz@Renders network information in a /etc/network/interfaces format.Nc                 ó–   — |si }|j                  dd«      | _        |j                  dd «      | _        |j                  dd«      | _        y )NÚeni_pathúetc/network/interfacesÚ
eni_headerÚnetrules_pathz(etc/udev/rules.d/70-persistent-net.rules)ra   rÎ   rÐ   rÑ   )ÚselfrÂ   s     rF   Ú__init__zRenderer.__init__k  sF   € ÙØˆFØŸ
™
 :Ð/GÓHˆŒØ Ÿ*™* \°4Ó8ˆŒØ#ŸZ™ZØÐGó
ˆÕrH   c                 óæ  — g }|dz   }|dz   }d}dddœ}d}|d   d	k(  r|d
   d	k(  rd}n|d   dk(  r
|d   dk(  rd}d}	dD ]�  }
|r|
dk(  rŒ|
dk(  r|	|›d||
   ›d||
   ›�z  }	Œ$|
|v sŒ)|
dk(  rCd||
   v r|	dz  }	n|j                  d«      dk(  r|	dz  }	n|	dz  }	d|v sŒ_|	d||
   ›d|d   ›�z  }	Œq|	d||
   ›d||
   ›�z  }	Œƒ |j                  ||	z   |z   «       |j                  ||	z   |z   «       |S )a¾  When rendering routes for an iface, in some cases applying a route
        may result in the route command returning non-zero which produces
        some confusing output for users manually using ifup/ifdown[1].  To
        that end, we will optionally include an '|| true' postfix to each
        route line allowing users to work with ifup/ifdown without using
        --force option.

        We may at somepoint not want to emit this additional postfix, and
        add a 'strict' flag to this function.  When called with strict=True,
        then we will not append the postfix.

        1. http://askubuntu.com/questions/168033/
                 how-to-set-static-routes-in-ubuntu-server
        zpost-up route addzpre-down route delz || trueÚgwr   )r   r   rƒ   r   z0.0.0.0r   z defaultz::r3   r   z -A inet6 default)r   r   r   r   r4   r¹   z	 -A inet6é    z -hostz -netr2   )ra   r=   )rÒ   ÚrouteÚindentrB   r   r   Úor_trueÚmappingÚ
default_gwÚ
route_lineÚks              rF   Ú_render_routezRenderer._render_routet  se  € ð ˆØÐ)Ñ)ˆØÐ,Ñ,ˆØˆàØñ
ˆð
 ˆ
Ø�Ñ˜yÒ(¨U°9Ñ-=ÀÒ-JØ#‰JØ�9Ñ Ò%¨%°©/¸QÒ*>Ø,ˆJàˆ
Ø1ò 	DˆAÙ˜a 9šnØØ�IŠ~ØªJ¸À»
ÀEÈ!ÂHÐMÑM‘
Ø�e’Ø˜	’>Ø˜e A™h‘Ø" kÑ1™
ØŸ™ 8Ó,°Ò2Ø" hÑ.™
à" gÑ-˜
Ø 5Ò(Ù"°%¸³(¸EÀ(ºOÐ&LÑL™
á¨g°a«j¸%Àº(Ð"CÑC‘Jð!	Dð" 	�‰�r˜J‘¨Ñ0Ô1Ø�‰�t˜jÑ(¨7Ñ2Ô3ØˆrH   c           	      óð  — t        j                  |«      }t        t        «      5  |j	                  d«       d d d «       g }|j                  di «      }|j	                  dd «      }|j	                  dd «      }|rd|d<   |�rit        |«      D �]X  \  }}d }	||d<   |d   |d	<   |j                  d
d«      |d
<   d}
t        |«      r|
dz  }
n|j                  d«      }	|
|d<   |d   dk(  s|d   dk(  s|d   dk(  rd|d	<   |�K|rdnd|d<   nA|d   dk(  rd|d	<   d|d<   n.|d   dk(  rd|d	<   d|d<   nt        |«      rd|d	<   |�	|rdnd|d<   d|D �cg c]  }d|d   z  |v ‘Œ c}v rd|d
<   t        t        |||¬«      t        ||«      z   t        |||	«      z   «      }|j                  dg «      D ]$  }|j                  | j                  |d¬ «      «       Œ& |j                  |«       �Œ[ |S g }d!|v sd"|v r!|j                   d#j                  d'i |¤Ž«       |j                   d$j                  d'i |¤Ž«       |j                  t        |d%d ¬&«      «       |j                  |«       |S # 1 sw Y   �Œ1xY wc c}w )(NÚ	config_idrQ   z	accept-raÚ	wakeonlanÚgzethernet-wolrM   rR   rO   rJ   ri   rN   Ú6r   Údhcp4Údhcp6zipv6_dhcpv6-statefulÚdhcpÚ1Ú0Ú	accept_razipv6_dhcpv6-statelessÚ
ipv6_slaacr¿   Tzauto %srP   Úalias©rp   Úroutesz    )rØ   zbond-masterzbond-slaveszauto {name}ziface {name} {inet} {mode}r   )rM   rb   rm   )rn   Údeepcopyr   ÚKeyErrorÚpopra   Ú	enumerater
   r:   rs   rG   rg   ÚextendrÞ   r=   r>   )rÒ   r@   rp   ÚsectionsrQ   ré   Úethernet_wolrM   rA   rb   Úsubnet_inetr¥   rr   r×   s                 rF   Ú_render_ifacezRenderer._render_iface¨  så  € Ü—‘˜eÓ$ˆô ”hÓñ 	#Ø�I‰I�kÔ"÷	#àˆØ—)‘)˜I rÓ*ˆØ—I‘I˜k¨4Ó0ˆ	Ø—y‘y ¨dÓ3ˆÙà$'ˆE�.Ñ!ÚÜ!*¨7Ó!3ó 7'‘��vØ"&�Ø!&��g‘Ø & v¡��f‘Ø#)§:¡:¨i¸Ó#@��iÑ Ø$�Ü! &Ô)Ø 3Ñ&‘Kà&,§j¡j°Ó&7�OØ +��f‘à˜6‘N gÒ-Ø˜f‘~¨Ò0Ø˜f‘~Ð)?Ò?ð %+�E˜&‘MØ Ð,á4=©SÀ3˜˜kÒ*Ø˜F‘^Ð'>Ò>à$*�E˜&‘Mà$'�E˜&’MØ˜F‘^ |Ò3à$*�E˜&‘Mà$'�E˜&’MÜ# FÔ+à$,�E˜&‘MØ Ð,á4=©SÀ3˜˜kÑ*ð ØDLöØ<@�I  v¡Ñ/°4Ò7òñ ð (/�E˜)Ñ$äÜ&Ø˜uÐ7Gôô (¨¨vÓ6ñ7ô ' u¨e°_ÓEñ	Fó�ð $ŸZ™Z¨°"Ó5ò K�EØ—L‘L ×!3Ñ!3°EÀ&Ð!3Ó!IÕJðKð —‘ Ö&ðo7'ðD ˆð ˆEØ Ñ%¨¸%Ñ)?Ø—‘Ð1˜]×1Ñ1Ñ:°EÑ:Ô;Ø�L‰LÐ<Ð5×<Ñ<ÑE¸uÑEÔFØ�L‰LÜ  ¨aÀÔFôð �O‰O˜EÔ"Øˆ÷Y	#ñ 	#üòds   ¥I&ÅI3É&I0c                 ó  ‡
— ddddddœgdœ}|j                  «       D ],  }|j                  d«      dk(  sŒt        j                  |«      }Œ. |j                  }|rd	j                  |«      |d
   d   d<   |j                  }|rd	j                  |«      |d
   d   d<   dddddddœŠ
g }|j                  | j                  |«      «       t        |j                  «       ˆ
fd„¬«      D ]9  }|j                  d«      dk(  rŒ|j                  | j                  ||¬«      «       Œ; |j                  «       D ]"  }|j                  | j                  |«      «       Œ$ dj                  |D �	cg c]  }	dj                  |	«      ‘Œ c}	«      dz   S c c}	w )z1Given state, emit etc/network/interfaces content.rº   r¼   rN   r»   ri   )rR   rJ   )rP   rR   rN   rQ   rP   r4   rQ   r   r1   r0   rv   r~   é   rz   é   )r»   r¼   rZ   rX   rY   r[   c                 ó   •— ‰| d      | d   fS )NrR   rP   rm   )rÝ   Úorders    €rF   ú<lambda>z-Renderer._render_interfaces.<locals>.<lambda>   s   ø€ ˜5  6¡Ñ+¨Q¨v©YÐ7€ rH   )rD   rì   z

ú
)Úiter_interfacesra   rn   rî   r1   r;   Údns_searchdomainsrò   rö   r?   Úiter_routesr=   rÞ   )rÒ   Únetwork_staterp   rº   r@   r�   Úsearchdomainsró   r×   Úsrû   s             @rF   Ú_render_interfaceszRenderer._render_interfacesú  sŸ  ø€ ð ØØØ!+¸Ñ?Ð@ñ	
ˆð #×2Ñ2Ó4ò 	*ˆEØ�y‰y˜Ó  DÓ(Ü—]‘] 5Ó)‘ð	*ð $×3Ñ3ˆÙØ25·(±(¸;Ó2GˆBˆy‰M˜!ÑÐ.Ñ/à%×7Ñ7ˆÙØ-0¯X©X°mÓ-DˆBˆy‰M˜!Ñ˜\Ñ*ð
 ØØØØØñ
ˆð ˆØ�‰˜×*Ñ*¨2Ó.Ô/ÜØ×)Ñ)Ó+Û7ô
ò 		ˆEð
 �y‰y˜Ó  DÒ(ØØ�O‰OØ×"Ñ" 5Ð;KÐ"ÓLõð		ð #×.Ñ.Ó0ò 	7ˆEØ�O‰O˜D×.Ñ.¨uÓ5Õ6ð	7ð �{‰{°(Ö;¨Q˜DŸI™I a�LÒ;Ó<¸tÑCÐCùÒ;s   Å%Fr  Ú	templatesÚreturnc                 ó8  — t        j                  || j                  «      }t        j                  t
        j                  j                  |«      «       | j                  r| j                  nd}t        j                  ||| j                  |«      z   «       | j                  rzt        j                  || j                  «      }t        j                  t
        j                  j                  |«      «       t        j                  || j                  |«      d¬«       y y )Nrƒ   T)rB   Úpreserve_mode)r   Útarget_pathrÎ   r   Ú
ensure_dirrŽ   r�   r˜   rÐ   Ú
write_filer  rÑ   Ú_render_persistent_net)rÒ   r  r  ÚtargetÚfpeniÚheaderÚnetruless          rF   Úrender_network_statezRenderer.render_network_state.  sÁ   € ô × Ñ  ¨¯©Ó7ˆÜ�‰œŸ™Ÿ™¨Ó.Ô/Ø$(§O¢O�—’¸ˆÜ�‰˜˜v¨×(?Ñ(?ÀÓ(NÑNÔOà×ÒÜ×'Ñ'¨°×0BÑ0BÓCˆHÜ�O‰OœBŸG™GŸO™O¨HÓ5Ô6Ü�O‰OØØ×3Ñ3°MÓBØ"öð rH   ©N)rƒ   ©F)NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rÓ   rÞ   rö   r  r   r   Údictr  rm   rH   rF   rÌ   rÌ   h  sK   „ ÙJó
ó2óhPód2Dðn %)Øñ	à#ðð ˜D‘>ðð
 
ôrH   rÌ   c                 óÂ   — g d¢}ddg}|D ]  }t        j                  ||| ¬«      rŒ y t        j                  | d«      }t        j                  j                  |«      syy)N)ÚifqueryÚifupÚifdownz/sbinz	/usr/sbin)r€   r  FrÏ   T)r   Úwhichr	  rŽ   r�   r’   )r  Úexpectedr€   ÚpÚenis        rF   Ú	availabler!  C  s^   € Ú,€HØ�{Ð#€FØò ˆÜ�z‰z˜! F°6Ö:Ùðô ×
Ñ
˜6Ð#;Ó
<€CÜ�7‰7�>‰>˜#ÔØàrH   r  r  )"rn   r�   ÚloggingrŽ   r“   Ú
contextlibr   Útypingr   Ú	cloudinitr   r   r   Úcloudinit.netr   r	   r
   Úcloudinit.net.network_stater   Ú	getLoggerr  r_   rœ   r�   r›   rG   rg   rs   r—   Útimedr·   rµ   rÌ   r!  rm   rH   rF   ú<module>r*     s¯   ðó Û Û Û 	Û 	Ý Ý ç -Ñ -ß ?Ñ ?Ý 4à€g×Ñ˜Ó!€òÐ ò	Ð òÐ ò8ò<9óxò0A*ðH €×ÑÐ(Ó)ñ.ó *ð.ò&EôRXˆx× Ñ ô Xôv
rH   