o
    x[há.  ã                	   @   sÀ  U d dl Z d dlmZmZ d dlmZ d dlmZmZm	Z	m
Z
mZmZmZ d dlmZmZ d dlmZmZmZmZ d dlmZ d dlmZ e  e¡ZG d	d
„ d
eƒZ	d)dede de!de!fdd„Z"	d)dede!de!fdd„Z#G dd„ deƒZ$G dd„ de$ƒZ%G dd„ de$ƒZ&G dd„ de$ƒZ'G dd„ de$ƒZ(G dd „ d e$ƒZ)g d!¢Z*e%e(e'e)e&d!œZ+ee ee$ f e,d"< d#e
e  d$ee df deee$  fd%d&„Z-	d*d#ee
e   d$ee  dee$ fd'd(„Z.dS )+é    N)ÚABCÚabstractmethod)Úpartial)ÚCallableÚDictÚIterableÚListÚOptionalÚTypeÚUnion)ÚsubpÚutil)ÚeniÚnetplanÚnetwork_managerÚnetworkd)ÚIproute2)ÚNetworkStatec                   @   s   e Zd ZdS )ÚNoActivatorExceptionN)Ú__name__Ú
__module__Ú__qualname__© r   r   ú:/usr/lib/python3/dist-packages/cloudinit/net/activators.pyr      s    r   TÚcmdÚdevice_nameÚwarn_on_stderrÚreturnc                 C   s   t ttj| ƒ|ƒS )z2Attempt to alter an interface using a command list)Ú_alter_interface_callabler   r   )r   r   r   r   r   r   Ú_alter_interface   s   r   Úcallablec              
   C   sl   z| ƒ \}}t |ƒr|rtjntj}|d|ƒ W dS  tjy5 } zt td|j¡ W Y d}~dS d}~ww )zŽAttempt to alter an interface using a callable

    this function standardizes logging and response to failure for
    various activators
    zReceived stderr output: %sTz#Running interface command %s failedNF)	ÚlenÚLOGÚwarningÚdebugr   ÚProcessExecutionErrorr   Úlogexcr   )r    r   Ú_outÚerrÚ
log_stderrÚer   r   r   r      s   

€þr   c                   @   sž   e Zd Zeeddee defdd„ƒƒZeededefdd„ƒƒZ	eededefd	d
„ƒƒZ
edee defdd„ƒZededefdd„ƒZeddd„ƒZdS )ÚNetworkActivatorNÚtargetr   c                 C   ó   t ƒ ‚)z>Return True if activator is available, otherwise return False.©ÚNotImplementedError©r,   r   r   r   Ú	available.   s   zNetworkActivator.availabler   c                 C   r-   )zWBring up interface.

        Return True is successful, otherwise return False
        r.   ©r   r   r   r   Úbring_up_interface4   ó   z#NetworkActivator.bring_up_interfacec                 C   r-   )zYBring down interface.

        Return True is successful, otherwise return False
        r.   r2   r   r   r   Úbring_down_interface=   r4   z%NetworkActivator.bring_down_interfaceÚdevice_namesc                    s   t ‡ fdd„|D ƒƒS )zjBring up specified list of interfaces.

        Return True is successful, otherwise return False
        c                 3   ó   � | ]}ˆ   |¡V  qd S ©N©r3   ©Ú.0Údevice©Úclsr   r   Ú	<genexpr>L   ó   € z7NetworkActivator.bring_up_interfaces.<locals>.<genexpr>)Úall)r>   r6   r   r=   r   Úbring_up_interfacesF   s   z$NetworkActivator.bring_up_interfacesÚnetwork_statec                 C   s   |   dd„ | ¡ D ƒ¡S )z\Bring up all interfaces.

        Return True is successful, otherwise return False
        c                 S   s   g | ]}|d  ‘qS )Únamer   ©r;   Úir   r   r   Ú
<listcomp>U   ó    z<NetworkActivator.bring_up_all_interfaces.<locals>.<listcomp>)rB   Úiter_interfaces)r>   rC   r   r   r   Úbring_up_all_interfacesN   s   ÿz(NetworkActivator.bring_up_all_interfacesc                   C   r-   )zWait for network to come up.r.   r   r   r   r   Úwait_for_networkX   s   z!NetworkActivator.wait_for_networkr8   ©r   N)r   r   r   Ústaticmethodr   r	   ÚstrÚboolr1   r3   r5   Úclassmethodr   rB   r   rJ   rK   r   r   r   r   r+   -   s     	r+   c                   @   sT   e Zd Zeddee defdd„ƒZededefdd„ƒZededefd	d
„ƒZ	dS )ÚIfUpDownActivatorNr,   r   c                 C   ó   t j| d�S ©z3Return true if ifupdown can be used on this system.r0   )r   r1   r0   r   r   r   r1   c   ó   zIfUpDownActivator.availabler   c                 C   ó   d| g}t || ƒS )úbBring up interface using ifup.

        Return True is successful, otherwise return False
        Úifup©r   ©r   r   r   r   r   r3   h   ó   
