
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
cj#                 @   sv  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 jeZG dd deZed	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$ddddgZ%e!e#e"e$dZ&ee'e	e  f &ee' e
e'df ee	e   dddZ(d eee'  ee' e	e  d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.6/activators.pyr      s   r   )returnc             C   s`   t jd| | y(tj| \}}t|r4t jd| | dS  tjk
rZ   tjt d|  dS X d S )Nz#Attempting command %s for device %sz(Running %s resulted in stderr output: %sTz#Running interface command %s failedF)LOGdebugr
   lenwarningZProcessExecutionErrorr   Zlogexc)cmddevice_nameZ_outerrr   r   r   _alter_interface   s    r   c               @   s   e Zd Zeedee edddZeeeedddZ	eeeeddd	Z
eee ed
ddZeeedddZdS )NetworkActivatorN)targetr   c             C   s
   t  dS )z>Return True if activator is available, otherwise return False.N)NotImplementedError)r   r   r   r   r   !   s    zNetworkActivator.available)r   r   c             C   s
   t  dS )zWBring up interface.

        Return True is successful, otherwise return False
        N)r   )r   r   r   r   bring_up_interface'   s    z#NetworkActivator.bring_up_interfacec             C   s
   t  dS )zYBring down interface.

        Return True is successful, otherwise return False
        N)r   )r   r   r   r   bring_down_interface0   s    z%NetworkActivator.bring_down_interface)device_namesr   c                s   t  fdd|D S )zjBring up specified list of interfaces.

        Return True is successful, otherwise return False
        c             3   s   | ]} j |V  qd S )N)r    ).0device)clsr   r   	<genexpr>?   s    z7NetworkActivator.bring_up_interfaces.<locals>.<genexpr>)all)r%   r"   r   )r%   r   bring_up_interfaces9   s    z$NetworkActivator.bring_up_interfaces)network_stater   c             C   s   | j dd |j 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   s    z<NetworkActivator.bring_up_all_interfaces.<locals>.<listcomp>)r(   Ziter_interfaces)r%   r)   r   r   r   bring_up_all_interfacesA   s    z(NetworkActivator.bring_up_all_interfaces)N)r   r   r   staticmethodr   r   strboolr   r    r!   classmethodr   r(   r   r-   r   r   r   r   r       s   r   c               @   sN   e Zd Zed
ee edddZeeedddZeeeddd	Z	dS )IfUpDownActivatorN)r   r   c             C   s
   t | dS )z3Return true if ifupdown can be used on this system.)r   )eni_available)r   r   r   r   r   Q   s    zIfUpDownActivator.available)r   r   c             C   s   d| g}t || S )zbBring up interface using ifup.

        Return True is successful, otherwise return False
        Zifup)r   )r   r   r   r   r   r    V   s    z$IfUpDownActivator.bring_up_interfacec             C   s   d| g}t || S )zbBring up interface using ifup.

        Return True is successful, otherwise return False
        Zifdown)r   )r   r   r   r   r   r!   _   s    z&IfUpDownActivator.bring_down_interface)N)
r   r   r   r.   r   r/   r0   r   r    r!   r   r   r   r   r2   L   s   r2   c               @   sH   e Zd Zed
edddZeeedddZeeeddd	ZdS )NetworkManagerActivatorN)r   c             C   s
   t | dS )z9Return true if NetworkManager can be used on this system.)r   )nm_available)r   r   r   r   r   j   s    z!NetworkManagerActivator.available)r   r   c             C   sx   ddl m} || }|dkr*tjd dS ddd|g}t|| rPddd	d
|g}ntdddg|  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nmcliZ
connectionloadupfilenamereloadZifname)cloudinit.net.network_managerr6   r   r   r   )r   r6   r:   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
        r7   r$   Z
