
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
\meO                 @   s  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 j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,dZd*d+Z-d,d- Z.d.d/ Z/d0d1 Z0d2d3 Z1d[d6d7Z2d8d9 Z3d:d; Z4d<d= Z5d>d? Z6d@dA Z7dBdC Z8dDdE Z9dFdG Z:dHdI Z;dJdK Z<dLdM Z=dNdO Z>dPdQ Z?dRdS Z@dTdU ZAdVdW ZBdS )\    N)safeyamlsubputil   )Config)PostCustomScriptPreCustomScript)
ConfigFile)NicConfigurator)PasswordConfigurator)GuestCustErrorEnum)GuestCustEventEnum)GuestCustStateEnumz/var/log/cloud-init.logZqueryNicsSupportedZ	connected/var/run/vmware-imcZ	deployPkgzenable-custom-scriptsc             C   s   | sd S d}d}y4t jd|  tjd| gdgd\}}|rB|j }W n6 tk
rz } zt jd t j| W Y d d }~X nX ||fS )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   $/usr/lib/python3.6/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   )Z	custstateZ	custerrorZerrormessagemessager   r   r   r   r   r   set_customization_status>   s    r!   c          	   C   s@   | sdS d}t jj| sdS t| d}|j|}W dQ R X |S )zReads the NICS from the specified file path and returns the content

    @param nicsfilepath: Absolute file path to the NICS.txt file.
    Ni   r)ospathexistsopenread)ZnicsfilepathZ	NICS_SIZEfpnicsr   r   r   get_nics_to_enableK   s    r*   c             C   s   | st jd d S d}d}d}xtd|D ]}t jd| ttjtj| \}}|sbt	j
