Ë
    x[hª§  ã                   ó”  — 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m	Z	m
Z
mZ d dlmZmZ d dlmZ  ej"                  e«      ZdZdZg d¢Zg d¢Z ej0                  d	«      fd
„Zd„ Zddd„Z	 	 	 	 ded„Zdfd„Zd„ Zd„ Zd„ Z d„ Z!d„ Z"d„ Z#d„ Z$d„ Z% ejL                  d¬«      de'fd„«       Z( ejL                  d¬«      de)fd„«       Z*de+de'fd„Z,dfd„Z-d„ Z.d„ Z/dfde'fd „Z0dfd!„Z1dfd"„Z2d#„ Z3d$„ Z4d%„ Z5d&„ Z6d'„ Z7 G d(„ d)e8«      Z9d*„ Z:de	e+   fd+„Z;de
e+   fd,„Z<de	e+   fd-„Z=de
e+   fd.„Z>de	e+   fd/„Z?de
e+   fd0„Z@de	e+   fd1„ZAde
e+   fd2„ZBdfde
eC   fd3„ZDd4„ ZEdgd5„ZFdhd6„ZG	 did7„ZHd8„ ZId9„ ZJdeCfd:„ZKd;e+de
e+   fd<„ZLdeCfd=„ZMdeCfd>„ZNdeCfd?„ZOdeCfd@„ZP	 	 	 	 	 	 	 djdAe'dBe'dCe'dDe'dEe'dFe'dGe'de)fdH„ZQdIedJ   dKe	ee+e+e+e+f      ddfdL„ZRdM„ ZSdNedOe+fdP„ZTdOe+de'fdQ„ZUdOe+de'fdR„ZVdOe+de'fdS„ZWdOe+de'fdT„ZXdOe+de'fdU„ZYdOe+de'fdV„ZZdOe+dWe+de'fdX„Z[dYe+dWe+de'fdZ„Z\de'fd[„Z]de+fd\„Z^de_fd]„Z`de_fd^„Zad_e+d`e+de+fda„Zb G db„ dcec«      Zdy)ké    N)ÚCallableÚDictÚListÚOptionalÚTuple)ÚsubpÚutil)ÚIproute2z/sys/class/net/Úeth0)Údhcp6Ú
ipv6_slaaczipv6_dhcpv6-statelesszipv6_dhcpv6-stateful)ú	ovs-vsctlz--formatÚcsvz--no-headingsz	--timeoutÚ10z	--columnsÚnameÚfindÚ	interfaceztype=internalz([0-9]+)c                 ó¦   — t        j                  || «      D �cg c]-  }|j                  «       rt        |«      n|j	                  «       ‘Œ/ c}S c c}w )aD  Sorting for Humans: natural sort order. Can be use as the key to sort
    functions.
    This will sort ['eth0', 'ens3', 'ens10', 'ens12', 'ens8', 'ens0'] as
    ['ens0', 'ens3', 'ens8', 'ens10', 'ens12', 'eth0'] instead of the simple
    python way which will produce ['ens0', 'ens10', 'ens12', 'ens3', 'ens8',
    'eth0'].)ÚreÚsplitÚisdigitÚintÚlower)ÚsÚ_nsreÚtexts      ú8/usr/lib/python3/dist-packages/cloudinit/net/__init__.pyÚnatural_sort_keyr   +   sF   € ô —H‘H˜U AÓ&öàð —\‘\”^ŒˆDŒ	¨¯©«Ñ5òð ùò s   ™2Ac                  ó   — t         S )z3Simple function to return the global SYS_CLASS_NET.)ÚSYS_CLASS_NET© ó    r   Úget_sys_class_pathr#   8   s   € äÐr"   c                 ó(   — t        «       | z   dz   |z   S )Nú/)r#   ©ÚdevnameÚpaths     r   Úsys_dev_pathr)   =   s   € ÜÓ 'Ñ)¨CÑ/°$Ñ6Ð6r"   c                 óÚ  — t        | |«      }	 t        j                  |«      }|j                  «       }|€|S 	 ||   S # t        t        f$ rf}t        |dd «      }	|	t        j                  t        j                  fv r|� ||«      cY d }~S |	t        j                  fv r|� ||«      cY d }~S ‚ d }~ww xY w# t        $ r,}|� ||«      cY d }~S t        j                  d||«       ‚ d }~ww xY w)NÚerrnoz5Found unexpected (not translatable) value '%s' in '%s)r)   r	   Úload_text_fileÚOSErrorÚIOErrorÚgetattrr+   ÚENOENTÚENOTDIRÚEINVALÚstripÚKeyErrorÚLOGÚdebug)
r'   r(   Ú	translateÚ	on_enoentÚon_keyerrorÚ	on_einvalÚdev_pathÚcontentsÚeÚe_errnos
             r   Úread_sys_netr?   A   sô   € ô ˜G TÓ*€Hð
Ü×&Ñ& xÓ0ˆð �~‰~Ó€HØÐØˆðØ˜Ñ"Ð"øô ”WÐò Ü˜!˜W dÓ+ˆØ”u—|‘|¤U§]¡]Ð3Ñ3ØÐ$Ù  “|Õ#Ø”u—|‘|�oÑ%ØÐ$Ù  “|Õ#Øûðûô ò 	ØÐ"Ù˜q“>Õ!ä�I‰IØGØØôð
 ûð	úsP   Ž= ¸B5 ½B2Á8B-ÂB2Â
