
    x[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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 j4                  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 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)partial)CallableDictIterableListOptionalTypeUnion)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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edd       Zy)NetworkActivatorNtargetr    c                     t               )z>Return True if activator is available, otherwise return False.NotImplementedErrorr2   s    r   	availablezNetworkActivator.available.   s     "##r   r   c                     t               )zWBring up interface.

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

        Return True is successful, otherwise return False
        r4   r9   s    r   bring_down_interfacez%NetworkActivator.bring_down_interface=   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>L   s     Mf3))&1M   )all)rF   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)rJ   iter_interfaces)rF   rK   is      r   bring_up_all_interfacesz(NetworkActivator.bring_up_all_interfacesN   s5     && - = = ?@1QvY@
 	
@s   1c                      t               )zWait for network to come up.r4   r   r   r   wait_for_networkz!NetworkActivator.wait_for_networkX   s     "##r   rA   r    N)r   r   r   staticmethodr   r
   strboolr7   r:   r=   classmethodr   rJ   r   rP   rR   r   r   r   r1   r1   -   s    $(3- $4 $  $ $ $ $  $ $# $$ $  $ Nx} N N N 
L 
T 
 
 $ $r   r1   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)	IfUpDownActivatorNr2   r    c                 .    t        j                  |       S z3Return true if ifupdown can be used on this system.r6   )r   r7   r6   s    r   r7   zIfUpDownActivator.availablec   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_interfaceh   s     {#[11r   c                 "    d| g}t        ||       S )r]   ifdownr_   r`   s     r   r=   z&IfUpDownActivator.bring_down_interfaceq   s     %[11r   rA   )
r   r   r   rT   r
   rU   rV   r7   r:   r=   r   r   r   rY   rY   ^   sl    
 ,(3- ,4 , , 2 2 2 2 2# 2$ 2 2r   rY   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                 N    d}dg}t        t        j                  |||             S )z3Return true if ifconfig can be used on this system.ifconfigz/sbin)searchr2   )rV   r   which)r2   expectedrg   s      r   r7   zIfConfigActivator.available|   s(     DJJxvFGGr   r   c                 $    d| dg}t        ||       S )zoBring up interface using ifconfig <dev> up.

        Return True is successful, otherwise return False
        rf   upr_   r`   s     r   r:   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
        rf   downr_   r`   s     r   r=   z&IfConfigActivator.bring_down_interface   s     ;/[11r   rA   )	r   r   r   rT   rV   r7   rU   r:   r=   r   r   r   rd   rd   {   sb    H$ H H 2 2 2 2 2# 2$ 2 2r   rd   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e	de
e   defd       Zy)
NetworkManagerActivatorNr    c                 .    t        j                  |       S )z9Return true if NetworkManager can be used on this system.r6   )r   r7   r6   s    r   r7   z!NetworkManagerActivator.available   s     ((77r   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loadrk   filename)rs   rt   reloadifname)cloudinit.net.network_managerrr   r'   r(   r#   )r   rr   rv   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
        rs   rE   
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   rI   c              3   @   K   | ]  }j                  |        y wrA   rB   rC   s     r   rG   z>NetworkManagerActivator.bring_up_interfaces.<locals>.<genexpr>   s     LV#((0LrH   )r   stdoutrstripr'   r(   r#   rI   )rF   r>   states   `  r   rJ   z+NetworkManagerActivator.bring_up_interfaces   sp     		
 & 	 &KKL  L
 M L|LL	Mr   rA   )r   r   r   rT   rV   r7   rU   r:   r=   rW   r   rJ   r   r   r   ro   ro      s    8$ 8 8 2 2 2 2. 2# 2$ 2 2 Mx} M M Mr   ro   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edd       Zy)NetplanActivatorr   applyNr    c                 .    t        j                  |       S )z2Return true if netplan can be used on this system.r6   )r   r7   r6   s    r   r7   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 interfacesrI   Fr   r'   r)   r#   r   NETPLAN_CMDr9   s    r   r:   z#NetplanActivator.bring_up_interface   1     			-	
  ((%
 	
r   r>   c                 d    t         j                  d       t        t        j                  dd      S r   r   )r>   s    r   rJ   z$NetplanActivator.bring_up_interfaces   r   r   rK   c                 :    t        t        j                  dd      S )r   rI   Fr   )r#   r   r   )rK   s    r   rP   z(NetplanActivator.bring_up_all_interfaces   s      ((%
 	
