o
    x[h·O  ã                   @   sØ  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 ddlmZ e  e¡ZdZdZdZdZ dZ!dZ"dd„ Z#dXdd„Z$dd„ Z%dd„ Z&dd„ Z'dd„ Z(dd„ Z)d d!„ Z*d"d#„ Z+d$d%„ Z,	dYd(d)„Z-d*d+„ Z.d,d-„ Z/d.d/„ Z0d0d1„ Z1d2d3„ Z2	dZd6d7„Z3d8d9„ Z4d:d;„ Z5d<d=„ Z6d>d?„ Z7d@dA„ Z8dBdC„ Z9dDdE„ Z:dFdG„ Z;dHdI„ Z<dJdK„ Z=dLdM„ Z>dNdO„ Z?dPdQ„ Z@dRdS„ ZAdTdU„ ZBdVdW„ ZCdS )[é    N)ÚperformanceÚsubpÚutilé   )ÚConfig)ÚPostCustomScriptÚPreCustomScript)Ú
ConfigFile)ÚNicConfigurator)ÚPasswordConfigurator)ÚGuestCustErrorEnum)ÚGuestCustEventEnum)ÚGuestCustStateEnumz/var/log/cloud-init.logÚqueryNicsSupportedÚ	connectedú/var/run/vmware-imcÚ	deployPkgzenable-custom-scriptsc              
   C   s”   | sd S d}d}z"t  d| ¡ tjd| gdgd�\}}|r&| ¡ }W ||fS W ||fS  tyI } zt  d¡ t  |¡ W Y d }~||fS d }~ww )NÚ zError sending the RPC commandzSending RPC command: %szvmware-rpctoolr   )ÚrcszFailed to send RPC command)ÚloggerÚdebugr   ÚrstripÚ	ExceptionÚ	exception)ÚrpcÚoutÚerrÚe© r   úU/usr/lib/python3/dist-packages/cloudinit/sources/helpers/vmware/imc/guestcust_util.pyÚsend_rpc,   s$   
úü
€ür    c                 C   s<   d}|rt d | }nt }d| ||f }t|ƒ\}}||fS )Nr   ú@zdeployPkg.update.state %d %d %s)ÚCLOUDINIT_LOG_FILEr    )Ú	custstateÚ	custerrorÚerrormessageÚmessager   r   r   r   r   r   Úset_customization_statusB   s   r'   c              	   C   s–   | sdS d}t j | ¡sdS t d| › �¡�+ t| dƒ�}| |¡}W d  ƒ n1 s,w   Y  W d  ƒ |S W d  ƒ |S 1 sDw   Y  |S )z‹Reads the NICS from the specified file path and returns the content

    @param nicsfilepath: Absolute file path to the NICS.txt file.
    Ni   zReading Úr)ÚosÚpathÚexistsr   ÚTimedÚopenÚread)ÚnicsfilepathÚ	NICS_SIZEÚfpÚnicsr   r   r   Úget_nics_to_enableO   s    ÿ(ýûûr3   c                 C   sÔ   | s	t  d¡ d S d}d}d}t|ƒD ]N}t  d|¡ ttjtj| ƒ\}}|s/t	 
|| ¡ q|tkr;t  d¡  d S t|ƒD ]!}ttjtj| ƒ\}}|r[|tkr[t  d|¡   d S t	 
|¡ q?qt  d|¡ d S )NzNo Nics foundé   r   z(Trying to connect interfaces, attempt %dz-NICS connection status query is not supportedzNICS are connected on %d secondz2Can't connect network interfaces after %d attempts)r   ÚwarningÚranger   r'   r   ÚGUESTCUST_STATE_RUNNINGr   ÚGUESTCUST_EVENT_ENABLE_NICSÚtimeÚsleepÚQUERY_NICS_SUPPORTEDÚGUESTCUST_EVENT_QUERY_NICSÚNICS_STATUS_CONNECTEDÚinfo)r2   ÚenableNicsWaitRetriesÚenableNicsWaitCountÚenableNicsWaitSecondsÚattemptr   Ú_errÚcountr   r   r   Úenable_nicsf   sD   
ý
ýöþrE   c              
   C   sæ   t  d¡st d¡ |S ddd| |g}zt   |¡}W n2 t jyL } z%|jdkr3t dd |¡|¡ nt d||j¡ t |¡ |W  Y d	}~S d	}~ww |}t	 
