o
    th-                  	   @   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 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e#  fd$d%Z,	d)d#ee
e  dee# fd&d'Z-dS )*    N)ABCabstractmethod)partial)CallableDictIterableListOptionalType)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 )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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 )NetworkActivatorr   c                   C      t  )z>Return True if activator is available, otherwise return False.NotImplementedErrorr   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,   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       | ]}  |V  qd S Nr0   .0deviceclsr   r   	<genexpr>L       z7NetworkActivator.bring_up_interfaces.<locals>.<genexpr>)all)r;   r3   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   r8   ir   r   r   
<listcomp>U       z<NetworkActivator.bring_up_all_interfaces.<locals>.<listcomp>)r?   iter_interfaces)r;   r@   r   r   r   bring_up_all_interfacesN   s   z(NetworkActivator.bring_up_all_interfacesNc                   C   r+   )zWait for network to come up.r,   r   r   r   r   wait_for_networkX   s   z!NetworkActivator.wait_for_networkr   N)r   r   r   staticmethodr   boolr.   strr0   r2   classmethodr   r?   r   rG   rH   r   r   r   r   r*   -   s     	r*   c                   @   J   e Zd Z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 )
IfUpDownActivatorr   c                   C      t  S z3Return true if ifupdown can be used on this system.)r   r.   r   r   r   r   r.   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   r0   h      
z$IfUpDownActivator.bring_up_interfacec                 C   rS   )rT   ifdownrV   rW   r   r   r   r2   q   rX   z&IfUpDownActivator.bring_down_interfaceN	r   r   r   rJ   rK   r.   rL   r0   r2   r   r   r   r   rO   ^   s    rO   c                   @   rN   )
IfConfigActivatorr   c                  C   s   d} dg}t tj| |dS )z3Return true if ifconfig can be used on this system.ifconfigz/sbin)search)rK   r   which)expectedr]   r   r   r   r.   |   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\   uprV   rW   r   r   r   r0         

z$IfConfigActivator.bring_up_interfacec                 C   r`   )zqBring up interface using ifconfig <dev> down.

        Return True is successful, otherwise return False
        r\   downrV   rW   r   r   r   r2      rb   z&IfConfigActivator.bring_down_interfaceNrZ   r   r   r   r   r[   {   s    r[   c                   @   sd   e Zd Z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	e
e defd
dZdS )NetworkManagerActivatorr   c                   C   rP   )z9Return true if NetworkManager can be used on this system.)r   r.   r   r   r   r   r.      rR   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loadra   filename)rf   rg   reloadifname)cloudinit.net.network_managerre   r!   r"   r   )r   re   ri   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
        rf   r9   
disconnectrV   rW   r   r   r   r2      s   
z,NetworkManagerActivator.bring_down_interfacer3   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)rn   ztry-reload-or-restartrp   r>   c                 3   r4   r5   r6   r7   r:   r   r   r<      r=   z>NetworkManagerActivator.bring_up_interfaces.<locals>.<genexpr>)r   stdoutrstripr!   r"   r   r>   )r;   r3   stater   r:   r   r?      s    z+NetworkManagerActivator.bring_up_interfacesN)r   r   r   rJ   rK   r.   rL   r0   r2   rM   r   r?   r   r   r   r   rd      s    rd   c                   @   s   e Zd ZddgZ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
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   applyr   c                   C   rP   )z2Return true if netplan can be used on this system.)r   r.   r   r   r   r   r.      rR   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   rt   NETPLAN_CMDr/   r   r   r   r0         z#NetplanActivator.bring_up_interfacer3   c                 C   rv   rw   rz   )r3   r   r   r   r?      r|   z$NetplanActivator.bring_up_interfacesr@   c                 C   s   t tjdddS )rx   r>   Fry   )r   rt   r{   )r@   r   r   r   rG      s   z(NetplanActivator.bring_up_all_interfacesc                 C   rv   rw   rz   r/   r   r   r   r2     r|   z%NetplanActivator.bring_down_interfaceNc                   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   r.   r!   r#   NetworkdActivatorrH   r   r   r   r   rH     s   
z!NetplanActivator.wait_for_networkrI   )r   r   r   r{   rJ   rK   r.   rL   r0   r   r?   r   rG   r2   rH   r   r   r   r   rt      s    	rt   c                   @   sn   e Zd Z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edefd
dZ
edddZdS )r}   r   c                   C   rP   rQ   )r   r.   r   r   r   r   r.     rR   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 )r   )rn   restartzsystemd-networkdzsystemd-resolvedr>   rV   )r@   r   r   r   r   rG   )  s   
z)NetworkdActivator.bring_up_all_interfacesc                 C   r~   r   )r   r   r   	link_downr/   r   r   r   r2   /  r   z&NetworkdActivator.bring_down_interfaceNc                   C   s   t  g d dS )z&Wait for systemd-networkd-wait-online.)rn   startz$systemd-networkd-wait-online.serviceN)r   r   r   r   r   rH   6  s   z"NetworkdActivator.wait_for_networkrI   )r   r   r   rJ   rK   r.   rL   r0   r   rG   r2   rH   r   r   r   r   r}     s    r}   )r   r   znetwork-managerr   r\   NAME_TO_ACTIVATORpriorityc                 C   sB   dd | D }|rt d| dd | D }t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_PRIORITYrB   r   r   r   rD   S  s    z$search_activator.<locals>.<listcomp>z.Unknown activators provided in priority list: c                 S   s   g | ]}t | qS r   )r   )r8   rA   r   r   r   rD   X  rE   c                 s   s    | ]	}|  r|V  qd S r5   )r.   )r8   activator_clsr   r   r   r<   Z  s    
z#search_activator.<locals>.<genexpr>N)
ValueErrornext)r   unknownactivator_classesr   r   r   search_activatorQ  s   r   c                 C   s8   | d u rt } t| }|std|  td||  |S )Nz>No available network activators found. Searched through list: z.Using selected activator: %s from priority: %s)r   r   r   r!   r#   )r   selectedr   r   r   select_activatorc  s   r   )Tr5   ).loggingabcr   r   	functoolsr   typingr   r   r   r   r	   r
   	cloudinitr   r   cloudinit.netr   r   r   r   cloudinit.net.netops.iproute2r   cloudinit.net.network_stater   	getLoggerr   r!   	Exceptionr   listrL   rK   r   r   r*   rO   r[   rd   rt   r}   r   r   __annotations__r   r   r   r   r   r   <module>   s`   
 


1@F$		
