o
    w7eI"                     @   s  U d dl Z d dlmZmZ d dl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 e eZG dd deZ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Z%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)DictIterableListOptionalTypeUnion)subputil	available)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   returnc                 C   s^   t d| | zt| \}}t|rt d| | W dS  tjy.   tt d|  Y dS w )Nz#Attempting command %s for device %sz(Running %s resulted in stderr output: %sTz#Running interface command %s failedF)LOGdebugr
   lenwarningProcessExecutionErrorr   logexc)cmddevice_name_outerrr   r   r   _alter_interface   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   !   s   zNetworkActivator.availabler   c                 C   r#   )zWBring up interface.

        Return True is successful, otherwise return False
        r$   r   r   r   r   bring_up_interface'      z#NetworkActivator.bring_up_interfacec                 C   r#   )zYBring down interface.

        Return True is successful, otherwise return False
        r$   r'   r   r   r   bring_down_interface0   r)   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)r(   ).0deviceclsr   r   	<genexpr>?   s    z7NetworkActivator.bring_up_interfaces.<locals>.<genexpr>)all)r0   r+   r   r/   r   bring_up_interfaces9   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>H       z<NetworkActivator.bring_up_all_interfaces.<locals>.<listcomp>)r3   iter_interfaces)r0   r4   r   r   r   bring_up_all_interfacesA   s   z(NetworkActivator.bring_up_all_interfacesr,   )r   r   r   staticmethodr   r   strboolr   r(   r*   classmethodr   r3   r   r;   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 | dS z3Return true if ifupdown can be used on this system.r&   )eni_availabler&   r   r   r   r   Q      
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   r(   V      
z$IfUpDownActivator.bring_up_interfacec                 C   rE   )rF   ifdownrH   rI   r   r   r   r*   _   rJ   z&IfUpDownActivator.bring_down_interfacer,   )
r   r   r   r<   r   r=   r>   r   r(   r*   r   r   r   r   r@   L   s    r@   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 )NetworkManagerActivatorNr   c                 C   rA   )z9Return true if NetworkManager can be used on this system.r&   )nm_availabler&   r   r   r   r   j   rD   z!NetworkManagerActivator.availabler   c                 C   s`   ddl m} || }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_filenamenmcli
connectionloadupfilename)rO   rP   reloadifname)cloudinit.net.network_managerrN   r    )r   rN   rS   r   r   r   r   r(   o   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
        rO   r.   
disconnectrH   rI   r   r   r   r*      s   
z,NetworkManagerActivator.bring_down_interfacer,   )	r   r   r   r<   r>   r   r=   r(   r*   r   r   r   r   rL   i   s    rL   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   rA   )z2Return true if netplan can be used on this system.r&   )netplan_availabler&   r   r   r   r      rD   zNetplanActivator.availabler   c                 C      t d ttjdS YApply netplan config.

        Return True is successful, otherwise return False
        zBCalling 'netplan apply' rather than altering individual interfacesr2   r   r   r    rX   NETPLAN_CMDr'   r   r   r   r(         z#NetplanActivator.bring_up_interfacer+   c                 C   r\   r]   r_   )r+   r   r   r   r3      ra   z$NetplanActivator.bring_up_interfacesr4   c                 C   s   t tjdS )r^   r2   )r    rX   r`   )r4   r   r   r   r;      s   z(NetplanActivator.bring_up_all_interfacesc                 C   r\   r]   r_   r'   r   r   r   r*      ra   z%NetplanActivator.bring_down_interfacer,   )r   r   r   r`   r<   r>   r   r=   r(   r   r3   r   r;   r*   r   r   r   r   rX      s    rX   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   rA   rB   )networkd_availabler&   r   r   r   r      rD   zNetworkdActivator.availabler   c                 C      dddd| g}t || S )1Return True is successful, otherwise return FalseiplinksetrR   rH   rI   r   r   r   r(         
z$NetworkdActivator.bring_up_interfacer4   c                 C   s   g d}t |dS )re   )	systemctlrestartzsystemd-networkdzsystemd-resolvedr2   rH   )r4   r   r   r   r   r;      s   
z)NetworkdActivator.bring_up_all_interfacesc                 C   rd   )re   rf   rg   rh   downrH   rI   r   r   r   r*      ri   z&NetworkdActivator.bring_down_interfacer,   )r   r   r   r<   r>   r   r=   r(   r   r;   r*   r   r   r   r   rb      s    rb   )enirY   znetwork-managernetworkd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_PRIORITYr6   r   r   r   r8      s    z$search_activator.<locals>.<listcomp>z0Unknown activators provided in priority list: %sc                 S   s   g | ]}t | qS r   )ro   )r-   r5   r   r   r   r8      r9   c                    s   g | ]	}|  r|qS r   r   )r-   activator_clsr&   r   r   r8      s    )
ValueError)rp   r"   unknownactivator_classesr   r&   r   search_activator   s   
rv   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)rq   rv   r   r   r   )rp   r"   foundtmsgselectedr   r   r   select_activator   s"   
r|   )NN)+loggingabcr   r   typingr   r   r   r   r   r	   	cloudinitr
   r   cloudinit.net.enir   rC   cloudinit.net.netplanr[   rV   rM   cloudinit.net.network_stater   cloudinit.net.networkdrc   	getLoggerr   r   	Exceptionr   r>   r    r!   r@   rL   rX   rb   rq   ro   r=   __annotations__rv   r|   r   r   r   r   <module>   sL   
 
,!5



