
    쑛h-              	          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 j2                  e      Z G d	 d
e      Z	 d#dedede de fdZ!	 d#dede 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e#      fd!Z,	 d$d ee
e      dee#   fd"Z-y)%    N)ABCabstractmethod)partial)CallableDictIterableListOptionalType)subputil)eninetplannetwork_managernetworkd)Iproute2)NetworkStatec                       e Zd Zy)NoActivatorExceptionN)__name__
__module____qualname__     :/usr/lib/python3/dist-packages/cloudinit/net/activators.pyr   r      s    r   r   cmddevice_namewarn_on_stderrreturnc                 J    t        t        t        j                  |       |      S )z2Attempt to alter an interface using a command list)_alter_interface_callabler   r   )r   r   r   s      r   _alter_interfacer"      s     %WTYY%<nMMr   callablec                    	  |        \  }}t        |      r+|rt        j                  nt        j                  } |d|       y# t        j
                  $ r/}t        j                  t        d|j                         Y d}~yd}~ww xY 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es         r   r!   r!      sf    J	cs8(6CIIJ3S9%% C>Fs   A A B%B  Bc                       e Zd Z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edd       Zy
)NetworkActivatorr   c                      t               )z>Return True if activator is available, otherwise return False.NotImplementedErrorr   r   r   	availablezNetworkActivator.available.   s     "##r   r   c                     t               )zWBring up interface.

        Return True is successful, otherwise return False
        r2   r   s    r   bring_up_interfacez#NetworkActivator.bring_up_interface4        "##r   c                     t               )zYBring down interface.

        Return True is successful, otherwise return False
        r2   r6   s    r   bring_down_interfacez%NetworkActivator.bring_down_interface=   r8   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r7   .0deviceclss     r   	<genexpr>z7NetworkActivator.bring_up_interfaces.<locals>.<genexpr>L   s     Mf3))&1M   )all)rC   r;   s   ` r   bring_up_interfacesz$NetworkActivator.bring_up_interfacesF   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)rG   iter_interfaces)rC   rH   is      r   bring_up_all_interfacesz(NetworkActivator.bring_up_all_interfacesN   s5     && - = = ?@1QvY@
 	
@s   1Nc                      t               )zWait for network to come up.r2   r   r   r   wait_for_networkz!NetworkActivator.wait_for_networkX   s     "##r   r   N)r   r   r   staticmethodr   boolr4   strr7   r:   classmethodr   rG   r   rM   rO   r   r   r   r0   r0   -   s    $t $  $ $ $ $  $ $# $$ $  $ Nx} N N N 
L 
T 
 
 $ $r   r0   c                   V    e Zd Zedefd       Zededefd       Zededefd       Zy)IfUpDownActivatorr   c                  *    t        j                         S z3Return true if ifupdown can be used on this system.)r   r4   r   r   r   r4   zIfUpDownActivator.availablec   s     }}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   r7   z$IfUpDownActivator.bring_up_interfaceh   s     {#[11r   c                 "    d| g}t        ||       S )rZ   ifdownr\   r]   s     r   r:   z&IfUpDownActivator.bring_down_interfaceq   s     %[11r   N	r   r   r   rQ   rR   r4   rS   r7   r:   r   r   r   rV   rV   ^   sa    
 t   2 2 2 2 2# 2$ 2 2r   rV   c                   V    e Zd Zedefd       Zededefd       Zededefd       Zy)IfConfigActivatorr   c                  L    d} dg}t        t        j                  | |            S )z3Return true if ifconfig can be used on this system.ifconfigz/sbin)search)rR   r   which)expectedre   s     r   r4   zIfConfigActivator.available|   s&     DJJx788r   r   c                 $    d| dg}t        ||       S )zoBring up interface using ifconfig <dev> up.

        Return True is successful, otherwise return False
        rd   upr\   r]   s     r   r7   z$IfConfigActivator.bring_up_interface   s     ;-[11r   c                 $    d| dg}t        ||       S )zqBring up interface using ifconfig <dev> down.

        Return True is successful, otherwise return False
        rd   downr\   r]   s     r   r:   z&IfConfigActivator.bring_down_interface   s     ;/[11r   Nr`   r   r   r   rb   rb   {   s_    9t 9 9 2 2 2 2 2# 2$ 2 2r   rb   c                   v    e Zd Zedefd       Zededefd       Zededefd       Ze	de
e   defd       Zy)	NetworkManagerActivatorr   c                  *    t        j                         S )z9Return true if NetworkManager can be used on this system.)r   r4   r   r   r   r4   z!NetworkManagerActivator.available   s     ((**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loadri   filename)rq   rr   reloadifname)cloudinit.net.network_managerrp   r&   r'   r"   )r   rp   rt   r   s       r   r7   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
        rq   rB   
