o
    x[hú5  ã                   @   s  d dl Z d dlZd dlZd dlmZ d dlmZmZ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 e e¡Zd	Zd
eiZdZdZddiZdZG dd„ dƒZG dd„ dej ƒZ!G dd„ de!ƒZ"dd„ Z#dd„ Z$d7dd„Z%d8dd„Z&dd „ Z'e"ej(ffe!ej(ej)ffgZ*d!d"„ Z+ed#k�rd dl,Z,d dl-Z-d d$lm.Z. e,j/d%d&�Z0e0j1d'd(d)ed*� e0j1d+d,d-d.dd/� e0 2¡ Z3e&e3j4e3j5d0�Z6d1e6v røz
e6d1  7¡ e6d1< W n e8y÷   e-j9 :d2¡ e6d1= e.e6d1 ƒ 7¡ e6d3< Y nw e;ej<e6d4dd5d6�ƒ dS dS )9é    N)Ú	b64decode)ÚdmiÚnetÚsourcesÚ
url_helperÚutil)Úug_util)Ú
EventScopeÚ	EventType)ÚNoDHCPLeaseError)ÚEphemeralDHCPv4)ÚDataSourceHostnamez3http://metadata.google.internal/computeMetadata/v1/Úmetadata_urlzLhttp://metadata.google.internal/computeMetadata/v1/instance/guest-attributesÚhostkeyszMetadata-FlavorÚGoogleÚens4c                   @   s   e Zd Zdd„ Zddd„ZdS )ÚGoogleMetadataFetcherc                 C   s   || _ || _|| _d S ©N)Úmetadata_addressÚnum_retriesÚsec_between_retries)Úselfr   r   r   © r   úA/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceGCE.pyÚ__init__   s   
zGoogleMetadataFetcher.__init__Fc           	   
   C   s²   d }z| j | }|r|d7 }tj|t| j| jd�}W n tjy7 } zd}t |||¡ W Y d }~|S d }~ww |j	dkrO|rGt
 |j¡}|S |j d¡}|S t d||j	¡ |S )Nz/?recursive=True)ÚurlÚheadersÚretriesÚsec_betweenzurl %s raised exception %séÈ   úutf-8zurl %s returned code %s)r   r   ÚreadurlÚHEADERSr   r   ÚUrlErrorÚLOGÚdebugÚcoder   Údecode_binaryÚcontentsÚdecode)	r   ÚpathÚis_textÚis_recursiveÚvaluer   ÚrespÚexcÚmsgr   r   r   Ú	get_value$   s2   

ü	€õ
ýÿzGoogleMetadataFetcher.get_valueN)F)Ú__name__Ú
__module__Ú__qualname__r   r1   r   r   r   r   r      s    r   c                   @   s|   e Zd ZdZdZejejej	hiZ
dd„ Zdd„ Zedd„ ƒZd	d
„ Zdd„ Zdd„ Zddd„Zedd„ ƒZedd„ ƒZdS )ÚDataSourceGCEÚGCEFc                 C   sr   t j | |||¡ d | _|rt ||¡\}}t |¡\| _}tƒ | _t	 
t	 |ddgi ¡tg¡| _| jd | _d S )NÚ
datasourcer6   r   )r   Ú
DataSourcer   Údefault_userr   Únormalize_users_groupsÚextract_defaultÚdictÚmetadatar   ÚmergemanydictÚget_cfg_by_pathÚBUILTIN_DS_CONFIGÚds_cfgr   )r   Úsys_cfgÚdistroÚpathsÚusersÚ_groupsÚ_user_configr   r   r   r   I   s   þÿzDataSourceGCE.__init__c                 C   s®  |   ¡ }i }| jr¤t ¡ }t|v r| t¡ | dt¡ t d|¡ t	|ƒdks,J dƒ‚|D ]g}t
| j|d�}z>|�2 z	t| j|d�}W n  tyd } zt d||¡ W Y d }~W d   ƒ W q.d }~ww W d   ƒ n1 sow   Y  W n ty„   t d|¡ Y q.w |d	 r•|| j_t d
|¡  nq.| jjd u r£t d| j¡ nt| j|d�}| d	¡sÉ| d¡r¿t | d¡¡ dS t | d¡¡ dS | d¡| _| d¡| _dS )Nr   z"Looking for the primary NIC in: %sé   z3The instance has to have at least one candidate NIC)Úiface)ÚaddressÚ
url_paramsz,Error fetching IMD with candidate NIC %s: %sz$Unable to obtain a DHCP lease for %sÚsuccesszPrimary NIC found: %s.z(Did not find a fallback interface on %s.Úplatform_reports_gceÚreasonFú	meta-dataú	user-dataT)Úget_url_paramsÚperform_dhcp_setupr   Úfind_candidate_nicsÚDEFAULT_PRIMARY_INTERFACEÚremoveÚinsertr$   r%   Úlenr   rC   Úread_mdr   Ú	Exceptionr   Úfallback_interfaceÚwarningÚ
cloud_nameÚgetr=   Úuserdata_raw)r   rK   ÚretÚcandidate_nicsÚcandidate_nicÚnetwork_contextÚer   r   r   Ú	_get_dataX   s|   
ÿþ
þý
ô€üþ€ÿüýÿ€