||  q*|tkrxt jd d S xLtd|D ]>}ttjtj| \}}|r|tkrt jd| d S t	j
| qW q*W t jd| d S )	NzNo Nics found   r   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   ZGUESTCUST_EVENT_ENABLE_NICStimesleepQUERY_NICS_SUPPORTEDZGUESTCUST_EVENT_QUERY_NICSNICS_STATUS_CONNECTEDinfo)r)   ZenableNicsWaitRetriesZenableNicsWaitCountZenableNicsWaitSecondsZattemptr   Z_errcountr   r   r   enable_nics`   s<    



r5   c             C   s   t jdstjd |S ddd| |g}yt j |}W n\ t jk
r } z>|jdkrhtjddj|| ntjd||j tj| |S d	}~X nX |}t	j
d
|j}|r|jdj }tjd| || ntj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getE   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   Zwhichr   r   ZProcessExecutionErrorZ	exit_codejoinerrorr   rematchstdoutgroupstrip)ZsectionkeyZ
defaultValcmdr   r   ZretValuemr   r   r   get_tools_config   s6    	


rE   c             C   s   | r| j rd| }t|S d S )Nzinfo-set guestinfo.gc.status %s)Zpost_gc_statusr   )r6   ZgcMsgr   r   r   r   set_gc_status   s    
rF   c               C   s   t S )N)IMC_DIR_PATHr   r   r   r   get_imc_dir_path   s    rH   c             C   s   i d d i f\}}}}t |d t|\}}t| |}	|	rJt||||sJdS t| |sXdS y"tjd t|dd|j|d< W n4 t	k
r }
 zt
dt|
tj| d	S d }
~
X nX t| ttjtj t |d ||||fS )
NStartedz#Preparing the Network configurationTZnetworkz%Error preparing Network Configuration
Successful)NNNN)NNNN)NNNN)rF   )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   Z$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cfgZis_special_customizationr   r   r   r   get_data_from_imc_cust_cfg   s6    




r_   c       	   -   C   s  t | d d\}}}| j}|r|tjjt |}tjj|sTtdd| tj	|  dS yt
j|}W n4 tk
r } ztdt|tj	|  dS d }~X nX ytjd tj|}W n: tjk
 r } ztdt|tj|  W Y d d }~X nX | j}|r|tjjt |}tjj|s.tdd| tj	|  dS yt
j|jd	d
}W n6 tk
rz } ztdt|tj	|  dS d }~X nX ttjtj t | d |||fS )NrI   z,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 filerJ   )NNN)NNN)NNN)NNN)NNN)rF   meta_data_namer#   r$   r;   rH   r%   rQ   r    GUESTCUST_EVENT_CUSTOMIZE_FAILEDr   Z	load_filer   rR   r   r   r   loadZ	YAMLErrorr   Z!GUESTCUST_ERROR_WRONG_META_FORMATZuser_data_namereplacer!   r   rT   rU   )	rX   r[   r\   r]   Zmd_fileZmd_pathr   Zud_fileZud_pathr   r   r   #get_data_from_imc_raw_data_cust_cfg   sl    



re   c             C   s^   i i  }}| j r6| jr,| j d | j |d< n
| j |d< | jrF| j|d< | jrV| j|d< ||fS )N.zlocal-hostnametimezonezinstance-id)Z	host_nameZdomain_namerg   Zinstance_id)rX   r[   r^   r   r   r   rK   1  s    



rK   TFc             C   s(   t | j|}|j||}t|| j| jS )N)r
   r)   Zgenerateget_v1_network_configZname_serversZdns_suffixes)rX   Zuse_system_devices	configurerP   ZnicConfiguratornics_cfg_listr   r   r   rO   A  s    rO   c             C   s(   | }|s|r|j d||d d|dS )NZ
nameserver)typeZaddresssearchr   )versionr6   )append)rj   Znameserversrl   Zconfig_listr   r   r   rh   L  s
    rh   c             C   s6   t jj| d}t jj|r2tjd| tt| d S )Nznics.txtz%s file found, to connect nics)r#   r$   r;   r%   r   r   r5   r*   )rY   Z	nics_filer   r   r   rS   W  s    rS   c             C   s   t j| dd S )NZdisable_vmware_customizationT)r   get_cfg_option_bool)Zsys_cfgr   r   r   is_vmware_cust_enabled^  s    rp   c             C   s   t j| ddS )NZallow_raw_dataT)r   ro   )ds_cfgr   r   r   is_raw_data_cust_enabledd  s    rr   c             C   sB   t | }tjtjdtd|fd}|r4tjd| |S tjd d S )Nz3Waiting for VMware customization configuration filezcust.cfg)Zlogfuncmsgfuncargsz3Found VMware customization configuration file at %sz0No VMware customization configuration file found)get_max_wait_from_cfgr   Zlog_timer   r   wait_for_cust_cfg_file)rq   max_waitZcust_cfg_file_pathr   r   r   get_cust_cfg_fileh  s    
ry      r+   c             C   s\   d}||krd}xF||k rVt jj|| }t jj|r8|S tjd tj| ||7 }qW d S )Nr   r   z3Waiting for VMware customization configuration file)r#   r$   r;   isfiler   r   r/   r0   )filenameZmaxwaitZnaplendirpathZwaitedZfileFullPathr   r   r   rw     s    


rw   c             C   sl   d}d}|}| s|S yt | j||}W n" tk
rJ   tjd|| Y nX |dk rhtjd||| |}|S )N   Zvmware_cust_file_max_waitzFailed to get '%s', using %sr   z/Invalid value '%s' for '%s', using '%s' instead)intr7   
ValueErrorr   r,   )rq   Zdefault_max_waitZmax_wait_cfg_optionrx   r   r   r   rv     s(    rv   c             C   s$   |j }t|tjj| d}|o"| S )Ndata)	marker_idcheck_marker_existsr#   r$   r;   )rV   rX   product_markerZhas_marker_filer   r   r   rL     s    rL   c             C   s2   | sdS t jj|d|  d }t j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.
    Fz.markerfile-z.txtT)r#   r$   r;   r%   )Zmarkerid
marker_dirZ
markerfiler   r   r   r     s    	r   c             C   s   |j }|rt| |sdS dS )NFT)r   create_marker_file)rV   rX   r   r   r   r   rN     s
    
rN   c             C   sT   yt |jtjj| d W n4 tk
rN } ztdt|tj	| dS d }~X nX dS )Nr   zError creating marker filesFT)
setup_marker_filesr   r#   r$   r;   r   rQ   rR   r   rb   )rV   rX   r   r   r   r   r     s    r   c             C   sd   t jd tjj|d|  d }x0tj|D ]"}|jdr,tjtjj|| q,W t	|dj
  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 creationz.markerfile-z.txtz.markerfilewN)r   r   r#   r$   r;   listdir
startswithr   Zdel_filer&   close)r   r   Zmarker_fileZfnamer   r   r   r     s    	

r   c       
      C   st   d}d}d}d}|j }|r2t|}|r2t|||}t||}|r`|r`tjj| d}	t||||	}|rp|on|on|S |S )NFzper-instance)Zcustom_script_namecheck_custom_script_enablementdo_pre_custom_scriptdo_password_customizationr#   r$   r;   do_post_custom_script)
rW   rX   rY   rZ   Zis_pre_custom_successfulZis_password_custom_successfulZis_post_custom_successfulis_custom_script_enabledcustom_scriptccScriptsDirr   r   r   rM     s(    

rM   c             C   sP   yt ||}|j  W n4 tk
rJ } ztdt|tj|  dS d }~X nX dS )Nz(Error executing pre-customization scriptFT)r   executer   rQ   rR   r   rb   )rX   r   rY   Zprecustr   r   r   r   r     s    
r   c             C   sR   yt |||}|j  W n4 tk
rL } ztdt|tj|  dS d }~X nX dS )Nz)Error executing post-customization scriptFT)r   r   r   rQ   rR   r   rb   )rX   r   rY   r   Zpostcustr   r   r   r   r     s    r   c             C   sN   d}d}| j rtjd d}ttt|}|j dkrFtddtj	|  nd}|S )NFZfalsez=Set default value to true due to customization configuration.truez-Custom script is disabled by VM Administratorz'Error checking custom script enablementT)
Zdefault_run_post_scriptr   r   rE   IMC_TOOLS_CONF_GROUPNAME"IMC_TOOLS_CONF_ENABLE_CUST_SCRIPTSlowerrQ   r   ZGUESTCUST_ERROR_SCRIPT_DISABLED)rX   r   Zdefault_valueZcustom_script_enablementr   r   r   r   $  s$    r   c             C   s|   t jd t }| j}y,| j}|s&|r6|j||| n
t jd W n4 tk
rv } ztdt|t	j
|  dS d }~X nX dS )NzApplying password customizationzChanging password is not neededz%Error applying password configurationFT)r   r   r   Zadmin_passwordZreset_passwordri   r   rQ   rR   r   rb   )rX   rZ   ZpwdConfiguratorZ	admin_pwdZ	reset_pwdr   r   r   r   r   =  s     
r   c             C   s   t t| S )N)r   r	   )Zcfg_filer   r   r   parse_cust_cfgR  s    r   c             C   s4   d\}}| j rd}tjd nd}tjd ||fS )NFTz!raw cloudinit data cust cfg foundzvmware cust cfg found)FF)ra   r   r   )rX   Zis_vmware_cust_cfgZis_raw_data_cust_cfgr   r   r   get_cust_cfg_typeV  s    
r   c              C   s8   d} d}x*| D ]"}t ||}|rtjd	| d
S qW dS )N/usr/lib/vmware-tools/usr/lib64/vmware-tools/usr/lib/open-vm-tools/usr/lib64/open-vm-tools'/usr/lib/x86_64-linux-gnu/open-vm-tools(/usr/lib/aarch64-linux-gnu/open-vm-tools%/usr/lib/i386-linux-gnu/open-vm-toolszlibdeployPkgPlugin.soz$Found the customization plugin at %sTF)r   r   r   r   r   r   r   )search_filer   r   )Zsearch_pathsZcust_pluginr$   Zcust_plugin_pathr   r   r   is_cust_plugin_availablea  s          

r   c             C   sD   |  s| rd S x.t j| D ] \}}}||krt jj||S qW d S )N)r#   walkr$   r;   )r}   r|   rootZ_dirsfilesr   r   r   r   v  s    r   c             C   s*   t jtd| | ttj| t||  dS )zS
    Set customization status to the underlying VMware Virtualization Platform
    z%s: %sN)r   Zlogexcr   r!   r   r.   rF   )prefixr<   ZeventrX   r   r   r   rQ     s    rQ   )N)TFN)NNN)rz   r+   r   )CZloggingr#   r=   r/   Z	cloudinitr   r   r   r6   r   Zconfig_custom_scriptr   r   Zconfig_filer	   Z
config_nicr
   Zconfig_passwdr   Zguestcust_errorr   Zguestcust_eventr   Zguestcust_stater   Z	getLogger__name__r   r   r1   r2   rG   r   r   r   r!   r*   r5   rE   rF   rH   r_   re   rK   rO   rh   rS   rp   rr   ry   rw   rv   rL   r   rN   r   r   rM   r   r   r   r   r   r   r   r   rQ   r   r   r   r   <module>	   sh   

*2(B



