509318396
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!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�rúy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–|rˆt
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¤|}q¤W |	� rê|d k� rêd}|| |d< |S |||< qŒW 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�rðt|ƒ}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