disconnectr\   r]   s     r   r:   z,NetworkManagerActivator.bring_down_interface   s     ,<[11r   r;   c                      t        j                   g d      j                  j                         }d|k7  rt        j	                  d|       t        g dd      xr t         fd|D              S )z9Activate network

        Return True on success
        )	systemctlshowz--property=SubStateNetworkManager.servicezSubState=runningz:Expected NetworkManager SubState=running, but detected: %s)r{   ztry-reload-or-restartr}   rF   c              3   @   K   | ]  }j                  |        y wr>   r?   r@   s     r   rD   z>NetworkManagerActivator.bring_up_interfaces.<locals>.<genexpr>   s     LV#((0LrE   )r   stdoutrstripr&   r'   r"   rF   )rC   r;   states   `  r   rG   z+NetworkManagerActivator.bring_up_interfaces   sp     		
 & 	 &KKL  L
 M L|LL	Mr   N)r   r   r   rQ   rR   r4   rS   r7   r:   rT   r   rG   r   r   r   rm   rm      s    +t + + 2 2 2 2. 2# 2$ 2 2 Mx} M M Mr   rm   c                       e Zd ZddgZe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edd       Zy)NetplanActivatorr   applyr   c                  *    t        j                         S )z2Return true if netplan can be used on this system.)r   r4   r   r   r   r4   zNetplanActivator.available   s       ""r   r   c                 d    t         j                  d       t        t        j                  dd      S YApply netplan config.

        Return True is successful, otherwise return False
        zBCalling 'netplan apply' rather than altering individual interfacesrF   Fr   r&   r(   r"   r   NETPLAN_CMDr6   s    r   r7   z#NetplanActivator.bring_up_interface   1     			-	
  ((%
 	
r   r;   c                 d    t         j                  d       t        t        j                  dd      S r   r   )r;   s    r   rG   z$NetplanActivator.bring_up_interfaces   r   r   rH   c                 :    t        t        j                  dd      S )r   rF   Fr   )r"   r   r   )rH   s    r   rM   z(NetplanActivator.bring_up_all_interfaces   s      ((%
 	
r   c                 d    t         j                  d       t        t        j                  dd      S r   r   r6   s    r   r:   z%NetplanActivator.bring_down_interface  r   r   Nc                      t        j                         rt        j                  d       yt        j                          y)z:On networkd systems, wait for systemd-networkd-wait-onlinez1NetworkManager is enabled, skipping networkd waitN)r   r4   r&   r(   NetworkdActivatorrO   r   r   r   rO   z!NetplanActivator.wait_for_network  s,     $$&IIIJ**,r   rP   )r   r   r   r   rQ   rR   r4   rS   r7   r   rG   r   rM   r:   rO   r   r   r   r   r      s    g&K#t # # 
 
 
 
 
(3- 
D 
 
 
| 
 
 
 
# 
$ 
 
 - -r   r   c                       e Zd Ze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
ed
d	       Zy)r   r   c                  *    t        j                         S rX   )r   r4   r   r   r   r4   zNetworkdActivator.available  s     !!##r   r   c                 H    t        t        t        j                  |             S 1Return True is successful, otherwise return False)r!   r   r   link_upr6   s    r   r7   z$NetworkdActivator.bring_up_interface"  s!     )H$$k2
 	
r   rH   c                 "    g d}t        |d      S )r   )r{   restartzsystemd-networkdzsystemd-resolvedrF   r\   )rH   r   s     r   rM   z)NetworkdActivator.bring_up_all_interfaces)  s     OU++r   c                 H    t        t        t        j                  |             S r   )r!   r   r   	link_downr6   s    r   r:   z&NetworkdActivator.bring_down_interface/  s!     )H&&4
 	
r   Nc                  2    t        j                   g d       y)z&Wait for systemd-networkd-wait-online.)r{   startz$systemd-networkd-wait-online.serviceN)r   r   r   r   rO   z"NetworkdActivator.wait_for_network6  s     			J	
r   rP   )r   r   r   rQ   rR   r4   rS   r7   r   rM   r:   rO   r   r   r   r   r     s    $t $ $ 
 
 
 
 ,| , , ,
 
# 
$ 
 
 
 
r   r   )r   r   znetwork-managerr   rd   NAME_TO_ACTIVATORpriorityc                     | D cg c]  }|t         vs| }}|rt        d|       | D cg c]  }t        |    }}t        d |D        d      S c c}w c c}w )zEReturns the first available activator from the priority list or None.z.Unknown activators provided in priority list: c              3   @   K   | ]  }|j                         r|  y wr>   )r4   )rA   activator_clss     r   rD   z#search_activator.<locals>.<genexpr>Z  s$      	
&&( 	
s   N)DEFAULT_PRIORITY
ValueErrorr   next)r   rL   unknownrJ   activator_classess        r   search_activatorr   Q  s    "@Qa/?&?q@G@<WIF
 	
 >FFT*40FF	
!2	

 	  A
 Gs   AAAc                 z    | t         } t        |       }|st        d|        t        j	                  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   selecteds     r   select_activatorr   c  sT     #)H"&&.Z1
 	
 II8(H Or   )Tr>   ).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   listrS   rR   r"   r!   r0   rV   rb   rm   r   r   r   r   __annotations__r   r   r   r   r   <module>r      sj    #  A A   A A 2 4g!	9 	
 9=N	NN15N	N 04(,	&.$s .$b2( 2:2( 26=M. =M@C-' C-L
( 
H  .!!8 4T"2334 tCy Xd;K6L-M & %)tCy!	
r   