B-Â&B2Â,B-Â-B2Â5	C*Â>	C%ÃC*ÃC%Ã%C*c                 ó*   — d„ }t        | |||||¬«      S )Nc                  ó   — y©NFr!   )r=   s    r   Úon_excp_falsez(read_sys_net_safe.<locals>.on_excp_falseg   s   € Ør"   )r9   r8   r:   r7   )r?   )ÚifaceÚfieldr7   rC   s       r   Úread_sys_net_saferF   f   s(   € òô ØØØ!ØØØôð r"   c                 óZ   — t        | |«      }|du ry 	 t        |«      S # t        $ r Y y w xY wrB   )rF   r   Ú
ValueError)rD   rE   Úvals      r   Úread_sys_net_intrJ   t   s8   € Ü
˜E 5Ó
)€CØ
ˆe�|ØðÜ�3‹xˆøÜò Ùðús   “
 ž	*©*c                 ó*   — ddddœ}t        | d|¬«      S )NTF)ÚupÚunknownÚdownÚ	operstate)r7   ©rF   )r'   r7   s     r   Úis_uprQ   ~   s   € ð ¨°eÑ<€IÜ˜W k¸YÔGÐGr"   c                 óT   — t         j                  j                  t        | d«      «      S )NÚbridge©Úosr(   Úexistsr)   ©r'   s    r   Ú	is_bridgerX   †   s   € Ü�7‰7�>‰>œ, w°Ó9Ó:Ð:r"   c                 óT   — t         j                  j                  t        | d«      «      S )NÚbondingrT   rW   s    r   Úis_bondr[   Š   s   € Ü�7‰7�>‰>œ, w°	Ó:Ó;Ð;r"   c                 ó`   — t        | d¬«      }t        j                  j                  |«      r|S y)z8Return the master path for devname, or None if no masterÚmaster©r(   N)r)   rU   r(   rV   r&   s     r   Ú
get_masterr_   Ž   s&   € ä˜ hÔ/€DÜ	‡w�w‡~�~�dÔØˆØr"   c                 ó  — t        | «      }|€yt        j                  j                  |d«      }t        j                  j                  |d«      }t        j                  j	                  |«      xs t        j                  j	                  |«      S )z@Return a bool indicating if devname's master is a bridge or bondFrZ   rS   )r_   rU   r(   ÚjoinrV   )r'   Úmaster_pathÚbonding_pathÚbridge_paths       r   Úmaster_is_bridge_or_bondre   –   sb   € ä˜WÓ%€KØÐØÜ—7‘7—<‘< ¨YÓ7€LÜ—'‘'—,‘,˜{¨HÓ5€KÜ�7‰7�>‰>˜,Ó'ÒF¬2¯7©7¯>©>¸+Ó+FÐFr"   c                 óv   — t        | «      }|€yt        | d¬«      }t        j                  j	                  |«      S )z;Return a bool indicating if devname's master is openvswitchFzupper_ovs-systemr^   )r_   r)   rU   r(   rV   )r'   rb   Úovs_paths      r   Úmaster_is_openvswitchrh       s5   € ä˜WÓ%€KØÐØÜ˜GÐ*<Ô=€HÜ�7‰7�>‰>˜(Ó#Ð#r"   c                 ó    — t        | d«      dk(  S )NÚtypeÚ32rP   rW   s    r   Úis_ib_interfacerl   ©   s   € Ü˜W fÓ-°Ñ5Ð5r"   )ÚmaxsizeÚreturnc                  óp   — t        t        j                  d«      «      } | st        j	                  d«       | S )zDReturn a bool indicating if Open vSwitch is installed in the system.r   z<ovs-vsctl not in PATH; not detecting Open vSwitch interfaces)Úboolr   Úwhichr5   r6   )Úrets    r   Úopenvswitch_is_installedrs   ­   s0   € ô Œt�z‰z˜+Ó&Ó
'€CÙÜ�	‰	ØJô	
ð €Jr"   c                  óè   — 	 t        j                   t        «      \  } }| j                  «       S # t         j                  $ r0}d|j                  v rt
        j                  d«       g cY d}~S ‚ d}~ww xY w)zÎReturn a list of the names of OVS internal interfaces on the system.

    These will all be strings, and are used to exclude OVS-specific interface
    from cloud-init's network configuration handling.
    zdatabase connection failedzJOpen vSwitch is not yet up; no interfaces will be detected as OVS-internalN)r   Ú!OVS_INTERNAL_INTERFACE_LOOKUP_CMDÚ
splitlinesÚProcessExecutionErrorÚstderrr5   Úinfo)ÚoutÚ_errÚexcs      r   Úget_ovs_internal_interfacesr}   ¸   sh   € ð Ü—I‘IÔ?Ó@‰	ˆˆTð �~‰~ÓÐøô ×%Ñ%ò Ø'¨3¯:©:Ñ5Ü�H‰Hð ôð �IØûðús!   ‚. ®A1Á$A,Á%A1Á+A,Á,A1r'   c                 ód   — t        «       syt        «       }| |v rt        j                  d| «       yy)z€Returns True if this is an OVS internal interface.

    If OVS is not installed or not yet running, this will return False.
    FzDetected %s as an OVS interfaceT)rs   r}   r5   r6   )r'   Úovs_bridgess     r   Ú!is_openvswitch_internal_interfacer€   Í   s2   € ô
 $Ô%ØÜ-Ó/€KØ�+ÑÜ�	‰	Ð3°WÔ=ØØr"   c                 óP   — |€t        | «      }t        | |«      st        | |«      ryy)z®netfailover driver uses 3 nics, master, primary and standby.
    this returns True if the device is either the primary or standby
    as these devices are to be ignored.
    TF)Údevice_driverÚis_netfail_primaryÚis_netfail_standby©r'   Údrivers     r   Úis_netfailoverr‡   Û   s2   € ð
 €~Ü˜wÓ'ˆÜ˜' 6Ô*Ô.@Ø�ô/ð Ør"   c                 óD   — d}	 t        | d«      }|S # t        $ r Y |S w xY w)zDReturns a str from reading /sys/class/net/<devname>/device/features.Ú zdevice/features)r?   Ú	Exception©r'   Úfeaturess     r   Úget_dev_featuresr�   é   s9   € à€HðÜ Ð):Ó;ˆð €Oøô ò ØØ€Oðús   „ ’	žc                 óJ   — t        | «      }|rt        |«      dk  ry|d   dk(  S )zÄReturn True if VIRTIO_NET_F_STANDBY bit (62) is set.

    https://github.com/torvalds/linux/blob/         089cf7f6ecb266b6a4164919a2e69bd2f938374a/         include/uapi/linux/virtio_net.h#L60
    é@   Fé>   Ú1)r�   Úlenr‹   s     r   Úhas_netfail_standby_featurer“   ó   s.   € ô   Ó(€HÙ”s˜8“} rÒ)ØØ�B‰<˜3ÑÐr"   c                 óZ   — t        | «      �y|€t        | «      }|dk7  ryt        | «      syy)zòA device is a "netfail master" device if:

    - The device does NOT have the 'master' sysfs attribute
    - The device driver is 'virtio_net'
    - The device has the standby feature bit set

    Return True if all of the above is True.
    FÚ
virtio_netT©r_   r‚   r“   r…   s     r   Úis_netfail_masterr—      s:   € ô �'ÓÐ&Øà€~Ü˜wÓ'ˆà�ÒØä& wÔ/Øàr"   c                 ó:  — t        | d¬«      }t        j                  j                  |«      sy|€t	        | «      }|dk(  ryt        j                  j                  t        j                  j                  |«      «      }t	        |«      }|dk7  ryt        |«      }|syy)a7  A device is a "netfail primary" device if:

    - the device has a 'master' sysfs file
    - the device driver is not 'virtio_net'
    - the 'master' sysfs file points to device with virtio_net driver
    - the 'master' device has the 'standby' feature bit set

    Return True if all of the above is True.
    r]   r^   Fr•   T)r)   rU   r(   rV   r‚   ÚbasenameÚrealpathr“   )r'   r†   Úmaster_sysfs_pathÚmaster_devnameÚmaster_driverÚmaster_has_standbys         r   rƒ   rƒ     sŒ   € ô % W°8Ô<ÐÜ�7‰7�>‰>Ð+Ô,Øà€~Ü˜wÓ'ˆà�ÒØä—W‘W×%Ñ%¤b§g¡g×&6Ñ&6Ð7HÓ&IÓJ€NÜ! .Ó1€MØ˜Ò$Øä4°^ÓDÐÙØàr"   c                 óZ   — t        | «      €y|€t        | «      }|dk7  ryt        | «      syy)zçA device is a "netfail standby" device if:

    - The device has a 'master' sysfs attribute
    - The device driver is 'virtio_net'
    - The device has the standby feature bit set

    Return True if all of the above is True.
    Fr•   Tr–   r…   s     r   r„   r„   9  s:   € ô �'ÓÐ"Øà€~Ü˜wÓ'ˆà�ÒØä& wÔ/Øàr"   c                 ó*   — t        | d«      }|r|dv ryy)a°  
    /* interface name assignment types (sysfs name_assign_type attribute) */
    #define NET_NAME_UNKNOWN      0  /* unknown origin (not exposed to user) */
    #define NET_NAME_ENUM         1  /* enumerated by kernel */
    #define NET_NAME_PREDICTABLE  2  /* predictably named by the kernel */
    #define NET_NAME_USER         3  /* provided by user-space */
    #define NET_NAME_RENAMED      4  /* renamed by user-space */
    Úname_assign_type)Ú3Ú4TFrP   )r'   r¡   s     r   Ú
is_renamedr¤   Q  s#   € ô )¨Ð2DÓEÐÙÐ,°
Ñ:ØØr"   c                 óP   — t        t        | d«      «      }d|j                  «       v S )NÚueventzDEVTYPE=vlan)ÚstrrF   rv   )r'   r¦   s     r   Úis_vlanr¨   `  s(   € ÜÔ" 7¨HÓ5Ó6€FØ˜V×.Ñ.Ó0Ð0Ð0r"   c                 óÄ   — d}t        | d«      }t        j                  j                  |«      r2t        j                  j	                  t        j
                  |«      «      }|S )z8Return the device driver for net device named 'devname'.Nzdevice/driver)r)   rU   r(   Úislinkr™   Úreadlink)r'   r†   Údriver_paths      r   r‚   r‚   e  sE   € à€FÜ˜w¨Ó8€Kä	‡w�w‡~�~�kÔ"Ü—‘×!Ñ!¤"§+¡+¨kÓ":Ó;ˆà€Mr"   c                 ó(   — t        | d«      }|du ry|S )z;Return the device id string for net device named 'devname'.zdevice/deviceFNrP   )r'   Údev_ids     r   Údevice_devidr¯   p  s   € ä˜w¨Ó8€FØ��Øà€Mr"   c                  óD  — t        j                  «       st        j                  «       r!t        t	        «       j                  «       «      S 	 t        j                  t        «       «      } | S # t        $ r,}|j                  t        j                  k(  rg } n‚ Y d }~| S d }~ww xY w©N)r	   Ú