z$IfUpDownActivator.bring_up_interfacec                 C   rU   )rV   ÚifdownrX   rY   r   r   r   r5   q   rZ   z&IfUpDownActivator.bring_down_interfacer8   )
r   r   r   rM   r	   rN   rO   r1   r3   r5   r   r   r   r   rQ   ^   s    rQ   c                   @   sL   e Zd Zed
defdd„ƒZededefdd„ƒZededefdd	„ƒZdS )ÚIfConfigActivatorNr   c                 C   s   d}dg}t tj||| d�ƒS )z3Return true if ifconfig can be used on this system.Úifconfigz/sbin)Úsearchr,   )rO   r   Úwhich)r,   Úexpectedr^   r   r   r   r1   |   s   zIfConfigActivator.availabler   c                 C   ó   d| dg}t || ƒS )zoBring up interface using ifconfig <dev> up.

        Return True is successful, otherwise return False
        r]   ÚuprX   rY   r   r   r   r3   ƒ   ó   

z$IfConfigActivator.bring_up_interfacec                 C   ra   )zqBring up interface using ifconfig <dev> down.

        Return True is successful, otherwise return False
        r]   ÚdownrX   rY   r   r   r   r5   Œ   rc   z&IfConfigActivator.bring_down_interfacer8   )	r   r   r   rM   rO   r1   rN   r3   r5   r   r   r   r   r\   {   s    r\   c                   @   sf   e Zd Zeddefdd„ƒZededefdd„ƒZededefdd	„ƒZe	d
e
e defdd„ƒZdS )ÚNetworkManagerActivatorNr   c                 C   rR   )z9Return true if NetworkManager can be used on this system.r0   )r   r1   r0   r   r   r   r1   —   rT   z!NetworkManagerActivator.availabler   c                 C   sv   ddl m} || ƒ}|du rt d¡ dS ddd|g}t|| ƒr(ddd	d
|g}ntg d¢| ƒ ddd	d| g}t|| ƒS )zdBring up connection using nmcli.

        Return True is successful, otherwise return False
        r   )Úconn_filenameNzFUnable to find an interface config file. Unable to bring up interface.FÚnmcliÚ
connectionÚloadrb   Úfilename)rg   rh   ÚreloadÚifname)Úcloudinit.net.network_managerrf   r"   r#   r   )r   rf   rj   r   r   r   r   r3   œ   s   ÿ

z*NetworkManagerActivator.bring_up_interfacec                 C   s   ddd| g}t || ƒS )zeBring down interface using nmcli.

        Return True is successful, otherwise return False
        rg   r<   Ú
disconnectrX   rY   r   r   r   r5   ´   s   
z,NetworkManagerActivator.bring_down_interfacer6   c                    sL   t   g d¢¡j ¡ }d|krt d|¡ tg d¢dƒo%t‡ fdd„|D ƒƒS )z9Activate network

        Return True on success
        )Ú	systemctlÚshowz--property=SubStateúNetworkManager.servicezSubState=runningz:Expected NetworkManager SubState=running, but detected: %s)ro   ztry-reload-or-restartrq   rA   c                 3   r7   r8   r9   r:   r=   r   r   r?   Ó   r@   z>NetworkManagerActivator.bring_up_interfaces.<locals>.<genexpr>)r   ÚstdoutÚrstripr"   r#   r   rA   )r>   r6   Ústater   r=   r   rB   ½   s    ÿùþþýz+NetworkManagerActivator.bring_up_interfacesr8   )r   r   r   rM   rO   r1   rN   r3   r5   rP   r   rB   r   r   r   r   re   –   s    re   c                   @   s’   e Zd ZddgZeddefdd„ƒZededefdd	„ƒZed
