
"T`@+                 @   s  d  d l  Z  d  d l 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 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 Gd d   d e  Z Gd d   d e
 j  Z d d   Z d d   Z d d d  Z d d d d  Z d d    Z 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&  Z' e' j( d' d( d) d* d+ d, e e' j( d- d. d/ d* d0 d1 d2 d, d e' j)   Z* e d3 e* j+ d/ e* j,  Z- d4 e- k r}y e- d4 j.   e- d4 <WnC e/ k
 r|e$ j0 j1 d5  e- d4 =e% e- d4  j.   e- d6 <Yn Xe2 e j3 e- d7 d8 d9 d d: d>  d S)?    N)	b64decode)dmi)ug_util)log)sources)
url_helper)utilz3http://metadata.google.internal/computeMetadata/v1/metadata_urlinstance-idavailability-zonelocal-hostnamezLhttp://metadata.google.internal/computeMetadata/v1/instance/guest-attributeshostkeyszMetadata-FlavorZGooglec               @   s+   e  Z d  Z d d   Z d d d  Z d S)GoogleMetadataFetcherc             C   s   | |  _  d  S)N)metadata_address)selfr    r   A/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceGCE.py__init__   s    zGoogleMetadataFetcher.__init__Fc       	      C   s   d  } y9 |  j  | } | r& | d 7} t j d | d t  } WnA t j k
 r } z d } t j | | |  WYd  d  } ~ XnV X| j d k r | r t j	 | j
  } q | j
 j d  } n t j d | | j  | S)Nz/?recursive=Trueurlheaderszurl %s raised exception %s   zutf-8zurl %s returned code %s)r   r   readurlHEADERSZ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)__name__
__module____qualname__r   r%   r   r   r   r   r      s   r   c               @   s   e  Z d  Z d Z d d   Z d d   Z e d d    Z d d	   Z d
 d   Z	 d d   Z
 d d d d d  Z e d d    Z e d d    Z d S)DataSourceGCEGCEc             C   s   t  j j |  | | |  d  |  _ | rX t j | |  \ } } t j |  \ |  _ } t   |  _ t	 j
 t	 j | d d g i   t g  |  _ |  j d |  _ d  S)NZ
datasourcer*   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_cfgZdistropathsZusersZ_groupsZ_user_configr   r   r   r   :   s    	zDataSourceGCE.__init__c             C   s   t  j t j d t d d |  j i } | d sd | d rO t j | d  n t j | d  d S| d |  _ | d	 |  _ d
 S)NzCrawl of GCE metadata servicekwargsaddresssuccessplatform_reports_gcereasonFz	meta-dataz	user-dataT)	r   Zlog_timer   r   read_mdr   warningr.   Zuserdata_raw)r   retr   r   r   	_get_dataF   s    	

zDataSourceGCE._get_datac             C   s   d  S)Nr   )r   r   r   r   launch_indexU   s    zDataSourceGCE.launch_indexc             C   s   |  j  d S)Nzinstance-id)r.   )r   r   r   r   get_instance_idZ   s    zDataSourceGCE.get_instance_idc             C   s   |  j  d } t | |  j  S)Nzpublic-keys-data)r.   _parse_public_keysr,   )r   public_keys_datar   r   r   get_public_ssh_keys]   s    z!DataSourceGCE.get_public_ssh_keysc             C   s   x | D] } t  |   q Wd  S)N)#_write_host_key_to_guest_attributes)r   r   keyr   r   r   publish_host_keysa   s    zDataSourceGCE.publish_host_keysFc             C   s   |  j  d j d  d S)Nzlocal-hostname.r   )r.   split)r   ZfqdnZ
resolve_ipZmetadata_onlyr   r   r   get_hostnamee   s    zDataSourceGCE.get_hostnamec             C   s   |  j  d S)Nzavailability-zone)r.   )r   r   r   r   availability_zonei   s    zDataSourceGCE.availability_zonec             C   s   |  j  j d d  d S)N-   r   )rE   rsplit)r   r   r   r   regionm   s    zDataSourceGCE.regionN)r&   r'   r(   Zdsnamer   r9   propertyr:   r;   r>   rA   rD   rE   rI   r   r   r   r   r)   6   s   r)   c             C   s   d t  t |  f } | j d  } t j d | d | d t d d d d	  } | j   rk t j d
 |   n t j d |   d  S)Nz%s/%s/%szutf-8r   datar   Zrequest_methodZPUTZcheck_statusFz&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   r?   r   s    r?   c             C   s   y& |  j  d  d  d d   \ } } Wn t t f k
 rD d SYn X| d k rU d Sy t j |  } Wn t k
 r d SYn Xd | k r d S| d } d } y t j j | |  } Wn t k
 r d SYn Xt j j   | k S)N      Fz
