a '¡Dg|9ã@s†dZddlZddlZddlZddlmZddlmZmZmZddl Z ddl m Z m Z m Z ddlmZddlmZddlmZe e¡Zd Zd Zd Zd Zed œdd„Zeed œdd„Zed œdd„Zed œdd„Zeeedœdd„Z eed œdd„Z!Gdd„dƒZ"eeee#dœdd„Z$eeee"ee"fdœd d!„Z%ee"ee"eed"œd#d$„Z&Gd%d&„d&e j'ƒZ(e(e j)ffgZ*d'd(„Z+dS))z?Datasource to support the Windows Subsystem for Linux platform.éN)ÚPurePath)ÚListÚOptionalÚTuple)ÚsourcesÚsubpÚutil)ÚDistro)Útype_from_starts_with)ÚPathsz/usr/bin/wslpathziid-datasource-wslú %s.user-dataz agent.yaml©ÚreturncCs"t tddg¡\}}t| ¡ƒjS)zL Returns the name of the current WSL instance as seen from outside. z-amú/)rÚ WSLPATH_CMDrÚrstripÚname)Z root_net_pathÚ_©rúC/usr/lib/python3.9/site-packages/cloudinit/sources/DataSourceWSL.pyÚ instance_names rcCsHd}d}g}t ¡ ¡D]*}|d|kr||dvr| |d¡q|S)z” Return a list of mount points of the Windows drives inside the current WSL instance, if drives are mounted, or an empty list otherwise Z9pz aname=drvfsZfstypeZoptsZ mountpoint)rÚmountsÚvaluesÚappend)ZFS_TYPEZOPTIONS_CONTAINZmountedÚmntrrrÚmounted_win_drives+srcCsdtƒ}|stdƒ‚d}|D]2}||}t |tj¡s6qt d|¡t|ƒStdd |¡ƒ‚dS)z? Returns the Linux path to the Windows host's cmd.exe. zWindows drives are not mounted.z%s/Windows/System32/cmd.exezFound cmd.exe at <%s>z,Couldn't find cmd.exe in any mount point: %sz, N) rÚIOErrorÚosÚaccessÚX_OKÚLOGÚdebugrÚjoin)rÚ candidaterÚcmdrrrÚcmd_executable;s   ÿr%cCsVtƒ}t d| ¡ddg¡\}}| ¡}|s6t d¡‚t td|g¡\}}t| ¡ƒS)zó Finds the user's home directory path as a WSL path. raises: IOError when no mountpoint with cmd.exe is found ProcessExecutionError when either cmd.exe is unable to retrieve the user's home directory z/initz/Czecho %USERPROFILE%z4No output from cmd.exe to show the user profile dir.z-au)r%rÚas_posixrZProcessExecutionErrorrr)r$ÚhomerÚoutrrrÚ find_homeSsÿ r))Ú user_homercCs2tj |d¡}tj |¡s*t d|¡dSt|ƒS)z¥ Returns the Windows user profile .cloud-init directory translated as a Linux path accessible inside the current WSL instance, or None if not found. z .cloud-initz*cloud-init user data dir %s doesn't exist.N)rÚpathr"Úisdirr r!r)r*Úseed_dirrrrÚcloud_init_data_dirqs   r.cCs6t ¡\}}}|r|n|}d|d||fd|dgS)z Return a list of candidate file names that may contain user-data in some supported format, ordered by precedence. r z%s-%s.user-dataz%s-all.user-datazdefault.user-data)rZget_linux_distro)rZdistribution_idZ version_idZversion_codenameÚversionrrrÚcandidate_user_data_file_namess  ør0c@s,eZdZdZedœdd„Zedœdd„ZdS) Ú ConfigDataz~Models a piece of configuration data as a dict if possible, while retaining its raw representation alongside its file path)r+cCs8t |¡|_||_d|_dt|jƒkr4t |j¡|_dS)Nztext/cloud-config)rÚload_text_fileÚrawr+Ú config_dictr Ú load_yaml)Úselfr+rrrÚ__init__—s  zConfigData.__init__r cCs |jduS©N)r4)r6rrrÚis_cloud_config szConfigData.is_cloud_configN)Ú__name__Ú __module__Ú __qualname__Ú__doc__rr7Úboolr9rrrrr1“s r1)Ú cloudinitdirrrcCs�dti}|dur|Stj | ¡d|¡}zt t |¡¡}Wnty\t   d|¡Yn0|rjd|vrŒd|›d|›�}t   |¡t |ƒ‚|S)z` Returns the relevant metadata loaded from cloudinit dir based on the instance name ú instance-idNz %s.meta-datazMsz5DataSourceWSL.find_user_data_file..z%s directory is emptycSsg|] }| ¡‘qSr)ra)rbÚfrrrÚ Ssÿz5DataSourceWSL.find_user_data_file..z6%s doesn't contain any of the expected user-data filesN)rÚscandirrr0rÚkeysr)r6r-Zexisting_filesZ folded_namesÚfilenamerrrÚfind_user_data_fileAs ÿ þ ÿz!DataSourceWSL.find_user_data_filer c Csv| ¡}|sdSz&ttƒƒ}t|tƒƒ}|| d¡kWSttfyp}zt  dt |ƒ¡WYd}~dSd}~00dS)NFr@z2Unable to check_instance_id from metadata file: %s) Zget_instance_idr.r)rGrrTrrDr ZwarningÚstr)r6r^ÚcurrentZdata_dirrEÚerrrrrÚcheck_instance_id_s  þzDataSourceWSL.check_instance_idc Cslt t¡st dt¡dStƒ|_z tƒ}Wn2ty^}zt d|¡WYd}~dSd}~00t|ƒ}d}d}zt ||jƒ|_ Wn:t tfy¼}zt  dt |ƒ¡WYd}~dSd}~00|jjdkrÖt|ƒ\}}z&|du�rú|du�rút| |¡ƒ}WnLt tf�yH}z.|�rtjntj }|d|t |ƒƒWYd}~n d}~00t||gƒ�s\dSt||ƒ|_dS)Nz5No WSL command %s found. Cannot detect WSL datasourceFz#Unable to detect WSL datasource: %szUnable to load metadata: %sZubuntuz+Unable to load any user-data file in %s: %sT)rÚwhichrr r!rr)rr.rGrErDrCrjr[rrLr1riÚinfoÚanyrYZ userdata_raw)r6r*Úer-rKrMrlÚlogrrrÚ _get_datarsL þ  ÿ   ý zDataSourceWSL._get_data)N) r:r;r<Zdsnamer r r7rrir>rmrsÚ __classcell__rrr_rrZ:s rZcCs t |t¡Sr8)rZlist_from_dependsÚ datasources)ZdependsrrrÚget_datasource_list®srv),r=ZloggingrÚtypingÚpathlibrrrrrUZ cloudinitrrrZcloudinit.distrosr Zcloudinit.handlersr Zcloudinit.helpersr Z getLoggerr:r rrArHrJrjrrr%r)r.r0r1rSrGrLrYZ DataSourcerZZDEP_FILESYSTEMrurvrrrrÚsF      þ "þ ! þ Uo ÿ