o
    w7eq7                     @   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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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m0Z0 e.j1d(d)Z2e2j3d*d+d,ed- e2j3d.d/d0d1dd2 e24 Z5e(e5j6e5j7d3Z8d4e8v rz
e8d4 9 e8d4< W n e:y   e/j;<d5 e8d4= e0e8d4 9 e8d6< Y nw e=ej>e8d7dd8d9 dS dS )<    N)	b64decode)dmi)log)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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   r5   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
datasourcer:   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   K   s   zDataSourceGCE.__init__c                 C   s  |   }| jrt }t|v r|t |dt td| t	|dks*J d|D ]g}t
| j|d}zE|9 ztjtjdt| j|dd}W n  tyi } ztd	|| W Y d }~W d    W q,d }~ww W d    n1 stw   Y  W n	 ty   Y q,w |d
 r|| _td|  nq,| jd u rtd| j ntjtjdt| j|dd}|d
 s|d rt|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)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reasonF	meta-data	user-dataT)get_url_paramsperform_dhcp_setupr   find_candidate_nicsDEFAULT_PRIMARY_INTERFACEremoveinsertr(   r)   lenr   rG   r   log_timeread_mdr   	Exceptionr   _fallback_interfacewarning
cloud_namerA   userdata_raw)r   rO   candidate_nicscandidate_nicnetwork_contextreter   r   r   	_get_dataZ   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 )Nr   rA   rj   r   r   r   get_instance_id   s   
zDataSourceGCE.get_instance_idc                 C   s   | j d }t|| jS )Npublic-keys-data)rA   _parse_public_keysr=   )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 )Nr   .r   F)r   rA   split)r   fqdn
resolve_ipmetadata_onlyr   r   r   get_hostname   s   zDataSourceGCE.get_hostnamec                 C   rl   )Nr   rm   rj   r   r   r   availability_zone   s   
zDataSourceGCE.availability_zonec                 C   s   | j ddd S )N-rL   r   )r|   rsplitrj   r   r   r   region   s   zDataSourceGCE.regionN)FFF)r6   r7   r8   dsnamerW   r
   NETWORKr   BOOT_NEW_INSTANCEBOOTdefault_update_eventsr   ri   propertyrk   rn   rr   ru   r{   r|   r   r   r   r   r   r9   @   s(    B


r9   c                   @   s   e Zd ZdZdS )DataSourceGCELocalTN)r6   r7   r8   rW   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   r2   r   r   r   rs      s   
rs   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 |kS )N      Fz
google-sshexpireOnz%Y-%m-%dT%H:%M:%S+0000)rw   
ValueErrorAttributeErrorjsonloadsdatetimestrptimeutcnow)
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>:rL   r   	cloudinit)allrw   r\   r   append)rq   r=   public_keysr   split_public_keyuserrt   r   r   r   rp      s   
rp   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 pd}|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rt|}n|rtd| ||d< ||d< d|d < |S )!NF)rT   rU   rQ   rS   rR   zNot running on GCE.rS   z%s is not resolvablezaddress "%s" is not resolvable))r   )zinstance/idTTF)r   )zinstance/zoneTTF)r   )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   rt   r   r   r   
<listcomp><  s    zread_md.<locals>.<listcomp>ro   r   /rU   r$   zuser-data-encodingbase64z(unknown user-data-encoding: %s, ignoringrT   TrQ   )	MD_V1_URLrR   r   is_resolvable_urlr(   r)   r   r   r   r5   r   r   getlowerr   join
splitlinesrw   r   r   ra   )rN   rO   platform_checkrg   url_mapmetadata_fetchermdmkeyrH   requiredr/   r0   r1   r.   	new_valuer4   instance_dataproject_data
valid_keysblock_projectrq   udencodingr   r   r   r^     sl   





r^   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   rR   R  s   
rR   c                 C   s   t | tS r   )r   list_from_dependsdatasources)dependsr   r   r   get_datasource_listj  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   )rN   r   rU   z/User-data cannot be decoded. Writing as base64
zuser-data-b64rL   ),z: )indent	sort_keys
separatorsr   )NNT)?r   r   r   r   r   r   r   loggingr   r   r   r   cloudinit.distrosr	   cloudinit.eventr
   r   cloudinit.net.dhcpr   cloudinit.net.ephemeralr   cloudinit.sourcesr   	getLoggerr6   r(   r   rD   REQUIRED_FIELDSr   r   r&   rY   r   r<   r9   r   rs   r   rp   r^   rR   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   
 {
"
M


