
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
\meF7                 @   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jeZd	Zd
eiZd;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%d<ddZ&d=d 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-j0d(d)Z1e1j2d*d+d,ed- e1j2d.d/d0d1dd2 e1j3 Z4e'e4j5e4j6d3Z7d4e7krye7d4 j8 e7d4< W n< e9k
r   e.j:j;d5 e7d4= e/e7d4 j8 e7d6< Y nX e<ej=e7d7dd>d: dS )?    N)	b64decode)dminetsources
url_helperutil)ug_util)
EventScope	EventType)NoDHCPLeaseError)EphemeralDHCPv4)DataSourceHostnamez3http://metadata.google.internal/computeMetadata/v1/metadata_urlinstance-idavailability-zonelocal-hostnamezLhttp://metadata.google.internal/computeMetadata/v1/instance/guest-attributeshostkeyszMetadata-FlavorGoogleZ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   #/usr/lib/python3.6/DataSourceGCE.py__init__    s    zGoogleMetadataFetcher.__init__Fc       	      C   s   d }y0| j | }|r|d7 }tj|t| j| jd}W n6 tjk
rj } zd}tj||| W Y d d }~X n<X |j	dkr|rt
j|j}q|jjd}ntjd||j	 |S )Nz/?recursive=True)urlheadersZretriesZsec_betweenzurl %s raised exception %s   zutf-8zurl %s returned code %s)r   r   readurlHEADERSr   r   ZUrlErrorLOGdebugcoder   Zdecode_binarycontentsdecode)	r   pathis_textis_recursivevaluer   respexcmsgr   r   r   	get_value%   s&    
 
zGoogleMetadataFetcher.get_valueN)F)__name__
__module____qualname__r   r-   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j| ||| d | _|r<tj||\}}tj|\| _}t | _t	j
t	j|ddgi tg| _| jd | _d S )NZ
datasourcer2   r   )r   
DataSourcer   default_userr   Znormalize_users_groupsZextract_defaultdictmetadatar   ZmergemanydictZget_cfg_by_pathBUILTIN_DS_CONFIGZds_cfgr   )r   Zsys_cfgdistropathsZusersZ_groupsZ_user_configr   r   r   r   J   s    
zDataSourceGCE.__init__c             C   s  | j  }| jr*tj }t|kr6|jt |jdt tjd| t	|dksVt
dx|D ]}t| j|d}yh|Z y tjtjdt| j|dd}W n2 tk
r } ztjd	|| w\W Y d d }~X nX W d Q R X W n tk
r   w\Y nX |d
 r\|| _tjd| P q\W | jd krFtjd| j ntjtjdt| j|dd}|d
 s||d rjtj|d  ntj|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)ZifacezCrawl of GCE metadata service)address
url_params)kwargsz,Error fetching IMD with candidate NIC %s: %ssuccesszPrimary NIC found: %s.z(Did not find a fallback interface on %s.platform_reports_gcereasonFz	meta-dataz	user-dataT)Zget_url_paramsperform_dhcp_setupr   Zfind_candidate_nicsDEFAULT_PRIMARY_INTERFACEremoveinsertr!   r"   lenAssertionErrorr   r8   r   Zlog_timeread_mdr   	Exceptionr   Z_fallback_interfacewarningZ
cloud_namer6   Zuserdata_raw)r   r<   Zcandidate_nicsZcandidate_nicZnetwork_contextreter   r   r   	_get_dataY   sf    

"



zDataSourceGCE._get_datac             C   s   d S )Nr   )r   r   r   r   launch_index   s    zDataSourceGCE.launch_indexc             C   s
   | j d S )Nzinstance-id)r6   )r   r   r   r   get_instance_id   s    zDataSourceGCE.get_instance_idc             C   s   | j d }t|| jS )Nzpublic-keys-data)r6   _parse_public_keysr4   )r   public_keys_datar   r   r   get_public_ssh_keys   s    