d
|j¡}|ri| d¡ ¡ }t d| ||¡ |S t d| ||¡ |S )a$  Return the value of [section] key from VMTools configuration.

    @param section: String of section to read from VMTools config
    @returns: String value from key in [section] or defaultVal if
              [section] is not present or vmware-toolbox-cmd is
              not installed.
    zvmware-toolbox-cmdz9vmware-toolbox-cmd not installed, returning default valueÚconfigÚgetéE   zRvmware-toolbox-cmd returned 69 (unavailable) for cmd: %s. Return default value: %sú zFailed running %s[%s]Nz([^=]+)=(.*)é   zGet tools config: [%s] %s = %sz<Tools config: [%s] %s is not found, return default value: %s)r   Úwhichr   r   ÚProcessExecutionErrorÚ	exit_codeÚjoinÚerrorr   ÚreÚmatchÚstdoutÚgroupÚstrip)ÚsectionÚkeyÚ
defaultValÚcmdr   r   ÚretValueÚmr   r   r   Úget_tools_config�   sB   
	ÿ
ü
€õ	ùür[   c                 C   s   | r| j rd| }t|ƒS d S )Nzinfo-set guestinfo.gc.status %s)Úpost_gc_statusr    )rF   ÚgcMsgr   r   r   r   Úset_gc_statusÂ   s   
r^   c                   C   s   t S ©N)ÚIMC_DIR_PATHr   r   r   r   Úget_imc_dir_pathÉ   s   ra   c              
   C   sâ   i d d i f\}}}}t |dƒ t|ƒ\}}t| |ƒ}	|	r%t||||ƒs%dS t| |ƒs,dS zt d¡ t|dd|jƒ|d< W n t	yZ }
 zt
dt|
ƒtj|ƒ W Y d }
~
dS d }
~
ww t|ƒ ttjtjƒ t |dƒ ||||fS )NÚStarted)NNNNz#Preparing the Network configurationTÚnetworkz%Error preparing Network ConfigurationÚ
Successful)r^   Ú)get_non_network_data_from_vmware_cust_cfgÚcheck_markersÚdo_special_customizationÚrecheck_markersr   r   Ú%get_network_data_from_vmware_cust_cfgÚosfamilyr   Úset_cust_error_statusÚstrr   Ú$GUESTCUST_EVENT_NETWORK_SETUP_FAILEDÚconnect_nicsr'   r   ÚGUESTCUST_STATE_DONEr   ÚGUESTCUST_ERROR_SUCCESS)Ú	cloud_dirÚscripts_cpathÚcust_cfgÚcust_cfg_dirÚdistroÚmdÚudÚvdÚcfgÚis_special_customizationr   r   r   r   Úget_data_from_imc_cust_cfgÍ   sB   

ÿ


ÿü€ùþ
r{   c           	   
   C   s¢  t | dƒ d\}}}| j}|rÀtj tƒ |¡}tj |¡s)tdd| tj	| ƒ dS zt
 |¡}W n tyM } ztdt|ƒtj	| ƒ W Y d }~dS d }~ww zt d¡ t |¡}W n tjyw } ztdt|ƒtj| ƒ W Y d }~nd }~ww | j}|rÀtj tƒ |¡}tj |¡s—tdd	| tj	| ƒ dS zt
 |¡ d
d¡}W n ty¿ } ztdt|ƒtj	| ƒ W Y d }~dS d }~ww ttjtjƒ t | dƒ |||fS )Nrb   )NNNz,Error locating the cloud-init meta data filezMeta data file is not found: %sz'Error loading cloud-init meta data filez'Validating if meta data is valid or notz&Error parsing the cloud-init meta dataz+Error locating the cloud-init userdata filezUserdata file is not found: %súr   z&Error loading cloud-init userdata filerd   )r^   Úmeta_data_namer)   r*   rN   ra   r+   rk   r   Ú GUESTCUST_EVENT_CUSTOMIZE_FAILEDr   Úload_text_filer   rl   r   r   ÚyamlÚ	safe_loadÚ	YAMLErrorr   Ú!GUESTCUST_ERROR_WRONG_META_FORMATÚuser_data_nameÚreplacer'   r   ro   rp   )	rs   rv   rw   rx   Úmd_fileÚmd_pathr   Úud_fileÚud_pathr   r   r   Ú#get_data_from_imc_raw_data_cust_cfgõ   s„   

üü€ù	
ü€ÿüü€ù	þ

rŠ   c                 C   s^   i i }}| j r| jr| j d | j |d< n| j |d< | jr#| j|d< | jr+| j|d< ||fS )NÚ.zlocal-hostnameÚtimezonezinstance-id)Ú	host_nameÚdomain_namerŒ   Úinstance_id)rs   rv   ry   r   r   r   re   7  s   
ÿ


re   TFc                 C   s(   t | j| j| j|ƒ}| ||¡}t|ƒS r_   )r
   r2   Úname_serversÚdns_suffixesÚgenerateÚgen_v2_network_config)rs   Úuse_system_devicesÚ	configurerj   ÚnicConfiguratorÚethernets_dictr   r   r   ri   G  s   üri   c                 C   s
   d| dœS )NrJ   )ÚversionÚ	ethernetsr   )r—   r   r   r   r“   U  s   