ÿzDataSourceGCE._get_datac                 C   s   d S r   r   ©r   r   r   r   Úlaunch_index‘   s   zDataSourceGCE.launch_indexc                 C   ó
   | j d S )Núinstance-id©r=   re   r   r   r   Úget_instance_id–   s   
zDataSourceGCE.get_instance_idc                 C   s   | j d }t|| jƒS )Núpublic-keys-data)r=   Ú_parse_public_keysr9   )r   Úpublic_keys_datar   r   r   Úget_public_ssh_keys™   s   
z!DataSourceGCE.get_public_ssh_keysc                 C   s   |D ]}t |Ž  qd S r   )Ú#_write_host_key_to_guest_attributes)r   r   Úkeyr   r   r   Úpublish_host_keys�   s   
ÿzDataSourceGCE.publish_host_keysc                 C   s   t | jd  d¡d dƒS )Núlocal-hostnameÚ.r   F)r   r=   Úsplit)r   ÚfqdnÚ
resolve_ipÚmetadata_onlyr   r   r   Úget_hostname¡   s   ÿzDataSourceGCE.get_hostnamec                 C   rg   )Núavailability-zoneri   re   r   r   r   Úavailability_zone§   s   
zDataSourceGCE.availability_zonec                 C   s   | j  dd¡d S )Nú-rH   r   )rz   Úrsplitre   r   r   r   Úregion«   s   zDataSourceGCE.regionN)FFF)r2   r3   r4   ÚdsnamerR   r	   ÚNETWORKr
   ÚBOOT_NEW_INSTANCEÚBOOTÚdefault_update_eventsr   rd   Úpropertyrf   rj   rn   rq   rx   rz   r}   r   r   r   r   r5   >   s(    þÿ9


r5   c                   @   s   e Zd ZdZdS )ÚDataSourceGCELocalTN)r2   r3   r4   rR   r   r   r   r   r„   °   s    r„   c                 C   sT   dt t| f }| d¡}tj||tddd�}| ¡ r"t d| ¡ d S t d| ¡ d S )Nz%s/%s/%sr    ÚPUTF)r   Údatar   Úrequest_methodÚcheck_statusz&Wrote %s host key to guest attributes.z0Unable to write %s host key to guest attributes.)	ÚGUEST_ATTRIBUTES_URLÚHOSTKEY_NAMESPACEÚencoder   r!   r"   Úokr$   r%   )Úkey_typeÚ	key_valuer   r.   r   r   r   ro   ´   s   
ûro   c              	   C   sº   z|   d d¡dd … \}}W n ttfy   Y dS w |dkr!dS zt |¡}W n
 ty2   Y dS w d|vr9dS |d }d}z	tj ||¡}W n
 tyR   Y dS w tj tjj	¡|kS )Né   é   Fz