r   c                 d    t         j                  d       t        t        j                  dd      S r   r   r9   s    r   r=   z%NetplanActivator.bring_down_interface  r   r   c                      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   r7   r'   r)   NetworkdActivatorrR   r   r   r   rR   z!NetplanActivator.wait_for_network  s,     $$&IIIJ**,r   rA   rS   )r   r   r   r   rT   rV   r7   rU   r:   r   rJ   r   rP   r=   rR   r   r   r   r   r      s    g&K0$ 0 0 
 
 
 
 
(3- 
D 
 
 
| 
 
 
 
# 
$ 
 
 - -r   r   c                       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
edd	       Zy)r   Nr    c                 .    t        j                  |       S r[   )r   r7   r6   s    r   r7   zNetworkdActivator.available  s     !!00r   r   c                 H    t        t        t        j                  |             S 1Return True is successful, otherwise return False)r"   r   r   link_upr9   s    r   r:   z$NetworkdActivator.bring_up_interface"  s!     )H$$k2
 	
r   rK   c                 "    g d}t        |d      S )r   )r}   restartzsystemd-networkdzsystemd-resolvedrI   r_   )rK   r   s     r   rP   z)NetworkdActivator.bring_up_all_interfaces)  s     OU++r   c                 H    t        t        t        j                  |             S r   )r"   r   r   	link_downr9   s    r   r=   z&NetworkdActivator.bring_down_interface/  s!     )H&&4
 	
r   c                  2    t        j                   g d       y)z&Wait for systemd-networkd-wait-online.)r}   startz$systemd-networkd-wait-online.serviceN)r   r   r   r   rR   z"NetworkdActivator.wait_for_network6  s     			J	
r   rA   rS   )r   r   r   rT   rV   r7   rU   r:   r   rP   r=   rR   r   r   r   r   r     s    1$ 1 1 
 
 
 
 ,| , , ,
 
# 
$ 
 
 
 
r   r   )r   r   znetwork-managerr   rf   NAME_TO_ACTIVATORpriorityr2   c                     | D cg c]  }|t         vs| }}|rt        d|       | D cg c]  }t        |    }}t        f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   D   K   | ]  }|j                        r|  y wrA   )r7   )rD   activator_clsr2   s     r   rG   z#search_activator.<locals>.<genexpr>\  s'      	
&&v. 	
s    N)DEFAULT_PRIORITY
ValueErrorr   next)r   r2   rO   unknownrM   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                     | t         } t        | |      }|s|r
|dk7  rd| nd}t        d| d|        t        j	                  d||        |S )N/z in target= z%No available network activators foundz. Searched through list: z.Using selected activator: %s from priority: %s)r   r   r   r'   r)   )r   r2   selectedtmsgs       r   select_activatorr   e  ss     #&1H)/FcMVH%r"3D6 :&&.Z1
 	
 II8(H Or   )T)NN)/loggingabcr   r   	functoolsr   typingr   r   r   r	   r
   r   r   	cloudinitr   r   cloudinit.netr   r   r   r   cloudinit.net.netops.iproute2r   cloudinit.net.network_stater   	getLoggerr   r'   	Exceptionr   listrU   rV   r#   r"   r1   rY   rd   ro   r   r   r   r   __annotations__r   r   r   r   r   <module>r      s    #  H H H   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 3i!&sDy!1d#$%* CGtCy!2:3-	
r   