r“   c                 C   s:   t j | d¡}t j |¡rt d|¡ tt|ƒƒ d S d S )Nznics.txtz%s file found, to connect nics)r)   r*   rN   r+   r   r   rE   r3   )rt   Ú	nics_filer   r   r   rn   Y  s
   þrn   c                 C   s   t  | dd¡ S )NÚdisable_vmware_customizationT©r   Úget_cfg_option_bool)Úsys_cfgr   r   r   Úis_vmware_cust_enabled`  s   ÿrŸ   c                 C   s   t  | dd¡S )NÚallow_raw_dataTrœ   )Úds_cfgr   r   r   Úis_raw_data_cust_enabledf  s   r¢   c                 C   s^   t | ƒ}t d¡� td|ƒ}W d   ƒ n1 sw   Y  |r(t d|¡ |S t d¡ d S )Nú3Waiting for VMware customization configuration filezcust.cfgz3Found VMware customization configuration file at %sz0No VMware customization configuration file found)Úget_max_wait_from_cfgr   r,   Úwait_for_cust_cfg_filer   r   )r¡   Úmax_waitÚcust_cfg_file_pathr   r   r   Úget_cust_cfg_filej  s   ÿýþ
r¨   é´   r4   c                 C   s^   d}||krd}||k r-t j || ¡}t j |¡r|S t d¡ t |¡ ||7 }||k sd S )Nr   r   r£   )r)   r*   rN   Úisfiler   r   r9   r:   )ÚfilenameÚmaxwaitÚnaplenÚdirpathÚwaitedÚfileFullPathr   r   r   r¥   �  s   

úr¥   c                 C   sj   d}d}|}| s
|S z
t |  ||¡ƒ}W n ty$   t d||¡ Y nw |dk r3t d|||¡ |}|S )Né   Úvmware_cust_file_max_waitzFailed to get '%s', using %sr   z/Invalid value '%s' for '%s', using '%s' instead)ÚintrG   Ú
ValueErrorr   r5   )r¡   Údefault_max_waitÚmax_wait_cfg_optionr¦   r   r   r   r¤   ’  s.   ýÿür¤   c                 C   s$   |j }t|tj | d¡ƒ}|o| S )NÚdata)Ú	marker_idÚcheck_marker_existsr)   r*   rN   )rq   rs   Úproduct_markerÚhas_marker_filer   r   r   rf   «  s
   ÿ
rf   c                 C   s2   | sdS t j |d|  d ¡}t j |¡rdS dS )ag  
    Check the existence of a marker file.
    Presence of marker file determines whether a certain code path is to be
    executed. It is needed for partial guest customization in VMware.
    @param markerid: is an unique string representing a particular product
                     marker.
    @param: marker_dir: The directory in which markers exist.
    Fú.markerfile-ú.txtT)r)   r*   rN   r+   )ÚmarkeridÚ
marker_dirÚ
markerfiler   r   r   r¹   ³  s   	r¹   c                 C   s   |j }|rt| |ƒsdS dS )NFT)r¸   Úcreate_marker_file)rq   rs   rº   r   r   r   rh   Ä  s
   
rh   c              
   C   sX   zt |jtj | d¡ƒ W dS  ty+ } ztdt|ƒtj	|ƒ W Y d }~dS d }~ww )Nr·   zError creating marker filesFT)
Úsetup_marker_filesr¸   r)   r*   rN   r   rk   rl   r   r~   )rq   rs   r   r   r   r   rÁ   Ì  s   	øü€ùrÁ   c                 C   s`   t  d¡ tj |d|  d ¡}t |¡D ]}| d¡r&t tj ||¡¡ qt	|dƒ 
¡  dS )a#  
    Create a new marker file.
    Marker files are unique to a full customization workflow in VMware
    environment.
    @param marker_id: is an unique string representing a particular product
                      marker.
    @param: marker_dir: The directory in which markers exist.
    zHandle marker creationr¼   r½   z.markerfileÚwN)r   r   r)   r*   rN   ÚlistdirÚ
startswithr   Údel_filer-   Úclose)r¸   r¿   Úmarker_fileÚfnamer   r   r   rÂ   Ú  s   
	
€rÂ   c           
      C   st   d}d}d}d}|j }|rt|ƒ}|rt|||ƒ}t||ƒ}|r0|r0tj | d¡}	t||||	ƒ}|r8|o7|o7|S |S )NFzper-instance)Úcustom_script_nameÚcheck_custom_script_enablementÚdo_pre_custom_scriptÚdo_password_customizationr)   r*   rN   Údo_post_custom_script)