is_FreeBSDÚis_DragonFlyBSDÚlistÚget_interfaces_by_macÚvaluesrU   Úlistdirr#   r-   r+   r0   )Údevsr=   s     r   Úget_devicelistr¹   y  sƒ   € Ü‡�ÔœD×0Ñ0Ô2ÜÔ)Ó+×2Ñ2Ó4Ó5Ð5ðÜ�z‰zÔ,Ó.Ó/ˆð €Køô ò Ø�7‰7”e—l‘lÒ"Ø‰Dàó ð €Kûðús   ÁA* Á*	BÁ3!BÂBc                   ó   — e Zd ZdZy)ÚParserErrorz6Raised when a parser has issue parsing a file/content.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r!   r"   r   r»   r»   ‡  s   „ Ú@r"   r»   c                 óP   — | rt        | t        «      sy| j                  d«      dk(  S )NFÚconfigÚdisabled)Ú
isinstanceÚdictÚget)Úcfgs    r   Úis_disabled_cfgrÇ   ‹  s%   € Ù”j ¤dÔ+ØØ�7‰7�8Ó 
Ñ*Ð*r"   c                  óÞ   — t        j                  «       st        j                  «       r
t        «       S t        j                  «       st        j
                  «       r
t        «       S t        «       S )zqGet the list of network interfaces viable for networking.

    @return List of interfaces, sorted naturally.
    )r	   r²   r³   Úfind_candidate_nics_on_freebsdÚ	is_NetBSDÚ
is_OpenBSDÚ(find_candidate_nics_on_netbsd_or_openbsdÚfind_candidate_nics_on_linuxr!   r"   r   Úfind_candidate_nicsrÎ   ‘  sG   € ô
 ‡�ÔœD×0Ñ0Ô2Ü-Ó/Ð/Ü	�‰Ô	œTŸ_™_Ô.Ü7Ó9Ð9ä+Ó-Ð-r"   c                  óÞ   — t        j                  «       st        j                  «       r
t        «       S t        j                  «       st        j
                  «       r
t        «       S t        «       S )z.Get the name of the 'fallback' network device.)r	   r²   r³   Úfind_fallback_nic_on_freebsdrÊ   rË   Ú&find_fallback_nic_on_netbsd_or_openbsdÚfind_fallback_nic_on_linuxr!   r"   r   Úfind_fallback_nicrÓ   ž  sE   € ä‡�ÔœD×0Ñ0Ô2Ü+Ó-Ð-Ü	�‰Ô	œTŸ_™_Ô.Ü5Ó7Ð7ä)Ó+Ð+r"   c                  óP   — t        t        «       j                  «       t        ¬«      S )zmGet the names of the candidate network devices on NetBSD/OpenBSD.

    @return list of sorted interfaces
    ©Úkey)Úsortedrµ   r¶   r   r!   r"   r   rÌ   rÌ   ¨  s   € ô
 Ô'Ó)×0Ñ0Ó2Ô8HÔIÐIr"   c                  ó&   — t        «       } | r| d   S y)zfGet the 'fallback' network device name on NetBSD/OpenBSD.

    @return default interface, or None
    r   N)rÌ   ©Únamess    r   rÑ   rÑ   °  s   € ô
 5Ó6€EÙØ�Q‰xˆàr"   c                  ó¬   — t        j                   g d¢«      \  } }| j                  «       }|r|S t        t        «       j	                  «       t
        ¬«      S )zgGet the names of the candidate network devices on FreeBSD.

    @return List of sorted interfaces.
    )Úifconfigz-lz-uÚetherrÕ   )r   r   r×   rµ   r¶   r   )ÚstdoutÚ_stderrr¶   s      r   rÉ   rÉ   ¼  sG   € ô
 —i‘iÒ AÓB�O€FˆGØ�\‰\‹^€FÙØˆô Ô'Ó)×0Ñ0Ó2Ô8HÔIÐIr"   c                  ó&   — t        «       } | r| d   S y)z_Get the 'fallback' network device name on FreeBSD.

    @return List of sorted interfaces.
    r   N)rÉ   rÙ   s    r   rÐ   rÐ   Ë  s   € ô
 +Ó,€EÙØ�Q‰xˆàr"   c                  ó~  — dt        j                  «       v rt        j                  d«       n\t	        «       D � cg c]  } | dk7  rt        | «      s| ‘Œ }} t        |«      r*t        j                  d|«       t        j                  «        g }g }t        dddddd¬«      D ]Ã  \  }}}}|dk(  rŒ|j                  d«      rt        j                  d	|«       Œ6t        |d
«      }|r|j                  |«       ŒVt        j                  d|«       t        |d«      }|r|j                  |«       ŒŒt        |d«      }|dv r|j                  |«       Œ®t        j                  d|«       ŒÅ g }	||fD ]K  }
t        |
t        ¬«      }
t        |
v r+|
j!                  t        «       |
j#                  dt        «       |	|
z  }	ŒM |	S c c} w )zeGet the names of the candidate network devices on Linux.

    @return List of sorted interfaces.
    znet.ifnames=0z9Stable ifnames disabled by net.ifnames=0 in /proc/cmdlineÚloz4Found unstable nic names: %s; calling udevadm settleFT)Úfilter_openvswitch_internalÚ2filter_slave_if_master_not_bridge_bond_openvswitchÚfilter_vlanÚfilter_without_own_macÚfilter_zero_macÚlog_filtered_reasonsÚvethzIgnoring veth interface: %sÚcarrierzInterface has no carrier: %sÚdormantrO   )rë   rN   ÚlowerlayerdownrM   zInterface ignored: %srÕ   r   )r	   Úget_cmdliner5   r6   r¹   r¤   r’   Úudevadm_settleÚget_interfacesÚ
startswithrJ   ÚappendrF   r×   r   ÚDEFAULT_PRIMARY_INTERFACEÚremoveÚinsert)ÚdeviceÚunstableÚ	connectedÚpossibly_connectedr   Ú_rê   rë   rO   Úsorted_interfacesÚ
interfacess              r   rÍ   rÍ   ×  sÖ  € ð
 œ$×*Ñ*Ó,Ñ,Ü�	‰	ÐMÕNô )Ó*ö