google-sshZexpireOnz%Y-%m-%dT%H:%M:%S+0000)rC   
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&    &		
	rY   c             C   s   g  } |  s | Sx |  D] } | s t  d d   | D  rA q | j d d  } t |  d k rh q | \ } } | 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>:rG   rR   	cloudinit)allrC   lenrY   append)r=   r,   Zpublic_keysrX   Zsplit_public_keyuserr@   r   r   r   r<      s    !r<   Tc          	   C   s  |  d  k r t  }  d d  d d  d d d d  i } t   | d <| r\ | d r\ d | d <| St j |   s t j d |   d	 |  | d <| Sd' d) d+ d- d/ g } t |   } i  } x | D] \ } } } }	 }
 d  } x5 | D]- } | j | |	 |
  } | d  k	 r | } q W| r8| d  k r8d } | | | d <| S| | | <q Wt j	 | d pYd  } t j	 | d prd  } | j
 d  | j
 d  g } | j
 d d  j   } | d k r| j
 d  r| j | j
 d   | j | j
 d   d j d d   | D  } | j   | d <| d rG| d j d   d0 | d <d | k r| d j d"  } | j
 d#  } | d$ k rt |  } n | rt j d% |  | | d <| | d <d | d <| S)1Nz	meta-dataz	user-datar3   Fr5   r4   zNot running on GCE.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 Sr   r   )r\   r@   r   r   r   
<listcomp>   s   	 zread_md.<locals>.<listcomp>zpublic-keys-data/rG   zutf-8zuser-data-encodingbase64z(unknown user-data-encoding: %s, ignoringrf   )re   ru   TTFrh   )rg   rv   TTFrj   )ri   rw   TTFrl   )rk   rx   FFTrn   )rm   ry   FFT)	MD_V1_URLr4   r   Zis_resolvable_urlr   r   r   r%   rU   rV   getlowerrc   join
splitlinesrC   rN   r   r7   )r2   platform_checkr8   Zurl_mapZmetadata_fetcherZmdZmkeyr0   Zrequiredr   r    r!   r   Z	new_valuer$   Zinstance_dataZproject_dataZ
valid_keysZblock_projectr=   Zudencodingr   r   r   r6      sh    
	




r6   c              C   sd   t  j d  p d }  |  d k r% d St  j d  p7 d } | j d  rM d St j d |  |  d S)	Nzsystem-product-namezN/AzGoogle Compute EngineTz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   r4      s    	
r4   c             C   s   t  j |  t  S)N)r   Zlist_from_dependsdatasources)Zdependsr   r   r   get_datasource_list  s    r   __main__)	b64encodeZdescriptionzQuery GCE Metadata Servicez
--endpointmetavarZURLhelpz The url of the metadata service.defaultz--no-platform-checkdestr   zIgnore smbios platform checkactionZstore_falser2   z	user-dataz/User-data cannot be decoded. Writing as base64
zuser-data-b64indentrG   Z	sort_keysZ
separators,: )r
   r   r   )r   r   )4rW   rU   rt   r   r`   r   Zcloudinit.distrosr   r   Zloggingr   r   r   Z	getLoggerr&   r   r{   r/   ZREQUIRED_FIELDSrL   rM   r   objectr   r+   r)   r?   rY   r<   r6   r4   ZDEP_FILESYSTEMZDEP_NETWORKr   r   argparsesysr   ArgumentParserparseradd_argument
parse_argsargsZendpointr   rK   r   UnicodeDecodeErrorstderrwriteprintdumpsr   r   r   r   <module>   sZ   <"H