
    f&                        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 j2                  e      Z G d de      Zd	efd
Z G d de      Z  G d de       Z! G d de       Z" G d de       Z# G d de       Z$ G 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Z*	 ddeee(      dee(   d	e	e    fdZ+y)    N)ABCabstractmethod)DictIterableListOptionalTypeUnion)subputil)	available)NetworkStatec                       e Zd Zy)NoActivatorExceptionN)__name__
__module____qualname__     :/usr/lib/python3/dist-packages/cloudinit/net/activators.pyr   r      s    r   r   returnc                    t         j                  d| |       	 t        j                  |       \  }}t        |      rt         j	                  d| |       y# t        j
                  $ r t        j                  t         d|        Y yw xY 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errs       r   _alter_interfacer#      sm    II3S+Fiinss8KKBCM%% C>Ds   :A .BBc                       e Zd Zeeddee   defd              Zeededefd              Z	eededefd              Z
edee   defd	       Zed
edefd       Zy)NetworkActivatorNtargetr   c                     t               )z>Return True if activator is available, otherwise return False.NotImplementedErrorr&   s    r   r   zNetworkActivator.available!   s     "##r   r    c                     t               )zWBring up interface.

        Return True is successful, otherwise return False
        r(   r    s    r   bring_up_interfacez#NetworkActivator.bring_up_interface'        "##r   c                     t               )zYBring down interface.

        Return True is successful, otherwise return False
        r(   r,   s    r   bring_down_interfacez%NetworkActivator.bring_down_interface0   r.   r   device_namesc                 ,     t         fd|D              S )zjBring up specified list of interfaces.

        Return True is successful, otherwise return False
        c              3   @   K   | ]  }j                  |        y wN)r-   ).0deviceclss     r   	<genexpr>z7NetworkActivator.bring_up_interfaces.<locals>.<genexpr>?   s     Mf3))&1Ms   )all)r7   r1   s   ` r   bring_up_interfacesz$NetworkActivator.bring_up_interfaces9   s     MMMMr   network_statec                 l    | j                  |j                         D cg c]  }|d   	 c}      S c c}w )z\Bring up all interfaces.

        Return True is successful, otherwise return False
        name)r:   iter_interfaces)r7   r;   is      r   bring_up_all_interfacesz(NetworkActivator.bring_up_all_interfacesA   s5     && - = = ?@1QvY@
 	
@s   1r4   )r   r   r   staticmethodr   r   strboolr   r-   r0   classmethodr   r:   r   r@   r   r   r   r%   r%       s    $(3- $4 $  $ $ $ $  $ $# $$ $  $ Nx} N N N 
L 
T 
 
r   r%   c                   b    e Zd Zeddee   defd       Zededefd       Zededefd       Z	y)	IfUpDownActivatorNr&   r   c                     t        |       S z3Return true if ifupdown can be used on this system.r*   )eni_availabler*   s    r   r   zIfUpDownActivator.availableQ   s     F++r   r    c                 "    d| g}t        ||       S )bBring up interface using ifup.

        Return True is successful, otherwise return False
        ifupr#   r    r   s     r   r-   z$IfUpDownActivator.bring_up_interfaceV   s     {#[11r   c                 "    d| g}t        ||       S )rK   ifdownrM   rN   s     r   r0   z&IfUpDownActivator.bring_down_interface_   s     %[11r   r4   )
r   r   r   rA   r   rB   rC   r   r-   r0   r   r   r   rF   rF   L   sl    
 ,(3- ,4 , , 2 2 2 2 2# 2$ 2 2r   rF   c                   X    e Zd Zeddefd       Zededefd       Zededefd       Zy)IfConfigActivatorNr   c                 <    d}dg}t        j                  |||       S )z3Return true if ifconfig can be used on this system.ifconfigz/sbin)searchr&   )r   which)r&   expectedrU   s      r   r   zIfConfigActivator.availablej   s#     zz(6&AAr   r    c                 $    d| dg}t        ||       S )zoBring up interface using ifconfig <dev> up.

        Return True is successful, otherwise return False
        rT   uprM   rN   s     r   r-   z$IfConfigActivator.bring_up_interfaceq   s     ;-[11r   c                 $    d| dg}t        ||       S )zqBring up interface using ifconfig <dev> down.

        Return True is successful, otherwise return False
        rT   downrM   rN   s     r   r0   z&IfConfigActivator.bring_down_interfacez   s     ;/[11r   r4   	r   r   r   rA   rC   r   rB   r-   r0   r   r   r   rR   rR   i   sb    B$ B B 2 2 2 2 2# 2$ 2 2r   rR   c                   X    e Zd Zeddefd       Zededefd       Zededefd       Zy)NetworkManagerActivatorNr   c                     t        |       S )z9Return true if NetworkManager can be used on this system.r*   )nm_availabler*   s    r   r   z!NetworkManagerActivator.available   s     6**r   r    c                     ddl m}  ||       }|t        j                  d       y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_filenamezFUnable to find an interface config file. Unable to bring up interface.Fnmcli
connectionloadrY   filename)rc   rd   reloadifname)cloudinit.net.network_managerrb   r   r   r#   )r    rb   rf   r   s       r   r-   z*NetworkManagerActivator.bring_up_interface   s~     	@ -KK0 fh7C-L$
HEC>LL$+FC[11r   c                 &    ddd| g}t        ||       S )zeBring down interface using nmcli.

        Return True is successful, otherwise return False
        rc   r6   
disconnectrM   rN   s     r   r0   z,NetworkManagerActivator.bring_down_interface   s     ,<[11r   r4   r\   r   r   r   r^   r^      s_    +$ + + 2 2 2 2. 2# 2$ 2 2r   r^   c                       e Zd ZddgZeddefd       Zededefd       Zede	e   defd	       Z
ed
edefd       Zededefd       Zy)NetplanActivatornetplanapplyNr   c                     t        |       S )z2Return true if netplan can be used on this system.r*   )netplan_availabler*   s    r   r   zNetplanActivator.available   s     !//r   r    c                 `    t         j                  d       t        t        j                  d      S YApply netplan config.

        Return True is successful, otherwise return False
        zBCalling 'netplan apply' rather than altering individual interfacesr9   r   r   r#   rm   NETPLAN_CMDr,   s    r   r-   z#NetplanActivator.bring_up_interface   +     			-	
   0 < <eDDr   r1   c                 `    t         j                  d       t        t        j                  d      S rs   ru   )r1   s    r   r:   z$NetplanActivator.bring_up_interfaces   rw   r   r;   c                 6    t        t        j                  d      S )rt   r9   )r#   rm   rv   )r;   s    r   r@   z(NetplanActivator.bring_up_all_interfaces   s       0 < <eDDr   c                 `    t         j                  d       t        t        j                  d      S rs   ru   r,   s    r   r0   z%NetplanActivator.bring_down_interface   rw   r   r4   )r   r   r   rv   rA   rC   r   rB   r-   r   r:   r   r@   r0   r   r   r   rm   rm      s    g&K0$ 0 0 	E 	E 	E 	E 	E(3- 	ED 	E 	E E| E E E 	E# 	E$ 	E 	Er   rm   c                   r    e Zd Zed	defd       Zededefd       Zededefd       Z	ededefd       Z
y)
NetworkdActivatorNr   c                     t        |       S rH   )networkd_availabler*   s    r   r   zNetworkdActivator.available   s     "00r   r    c                 (    dddd| g}t        ||       S )1Return True is successful, otherwise return FalseiplinksetrY   rM   rN   s     r   r-   z$NetworkdActivator.bring_up_interface   s!     VUD+6[11r   r;   c                 "    g d}t        |d      S )r   )	systemctlrestartzsystemd-networkdzsystemd-resolvedr9   rM   )r;   r   s     r   r@   z)NetworkdActivator.bring_up_all_interfaces   s     OU++r   c                 (    dddd| g}t        ||       S )r   r   r   r   r[   rM   rN   s     r   r0   z&NetworkdActivator.bring_down_interface   s!     VUFK8[11r   r4   )r   r   r   rA   rC   r   rB   r-   r   r@   r0   r   r   r   r|   r|      s    1$ 1 1 2 2 2 2
 ,| , , ,
 2# 2$ 2 2r   r|   )enirn   znetwork-managernetworkdrT   NAME_TO_ACTIVATORpriorityr&   c                     | D cg c]  }|t         vs| }}|rt        d|z        | D cg c]  }t        |    }}|D cg c]  }|j                  |      r| c}S c c}w c c}w c c}w )Nz0Unknown activators provided in priority list: %s)DEFAULT_PRIORITY
ValueErrorr   r   )r   r&   r?   unknownr=   activator_classesactivator_clss          r   search_activatorr     s     #@Qa/?&?q@G@>H
 	
 >FFT*40FF /""6* 	  A
 Gs   A A A%A*c                     | t         } t        | |      }|sd}|r
|dk7  rd|z  }t        d|d|       |d   }t        j	                  d||        |S )N /z in target=%sz%No available network activators foundz. Searched through list: r   z.Using selected activator: %s from priority: %s)r   r   r   r   r   )r   r&   foundtmsgselecteds        r   select_activatorr     sr     #Xv.Efm"V+D""&2
 	
 QxHII8(H Or   )NN),loggingabcr   r   typingr   r   r   r   r	   r
   	cloudinitr   r   cloudinit.net.enir   rI   cloudinit.net.netplanrq   ri   r`   cloudinit.net.network_stater   cloudinit.net.networkdr~   	getLoggerr   r   	Exceptionr   rC   r#   r%   rF   rR   r^   rm   r|   r   r   rB   __annotations__r   r   r   r   r   <module>r      sC    # > >   8 @ C 4 Bg!	9 		$ 	)
s )
X2( 2:2( 26%2. %2P2E' 2Ej2( 26  .!!8 4T"2334 3i!&sDy!1	$
 !" CGtCy!2:3-	
r   