àØ˜Š~¤j°Ô&8ò ð
ˆð 
ô
 ˆxŒ=Ü�I‰IØFØôô ×ÑÔ!ð €IØÐÜ,Ø$)Ø;@ØØ$ØØ!ôò 6Ñˆ	�1�a˜ð ˜ÒØØ×Ñ Ô'Ü�I‰IÐ3°YÔ?ØÜ" 9¨iÓ8ˆÙØ×Ñ˜YÔ'ØÜ�	‰	Ð0°)Ô<ô # 9¨iÓ8ˆÙØ×%Ñ% iÔ0ØÜ% i°Ó=ˆ	ØÐHÑHØ×%Ñ% iÔ0Øä�	‰	Ð)¨9Õ5ð=6ðJ ÐØ Ð"4Ð5ò (ˆ
Ü˜JÔ,<Ô=ˆ
Ü$¨
Ñ2Ø×ÑÔ7Ô8Ø×Ñ˜aÔ!:Ô;Ø˜ZÑ'Ñð(ð Ðùò{
s   ¹F:c                  ó&   — t        «       } | r| d   S y)z]Get the 'fallback' network device name on Linux.

    @return List of sorted interfaces.
    r   N)rÍ   rÙ   s    r   rÒ   rÒ     s   € ô
 )Ó*€EÙØ�Q‰xˆàr"   c                 ó¼   — t        «       }|syt        |«      rd|i}ndt        |d«      j                  «       i}| rt	        |«      }|r||d<   dd||dœ}||idd	œ}|S )
zBGenerate network cfg v2 for dhcp on the NIC most likely connected.Nr   Ú
macaddressÚaddressr†   T)Údhcp4r   úset-nameÚmatché   )Ú	ethernetsÚversion)rÓ   r—   rF   r   r‚   )Úconfig_driverÚtarget_namer  r†   rÆ   Únconfs         r   Úgenerate_fallback_configr	  +  s‰   € ô $Ó%€KÙàô ˜Ô%Ø˜Ð%‰ð Ô+¨K¸ÓC×IÑIÓKð
ˆñ Ü˜{Ó+ˆÙØ$ˆE�(‰OàØØØñ	€Cð '¨Ð,¸Ñ;€EØ€Lr"   c                 ó€   — d„ }d„ }| j                  d«      }|dk(  r || «      S |dk(  r || «      S t        d|z  «      ‚)Nc                 óŽ  — g }| j                  di «      D ]­  }|j                  d«      dk7  rŒ|j                  d«      }|sŒ,|j                  d«      }|j                  di «      j                  d«      }|j                  di «      j                  d«      }|st        |«      }|st        |«      }|j                  ||||g«       Œ¯ |S )	NrÁ   rj   ÚphysicalÚmac_addressr   Úparamsr†   Ú	device_id)rÅ   r‚   r¯   rñ   )ÚnetcfgÚphysdevsÚentÚmacr   r†   r  s          r   Ú
_version_1z$extract_physdevs.<locals>._version_1I  sÁ   € ØˆØ—:‘:˜h¨Ó+ò 	<ˆCØ�w‰w�v‹ *Ò,ØØ—'‘'˜-Ó(ˆCÙØØ—7‘7˜6“?ˆDØ—W‘W˜X rÓ*×.Ñ.¨xÓ8ˆFØŸ™ ¨"Ó-×1Ñ1°+Ó>ˆIÙÜ& tÓ,�ÙÜ(¨Ó.�	Ø�O‰O˜S $¨°	Ð:Õ;ð	<ð ˆr"   c                 ó¦  — g }| j                  di «      j                  «       D ]«  }|j                  d«      }|sŒ|j                  di «      j                  d«      }|sŒ;|j                  di «      j                  d«      }|j                  di «      j                  d«      }|st        |«      }|st        |«      }|j	                  ||||g«       Œ­ |S )Nr  r  r  rþ   r†   r  )rÅ   r¶   r‚   r¯   rñ   )r  r  r  r   r  r†   r  s          r   Ú
_version_2z$extract_physdevs.<locals>._version_2[  sË   € ØˆØ—:‘:˜k¨2Ó.×5Ñ5Ó7ò 	<ˆCà—7‘7˜:Ó&ˆDÙØà—'‘'˜' 2Ó&×*Ñ*¨<Ó8ˆCÙØØ—W‘W˜W bÓ)×-Ñ-¨hÓ7ˆFØŸ™ ¨Ó,×0Ñ0°Ó=ˆIÙÜ& tÓ,�ÙÜ(¨Ó.�	Ø�O‰O˜S $¨°	Ð:Õ;ð	<ð  ˆr"   r  é   r  z"Unknown network config version: %s)rÅ   ÚRuntimeError)r  r  r  r  s       r   Úextract_physdevsr  H  sQ   € òò$ð( �j‰j˜Ó#€GØ�!‚|Ù˜&Ó!Ð!Ø	�AŠÙ˜&Ó!Ð!ä
Ð;¸gÑEÓ
FÐFr"   c                 óB   — t        | d«      }|€|rt        d«      ‚y|dv S )aš  return True if the provided interface has its own address.

    Based on addr_assign_type in /sys.  Return true for any interface
    that does not have a 'stolen' address. Examples of such devices
    are bonds or vlans that inherit their mac from another device.
    Possible values are:
      0: permanent address    2: stolen from another device
    1: randomly generated   3: set using dev_set_mac_addressÚaddr_assign_typez%s had no addr_assign_type.T)r   r  é   )rJ   rH   )ÚifnameÚstrictÚassign_types      r   Úinterface_has_own_macr   x  s6   € ô # 6Ð+=Ó>€KØÐñ ÜÐ:Ó;Ð;ØØ˜)Ð#Ð#r"   c           	      óÌ  — i }t        «       D ]*  \  }}}}d|||j                  «       |t        |«      dœ||<   Œ, | r¨t        j                  d«      }t        j
                  g d¢d¬«      \  }}t        j
                  g d¢d¬«      \  }	}t        «       }
||	fD ]"  }|
j                  |j                  |«      «       Œ$ |j                  «       D ]  }|d   d	u xs |d
   |
v|d<   Œ |S )aà  Collect information necessary for rename_interfaces.

    returns a dictionary by mac address like:
       {name:
         {
          'downable': None or boolean indicating that the
                      device has only automatically assigned ip addrs.
          'device_id': Device id value (if it has one)
          'driver': Device driver (if it has one)
          'mac': mac address (in lower case)
          'name': name
          'up': boolean: is_up(name)
         }}
    N)Údownabler  r†   r  r   rL   z[0-9]+:\s+(\w+)[@:])Úipz-6ÚaddrÚshowÚ	permanentÚscopeÚglobalT)Úcapture)r#  z-4r$  r%  rL   Fr   r"  )
rï   r   rQ   r   Úcompiler   ÚsetÚupdateÚfindallr¶   )Úcheck_downableÚcur_infor   r  r†   r  ÚnmatchÚipv6r{   Úipv4Únics_with_addressesÚ	bytes_outÚds                r   Ú_get_current_rename_infor6  Œ  s  € ð €HÜ(6Ó(8ò 
Ñ$ˆˆc�6˜9àØ"ØØ—9‘9“;ØÜ˜“+ñ
ˆ�Šð
ñ Ü—‘Ð2Ó3ˆÜ—Y‘YÚHØô
‰
ˆˆdô —Y‘YÒ;ÀTÔJ‰
ˆˆdä!›eÐØ ˜ò 	BˆIØ×&Ñ& v§~¡~°iÓ'@ÕAð	Bð —‘Ó"ò 	ˆAà�$‘˜5Ð ÒH A f¡IÐ5HÐ$Hð ˆjŠMð	ð
 €Or"   c                 ó°  ‡‡— t        | «      st        j                  d«       y |€
t        «       }i Š|j	                  «       D ]F  \  }}|j                  «       }|j                  d«      r|d   j                  «       |d<   ||d<   |‰|<   ŒH t        j                  d‰«       d„ }g }g }	g }
 |‰«      }d}d}d„ Šˆˆfd	„}| D �]˜  \  }}}}|r|j                  «       }g } ||||«      }|s|r|	j                  d
