o x[h5@sddlZddlZddlZddlmZddlmZmZmZm Z m Z ddl m Z ddl mZmZddlmZddlmZddlmZeeZd Zd eiZd Zd Zd diZdZGdddZGdddej Z!Gddde!Z"ddZ#ddZ$d7ddZ%d8ddZ&dd Z'e"ej(ffe!ej(ej)ffgZ*d!d"Z+ed#krddl,Z,ddl-Z-dd$lm.Z.e,j/d%d&Z0e0j1d'd(d)ed*e0j1d+d,d-d.dd/e02Z3e&e3j4e3j5d0Z6d1e6vrz e6d17e6d1<Wne8ye-j9:d2e6d1=e.e6d17e6d3<Ynwe;ej|2z t |j |d}Wn tyd}ztd||WYd}~WdWq.d}~wwWdn1sowYWntytd|Yq.w|d r||j _td |nq.|j jdurtd |jnt |j |d}|d s|d rt|d dSt|d dS|d|_|d|_dS)Nrz"Looking for the primary NIC in: %sz3The 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 %ssuccesszPrimary NIC found: %s.z(Did not find a fallback interface on %s.platform_reports_gcereasonF meta-data user-dataT)get_url_paramsperform_dhcp_setuprfind_candidate_nicsDEFAULT_PRIMARY_INTERFACEremoveinsertr$r%lenr rCread_mdr Exceptionr fallback_interfacewarning cloud_namegetr= userdata_raw)rrKretcandidate_nics candidate_nicnetwork_contexterrr _get_dataXs|            zDataSourceGCE._get_datacCsdSrrrrrr launch_indexszDataSourceGCE.launch_indexcC |jdS)N instance-idr=rerrrget_instance_ids zDataSourceGCE.get_instance_idcCs|jd}t||jS)Npublic-keys-data)r=_parse_public_keysr9)rpublic_keys_datarrrget_public_ssh_keyss  z!DataSourceGCE.get_public_ssh_keyscCs|D]}t|qdSr)#_write_host_key_to_guest_attributes)rrkeyrrrpublish_host_keyss zDataSourceGCE.publish_host_keyscCst|jddddS)Nlocal-hostname.rF)r r=split)rfqdn resolve_ip metadata_onlyrrr get_hostnameszDataSourceGCE.get_hostnamecCrg)Navailability-zonerirerrravailability_zones zDataSourceGCE.availability_zonecCs|jdddS)N-rHr)rzrsplitrerrrregionszDataSourceGCE.regionN)FFF)r2r3r4dsnamerRr NETWORKr BOOT_NEW_INSTANCEBOOTdefault_update_eventsrrdpropertyrfrjrnrqrxrzr}rrrrr5>s(9   r5c@seZdZdZdS)DataSourceGCELocalTN)r2r3r4rRrrrrrsrcCsTdtt|f}|d}tj||tddd}|r"td|dStd|dS)Nz%s/%s/%sr PUTF)rdatarrequest_method check_statusz&Wrote %s host key to guest attributes.z0Unable to write %s host key to guest attributes.) GUEST_ATTRIBUTES_URLHOSTKEY_NAMESPACEencoderr!r"okr$r%)key_type key_valuerr.rrrros roc Csz|dddd\}}Wn ttfyYdSw|dkr!dSzt|}Wn ty2YdSwd|vr9dS|d}d}z tj||}Wn tyRYdSwtjtjj |kS)NFz google-sshexpireOnz%Y-%m-%dT%H:%M:%S%z) rt ValueErrorAttributeErrorjsonloadsdatetimestrptimenowtimezoneutc) public_keyschemajson_strjson_obj expire_str format_str expire_timerrr _has_expireds,  rcCsrg}|s|S|D].}|rtdd|Dsq|dd}t|dkr#q|\}}|d|fvr6t|s6||q|S)Ncss|] }t|dkVqdS)N)ord).0crrr sz%_parse_public_keys..:rHr cloudinit)allrtrWrappend)rmr9 public_keysrsplit_public_keyuserrprrrrls   rlTcCs|durt}ddddd}t|d<|r|dsd|d<|St|s1td|d||d<|Sgd}t||j|j}i}|D]1\}}} } } d} |D]} | | | | }|dur[|} qL| rn| durnd }|||d<|S| ||<qAt |d pzd }t |d pd }| d | dg}| dd }|dkr| d s|| d|| d ddd|D}||d<|dr|ddd|d<d|vr|dd}| d}|dkrt|}n|rtd|||d<||d<d|d <|S)!NF)rOrPrLrNrMzNot running on GCE.rNz%s is not resolvablezaddress "%s" is not resolvable))rh)z instance/idTTF)ry)z instance/zoneTTF)rr)zinstance/hostnameTTF) instance-data)zinstance/attributesFFT) project-data)zproject/attributesFFTz)required key %s returned nothing. not GCErz{}rsshKeyszssh-keyszblock-project-ssh-keystrue cSsg|]}|r|qSrr)rrprrr 1szread_md..rkry/rPr zuser-data-encodingbase64z(unknown user-data-encoding: %s, ignoringrOTrL) MD_V1_URLrMris_resolvable_urlr$r%rrrr1rrr]lowerrjoin splitlinesrtrrr[)rJrKplatform_checkr_url_mapmetadata_fetchermdmkeyrDrequiredr+r,r-r* new_valuer0 instance_data project_data valid_keys block_projectrmudencodingrrrrXsl             rXcCsPtdpd}|dks|dkrdStdpd}|drdStd||d S) Nzsystem-product-namezN/AzGoogle Compute EnginerTzsystem-serial-numberz GoogleCloud-z6Not running on google cloud. product-name=%s serial=%sF)r read_dmi_data startswithr$r%)pnameserialrrrrMGs rMcCs t|tSr)rlist_from_depends datasources)dependsrrrget_datasource_list_s r__main__) b64encodezQuery GCE Metadata Service) descriptionz --endpointURLz The url of the metadata service.)metavarhelpdefaultz--no-platform-checkrzIgnore smbios platform check store_false)destractionr)rJrrPz/User-data cannot be decoded. Writing as base64 z user-data-b64rH),z: )indent sort_keys separatorsr)NNT)=rrloggingrrrrrrrrcloudinit.distrosrcloudinit.eventr r cloudinit.net.dhcpr cloudinit.net.ephemeralr cloudinit.sourcesr getLoggerr2r$rr@rrr"rTrr8r5rrorrlrXrMDEP_FILESYSTEM DEP_NETWORKrrargparsesysrArgumentParserparser add_argument parse_argsargsendpointrrr)UnicodeDecodeErrorstderrwriteprintdumpsrrrrs|       r " M