
    x[h-                        d Z ddlZddlZddlZddlZddlZddlZddlZddlm	Z	m
Z
mZ ddl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mZ ddlmZ  ej<                  e      Z dZ!ddZ" G d dejF                        Z$ G d de$      Z%de%ejL                  fiZ'd Z(dede)fdZ*deddfdZ+ddZ,dede-fdZ.d Z/edk(  r e"       ja                         Z1 e/e!e1       yy)z)Handle reconfiguration on hotplug events.    N)	reportingstagesutil)install_hotplug)
EventScope	EventType)loggers)read_sys_net_safe)parse_net_config_data)events)
DataSourceDataSourceNotFoundException)Initzhotplug-hookc                    | st        j                  t        t              } t        | _        | j                  dddddg       | j                  dd	
      }d|_        |j                  dd       |j                  dd      }|j                  ddddd       |j                  ddddddg       |j                  dd       | S )a  Build or extend an arg parser for hotplug-hook utility.

    @param parser: Optional existing ArgumentParser instance representing the
        subcommand which will be extended to support the args of this utility.

    @returns: ArgumentParser with proper argument configuration.
    )progdescriptionz-sz--subsystemTzsubsystem to act onnet)requiredhelpchoiceszHotplug Actionhotplug_action)titledestqueryz0Query if hotplug is enabled for given subsystem.)r   handlezHandle the hotplug event.z-dz	--devpathPATHzSysfs path to hotplugged device)r   metavarr   z-uz--udevactionzSpecify action to take.addremoveenablez%Enable hotplug for a given subsystem.)	argparseArgumentParserNAME__doc__r   add_argumentadd_subparsersr   
add_parser)parser
subparsersparser_handles      B/usr/lib/python3/dist-packages/cloudinit/cmd/devel/hotplug_hook.py
get_parserr,      s    ((dH F
"   &&%5 ' J JH   ))2 * M .   &!   >   M    c                       e Zd Zd Zej
                  d        Zeej
                  d               Zej
                  de	fd       Z
d Zd Zd Zy	)
UeventHandlerc                 J    || _         || _        || _        || _        || _        y N)id
datasourcedevpathaction
success_fn)selfr2   r3   r4   r5   r6   s         r+   __init__zUeventHandler.__init__R   s%    &0$r-   c                     t               r1   NotImplementedErrorr7   s    r+   applyzUeventHandler.applyY       !##r-   c                     t               r1   r:   r<   s    r+   configzUeventHandler.config]   s     "##r-   returnc                     t               r1   r:   r<   s    r+   device_detectedzUeventHandler.device_detectedb   r>   r-   c                     d }| j                   dk(  rd}n*| j                   dk(  rd}nt        d| j                   z        || j                         k7  rt        d| j                  z        y )Nr   Tr   FzUnknown action: %sz'Failed to detect %s in updated metadata)r5   
ValueErrorrC   RuntimeErrorr2   )r7   detect_presences     r+   detect_hotplugged_devicez&UeventHandler.detect_hotplugged_devicef   sm    ;;%"O[[H$#O1DKK?@@d22449DGGC  5r-   c                 "    | j                         S r1   )r6   r<   s    r+   successzUeventHandler.successt   s      r-   c                     | j                   j                  t        j                  g      }|s)t	        d| j                   dt        j                        |S )NzDatasource z not updated for event )r3   update_metadata_if_supportedr   HOTPLUGrF   )r7   results     r+   update_metadatazUeventHandler.update_metadataw   sO    ==
 ??I$5$57  r-   N)__name__