|›d|›d�«       ŒD|j                  d«      }||k(  rŒ[|s|r|	j                  d
|›d|›d�«       Œx|d   rRd}|d   s|r|	j                  ||||fz  «       Œžd|d<   |j                  d|||ff«       |
j                  d|||ff«       ||v rš||   }|d   r7d}|d   s|r|	j                  ||||fz  «       Œþ|j                  d|||ff«       d }|�||v r|dz  }||z  }|€Œ||v rŒ|j                  d||||ff«       ||d<    |‰«      }|d   r|
j                  d|||ff«       |j                  d|||d   |ff«       ||d<    |‰«      }||z  }�Œ› t        j                  t        j                  t        j                  dœ}|s<|
s:t        |	«      rt        j                  d| |	«       nIt        j                  d| «       n2t        j                  d| ||
z   «       ||
z   D ]  \  }}}}	  ||   |Ž  Œ t        |	«      rt        dj!                  |	«      «      ‚y # t        $ r)}|	j                  d|›|›d|›d|›d|›�	«       Y d }~Œfd }~ww xY w)Nzno interfaces to renamer  r   zDetected interfaces %sc                 óB   — t        d„ | j                  «       D «       «      S )Nc              3   ó*   K  — | ]  }|d    |f–— Œ y­w)r   Nr!   )Ú.0Údatas     r   ú	<genexpr>z<_rename_interfaces.<locals>.update_byname.<locals>.<genexpr>Ð  s   è ø€ ÒD¨T�T˜&‘\ 4Ô(ÑDùs   ‚)rÄ   r¶   )Úbymacs    r   Úupdate_bynamez)_rename_interfaces.<locals>.update_bynameÏ  s   € ÜÑD°U·\±\³^ÔDÓDÐDr"   z
cirename%déÿÿÿÿc                 óˆ   — |r |r|r| d   |k(  xr | d   |k(  xr | d   |k(  S |r|r| d   |k(  xr | d   |k(  S |r| d   |k(  S y)zmatch if set and in datar  r†   r  Fr!   )r;  r  r†   r  s       r   Úentry_matchz'_rename_interfaces.<locals>.entry_matchÙ  sv   € á‘6™ià�U‘˜sÑ"ò 3Ø˜‘N fÑ,ò3à˜Ñ%¨Ñ2ðñ
 ‘VØ˜‘; #Ñ%ÒB¨$¨x©.¸FÑ*BÐBÙØ˜‘; #Ñ%Ð%àr"   c           	      óÐ   •— ‰j                  «       D �cg c]  } ‰|| ||«      r|‘Œ }}t        |«      r-t        |«      dkD  rd|›d| ›d|›d|›d�	}t        |«      ‚|d   S y c c}w )Nr  z2Failed to match a single device. Matched devices "z" with search values "(mac:z driver:z device_id:z)"r   )r¶   r’   rH   )r  r†   r  r;  r  Úmsgr/  rA  s         €€r   Ú
find_entryz&_rename_interfaces.<locals>.find_entryè  s}   ø€ ð !Ÿ™Ó)ö
àÙ˜4  f¨iÔ8ò ð
ˆð 
ô
 ˆuŒ:Ü�5‹z˜A‹~ò šc¢6ª9ð6ð ô
 ! “oÐ%Ø˜‘8ˆOàùò
s   ”A#z$[nic not present] Cannot rename mac=z to z, not available.rL   z*[busy] Error renaming mac=%s from %s to %sr"  FrN   z2[busy-target] Error renaming mac=%s from %s to %s.r  Úrename)rE  rN   rL   z1Unable to rename interfaces: %s due to errors: %sz$no work necessary for renaming of %szRenamed %s with ops %sz[unknown] Error performing z for z, z: ú
)r’   r5   r6   r6  ÚitemsÚcopyrÅ   r   rñ   r
   Úlink_renameÚ	link_downÚlink_upÚwarningrŠ   r  ra   )ÚrenamesÚstrict_presentÚstrict_busyÚcurrent_infor   r;  Úcurr>  ÚopsÚerrorsÚupsÚ
cur_bynameÚtmpname_fmtÚtmpirD  r  Únew_namer†   r  Úcur_opsÚcur_namerC  ÚtargetÚtmp_nameÚopmapÚopr  r=   r/  rA  s                               @@r   Ú_rename_interfacesr_  º  sÕ  ù€ ô ˆwŒ<Ü�	‰	Ð+Ô,ØàÐÜ/Ó1ˆà€HØ"×(Ñ(Ó*ò ‰
ˆˆdØ�i‰i‹kˆØ�7‰7�5Œ>Ø˜U™×)Ñ)Ó+ˆC�‰JØˆˆF‰Øˆ�Šðô ‡I�IÐ&¨Ô1òEð €CØ€FØ
€CÙ˜xÓ(€JØ€KØ€Dòõð$ -4ó =Ñ(ˆˆX�v˜yÙØ—)‘)“+ˆCØˆÙ˜˜f iÓ0ˆÙÙØ—’â*-ªxð9ôð à—7‘7˜6“?ˆØ�xÒàáÙØ—’â*-ªxð9ôð àˆtŠ9Ø>ˆCØ�z’?ÙØ—M‘M #¨¨h¸Ð(AÑ"AÔBØØˆC�‰IØ�N‰N˜F C¨°H°;Ð?Ô@Ø�J‰J˜˜c 8¨h¨[Ð9Ô:à�zÑ!Ø Ñ)ˆFØ�dŠ|ØJ�Ø˜jÒ)Ù"ØŸ™ c¨S°(¸HÐ,EÑ&EÔFØà—N‘N F¨C°¸H¸;Ð#GÔHà&*ˆHØÐ" h°*Ñ&<Ø˜‘	�Ø&¨Ñ-�ð Ñ" h°*Ò&<ð �N‰N˜H c¨8°hÀÐ5IÐJÔKØ%ˆF�6‰NÙ& xÓ0ˆJØ�dŠ|Ø—
‘
˜D # x°(°Ð=Ô>à�‰˜ # x°#°f±+¸xÐ1HÐIÔJØˆˆF‰Ù" 8Ó,ˆ
Øˆw‰Šð{=ô@ ×&Ñ&Ü×"Ñ"Ü×Ññ"€Eñ ™#ÜˆvŒ;Ü�K‰KØCØØõô �I‰IÐ<¸gÕFä�	‰	Ð*¨G°S¸3±YÔ?à),¨s©ò 	Ñ%ˆB��X˜vðØ��b‘	˜6Ò"ð	ô ˆ6„{Ü˜4Ÿ9™9 VÓ,Ó-Ð-ð øô ò Ø—’áš6¢3ª±!ð5÷ñ ûðús   Ë3L#Ì#	MÌ,MÍMc                 ót   — d}t         j                  j                  t        | d«      «      rd}t	        | |«      S )z6Returns the string value of an interface's MAC Addressrÿ   Úbonding_slavezbonding_slave/perm_hwaddr)rU   r(   Úisdirr)   rF   )r  r(   s     r   Úget_interface_macrc  X  s2   € à€DÜ	‡w�w‡}�}”\ &¨/Ó:Ô;ð +ˆÜ˜V TÓ*Ð*r"   c                 óZ   — t        | d«      dk(  rt        | «      }|r|r|dd |dd z   }|S y)z½Returns the string value of an Infiniband interface's hardware
    address. If ethernet_format is True, an Ethernet MAC-style 6 byte
    representation of the address will be returned.
    rj   rk   é$   iòÿÿÿé3   N)rF   rc  )r  Úethernet_formatr  s      r   Úget_ib_interface_hwaddrrh  b  sB   € ô ˜ Ó(¨DÒ0Ü Ó'ˆÙ‘?à�b˜�+  B C Ñ(ˆCØˆ
ð 1r"   c                  óò   — t        j                  «       st        j                  «       r
t        «       S t        j                  «       r
t        «       S t        j                  «       r
t        «       S t        «       S r±   )	r	   r²   r³   Ú get_interfaces_by_mac_on_freebsdrÊ   Úget_interfaces_by_mac_on_netbsdrË   Ú get_interfaces_by_mac_on_openbsdÚget_interfaces_by_mac_on_linuxr!   r"   r   rµ   rµ   p  sO   € Ü‡�ÔœD×0Ñ0Ô2Ü/Ó1Ð1Ü	�‰Ô	Ü.Ó0Ð0Ü	�‰Ô	Ü/Ó1Ð1ä-Ó/Ð/r"   r  c                 óŽ   — t        «       j                  «       D ]*  \  }}| j                  «       |j                  «       k(  sŒ(|c S  y r±   )rµ   rG  r   )r  Úinterface_macÚinterface_names      r   Úfind_interface_name_from_macrq  {  sD   € Ü)>Ó)@×)FÑ)FÓ)Hò "Ñ%ˆ�~Ø�9‰9‹;˜-×-Ñ-Ó/Ó/Ø!Ò!ð"ð r"   c                  ó”   — t        j                   g d¢«      \  } }d„ }d„ } | || «      «      D ��ci c]  \  }}||“Œ
 }}}|S c c}}w )N)rÜ   ú-arÝ   c              3   ó‚   K  — d}| j                  d«      D ]!  }|j                  d«      r||z  }Œ|r|–— |}Œ# |–— y ­w)Nr‰   rF  ú	)r   rð   )rz   Ú
