o
    fi)                  	   @   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 d dlmZ d dlmZ d dl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 e0d"< d#e
e$ d$ee$df de
ee(  fd%d&Z1	d*d#ee
e$  d$ee$ dee( fd'd(Z2dS )+    N)ABCabstractmethod)partial)CallableDictIterableListOptionalTypeUnion)subputil	available)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 )zAttempt 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dS )NetworkActivatorNtargetr   c                 C      t  )z>Return True if activator is available, otherwise return False.NotImplementedErrorr*   r   r   r   r   1   s   zNetworkActivator.availabler   c                 C   r+   )zWBring up interface.

        Return True is successful, otherwise return False
        r,   r   r   r   r   bring_up_interface7      z#NetworkActivator.bring_up_interfacec                 C   r+   )zYBring down interface.

        Return True is successful, otherwise return False
        r,   r/   r   r   r   bring_down_interface@   r1   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   s    | ]}  |V  qd S N)r0   ).0deviceclsr   r   	<genexpr>O   s    z7NetworkActivator.bring_up_interfaces.<locals>.<genexpr>)all)r8   r3   r   r7   r   bring_up_interfacesI   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   r5   ir   r   r   
<listcomp>X       z<NetworkActivator.bring_up_all_interfaces.<locals>.<listcomp>)r;   iter_interfaces)r8   r<   r   r   r   bring_up_all_interfacesQ   s   z(NetworkActivator.bring_up_all_interfacesr4   )r   r   r   staticmethodr   r	   strboolr   r0   r2   classmethodr   r;   r   rC   r   r   r   r   r)   0   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 | dS z3Return true if ifupdown can be used on this system.r.   )eni_availabler.   r   r   r   r   a      
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   r0   f      
z$IfUpDownActivator.bring_up_interfacec                 C   rM   )rN   ifdownrP   rQ   r   r   r   r2   o   rR   z&IfUpDownActivator.bring_down_interfacer4   )
r   r   r   rD   r	   rE   rF   r   r0   r2   r   r   r   r   rH   \   s    rH   c                   @   L   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*   )rF   r   which)r*   expectedrW   r   r   r   r   z   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
        rV   uprP   rQ   r   r   r   r0         

z$IfConfigActivator.bring_up_interfacec                 C   rZ   )zqBring up interface using ifconfig <dev> down.

        Return True is successful, otherwise return False
        rV   downrP   rQ   r   r   r   r2      r\   z&IfConfigActivator.bring_down_interfacer4   	r   r   r   rD   rF   r   rE   r0   r2   r   r   r   r   rU   y   s    rU   c                   @   rT   )NetworkManagerActivatorNr   c                 C   rI   )z9Return true if NetworkManager can be used on this system.r.   )nm_availabler.   r   r   r   r      rL   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loadr[   filename)rb   rc   reloadifname)cloudinit.net.network_managerra   r    r!   r   )r   ra   re   r   r   r   r   r0      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
        rb   r6   
disconnectrP   rQ   r   r   r   r2      s   
z,NetworkManagerActivator.bring_down_interfacer4   r^   r   r   r   r   r_      s    r_   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dS )NetplanActivatornetplanapplyNr   c                 C   rI   )z2Return true if netplan can be used on this system.r.   )netplan_availabler.   r   r   r   r      rL   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 interfacesr:   Fr   r    r"   r   rj   NETPLAN_CMDr/   r   r   r   r0         z#NetplanActivator.bring_up_interfacer3   c                 C   rn   ro   rr   )r3   r   r   r   r;      rt   z$NetplanActivator.bring_up_interfacesr<   c                 C   s   t tjdddS )rp   r:   Frq   )r   rj   rs   )r<   r   r   r   rC      s   z(NetplanActivator.bring_up_all_interfacesc                 C   rn   ro   rr   r/   r   r   r   r2      rt   z%NetplanActivator.bring_down_interfacer4   )r   r   r   rs   rD   rF   r   rE   r0   r   r;   r   rC   r2   r   r   r   r   rj      s    	rj   c                   @   sb   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
dS )NetworkdActivatorNr   c                 C   rI   rJ   )networkd_availabler.   r   r   r   r      rL   zNetworkdActivator.availabler   c                 C      t ttj| S 1Return True is successful, otherwise return False)r   r   r   link_upr/   r   r   r   r0         
z$NetworkdActivator.bring_up_interfacer<   c                 C   s   g d}t |dS )ry   )	systemctlrestartzsystemd-networkdzsystemd-resolvedr:   rP   )r<   r   r   r   r   rC     s   
z)NetworkdActivator.bring_up_all_interfacesc                 C   rw   rx   )r   r   r   	link_downr/   r   r   r   r2     r{   z&NetworkdActivator.bring_down_interfacer4   )r   r   r   rD   rF   r   rE   r0   r   rC   r2   r   r   r   r   ru      s    ru   )enirk   znetwork-managernetworkdrV   NAME_TO_ACTIVATORpriorityr*   c                    s>   dd | D }|rt d| dd | D } fdd|D S )Nc                 S   s   g | ]}|t vr|qS r   )DEFAULT_PRIORITYr>   r   r   r   r@   *  s    z$search_activator.<locals>.<listcomp>z0Unknown activators provided in priority list: %sc                 S   s   g | ]}t | qS r   )r   )r5   r=   r   r   r   r@   /  rA   c                    s   g | ]	}|  r|qS r   r   )r5   activator_clsr.   r   r   r@   0  s    )
ValueError)r   r*   unknownactivator_classesr   r.   r   search_activator'  s   
r   c                 C   s\   | d u rt } t| |}|s!d}|r|dkrd| }td|| f |d }td||  |S )N /z in target=%szBNo available network activators found%s. Searched through list: %sr   z.Using selected activator: %s from priority: %s)r   r   r   r    r"   )r   r*   foundtmsgselectedr   r   r   select_activator7  s"   
r   )T)NN)3loggingabcr   r   	functoolsr   typingr   r   r   r   r	   r
   r   	cloudinitr   r   cloudinit.net.enir   rK   cloudinit.net.netops.iproute2r   cloudinit.net.netplanrm   rh   r`   cloudinit.net.network_stater   cloudinit.net.networkdrv   	getLoggerr   r    	Exceptionr   listrE   rF   r   r   r)   rH   rU   r_   rj   ru   r   r   __annotations__r   r   r   r   r   r   <module>   sv   
$


,(=		