e	e defdd„ƒZ
ededefdd„ƒZededefdd„ƒZeddd„ƒZdS )ÚNetplanActivatorr   ÚapplyNr   c                 C   rR   )z2Return true if netplan can be used on this system.r0   )r   r1   r0   r   r   r   r1   Ù   rT   zNetplanActivator.availabler   c                 C   ó   t  d¡ ttjddd�S ©úYApply netplan config.

        Return True is successful, otherwise return False
        zBCalling 'netplan apply' rather than altering individual interfacesrA   F©r   ©r"   r$   r   ru   ÚNETPLAN_CMDr2   r   r   r   r3   Þ   ó   ÿÿz#NetplanActivator.bring_up_interfacer6   c                 C   rw   rx   r{   )r6   r   r   r   rB   ì   r}   z$NetplanActivator.bring_up_interfacesrC   c                 C   s   t tjddd�S )ry   rA   Frz   )r   ru   r|   )rC   r   r   r   rJ   ú   s   ÿz(NetplanActivator.bring_up_all_interfacesc                 C   rw   rx   r{   r2   r   r   r   r5     r}   z%NetplanActivator.bring_down_interfacec                   C   s"   t  ¡ rt d¡ dS t ¡  dS )z:On networkd systems, wait for systemd-networkd-wait-onlinez1NetworkManager is enabled, skipping networkd waitN)r   r1   r"   r$   ÚNetworkdActivatorrK   r   r   r   r   rK     s   
z!NetplanActivator.wait_for_networkr8   rL   )r   r   r   r|   rM   rO   r1   rN   r3   r   rB   r   rJ   r5   rK   r   r   r   r   ru   Ö   s    	ru   c                   @   sp   e Zd Zeddefdd„ƒZededefdd„ƒZededefd	d
„ƒZ	ededefdd„ƒZ
eddd„ƒZdS )r~   Nr   c                 C   rR   rS   )r   r1   r0   r   r   r   r1     rT   zNetworkdActivator.availabler   c                 C   ó   t ttj| ƒƒS ©ú1Return True is successful, otherwise return False)r   r   r   Úlink_upr2   r   r   r   r3   "  ó   
ÿz$NetworkdActivator.bring_up_interfacerC   c                 C   s   g d¢}t |dƒS )r�   )ro   Úrestartzsystemd-networkdzsystemd-resolvedrA   rX   )rC   r   r   r   r   rJ   )  s   
z)NetworkdActivator.bring_up_all_interfacesc                 C   r   r€   )r   r   r   Ú	link_downr2   r   r   r   r5   /  rƒ   z&NetworkdActivator.bring_down_interfacec                   C   s   t   g d¢¡ dS )z&Wait for systemd-networkd-wait-online.)ro   Ústartz$systemd-networkd-wait-online.serviceN)r   r   r   r   r   rK   6  s   ÿz"NetworkdActivator.wait_for_networkr8   rL   )r   r   r   rM   rO   r1   rN   r3   r   rJ   r5   rK   r   r   r   r   r~     s    r~   )r   r   znetwork-managerr   r]   ÚNAME_TO_ACTIVATORÚpriorityr,   c                    sF   dd„ | D ƒ}|rt d|› �ƒ‚dd„ | D ƒ}t‡ fdd„|D ƒdƒS )zEReturns the first available activator from the priority list or None.c                 S   s   g | ]}|t vr|‘qS r   )ÚDEFAULT_PRIORITYrE   r   r   r   rG   U  s    z$search_activator.<locals>.<listcomp>z.Unknown activators provided in priority list: c                 S   s   g | ]}t | ‘qS r   )r‡   )r;   rD   r   r   r   rG   Z  rH   c                 3   s   � | ]
}|  ˆ ¡r|V  qd S r8   )r1   )r;   Úactivator_clsr0   r   r   r?   \  s   € ý
ÿz#search_activator.<locals>.<genexpr>N)Ú
ValueErrorÚnext)rˆ   r,   ÚunknownÚactivator_classesr   r0   r   Úsearch_activatorQ  s   ÿ
þúr�   c                 C   sZ   | d u rt } t| |ƒ}|s$|r|dkrd|› �nd}td|› d| › �ƒ‚t d|| ¡ |S )Nú/z in target=Ú z%No available network activators foundz. Searched through list: z.Using selected activator: %s from priority: %s)r‰   r�   r   r"   r$   )rˆ   r,   ÚselectedÚtmsgr   r   r   Úselect_activatore  s   
ÿÿÿr”   )T)NN)/ÚloggingÚabcr   r   Ú	functoolsr   Útypingr   r   r   r   r	   r
   r   Ú	cloudinitr   r   Úcloudinit.netr   r   r   r   Úcloudinit.net.netops.iproute2r   Úcloudinit.net.network_stater   Ú	getLoggerr   r"   Ú	Exceptionr   ÚlistrN   rO   r   r   r+   rQ   r\   re   ru   r~   r‰   r‡   Ú__annotations__r�   r”   r   r   r   r   Ú<module>   sp   
$
ÿÿÿÿ
þÿÿÿ
þ1@F$	û	ÿ
ÿ

þÿ
ÿÿþ