curr_blockÚlines      r   Úflattenz1get_interfaces_by_mac_on_freebsd.<locals>.flatten†  sN   è ø€ Øˆ
Ø—I‘I˜d“Oò 	"ˆDØ�‰˜tÔ$Ø˜dÑ"‘
áØ$Ò$Ø!‘
ð	"ð Óùs   ‚=?c              3   ó”   K  — | D ]?  }t        j                  d|«      }|sŒ|j                  d«      |j                  d«      f–— ŒA y ­w)Nz2^(?P<ifname>\S*): .*ether\s(?P<mac>[\da-f:]{17}).*r  r  )r   ÚsearchÚgroup)Ú	flat_listÚblockÚms      r   Úfind_macz2get_interfaces_by_mac_on_freebsd.<locals>.find_mac’  sI   è ø€ Øò 	:ˆEÜ—	‘	ØEÀuóˆAò Ø—w‘w˜u“~ q§w¡w¨xÓ'8Ð9Ó9ñ	:ùs
   ‚A¡'A)r   )rz   rù   rx  r  r  r  Úresultss          r   rj  rj  ‚  sP   € Ü�y‰yÒ4Ó5�H€Sˆ!ò	ò:ñ /7±w¸s³|Ó.D×E™{˜s Fˆs�F‰{ÐE€GÑEØ€Nùó Fs   ²Ac                  ó  — i } d}t        j                   ddg«      \  }}t        j                  dd|«      j                  «       }|D ]6  }t        j                  ||«      }|sŒ|j                  «       }|d   | |d   <   Œ8 | S )NzE(?P<ifname>\w+).*address:\s(?P<mac>([\da-f]{2}[:-]){5}([\da-f]{2})).*rÜ   rs  ú\n\s+ú r  r  ©r   r   Úsubrv   r  Ú	groupdict©rr   Úre_field_matchrz   rù   Úif_linesrw  r~  Úfieldss           r   rk  rk  ž  óŒ   € Ø
€Cð	6ð ô �y‰y˜* dÐ+Ó,�H€Sˆ!Ü�v‰v�h  SÓ)×4Ñ4Ó6€HØò 2ˆÜ�H‰H�^ TÓ*ˆÚØ—[‘[“]ˆFØ!'¨Ñ!1ˆC��u‘Òð	2ð
 €Jr"   c                  ó  — i } d}t        j                   ddg«      \  }}t        j                  dd|«      j                  «       }|D ]6  }t        j                  ||«      }|sŒ|j                  «       }|d   | |d   <   Œ8 | S )NzC(?P<ifname>\w+).*lladdr\s(?P<mac>([\da-f]{2}[:-]){5}([\da-f]{2})).*rÜ   rs  r‚  rƒ  r  r  r„  r‡  s           r   rl  rl  ®  r‹  r"   c                  ó   — i } t        «       D ]~  \  }}}}|| v r:|dv rt        j                  d|| |   |«       Œ,d|›d| |   ›d|›d�}t        |«      ‚|| |<   t	        |d«      }|sŒZ|| vr|| |<   Œdt        j                  d|| |   |«       Œ€ | S )	zmBuild a dictionary of tuples {mac: name}.

    Bridges and any devices that have a 'stolen' mac are excluded.)Ú	fsl_enetcÚ