google-sshÚexpireOnz%Y-%m-%dT%H:%M:%S%z)
rt   Ú
ValueErrorÚAttributeErrorÚjsonÚloadsÚdatetimeÚstrptimeÚnowÚtimezoneÚutc)Ú
public_keyÚschemaÚjson_strÚjson_objÚ
expire_strÚ
format_strÚexpire_timer   r   r   Ú_has_expiredÄ   s,   ÿÿÿr¢   c                 C   sr   g }| s|S | D ].}|rt dd„ |D ƒƒsq| dd¡}t|ƒdkr#q|\}}|d|fv r6t|ƒs6| |¡ q|S )Nc                 s   s   � | ]	}t |ƒd k V  qdS )é€   N)Úord)Ú.0Úcr   r   r   Ú	<genexpr>ï   s   € z%_parse_public_keys.<locals>.<genexpr>ú:rH   r�   Ú	cloudinit)Úallrt   rW   r¢   Úappend)rm   r9   Úpublic_keysr›   Úsplit_public_keyÚuserrp   r   r   r   rl   æ   s   
€rl   Tc                 C   sü  | d u rt } d d dd dœ}tƒ |d< |r|d sd|d< |S t | ¡s1t d| ¡ d|  |d< |S g d¢}t| |j|jƒ}i }|D ]1\}}}	}
}d }|D ]}| 	||
|¡}|d ur[|}qL|	rn|d u rnd	}|| |d< |  S |||< qAt
 |d
 pzd¡}t
 |d pƒd¡}| d¡| d¡g}| dd¡ ¡ }|dkr°| d¡s°| | d¡¡ | | d¡¡ d dd„ |D ƒ¡}| ¡ |d< |d rÏ|d  d¡d |d< d|v rô|d  d¡}| d¡}|dkrèt|ƒ}n|rðt d|¡ ||d< ||d< d|d < |S )!NF)rO   rP   rL   rN   rM   zNot running on GCE.rN   z%s is not resolvablezaddress "%s" is not resolvable))rh   )zinstance/idTTF)ry   )zinstance/zoneTTF)rr   )zinstance/hostnameTTF)úinstance-data)zinstance/attributesFFT)úproject-data)zproject/attributesFFTz)required key %s returned nothing. not GCEr¯   z{}r°   ÚsshKeyszssh-keyszblock-project-ssh-keysÚ ÚtrueÚ
c                 S   s   g | ]}|r|‘qS r   r   )r¥   rp   r   r   r   Ú
<listcomp>1  s    zread_md.<locals>.<listcomp>rk   ry   ú/éÿÿÿÿrP   r    zuser-data-encodingÚbase64z(unknown user-data-encoding: %s, ignoringrO   TrL   )Ú	MD_V1_URLrM   r   Úis_resolvable_urlr$   r%   r   r   r   r1   r”   r•   r]   Úlowerr«   ÚjoinÚ
splitlinesrt   r‹   r   r[   )rJ   rK   Úplatform_checkr_   Úurl_mapÚmetadata_fetcherÚmdÚmkeyrD   Úrequiredr+   r,   r-   r*   Ú	new_valuer0   Úinstance_dataÚproject_dataÚ
valid_keysÚblock_projectrm   ÚudÚencodingr   r   r   rX   ú   sl   ü


ÿ€


rX   c                  C   sP   t  d¡pd} | dks| dkrdS t  d¡pd}| d¡rdS t d| |¡ d	S )
Nzsystem-product-namezN/AzGoogle Compute Enginer   Tzsystem-serial-numberzGoogleCloud-z6Not running on google cloud. product-name=%s serial=%sF)r   Úread_dmi_dataÚ
startswithr$   r%   )ÚpnameÚserialr   r   r   rM   G  s   
ÿrM   c                 C   s   t  | t¡S r   )r   Úlist_from_dependsÚdatasources)Údependsr   r   r   Úget_datasource_list_  s   rÒ   Ú__main__)Ú	b64encodezQuery GCE Metadata Service)Údescriptionz
--endpointÚURLz The url of the metadata service.)ÚmetavarÚhelpÚdefaultz--no-platform-checkr¾   zIgnore smbios platform checkÚstore_false)ÚdestrØ   ÚactionrÙ   )rJ   r¾   rP   z/User-data cannot be decoded. Writing as base64
zuser-data-b64rH   )ú,z: )ÚindentÚ	sort_keysÚ
separatorsr   )NNT)=r–   r”   Úloggingr¸   r   r©   r   r   r   r   r   Úcloudinit.distrosr   Úcloudinit.eventr	   r
   Úcloudinit.net.dhcpr   Úcloudinit.net.ephemeralr   Úcloudinit.sourcesr   Ú	getLoggerr2   r$   r¹   r@   r‰   rŠ   r"   rT   r   r8   r5   r„   ro   r¢   rl   rX   rM   ÚDEP_FILESYSTEMÚDEP_NETWORKrÐ   rÒ   ÚargparseÚsysrÔ   ÚArgumentParserÚparserÚadd_argumentÚ
parse_argsÚargsÚendpointr¾   r†   r)   ÚUnicodeDecodeErrorÚstderrÚwriteÚprintÚdumpsr   r   r   r   Ú<module>   s|   
ÿ r
"
M
þ
üûÿúÝ