disconnect)r   )r   r   r   r   r   r!      s    z,NetworkManagerActivator.bring_down_interface)N)	r   r   r   r.   r0   r   r/   r    r!   r   r   r   r   r4   i   s   r4   c               @   s|   e Zd ZddgZededddZeeeddd	Zee	e ed
ddZ
eeedddZeeedddZdS )NetplanActivatornetplanZapplyN)r   c             C   s
   t | dS )z2Return true if netplan can be used on this system.)r   )netplan_available)r   r   r   r   r      s    zNetplanActivator.available)r   r   c             C   s   t jd ttjdS )zYApply netplan config.

        Return True is successful, otherwise return False
        zBCalling 'netplan apply' rather than altering individual interfacesr'   )r   r   r   r=   NETPLAN_CMD)r   r   r   r   r       s    z#NetplanActivator.bring_up_interface)r"   r   c             C   s   t jd ttjdS )zYApply netplan config.

        Return True is successful, otherwise return False
        zBCalling 'netplan apply' rather than altering individual interfacesr'   )r   r   r   r=   r@   )r"   r   r   r   r(      s    z$NetplanActivator.bring_up_interfaces)r)   r   c             C   s   t tjdS )zYApply netplan config.

        Return True is successful, otherwise return False
        r'   )r   r=   r@   )r)   r   r   r   r-      s    z(NetplanActivator.bring_up_all_interfacesc             C   s   t jd ttjdS )zYApply netplan config.

        Return True is successful, otherwise return False
        zBCalling 'netplan apply' rather than altering individual interfacesr'   )r   r   r   r=   r@   )r   r   r   r   r!      s    z%NetplanActivator.bring_down_interface)N)r   r   r   r@   r.   r0   r   r/   r    r   r(   r   r-   r!   r   r   r   r   r=      s   r=   c               @   s\   e Zd ZededddZeeedddZeeedd	d
Z	eeedddZ
dS )NetworkdActivatorN)r   c             C   s
   t | dS )z3Return true if ifupdown can be used on this system.)r   )networkd_available)r   r   r   r   r      s    zNetworkdActivator.available)r   r   c             C   s   dddd| g}t || S )z1Return True is successful, otherwise return Falseiplinksetr9   )r   )r   r   r   r   r   r       s    z$NetworkdActivator.bring_up_interface)r)   r   c             C   s   ddddg}t |dS )z1Return True is successful, otherwise return FalseZ	systemctlZrestartzsystemd-networkdzsystemd-resolvedr'   )r   )r)   r   r   r   r   r-      s    z)NetworkdActivator.bring_up_all_interfacesc             C   s   dddd| g}t || S )z1Return True is successful, otherwise return FalserC   rD   rE   Zdown)r   )r   r   r   r   r   r!      s    z&NetworkdActivator.bring_down_interface)N)r   r   r   r.   r0   r   r/   r    r   r-   r!   r   r   r   r   rA      s   rA   enir>   znetwork-managernetworkd)rF   r>   znetwork-managerrG   )priorityr   r   c                s>   dd | D }|rt d| dd | D } fdd|D S )Nc             S   s   g | ]}|t kr|qS r   )DEFAULT_PRIORITY)r#   r+   r   r   r   r,      s    z$search_activator.<locals>.<listcomp>z0Unknown activators provided in priority list: %sc             S   s   g | ]}t | qS r   )NAME_TO_ACTIVATOR)r#   r*   r   r   r   r,      s    c                s   g | ]}|j  r|qS r   )r   )r#   Zactivator_cls)r   r   r   r,      s   )
ValueError)rH   r   unknownZactivator_classesr   )r   r   search_activator   s    

rM   c             C   s\   | d krt } t| |}|sBd}|r2|dkr2d| }td|| f |d }tjd||  |S )N /z in target=%szBNo available network activators found%s. Searched through list: %sr   z.Using selected activator: %s from priority: %s)rI   rM   r   r   r   )rH   r   foundZtmsgZselectedr   r   r   select_activator   s    

rQ   )NN)*Zloggingabcr   r   Ztypingr   r   r   r   r   r	   Z	cloudinitr
   r   Zcloudinit.net.enir   r3   Zcloudinit.net.netplanr?   r<   r5   Zcloudinit.net.network_stater   Zcloudinit.net.networkdrB   Z	getLoggerr   r   	Exceptionr   r0   r   r   r2   r4   r=   rA   rI   rJ   r/   rM   rQ   r   r   r   r   <module>   s:     
,(5