mscc_felixÚqmi_wwanz>Ignoring duplicate macs from '%s' and '%s' due to driver '%s'.úduplicate mac found! both 'ú' and 'ú' have mac 'z'.Tz^Ethernet and InfiniBand interfaces have the same address both '%s' and '%s' have address '%s'.)rï   r5   r6   r  rh  rL  )rr   r   r  r†   Ú_devidrC  Úib_macs          r   rm  rm  ¾  sÖ   € ð €Cä%3Ó%5ò =Ñ!ˆˆc�6˜6Ø�#‰:ð Ð@Ñ@Ü—	‘	ð#àØ˜‘HØôð ð Aò Ø�C“ÚðˆCô
 ˜sÓ#Ð#àˆˆC‰ô
 )¨¨tÓ4ˆÚð* ˜SÑ Ø"��F’ä—‘ð=àØ˜‘KØõðo=ð| €Jr"   Úfilter_hyperv_vf_with_syntheticrã   rä   rå   ræ   rç   rè   c           	      ó`  — |rt         j                  nd„ }g }t        «       }	dj                  d«      }
|	D ]è  }|rt	        |«      sŒt        |«      r
 |d|«       Œ&|rt        |«      rŒ4t        |«      r
 |d|«       ŒI|r"t        |«      �t        |«      st        |«      sŒmt        |«      r
 |d|«       Œ‚t        |«      }|s
 |d|«       Œ™|r|d	k7  r||
dt        |«       k(  rŒ²|rt        |«      rŒÀt        |«      }|j!                  |||t#        |«      f«       Œê | rt%        ||«       |S )
z‚Return list of interface tuples (name, mac, driver, device_id)

    Bridges and any devices that have a 'stolen' mac are excluded.c                   ó   — y r±   r!   )Úargss    r   ú<lambda>z get_interfaces.<locals>.<lambda>  s   � r"   ú:)Ú00rœ  rœ  rœ  rœ  rœ  rœ  rœ  rœ  rœ  rœ  rœ  rœ  rœ  rœ  rœ  zIgnoring bridge interface: %szIgnoring bond interface: %sNzIgnoring failover interface: %sz"Ignoring interface without mac: %srâ   )r5   r6   r¹   ra   r   rX   r¨   r[   r_   re   rh   r‡   rc  r’   r€   r‚   rñ   r¯   Ú)filter_hyperv_vf_with_synthetic_interface)r–  rã   rä   rå   ræ   rç   rè   Úfiltered_loggerrr   r¸   Úzero_macr   r  r†   s                 r   rï   rï     s=  € ñ $8”c—i’iÑ=O€OØ
€CÜÓ€Dà�x‰x˜Ó%€HØò "<ˆÙ!Ô*?ÀÔ*EØÜ�TŒ?ÙÐ;¸TÔBØÙœ7 4œ=ØÜ�4Œ=ÙÐ9¸4Ô@Øá>Ü˜4Ó Ð,Ü,¨TÔ2Ü)¨$Ô/àÜ˜$ÔÙÐ=¸tÔDØÜ Ó%ˆáÙÐ@À$ÔGØá˜t tš|°°xÀ
Ä#ÀcÃ(Ð7KÒ0KØÙ&Ô+LØô,
ð Ü˜tÓ$ˆØ�
‰
�D˜#˜v¤|°DÓ'9Ð:Õ;ðE"<ñJ 'Ü1°/À3ÔGà€Jr"   rž  ).Nrû   c                 óî   — |D �ci c]  }|d   dk(  sŒ|d   |d   “Œ }}|D �cg c]  }|d   |v r
|d   dk7  r|‘Œ }}|D ])  }|\  }}}}	 | d||||   |«       |j                  |«       Œ+ yc c}w c c}w )a�  Filter Hyper-V SR-IOV/VFs when used with synthetic hv_netvsc.

    Hyper-V's netvsc driver may register an SR-IOV/VF interface with a mac
    that matches the synthetic (hv_netvsc) interface.  This VF will be
    enslaved to the synthetic interface, but cloud-init may be racing this
    process.  The [perhaps-yet-to-be-enslaved] VF should never be directly
    configured, so we filter interfaces that duplicate any hv_netvsc mac
    address, as this the most reliable indicator that it is meant to be
    subordinate to the synthetic interface.

    VF drivers will be mlx4_core, mlx5_core, or mana.  However, given that
    this list of drivers has changed over time and mana's dependency on
    hv_netvsc is expected to be removed in the future, we no longer rely
    on these names. Note that this will not affect mlx4/5 instances outside
    of Hyper-V, as it only affects environments where hv_netvsc is present.
    r  Ú	hv_netvscr  r   zdIgnoring %r VF interface with driver %r due to synthetic hv_netvsc interface %r with mac address %r.N)ró   )
rž  rû   ÚiÚhv_netvsc_mac_to_nameÚinterfaces_to_remover   r   r  r†   rù   s
             r   r�  r�  A  sÆ   € ð* 'öØ¨!¨A©$°+Ó*=ˆˆ!‰ˆa�‰d‰
ðÐð ð
 öàØˆQ‰4Ð(Ñ(¨Q¨q©T°[Ò-@ò 	
ðÐð ð *ò 
%ˆ	Ø(Ñˆˆc�6˜1ÙðDàØØ! #Ñ&Øô	
ð 	×Ñ˜)Õ$ñ
%ùòùòs   …A-“A-¤A2c            
      ó’   — i } t        «       D ]7  \  }}}}t        |d«      }|sŒ|| v rt        d|›d| |   ›d|›d�«      ‚|| |<   Œ9 | S )zTBuild a dictionary mapping Infiniband interface names to their hardware
    address.Fr‘  r’  r“  ú')rï   rh  r  )rr   r   rù   r•  s       r   Úget_ib_hwaddrs_by_interfacer§  k  sh   € ð €CÜ'Ó)ò ‰ˆˆa��AÜ(¨¨uÓ5ˆÚØ˜‰}Ý"â˜S ›[ª&ð2óð ð ˆC�ŠIðð €Jr"   Úconvert_to_addressrÿ   c                 ó4   — 	  | |fi |¤ŽS # t         $ r Y yw xY w)a  Use a function to return an address. If conversion throws a ValueError
    exception return False.

    :param check_cb:
        Test function, must return a truthy value
    :param address:
        The string to test.

    :return:
        Address or False

    F)rH   )r¨  rÿ   Úkwargss      r   Úmaybe_get_addressr«  {  s)   € ðÙ! 'Ñ4¨VÑ4Ð4øÜò Ùðús   ‚ ‹	–c                 óH   — t        t        t        j                  | «      «      S )z¹Returns a bool indicating if ``s`` is an IP address.

    :param address:
        The string to test.

    :return:
        A bool indicating if the string is an IP address or not.
    )rp   r«  Ú	ipaddressÚ
ip_address©rÿ   s    r   Úis_ip_addressr°  Ž  s   € ô Ô!¤)×"6Ñ"6¸Ó@ÓAÐAr"   c                 óH   — t        t        t        j                  | «      «      S )z½Returns a bool indicating if ``s`` is an IPv4 address.

    :param address:
        The string to test.

    :return:
        A bool indicating if the string is an IPv4 address or not.
    )rp   r«  r­  ÚIPv4Addressr¯  s    r   Úis_ipv4_addressr³  š  ó   € ô Ô!¤)×"7Ñ"7¸ÓAÓBÐBr"   c                 óH   — t        t        t        j                  | «      «      S )z½Returns a bool indicating if ``s`` is an IPv6 address.

    :param address:
        The string to test.

    :return:
        A bool indicating if the string is an IPv4 address or not.
    )rp   r«  r­  ÚIPv6Addressr¯  s    r   Úis_ipv6_addressr·  ¦  r´  r"   c                 óL   — t        t        t        j                  | d¬«      «      S )zÅReturns a bool indicating if ``s`` is an IPv4 or IPv6 network.

    :param address:
        The string to test.

    :return:
        A bool indicating if the string is an IPv4 address or not.
    F©r  )rp   r«  r­  Ú
ip_networkr¯  s    r   Úis_ip_networkr»  ²  s   € ô Ô!¤)×"6Ñ"6¸ÈÔNÓOÐOr"   c                 óL   — t        t        t        j                  | d¬«      «      S )z½Returns a bool indicating if ``s`` is an IPv4 network.

    :param address:
        The string to test.

    :return:
        A bool indicating if the string is an IPv4 address or not.
    Fr¹  )rp   r«  r­  ÚIPv4Networkr¯  s    r   Úis_ipv4_networkr¾  ¾  ó#   € ô Üœ)×/Ñ/°ÀÔGóð r"   c                 óL   — t        t        t        j                  | d¬«      «      S )z½Returns a bool indicating if ``s`` is an IPv6 network.

    :param address:
        The string to test.

    :return:
        A bool indicating if the string is an IPv4 address or not.
    Fr¹  )rp   r«  r­  ÚIPv6Networkr¯  s    r   Úis_ipv6_networkrÂ  Ì  r¿  r"   Úsubnetc                 ób   — t        j                  | «      }t        j                  |d¬«      }||v S )zâReturns a bool indicating if ``s`` is in subnet.

    :param address:
        The string of IP address.

    :param subnet:
        The string of subnet.

    :return:
        A bool indicating if the string is in subnet.
    Fr¹  )r­  r®  rº  )rÿ   rÃ  r®  Úsubnet_networks       r   Úis_ip_in_subnetrÆ  Ú  s1   € ô ×%Ñ% gÓ.€JÜ×)Ñ)¨&¸Ô?€NØ˜Ð'Ð'r"   Úgatewayc                 óz   — 	 t        | |«       S # t        $ r"}t        j                  d| ||«       Y d}~yd}~ww xY w)zóReturns a bool indicating if should add gateway onlink flag.

    :param gateway:
        The string of gateway address.

    :param subnet:
        The string of subnet.

    :return:
        A bool indicating if the string is in subnet.
    zDFailed to check whether gateway %s is contained within subnet %s: %sNF)rÆ  rH   r5   rL  )rÇ  rÃ  r=   s      r   Úshould_add_gateway_onlink_flagrÉ  ë  sF   € ð
Ü" 7¨FÓ3Ð3Ð3øÜò Ü�‰ð1àØØô	
ô ûðús   ‚ �	:˜5µ:c                 óŠ   — | d   j                  d«      s| d   t        v ry| d   dk(  rt        | j                  d«      «      ryy)z:Common helper for checking network_state subnets for ipv6.rj   Ú6TÚstaticrÿ   F)ÚendswithÚIPV6_DYNAMIC_TYPESr·  rÅ   )rÃ  s    r   Úsubnet_is_ipv6rÏ    sG   € ð ˆf�~×Ñ˜sÔ# v¨f¡~Ô9KÑ'KàØ	�‰˜8Ò	#¬¸¿
¹
À9Ó8MÔ(NØØr"   c                 óX   — t        t        j                  d| › �«      j                  «      S )z¤Convert a network prefix to an ipv4 netmask.

    This is the inverse of ipv4_mask_to_net_prefix.
        24 -> "255.255.255.0"
    Also supports input as a string.ú0.0.0.0/)r§   r­  r½  Únetmask)Úprefixs    r   Únet_prefix_to_ipv4_maskrÔ    s'   € ô Œy×$Ñ$ x°¨xÐ%8Ó9×AÑAÓBÐBr"   c                 óF   — t        j                  d| › �«      j                  S )a  Convert an ipv4 netmask into a network prefix length.

    If the input is already an integer or a string representation of
    an integer, then int(mask) will be returned.
       "255.255.255.0" => 24
       str(24)         => 24
       "24"            => 24
    rÑ  )r­  rº  Ú	prefixlen)Úmasks    r   Úipv4_mask_to_net_prefixrØ    s"   € ô ×Ñ (¨4¨&Ð 1Ó2×<Ñ<Ð<r"   c                 ó€  — 	 t        j                  d| › �«      j                  }|S # t        $ r Y nw xY wt        j                  | «      }t        |«      }|dk(  r|S t        t         j                  | |dz
  z  j                  «       «      }||z	  }t         j                  |z
  }d|z  dz
  }||k7  rt        d| z  «      ‚|S )zÿConvert an ipv6 netmask (very uncommon) or prefix (64) to prefix.

    If the input is already an integer or a string representation of
    an integer, then int(mask) will be returned.
       "ffff:ffff:ffff::"  => 48
       "48"                => 48
    z::/r   r  zInvalid network mask '%s')	r­  rº  rÖ  rH   r®  r   ÚminÚ
IPV6LENGTHÚ
bit_length)r×  rÖ  rÒ  Úmask_intÚtrailing_zeroesÚleading_onesÚall_oness          r   Úipv6_mask_to_net_prefixrá  '  sÖ   € ðä×(Ñ(¨3¨t¨f¨Ó6×@Ñ@ˆ	ØÐøÜò ñ 	ðúô
 ×"Ñ" 4Ó(€GÜ�7‹|€Hà�1‚}ØˆäÜ×Ñ ˜y¨H°q©LÑ9×EÑEÓGó€Oð ˜Ñ.€LÜ×$Ñ$ Ñ6€IØ�Y‘ !Ñ#€HØ�xÒÜÐ4°tÑ;Ó<Ð<àÐs   ‚#& ¦	2±2r×  r#  c                 ó`   — t        t        j                  |› d| › �d¬«      j                  «      S )zCGet string representation of broadcast address from an ip/mask pairr%   Fr¹  )r§   r­  r½  Úbroadcast_address)r×  r#  s     r   Úmask_and_ipv4_to_bcast_addrrä  J  s/   € äÜ×Ñ   A d V˜n°UÔ;×MÑMóð r"   c                   ó   — e Zd Zy)ÚRendererNotFoundErrorN)r¼   r½   r¾   r!   r"   r   ræ  ræ  Q  s   „ Ør"   ræ  )r‰   )NNNNr±   )F)T)TTN)TTTTTTF)er+   Ú	functoolsr­  ÚloggingrU   r   Útypingr   r   r   r   r   Ú	cloudinitr   r	   Úcloudinit.net.netops.iproute2r
   Ú	getLoggerr¼   r5   r    rò   rÎ  ru   r*  r   r#   r)   r?   rF   rJ   rQ   rX   r[   r_   re   rh   rl   Ú	lru_cacherp   rs   r´   r}   r§   r€   r‡   r�   r“   r—   rƒ   r„   r¤   r¨   r‚   r¯   r¹   rŠ   r»   rÇ   rÎ   rÓ   rÌ   rÑ   rÉ   rÐ   rÍ   rÒ   rÄ   r	  r  r   r6  r_  rc  rh  rµ   rq  rj  rk  rl  rm  rï   r�  r§  r«  r°  r³  r·  r»  r¾  rÂ  rÆ  rÉ  rÏ  rÔ  r   rØ  rá  rä  r  ræ  r!   r"   r   ú<module>rî     sD  ðó Û Û Û Û 	Û 	ß 8Õ 8ç  Ý 2à€g×Ñ˜Ó!€Ø!€Ø"Ð òÐ ò%Ð !ð )˜bŸj™j¨Ó4ó 