__module____qualname__r8   abcabstractmethodr=   propertyr@   boolrC   rH   rJ   rO    r-   r+   r/   r/   Q   ss    % 	$ $ $  $ 	$ $ $!	r-   r/   c                   @     e Zd Z fdZd Zed        ZdefdZ xZ	S )
NetHandlerc                 ~    t        t        j                  j                  |      d      }t        |   |||||       y )Naddress)r
   ospathbasenamesuperr8   )r7   r3   r4   r5   r6   r2   	__class__s         r+   r8   zNetHandler.__init__   s3    rww//8)DZ&*Er-   c                    | j                   j                  j                  | j                  d       t        j
                  j                  | j                        }| j                   j                  j                         }| j                  dk(  r6|j                  |      s$t        dj                  | j                              y | j                  dk(  r6|j                  |      s$t        dj                  | j                              y y )NF)bring_upr   zFailed to bring up device: {}r   zFailed to bring down device: {})r3   distroapply_network_configr@   r\   r]   r^   r4   network_activatorr5   bring_up_interfacerF   formatbring_down_interface)r7   interface_name	activators      r+   r=   zNetHandler.apply   s    33KK 	4 	
 ))$,,7OO**<<>	;;%//?"3::4<<H  @ [[H$11.A"5<<T\\J  B %r-   c                 .    | j                   j                  S r1   )r3   network_configr<   s    r+   r@   zNetHandler.config   s    ---r-   rA   c                 
   t        | j                        }|j                         D cg c]"  }|j                  d      | j                  k(  r|$ }}t
        j                  d| j                  |       t        |      dkD  S c c}w )Nmac_addresszIfaces with ID=%s : %sr   )r   r@   iter_interfacesgetr2   LOGdebuglen)r7   netstateifacefounds       r+   rC   zNetHandler.device_detected   sw    (5 "113
yy'4772 
 

 			*DGGU;5zA~
s   'B )
rP   rQ   rR   r8   r=   rU   r@   rV   rC   __classcell__)r`   s   @r+   rY   rY      s.    F
$ . . r-   rY   r   c                     	 t         |   d   }t	        j
                  | j                  | j                  t        j                  |      S # t        $ r }t        dj                  |            |d }~ww xY w)N   z4hotplug-hook: cannot handle events for subsystem: {})r3   cfgevent_source_typescope)
SUBSYSTEM_PROPERTIES_MAPKeyErrorrF   rg   r   update_event_enabledr3   rz   r   rM   )hotplug_init	subsystemr|   es       r+   
is_enabledr      s~    (3A6 &&**#++	   BII
 		s   A	 		A2A--A2r   r   c                    t         j                  d       | j                  d      }|j                  t        j
                  g      st         j                  d|       y t        | |      st         j                  d|       y |S )NzFetching datasourcetrustexistingz*hotplug not supported for event of type %sz(hotplug not enabled for event of type %s)rq   rr   fetchget_supported_eventsr   rM   r   )r   r   r3   s      r+   initialize_datasourcer      sm    II#$##W#5J**I,=,=+>?		>	JlI.		<iHr-   rA   c                 T   t        | |      }|sy t        |   d   }t        j                  d|        ||||| j                        }t        j
                         }|j                  j                  st        |||       y t        j
                         |z
  |j                  j                  k  r{t        |||       t        j                  d       t        j                  |j                  j                         t        j
                         |z
  |j                  j                  k  rzy y )Nr   zCreating %s event handler)r3   r4   r5   r6   z>Gathering network configuration again due to IMDS limitations.)r   r}   rq   rr   _write_to_cachetimehotplug_retry_settingsforce_retrytry_hotplugsleep_totalsleepsleep_period)r   r4   r   
udevactionr3   handler_clsevent_handlerstarts           r+   handle_hotplugr      s    &|Y?J*95a8KII)95#.//	$M IIKE,,88I}j9
))+

 A A M M
MI}j9		L	
 	

:44AAB ))+

 A A M M
Mr-   c           	      X   g d}t        d      }t        |      D ]  \  }}t        j                  d| |t	        |             	 t        j                  d       |j                          |j                  s%t        j                  d       |j                          t        j                  d       |j                          t        j                  d       |j                           y  |# t         $ r8}t        j                  d|       t        j                  |       |}Y d }~	d }~ww xY w)	N)ry         
      z#Bug while processing hotplug event.z!subsystem=%s update attempt %s/%szRefreshing metadataz$Detecting device in updated metadatazApplying config changezUpdating cachez,Exception while processing hotplug event. %s)	Exception	enumeraterq   rr   rs   rO   skip_hotplug_detectrH   r=   rJ   r   r   )r   r   r3   
wait_timeslast_exceptionattemptwaitr   s           r+   r   r      s    "JDEN":. 		/
O		
	II+,))+11		@A668II./!II&'!!##.   	IIDaHJJtN	s   B C((	D)1-D$$D)c                    | j                  d      }|syt        |   d   }t        j                  |j	                  t        j                  g      j                  |t                     v }|st        d| t        j                         yt        j                  | j                        }|j                  |d   v r t        d| d	t        j                         y
|d   j                  |j                         t        j                  | j                  j!                  d      t#        j$                  |      dd       t'        |d
| j(                         y
)Nr   r   Fry   z#hotplug not supported for event of )filescopesz)Not installing hotplug for event of type z. Reason: Already done.Tzhotplug.enabledwi  )omodemode)network_hotplug_enabledrz   )r   r}   r   rM   r   rp   setprintsysstderrr   read_hotplug_enabled_filepathsvalueappend
write_file	get_cpathjsondumpsr   rz   )r   r   r3   r|   hotplug_supportedhotplug_enabled_files         r+   enable_hotplugr     s9   ##W#5J$Y/2E!))''):):(;<@@N 1)=CJJ	
 99,:L:LM{{*8447	{ C% %	

 "))%++6OO$$%67

'(	 Dl6F6F r-   c           	         t        j                  | t        d      }t        g |      }|j	                          t        j                  |j                         d|j                  v r.t        j                  |j                  j                  d             t        j                  d| |j                  |j                  d|v r|j                  nd d|v r|j                   nd        |5  	 |j                  dk(  r'	 t#        ||j                        }t'        rdnd       n|j                  dk(  r.t-        ||j                   |j                  |j                         nt/        j0                         dk7  r4t(        j2                  j5                  d       t)        j*                  d
       t7        ||j                        st)        j*                  d
       t'        d|j                          d d d        t        j                  d       t        j<                          y # t$        $ r$ t'        d	       t)        j*                  d
       Y :w xY w# t8        $ r t        j;                  d        w xY w# 1 sw Y   xY w)NT)reporting_enabled)ds_depsreporterr   zh%s called with the following arguments: {hotplug_action: %s, subsystem: %s, udevaction: %s, devpath: %s}r   r4   r   z9Unable to determine hotplug state. No datasource detectedry   enableddisabledr   )r   r4   r   r   r   z9Root is required. Try prepending your command with sudo.
)r   r   z)Enabled cloud-init hotplug for subsystem=z*Received fatal exception handling hotplug!zExiting hotplug handler)r   ReportEventStackr$   r   read_cfgr	   setup_loggingrz   r   update_configurationrp   rq   rr   r   r   r   r4   r   r   r   r   exitr   r\   getuidr   writer   r   	exceptionflush_events)nameargshotplug_reporterr   r3   s        r+   handle_argsr   '  s    ..g -=>L,**+l&&&&&|'7'7';';K'HIII	J'4/T!T)t 
 '&	""g-	 !6$dnn"J :i:>$$0!- LL"nn#	 99;!#JJ$$# HHQK%!- HHQK!!% 02A'R II'(G 3  # HHQK <  	MMFG	K' 'sC   %I.'I7HCI)IIII I++I..I7__main__r1   )rA   N)2r$   rS   r!   r   loggingr\   r   r   	cloudinitr   r   r   #cloudinit.config.cc_install_hotplugr   cloudinit.eventr   r   cloudinit.logr	   cloudinit.netr
   cloudinit.net.network_stater   cloudinit.reportingr   cloudinit.sourcesr   r   cloudinit.stagesr   	getLoggerrP   rq   r#   r,   ABCr/   rY   NETWORKr}   r   strr   r   r   rV   r   r   
parse_argsr   rW   r-   r+   <module>r      s	   0 
    	 
  - - ? 1 ! + = & E !g!3l/CGG /d$ $P 
J
**+ 
$  C C$ C0:   T  FBJ z<""$Dd r-   