z!DataSourceGCE.get_public_ssh_keysc             C   s   x|D ]}t |  qW d S )N)#_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 jdd dS )Nzlocal-hostname.r   F)r   r6   split)r   ZfqdnZ
resolve_ipZmetadata_onlyr   r   r   get_hostname   s    zDataSourceGCE.get_hostnamec             C   s
   | j d S )Nzavailability-zone)r6   )r   r   r   r   availability_zone   s    zDataSourceGCE.availability_zonec             C   s   | j jddd S )N-r:   r   )rX   rsplit)r   r   r   r   region   s    zDataSourceGCE.regionN)FFF)r.   r/   r0   ZdsnamerA   r	   ZNETWORKr
   ZBOOT_NEW_INSTANCEZBOOTZdefault_update_eventsr   rL   propertyrM   rN   rQ   rT   rW   rX   r[   r   r   r   r   r1   ?   s   
B
r1   c               @   s   e Zd ZdZdS )DataSourceGCELocalTN)r.   r/   r0   rA   r   r   r   r   r]      s   r]   c             C   sR   dt t| f }|jd}tj||tddd}|j rBtjd|  ntjd|  d S )Nz%s/%s/%szutf-8ZPUTF)r   datar   Zrequest_methodZ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"   )Zkey_type	key_valuer   r*   r   r   r   rR      s    
rR   c             C   s   y| j d ddd  \}}W n ttfk
r4   dS X |dkrBdS ytj|}W n tk
rd   dS X d|krrdS |d }d}ytjj||}W n tk
r   dS X tjj |kS )N      Fz
google-sshZexpireOnz%Y-%m-%dT%H:%M:%S+0000)rV   
ValueErrorAttributeErrorjsonloadsdatetimeZstrptimeZutcnow)
public_keyZschemaZjson_strZjson_objZ
expire_strZ
format_strZexpire_timer   r   r   _has_expired   s&    rl   c             C   s|   g }| s|S xj| D ]b}| st dd |D  r2q|jdd}t|dkrLq|\}}|d|fkrt| r|j| qW |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>:r:   re   	cloudinit)allrV   rE   rl   append)rP   r4   Zpublic_keysrk   Zsplit_public_keyuserrS   r   r   r   rO      s    
rO   Tc          	   C   s  | d krt } d d dd d}t |d< |r>|d  r>d|d< |S tj| sdtjd|  d|  |d< |S d(d*d,d.d0g}t| |j|j}i }xn|D ]f\}}}	}
}d }x&|D ]}|j	||
|}|d k	r|}qW |	 r|d k rd}|| |d< |S |||< qW t
j|d pd}t
j|d pd}|jd|jdg}|jddj }|dkrz|jd rz|j|jd |j|jd djdd |D }|j |d< |d r|d jdd1 |d< d |kr
|d  jd!}|jd"}|d#krt|}n|rtjd$| ||d < ||d%< d
|d&< |S )2NF)z	meta-dataz	user-datar>   r@   r?   zNot running on GCE.r@   z%s is not resolvablezaddress "%s" is not resolvableinstance-idinstance/idTavailability-zoneinstance/zonelocal-hostnameinstance/hostnameinstance-datainstance/attributesproject-dataproject/attributesz)required key %s returned nothing. not GCEz{}ZsshKeyszssh-keyszblock-project-ssh-keys true
c             S   s   g | ]}|r|qS r   r   )ro   rS   r   r   r   
<listcomp>;  s    zread_md.<locals>.<listcomp>zpublic-keys-data/r:   z	user-datazutf-8zuser-data-encodingbase64z(unknown user-data-encoding: %s, ignoringz	meta-datar>   rx   )rw   r   TTFrz   )ry   r   TTFr|   )r{   r   TTFr~   )r}   r   FFTr   )r   r   FFT)	MD_V1_URLr?   r   Zis_resolvable_urlr!   r"   r   r   r   r-   rh   ri   getlowerru   join
splitlinesrV   ra   r   rI   )r;   r<   platform_checkrJ   Zurl_mapZmetadata_fetcherZmdZmkeyr9   Zrequiredr'   r(   r)   r&   Z	new_valuer,   Zinstance_dataZproject_dataZ
valid_keysZblock_projectrP   Zudencodingr   r   r   rG     sn    







rG   c              C   sP   t jdpd} | dks| dkr"dS t jdp.d}|jdr>dS tj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   Zread_dmi_data
startswithr!   r"   )Zpnameserialr   r   r   r?   Q  s    

r?   c             C   s   t j| tS )N)r   Zlist_from_dependsdatasources)Zdependsr   r   r   get_datasource_listi  s    r   __main__)	b64encodezQuery GCE Metadata Service)descriptionz
--endpointZURLz The url of the metadata service.)metavarhelpdefaultz--no-platform-checkr   zIgnore smbios platform checkZstore_false)destr   actionr   )r;   r   z	user-dataz/User-data cannot be decoded. Writing as base64
zuser-data-b64r:   ,: )indentZ	sort_keysZ
separators)r   r   r   )N)NNT)r   r   )>rj   rh   Zloggingr   r   rs   r   r   r   r   r   Zcloudinit.distrosr   Zcloudinit.eventr	   r
   Zcloudinit.net.dhcpr   Zcloudinit.net.ephemeralr   Zcloudinit.sourcesr   Z	getLoggerr.   r!   r   r7   ZREQUIRED_FIELDSr_   r`   r    rB   r   r3   r1   r]   rR   rl   rO   rG   r?   ZDEP_FILESYSTEMZDEP_NETWORKr   r   argparsesysr   ArgumentParserparseradd_argument
parse_argsargsZendpointr   r^   r%   UnicodeDecodeErrorstderrwriteprintdumpsr   r   r   r   <module>   sn   
 {"

M