òó
7ð ØØØó"óJòòHò;ò<òòGò$ò6ð €×Ñ˜TÔ"ð $ò ó #ðð €×Ñ˜TÔ"ð  Tò  ó #ð ð(¨sð °tó óòò
ñ¨tó ó0óBò0ò1ò
òòôA�)ô Aò+ð
.˜T #™Yó 
.ð,˜8 C™=ó ,ðJ°$°s±)ó Jð	°¸±ó 	ðJ¨¨S©	ó Jð	 h¨s¡mó 	ðE d¨3¡ió EðP	 H¨S¡Mó 	ñ°H¸T±Nó ò:-Gó`$ó(+ð^ BFó[.ò|+òð0˜tó 0ð cð ¨h°s©mó ð¨$ó ð8¨ó ð ¨$ó ð D¨ó DðP -1Ø(,Ø?CØØ#'Ø Ø!&ñ9Ø%)ð9à!%ð9ð 9=ð9ð ð	9ð
 !ð9ð ð9ð ð9ð 
ó9ðx'%Ø˜iÑ(ð'%à�U˜3  S¨#Ð-Ñ.Ñ/ð'%ð 
ó'%òTð ¨(ð ¸Só ð&	B˜3ð 	B 4ó 	Bð	C˜Sð 	C Tó 	Cð	C˜Sð 	C Tó 	Cð	P˜3ð 	P 4ó 	Pð˜Sð  Tó ð˜Sð  Tó ð(˜Sð (¨#ð (°$ó (ð"¨Cð ¸ð Àó ð2˜dó ðC só Cð	= Só 	=ð  Só  ðF cð ¨sð °só ô	˜Lõ 	r"   