rr   rs   rt   ru   Úis_pre_custom_successfulÚis_password_custom_successfulÚis_post_custom_successfulÚis_custom_script_enabledÚcustom_scriptÚccScriptsDirr   r   r   rg   ë  s0   ÿ
ÿÿýrg   c              
   C   sT   zt ||ƒ}| ¡  W dS  ty) } ztdt|ƒtj| ƒ W Y d }~dS d }~ww )Nz(Error executing pre-customization scriptFT)r   Úexecuter   rk   rl   r   r~   )rs   rÓ   rt   Úprecustr   r   r   r   rÌ     s   

	øü€ùrÌ   c              
   C   sV   zt |||ƒ}| ¡  W dS  ty* } ztdt|ƒtj| ƒ W Y d }~dS d }~ww )Nz)Error executing post-customization scriptFT)r   rÕ   r   rk   rl   r   r~   )rs   rÓ   rt   rÔ   Úpostcustr   r   r   r   rÎ     s   
	øü€ùrÎ   c                 C   sP   d}d}| j rt d¡ d}ttt|ƒ}| ¡ dkr$tddtj	| ƒ |S d}|S )NFÚfalsez=Set default value to true due to customization configuration.Útruez-Custom script is disabled by VM Administratorz'Error checking custom script enablementT)
Údefault_run_post_scriptr   r   r[   ÚIMC_TOOLS_CONF_GROUPNAMEÚ"IMC_TOOLS_CONF_ENABLE_CUST_SCRIPTSÚlowerrk   r   ÚGUESTCUST_ERROR_SCRIPT_DISABLED)rs   rÒ   Údefault_valueÚcustom_script_enablementr   r   r   rË   $  s,   ÿýüÿrË   c              
   C   s„   t  d¡ tƒ }| j}z| j}|s|r| |||¡ W dS t  d¡ W dS  tyA } ztdt|ƒt	j
| ƒ W Y d }~dS d }~ww )NzApplying password customizationzChanging password is not neededz%Error applying password configurationFT)r   r   r   Úadmin_passwordÚreset_passwordr•   r   rk   rl   r   r~   )rs   ru   ÚpwdConfiguratorÚ	admin_pwdÚ	reset_pwdr   r   r   r   rÍ   =  s(   
÷	øü€ùrÍ   c                 C   s   t t| ƒƒS r_   )r   r	   )Úcfg_filer   r   r   Úparse_cust_cfgR  s   rç   c                 C   s:   d\}}| j rd}t d¡ ||fS d}t d¡ ||fS )N)FFTz!raw cloudinit data cust cfg foundzvmware cust cfg found)r}   r   r   )rs   Úis_vmware_cust_cfgÚis_raw_data_cust_cfgr   r   r   Úget_cust_cfg_typeV  s   
þ
rê   c                  C   s6   d} d}| D ]}t ||ƒ}|rt d|¡  dS qdS )N)z/usr/lib/vmware-toolsz/usr/lib64/vmware-toolsz/usr/lib/open-vm-toolsz/usr/lib64/open-vm-toolsz'/usr/lib/x86_64-linux-gnu/open-vm-toolsz(/usr/lib/aarch64-linux-gnu/open-vm-toolsz%/usr/lib/i386-linux-gnu/open-vm-toolszlibdeployPkgPlugin.soz$Found the customization plugin at %sTF)Úsearch_filer   r   )Úsearch_pathsÚcust_pluginr*   Úcust_plugin_pathr   r   r   Úis_cust_plugin_availablea  s   	
ÿürï   c                 C   s@   | r|sd S t  | ¡D ]\}}}||v rt j ||¡  S qd S r_   )r)   Úwalkr*   rN   )r®   r«   ÚrootÚ_dirsÚfilesr   r   r   rë   v  s   ÿrë   c                 C   s*   t  td| |¡ ttj|ƒ t|| ƒ dS )zS
    Set customization status to the underlying VMware Virtualization Platform
    z%s: %sN)r   Úlogexcr   r'   r   r7   r^   )ÚprefixrO   Úeventrs   r   r   r   rk   �  s   rk   r_   )TFN)r©   r4   r   )DÚloggingr)   rP   r9   r€   Ú	cloudinitr   r   r   rF   r   Úconfig_custom_scriptr   r   Úconfig_filer	   Ú
config_nicr
   Úconfig_passwdr   Úguestcust_errorr   Úguestcust_eventr   Úguestcust_stater   Ú	getLoggerÚ__name__r   r"   r;   r=   r`   rÛ   rÜ   r    r'   r3   rE   r[   r^   ra   r{   rŠ   re   ri   r“   rn   rŸ   r¢   r¨   r¥   r¤   rf   r¹   rh   rÁ   rÂ   rg   rÌ   rÎ   rË   rÍ   rç   rê   rï   rë   rk   r   r   r   r   Ú<module>   sp   


*2(B
ÿ
ÿ