8889841có oBú]c@s@ddlZddlZddlZddlZddlZddlZddlZddlZddlm Z ddl m Z ddl m Z ddl mZddlmZddl mZddl mZdd l mZdd l mZdd lmZdd lmZdd lmZejeƒZdZdZdZdZ ej!ddddde"ƒZ#d„Z$d„Z%e$d„ƒZ&e$d„ƒZ'd„Z(ed„ƒZ)d„Z*de+fd„ƒYZ,d e+fd!„ƒYZ-d"e+fd#„ƒYZ.d$e+fd%„ƒYZ/e$dddd&„ƒZ1d'e+fd(„ƒYZ2dS()iÿÿÿÿN(tdhcp(tstages(t temp_utils(tcontextmanager(t ElementTree(t url_helper(tutil(tversion(tdistros(tevents(tEphemeralDHCPv4(tdatetimes a8:3f:81:10sboot-telemetrys system-infot diagnostictnamesazure-dst descriptions initialize reporter for azure dstreporting_enabledcs‡fd†}|S(Ncs<tjdˆjdˆjdtƒˆ||ŽSWdQXdS(NR Rtparent(R tReportEventStackt__name__tazure_ds_reporter(targstkwargs(tfunc(sC/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/azure.pytimpl+s     ((RR((RsC/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/azure.pytazure_ds_telemetry_reporter*scCsy||krtSdd„}|jdƒ}dj||dƒ||dƒ||dƒ|d|dgƒ}||kS(sÇ Azure stores the instance ID with an incorrect byte ordering for the first parts. This corrects the byte order such that it is consistent with that returned by the metadata service. icSs<gtj|dƒD] }|^q}|jƒdj|ƒS(Nit(ttextwraptwraptreversetjoin(tstwidthtbytetdd((sC/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/azure.pytswap_bytestring=s% t-iiii(tFalsetsplitR(t previous_idt current_idR"tpartst swapped_id((sC/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/azure.pytis_byte_swapped4s     c Cs}tjƒstdƒ‚ntjdƒy&ttjƒƒttjƒƒ}Wnt k rmtdƒ‚nXy‚tj ddddgdt ƒ\}}d}|rÆd |krÆ|j d ƒd }n|sÛtd ƒ‚n|t|ƒd }WnHtjk r}td |ƒ‚n#t k r:}td|ƒ‚nXy…tj dddddgdt ƒ\}}d}|r–d |kr–|j d ƒd }n|s«tdƒ‚n|t|ƒd }WnHtjk rè}td|ƒ‚n#t k r }td|ƒ‚nXtjtddtj|ƒjƒdtj|ƒjƒdtj|ƒjƒdftjƒ}tj|ƒ|S(s^Report timestamps related to kernel initialization and systemd activation of cloud-inits1distro not using systemd, skipping boot telemetrysCollecting boot telemetrys*Failed to determine kernel start timestamps/bin/systemctltshows-ptUserspaceTimestampMonotonictcapturet=is8Failed to parse UserspaceTimestampMonotonic from systemdi@Bs-Failed to get UserspaceTimestampMonotonic: %ss<Failed to parse UserspaceTimestampMonotonic from systemd: %sscloud-init-localtInactiveExitTimestampMonotonics;Failed to parse InactiveExitTimestampMonotonic from systemds0Failed to get InactiveExitTimestampMonotonic: %ss?Failed to parse InactiveExitTimestampMonotonic from systemd: %ssboot-telemetrys5kernel_start=%s user_start=%s cloudinit_activation=%stZN(Rt uses_systemdt RuntimeErrortLOGtdebugtfloatttimeRtuptimet ValueErrortsubptTruetNoneR%tProcessExecutionErrorR tReportingEventtBOOT_EVENT_TYPER tutcfromtimestampt isoformattDEFAULT_EVENT_ORIGINt report_event(t kernel_starttoutt_ttsmt user_starttetcloudinit_activationtevt((sC/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/azure.pytget_boot_telemetryNsf   &         c Cs{tjƒ}tjtddtjƒ|d|d|dd|dd|dd|d ftjƒ}tj|ƒ|S( s%Collect and report system informationssystem informationstcloudinit_version=%s, kernel_version=%s, variant=%s, distro_name=%s, distro_version=%s, flavor=%s, python_version=%streleasetvarianttdistiiitpython( Rt system_infoR R=tSYSTEMINFO_EVENT_TYPERtversion_stringRARB(tinfoRJ((sC/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/azure.pytget_system_info”s ! cCs,tjtd|tjƒ}tj|ƒ|S(sReport a diagnostic eventsdiagnostic message(R R=tDIAGNOSTIC_EVENT_TYPERARB(tstrRJ((sC/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/azure.pytreport_diagnostic_event¦s  ccsCtjƒ}tjtjj|ƒƒz dVWdtj|ƒXdS(N(tostgetcwdtchdirtpatht expanduser(tnewdirtprevdir((sC/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/azure.pytcd±s   cCstjƒrd}nd}|S(Ns option-245s unknown-245(Rt is_FreeBSD(tazure_endpoint((sC/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/azure.pyt_get_dhcp_endpoint_option_name»s  tAzureEndpointHttpClientcBs@eZidd6dd6Zd„Zed„Zddd„ZRS(t WALinuxAgentsx-ms-agent-names 2012-11-30s x-ms-versioncCsidd6|d6|_dS(Nt DES_EDE3_CBCsx-ms-cipher-names!x-ms-guest-agent-public-x509-cert(textra_secure_headers(tselft certificate((sC/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/azure.pyt__init__ÊscCsP|j}|r1|jjƒ}|j|jƒntj|d|ddddƒS(Ntheadersttimeoutitretriesi (RjtcopytupdateRfRtread_file_or_url(RgturltsecureRj((sC/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/azure.pytgetÐs  c CsY|j}|dk r4|jjƒ}|j|ƒntj|d|d|ddddƒS(NtdataRjRkiRli (RjR;RmRnRRo(RgRpRst extra_headersRj((sC/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/azure.pytpostØs   N(Rt __module__RjRiR$RrR;Ru(((sC/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/azure.pyRcÃs    t GoalStatecBsVeZd„Zd„Zed„ƒZed„ƒZed„ƒZed„ƒZRS(cCs(||_tj|ƒ|_d|_dS(N(t http_clientRt fromstringtrootR;t_certificates_xml(RgtxmlRx((sC/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/azure.pyRiãs cCs)|jj|ƒ}|dk r%|jSdS(N(RztfindR;ttext(Rgtxpathtelement((sC/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/azure.pyt_text_from_xpathès cCs |jdƒS(Ns./Container/ContainerId(R(Rg((sC/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/azure.pyt container_idîscCs |jdƒS(Ns ./Incarnation(R(Rg((sC/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/azure.pyt incarnationòscCs |jdƒS(Ns4./Container/RoleInstanceList/RoleInstance/InstanceId(R(Rg((sC/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/azure.pyt instance_idöscCsU|jdkrN|jdƒ}|dk rN|jj|dtƒj|_qNn|jS(NsD./Container/RoleInstanceList/RoleInstance/Configuration/CertificatesRq(R{R;RRxRrR:tcontents(RgRp((sC/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/azure.pytcertificates_xmlûs   ( RRvRiRtpropertyR‚RƒR„R†(((sC/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/azure.pyRwás   tOpenSSLManagercBsŽeZidd6dd6Zd„Zd„Zed„ƒZeed„ƒƒZed„ƒZ ed „ƒZ ed „ƒZ ed „ƒZ RS( sTransportPrivate.pemt private_keysTransportCert.pemRhcCs&tjƒ|_d|_|jƒdS(N(RtmkdtempttmpdirR;Rhtgenerate_certificate(Rg((sC/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/azure.pyRis cCstj|jƒdS(N(Rtdel_dirR‹(Rg((sC/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/azure.pytclean_upscCsåtjdƒ|jdk r-tjdƒdSt|jƒ–tjddddddd d d d d |jdd|jdgƒd}x:t |jdƒD]%}d|krœ||j ƒ7}qœqœW||_WdQXtjdƒdS(Ns7Generating certificate for communication with fabric...sCertificate already generated.topenssltreqs-x509s-nodess-subjs/CN=LinuxTransports-dayst32768s-newkeysrsa:2048s-keyoutR‰s-outRhRt CERTIFICATEsNew certificate generated.( R3R4RhR;R_R‹RR9tcertificate_namestopentrstrip(RgRhtline((sC/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/azure.pyRŒs     cCs1ddd|g}tj|d|ƒ\}}|S(NRtx509s-nooutRs(RR9(tactiontcerttcmdtresultRE((sC/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/azure.pyt_run_x509_action*scCsI|jd|ƒ}ddddddg}tj|d|ƒ\}}|S( Ns-pubkeys ssh-keygens-is-mtPKCS8s-fs /dev/stdinRs(RœRR9(RgRhtpub_keyt keygen_cmdtssh_keyRE((sC/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/azure.pyt_get_ssh_key_from_cert1scCsH|jd|ƒ}|jdƒ}||dd!jdƒ}dj|ƒS(sopenssl x509 formats fingerprints as so: 'SHA1 Fingerprint=07:3E:19:D1:4D:1C:79:92:24:C6:A0:FD:8D:DA: B6:A8:BF:27:D4:73 ' Azure control plane passes that fingerprint as so: '073E19D14D1C799224C6A0FD8DDAB6A8BF27D473' s -fingerprintR.iiÿÿÿÿt:R(RœR}R%R(RgRhtraw_fpteqtoctets((sC/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/azure.pyt_get_fingerprint_from_cert8s c Cs’tj|ƒjdƒ}|j}ddddd|jdƒg}t|jƒ;tjdj |j d t d d j |ƒƒ\}}Wd QX|S( s”Decrypt the certificates XML document using the our private key; return the list of certs and private keys contained in the doc. s.//DatasMIME-Version: 1.0s<Content-Disposition: attachment; filename="Certificates.p7m"s?Content-Type: application/x-pkcs7-mime; name="Certificates.p7m"s!Content-Transfer-Encoding: base64Rsutf-8suopenssl cms -decrypt -in /dev/stdin -inkey {private_key} -recip {certificate} | openssl pkcs12 -nodes -password pass:tshellRss N( RRyR}R~tencodeR_R‹RR9tformatR“R:R(RgR†ttagtcertificates_contenttlinesRDRE((sC/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/azure.pyt_decrypt_certs_from_xmlFs  $c Cs°|j|ƒ}g}i}xŽ|jƒD]€}|j|ƒtjd|ƒrVg}q(tjd|ƒr(dj|ƒ}|j|ƒ}|j|ƒ}|||sks< {incarnation}s s- {container_id}s s s. {instance_id}s s Readys s s s s cCs8tjd|ƒ||_d|_d|_||_dS(Ns5WALinuxAgentShim instantiated, fallback_lease_file=%s(R3R4t dhcpoptionsR;t _endpointtopenssl_managert lease_file(Rgtfallback_lease_filet dhcp_options((sC/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/azure.pyRi†s     cCs#|jdk r|jjƒndS(N(RºR;RŽ(Rg((sC/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/azure.pyRŽŽscCs(tjƒ}tjj|jjƒdƒS(Nsdhclient.hooks(RtInitRXR[Rtpathst get_runpath(t_paths((sC/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/azure.pyt_get_hooks_dir’s cCs4|jdkr-|j|j|jƒ|_n|jS(N(R¹R;t find_endpointR»R¸(Rg((sC/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/azure.pytendpoint—s cCs³|jddƒ}t|ƒdkr—d}x@|jdƒD]/}t|ƒdkr_d|}n||7}q:Wtjdt|jddƒdƒƒ}n|jd ƒ}tj|ƒS( Ns\RiR¢it0s>Lisutf-8( treplacetlenR%tstructtpacktintR¨tsockett inet_ntoa(tfallback_lease_valuetunescaped_valuet hex_stringthex_pairt packed_bytes((sC/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/azure.pytget_ip_from_lease_valuežs $cCstjdd|ƒS(Nt OPTION_245tleases_d(Rtnetworkd_get_option_from_leases(RÔ((sC/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/azure.pyt_networkd_get_value_from_leases­scCsÓg}ytj|ƒ}Wn'tk rB}tjd||ƒdSXtjd|ƒtƒ}xR|jƒD]D}||kri|j |j dƒj ddƒdj dƒƒqiqiWt |ƒdkrÇdS|dSdS(NsFailed to read %s: %ss content is %st iiÿÿÿÿs; "i( Rt load_filetIOErrorR3terrorR;R4RbR®R¯tstripR%RÇ(R¼tleasestcontenttext option_nameR–((sC/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/azure.pyt_get_value_from_leases_file³s  6cCsèi}tjƒ}tjj|ƒs8tjd|ƒdSgtj|ƒD]}tjj ||ƒ^qH}xx|D]p}y>tjj |ƒj ddƒ}t j tj|ƒƒ||RQRURR:RRR*RKRTRWR_RbtobjectRcRwRˆR·R;RR(((sC/usr/lib/python2.7/site-packages/cloudinit/sources/helpers/azure.pytsV           F  &kõ