3 cj#@sUddlZddlZddlZddlZddlZddlZddlZddljj Z ddl m Z ddl mZddlmZmZddlmZmZmZmZddlZddlmZmZmZmZmZddlmZmZddl m!Z!dd l"m#Z#m$Z$m%Z%dd l&m'Z'm(Z(dd l)m*Z*dd l+m,Z,m-Z-m.Z.m/Z/dd l0m1Z1ddl2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;mZ>m?Z?m@Z@mAZAddlBmCZCy.ddlDZDejEeDjDdejFdddZGeGWnPeHeIfk ryddlJZKeKjLjMjLZGWneHk rddZGYnXYnXejNeOZPdZQddiZRdZSdZTdZUdZVGddde ZWdZXeeYXd d!d"d#gZZd$d%Z[d&d'Z\eYeYeeYd(d)d*Z]eYeYd+d,d-Z^e8eeYd.d/d0Z_e8eYeeYd+d1d2Z`d|eYd.d3d4Zad5d6Zbd7d8Zcd9d:ZdeeYd.d;d<Zeejfrd=ZTeed>Zgegdk r ePjhd?d@egZSn ePjhdAdZXeUdBeSidCdCdDZidBdEdFgdCdGieTdHdIgdJZjdKeQgZkdLZldMZmdNZnGdOdPdPejoZpdQdRZqdSdTZrdUdVZsdWdXZtdYdZZud}d[d\Zve8d]d^Zwe8d_d`Zxe8eSdadafeYeYeyeydbdcddZze8d~dedfZ{e8dgdhZ|didjZ}e8dkdlZ~e8eXfdmdnZe8dodpZe8dqdrZe8eeyedsdtduZe8ed.dvdwZe8ddxdyZepZepejffgZdzd{ZdS)N)Enum)Path)sleeptime)AnyDictListOptional)netsourcesssh_utilsubputil) EventScope EventType) device_driver)NoDHCPLeaseErrorNoDHCPLeaseInterfaceErrorNoDHCPLeaseMissingDhclientError)EphemeralDHCPv4EphemeralIPv4Network)events)errorsidentityimdskvp)netlink)DEFAULT_WIRESERVER_ENDPOINTBrokenAzureDataSourceNonAzureDataSource OvfEnvXmlazure_ds_reporterazure_ds_telemetry_reporterbuild_minimal_ovf dhcp_log_cbget_boot_telemetryget_ip_from_lease_valueget_metadata_from_fabricget_system_infopush_log_to_kvpreport_diagnostic_eventreport_failure_to_fabric)UrlErrorz$6$)Zstrlen)ZsaltcCs tddS)zRaise when called so that importing this module doesn't throw ImportError when ds_detect() returns false. In this case, crypt and passlib are not needed. z/crypt and passlib not found, missing dependencyN) ImportError)_r0%/usr/lib/python3.6/DataSourceAzure.py blowfish_hashBsr2Azurez instance-idziid-AZURE-NODEz/dev/disk/cloud/azure_resourceZext4z/var/lib/waagentz/dev/sr0c@s eZdZdZdZdZdZdZdS)PPSTypeNoneZPreprovisionedOSDiskZRunningZSavableZUnknownN)__name__ __module__ __qualname__NONEOS_DISKRUNNINGSAVABLEUNKNOWNr0r0r0r1r4Ys r4z/sys/firmware/acpi/tables/OEM0z"/etc/netplan/90-hotplug-azure.yamlz /usr/local/sbin/ephemeral_eth.shz+/etc/udev/rules.d/10-net-device-added.rulesz#/run/network/interfaces.ephemeral.dcCsxz|jD]n}tjd|r |j}t|dkr |djd}t|dkr |ddkr |dj|r |djd}|dSq Wd S) z dev.storvsc.1.%pnpinfo: classid=32412632-86cb-44a2-9b5c-50d1417354f5 deviceid=00000000-0001-8899-0000-000000000000 Zpnpinfo=rdeviceid.N) splitlinesresearchsplitlen startswith) sysctl_outrAlineZfieldscolumnscompsr0r0r1"find_storvscid_from_sysctl_pnpinfoms     rNcCs2x,|jD] }tj||r |j}|dSq WdS)z scbus0 on ata0 bus 0 scbus1 on ata1 bus 0 scbus2 on blkvsc0 bus 0 scbus3 on blkvsc1 bus 0 scbus4 on storvsc2 bus 0 scbus5 on storvsc3 bus 0 scbus-1 on xpt0 bus 0 rN)rDrErFrG)camcontrol_outZdisk_drvrKitemsr0r0r1find_busdev_from_disks   rQ)rObusdevreturncCsNxH|jD]<}tj||r |jd}t|dkr |djd}|dSq WdS)z at scbus1 target 0 lun 0 (cd0,pass0) at scbus2 target 0 lun 0 (da0,pass1) at scbus3 target 1 lun 0 (da1,pass2) (r?rB,rN)rDrErFrGrH)rOrRrKrPZdev_passr0r0r1find_dev_from_busdevs    rV)macrSc CsZt|dkrRdj|dd|dd|dd|dd|dd|ddg}|jS) z1Normalize mac address with colons and lower-case. :rr? )rHjoinlower)rWr0r0r1normalize_mac_addresss Br`)rScCsddtjDS)z-Get Hyper-V NICs as normalized MAC addresses.cSs$g|]}|ddkrt|dqS)r? hv_netvscrB)r`).0nr0r0r1 sz1get_hv_netvsc_macs_normalized..)r get_interfacesr0r0r0r1get_hv_netvsc_macs_normalizedsrfcsffddtjD}d|kr"dSt|dkrLtd|ftjd|dStd|ftjdd S) z0Determine the device driver to match on, if any.cs$g|]}t|dkr|dqS)rBr?)r`)rbi)rWr0r1rdsz3determine_device_driver_for_mac..rarBz4Assuming driver for interface with mac=%s drivers=%r) logger_funcrz=Unable to specify driver for interface with mac=%s drivers=%rN)r rerHr*LOGdebugwarning)rWZdriversr0)rWr1determine_device_driver_for_macs     rlc Cs:y tj|jStjk r4tjddj||SXdS)NzFailed to execute: %s )r stdoutProcessExecutionErrorrirjr^)cmdfail_retr0r0r1execute_or_debugs  rrcCstddgddS)NZsysctlz dev.storvsc)rq)rrr0r0r0r1get_dev_storvsc_sysctlsrtcCstdddgS)N camcontroldevlistz-b)rrr0r0r0r1get_camcontrol_dev_bussrwcCs tddgS)Nrurv)rrr0r0r0r1get_camcontrol_devsrxc Csd}|dkrd}|d}dt|}dj||}t}t||}|sRtjddSt}t}dj|}t||} | rt || } | dkrtjd dS| Sd j|} t|| } | rt || } | dkrtjd dS| SdS) NZ00000000rBZ00000001r?Z000z{0}-{1}z#Fail to find storvsc id from sysctlz blkvsc{0}zFail to find /dev/daXz storvsc{0}) strformatrtrNrirjrwrxrQrV) Zport_idZg0Zg1Zg0g1rJZ storvscidZcamcontrol_b_outrOZblkvscZscbusxZdevnameZstorvscr0r0r1get_resource_disk_on_freebsds<            r{z freebsd-ufsrBzresource disk is not Nonez/dev/zresource disk is NoneZ ephemeral0T)data_dir disk_aliasesapply_network_config&apply_network_config_for_secondary_ipsZgptd)Z table_typeZlayoutZ overwritez ephemeral0.1)Z filesystemZdevice) disk_setupZfs_setupZ datasourceZnever_destroy_ntfszTemporary StorageZREDACTEDcseZdZdZejejejhiZ dZ e j Z dZddZeddfdd Zd d Zd d ZeeedddZedddddeeeeeedddZeddddZedddZeddZeeeddd Zfffd!d" Z ed#d$Z!ed%d&Z"d'd(Z#d)d*Z$ee%edd+d,Z&e'e%ed-d.d/Z(e%edd0d1Z)d2d3Z*d4d5Z+drd6d7Z,ed8d9Z-edseee.d<d=d>Z/ed?d@Z0edddAeeddBdCdDZ1edEdFZ2ee3j3ddGdHZ4edIdJZ5edddKdLZ6edMdNZ7edOdPZ8ee9ddQdRZ:edte;je'eed-dZd[Z?e'e'e@d\d]d^ZAed_d`ZBee'e'ee%edadbdcZCdddeZDedfdgZEeFdhdiZGedjdkZHeFdldmZIeFdndoZJee'ed-dpdqZKZLS)uDataSourceAzurer3FrBcCstjj||||tjj|jd|_i|_d|_t j t j |t it g|_d|_d|_d|_d|_d|_t|_tjj|jdd|_dS)NZazureFdatareported_ready)r DataSource__init__ospathr^seed_dircfgseedr mergemanydictZget_cfg_by_path DS_CFG_PATHBUILTIN_DS_CONFIGds_cfg_iso_dev_network_config_ephemeral_dhcp_ctx_route_configured_for_imds _route_configured_for_wireserverr_wireserver_endpoint cloud_dir_reported_ready_marker_file)selfsys_cfgdistropathsr0r0r1rHszDataSourceAzure.__init__N)ci_pkl_versionrScsDtj|d|_d|_d|_d|_t|_tj j |j j dd|_ dS)NFrr)super _unpicklerrrrrrrrr^rrr)rr) __class__r0r1rZs zDataSourceAzure._unpicklecCstjj|}d||jfS)Nz %s [seed=%s])r r__str__r)rrootr0r0r1rfs zDataSourceAzure.__str__cCsH|jdkrd}n*|jjdr"d}n|jjdkr6d}nd}d||jfS)z/Return the subplatform metadata source details.Nunknownz/devz config-diskrzseed-dirz%s (%s))rrIr_)rZsubplatform_typer0r0r1_get_subplatformjs  z DataSourceAzure._get_subplatform)ephipv4rScCs<|js dSdd|jD}d|k|_|j|k|_|jp:|jS)NFcSsg|]}|djddqS)r/)rG)rbrr0r0r1rd|sz5DataSourceAzure._check_if_primary..z169.254.169.254) static_routesrrr)rrZrouted_networksr0r0r1_check_if_primaryvs  z!DataSourceAzure._check_if_primaryT)ifacereport_failure_if_not_primary retry_sleeptimeout_minutes)rrrrrSc Csr|jdk rtdtd|tjftjdt|j|t d|_d}t }||d}t j ddt d x4|dkry|jj}Wntk rtd tjd|jtjt |d d d Yntk rtdtjdd|_Yntk r.td|tjd|jtjt ||dd d YnHtjk rt}z(td|j|j|j|jftjdWYdd}~XnX|dkrt ||krt|qlPqlW|dkrd|_t|d}||j_d|krt |d|_!t"|} |jj#} | dkrtd|j$| } td|| | | j%| j&||j'|j(ftjd|rd| rd|jtj)|| | j%| j&|dd d | SQRXdS)aSetup ephemeral networking. Keep retrying DHCP up to specified number of minutes. This does not kill dhclient, so the timeout in practice may be up to timeout_minutes + the system-configured timeout for dhclient. :param timeout_minutes: Number of minutes to keep retrying for. :raises NoDHCPLeaseError: If unable to obtain DHCP lease. :returns: True if NIC is determined to be primary. Nz/Bringing up networking when already configured.z2Bringing up ephemeral networking with iface=%s: %r)rh)rZ dhcp_log_func<zobtain-dhcp-leasezobtain dhcp lease)name descriptionparentzInterface not found for DHCP)durationT) host_onlyzdhclient executable not foundz&Failed to obtain DHCP lease (iface=%s))r interfacez7Command failed: cmd=%r stderr=%r stdout=%r exit_code=%srz unknown-245zdhcp context missing ephipv4z{Obtained DHCP lease on interface %r (primary=%r driver=%r router=%r routes=%r lease=%r imds_routed=%r wireserver_routed=%r))rdriverrouterrlease)*r RuntimeErrorr*r rerirjrrr$rrReportEventStackr!Z obtain_leaserrk_report_failurerZ$ReportableErrorDhcpInterfaceNotFoundrerrorrZReportableErrorDhcpLeaser rorpstderrrnZ exit_coderrr&rrZ_ephipv4rrrrrZ(ReportableErrorDhcpOnNonPrimaryInterface) rrrrrr start_timeZdeadlinerrrZprimaryr0r0r1_setup_ephemeral_networkings                   z+DataSourceAzure._setup_ephemeral_networking)rScCs.d|_d|_|jdkrdS|jjd|_dS)zTeardown ephemeral networking.FN)rrrZ clean_network)rr0r0r1_teardown_ephemeral_networking s   z.DataSourceAzure._teardown_ephemeral_networkingcCs|jdkp|jjdk S)z"Check if networking is configured.N)rr)rr0r0r1_is_ephemeral_networking_up+s z+DataSourceAzure._is_ephemeral_networking_upc)Cs&i}|jd}d}ddi}ddddiii}d}i}x2t|j|D]}yt|jdrtjrvtj|td d \}}}}ntj|t\}}}}||_nt|\}}}}|}t d |t j d PWqBt k rt d |t j d wBYqBtj k rt d|t j d wBYqBtk rP} z&d| } t | t jd tj| WYdd} ~ XqBXqBWd} t | t jd t|jpz|dk} | rdnd} y|j| dWntk rYnXi} |jr|jdd} | r|dkrd} t | tj| |j|| }|tjkrtjr2d} t | t jd tj| |jsXd} t | t jd tj| |tjkrn|jn4|tjkr|jn|tjkr|j n|j!|j"\}}}}|jdd} |j#| }|dtjj$fkr|j%t&j'd|d|j(| d|pd|_)|j*||tj+|d| ig|dt,| }t-| }t.| }|rbt j d|||ddd<|rt j d |||d!d<|rt j d"|||d!d#<|j)dkr |d$ r yt/|||d%}d&|i|d$<Wn6t0k r }zt d'|t j d WYdd}~XnX|slt1| }|rlt j d(yt2j3dj4|j5|d)<Wn$t0k rjt d*t jd YnX||krt d+|t j d t6}|r||d!d,<|j7|d!d-<|j8d.kr"|jr"|j9|| d/}y|j:|d0}Wnt0k rYn(Xt j d1||r||d!d2<|j;|S)3aWalk all instance metadata sources returning a dict on success. @return: A dictionary of any metadata content for this instance. @raise: InvalidMetaDataException when the expected metadata service is unavailable, broken or disabled. r|Nzlocal-hostnamers system_info default_userrz/dev/udf)mtypez!Found provisioning metadata in %s)rhz$Did not find Azure data source in %sz%s was not mountablezBrokenAzureDataSource: %szUnable to find provisioning media, falling back to IMDS metadata. Be aware that IMDS metadata does not support admin passwords or custom-data (user-data only).r)rT)report_failurezNo OVF or IMDS availablez%Free BSD is not supported for PPS VMszDHCP failed while in source PPSzextended.compute.ppsType)keyvalue)imds_mdZIMDSr)rfilesmetadata userdata_rawz Username retrieved from IMDS: %sz Hostname retrieved from IMDS: %srz(Disable password retrieved from IMDS: %sZdisable_passwordr)usernamehostnameZ disableSshPwdz ovf-env.xmlz)Failed to construct OVF from IMDS data %szRetrieved userdata from IMDSrzBad userdata in IMDSzusing files cached in %sZ random_seedz instance-idF)rr) pubkey_infoznegotiating returned %sz public-keys)DataSourceAzure._get_public_keys_from_imds..computeZ publicKeysz"No SSH keys found in IMDS metadata)rhcss|]}t|d VqdS))rN)_key_is_openssh_formatted)rbrr0r0r1 sz=DataSourceAzure._get_public_keys_from_imds..zKey(s) not in OpenSSH formatzRetrieved {} keys from IMDS)rr*rirjanyrrzrH)rrrlog_msgr0r0r1rsz*DataSourceAzure._get_public_keys_from_imdsc CsZg}y*|jd}djt|}t|tjdWn&tk rTd}t|tjdYnX|S)zYGet SSH keys that were fetched from wireserver. :returns: List of keys. z public-keyszRetrieved {} keys from OVF)rhzNo keys available from OVF)rrzrHr*rirjr)rrrr0r0r1rs z)DataSourceAzure._get_public_keys_from_ovfcCs|jS)N)r)rr0r0r1get_config_objszDataSourceAzure.get_config_objcCstj|jS)N)r Zinstance_id_matches_system_uuidr)rrr0r0r1check_instance_idsz!DataSourceAzure.check_instance_idcCsZtjj|jjdd}tj}tjj|rVtj |j }tj |}|j ||gkrV|S|S)Nrz instance-id) rrr^rZ get_cpathrZquery_system_uuidrr load_filestripZbyte_swap_system_uuidr_)rZpreviousZ prev_iid_pathZ system_uuidZ swapped_idr0r0r1rs  zDataSourceAzure._iidcCsy\d}tjddtdtj|}WdQRX|dkrHd}t|tjdntd|tjdWn6t k r}ztt |tj dWYdd}~XnXdS)zUse the netlink socket provided to wait for nic detach event. NOTE: The function doesn't close the socket. The caller owns closing the socket and disposing it safely. Nzwait-for-nic-detachzwait for nic detach)rrrzHPreprovisioned nic not detached as expected. Proceeding without failing.)rhz%The preprovisioned nic %s is detached) rrr!rZwait_for_nic_detach_eventr*rirkrjAssertionErrorryr)rnl_sockifnamerrr0r0r1_wait_for_nic_detachs  z$DataSourceAzure._wait_for_nic_detachr皙?)r"retriesrcCsfx`t|D]:}|jjj|r0td|tjdP|d|kr t|q Wtd|||ftjddS)NzThe link %s is up.)rhrBz;The link %s is not up after %f seconds, continuing anyways.)rangerZ networkingZtry_set_link_upr*riinfor)rr"r%rrgr0r0r1wait_for_link_ups   z DataSourceAzure.wait_for_link_upcCs@|j}tjd|tj|djtjtdt dtj ddS)Nz*Creating a marker file to report ready: %sz{pid}: {time} )pidrzRSuccessfully created reported ready marker file while in the preprovisioning pool.)rh) rrir'r write_filerzrgetpidrr*rj)rrr0r0r1_create_report_ready_marker"s z+DataSourceAzure._create_report_ready_marker) create_markerexpect_url_error)r-r.rScCsy |jWndtk rp}zH|rBt|trBtdtjdd|_nd}t|tjdt j ||WYdd}~XnXd|_ |r|j dS)zReport ready for PPS, creating the marker file upon completion. :raises sources.InvalidMetaDataException: On error reporting ready. z,Ignoring http call failure, it was expected.)rhNz9Failed reporting ready while in the preprovisioning pool.F) rrrr,r*rirjrrr rrr,)rr-r.rrr0r0r1_report_ready_for_pps/s   z%DataSourceAzure._report_ready_for_ppscCstjdyg}d}xd}tjddt|tdtj||}WdQRX|j|t d|tjd|j ||stjd ||j |d dd }|rtjd Pq|j qWWn4t k r}zt t|tjdWYdd}~XnXdS) z6Wait until the primary nic for the vm is hot-attached.z*Waiting for primary nic to be hot-attachedFNzwait-for-nic-attachz4wait for nic attach after %d nics have been attached)rrrzDetected nic %s attached.)rhz!Checking if %s is the primary nicr)rrrzFound primary nic for this VM.)rir'rrrHr!rZwait_for_nic_attach_eventappendr*r(rrr ryr)rr!Z nics_foundZprimary_nic_foundr"rr0r0r1"_wait_for_hot_attached_primary_nicVs:      z2DataSourceAzure._wait_for_hot_attached_primary_niccCsHytjStjk rB}ztd|tjdWYdd}~XnXdS)Nz!Failed to create netlink socket: )rh)rZcreate_bound_netlink_socketZNetlinkCreateSocketErrorr*rir)rrr0r0r1_create_bound_netlink_sockets z,DataSourceAzure._create_bound_netlink_socketcCs.|jddtdtjdtdtddS)z4Report ready and wait for host to initiate shutdown.F)r-z"Waiting for host to shutdown VM...)rhi3zShutdown failure for PPS disk.N)r/r*rir'rr)rr0r0r1rs   z.DataSourceAzure._wait_for_pps_os_disk_shutdowncCs|j}z|jdks |jjdkr(td|jj}|jtjd|tjddt dLyt j ||Wn4t k r}zt d|tjdWYdd}~XnXWdQRXWd|jX|jdS) z9Report ready and wait for nic link to switch upon re-use.Nzmissing ephemeral contextz#Wait for vnetswitch to happen on %sz!wait-for-media-disconnect-connectzwait for vnet switch)rrrz'Error while waiting for vnet switch: %s)rh)r2rrrr/rirjrrr!rZ!wait_for_media_disconnect_connectr r*rcloser)rr!rrr0r0r1rs,   * z+DataSourceAzure._wait_for_pps_running_reusecCs|j}zn|jddy |jWn<tjk r^}ztd|tjdd|_WYdd}~XnX|j ||j |Wd|j XdS)z@Report ready and wait for nic(s) to be hot-attached upon re-use.T)r.zLIgnoring failure while tearing down networking, NIC was likely unplugged: %r)rhN) r2r/rr ror*rir'rr#r1r3)rr!rr0r0r1rs    z+DataSourceAzure._wait_for_pps_savable_reusecCs&tjj|jrdS|j|jdS)z0Report ready if needed for unknown/recovery PPS.N)rrisfilerr/r)rr0r0r1rsz+DataSourceAzure._wait_for_pps_unknown_reusecCsd}d}x|s|jsF|d7}y|jddWntk rDw YnXtjddtd2y tj}Wntk r|j w YnXWdQRXq Wt d |t j d |S) z0Poll IMDs for reprovisiondata XML document data.rNrBr)rzget-reprovision-data-from-imdszget reprovision data from imds)rrrz#attempted dhcp %d times after reuse)rh) rrrrrr!rZfetch_reprovision_datar,rr*rirj)rZ dhcp_attemptsZreprovision_datar0r0r1 _poll_imdss,   zDataSourceAzure._poll_imds)rrrSc Cstd|jtjdtj|}|r*|S|jry&tdtjdt|j |dd|_ dSt k r}ztd|tjdWYdd}~XnXyTtdtjd|j y|j d d Wntk rYnXt|j |dd|_ dSt k r}ztd |tjdWYdd}~XnXd S) aReport failure to Azure host and fabric. For errors that may be recoverable (e.g. DHCP), host_only provides a mechanism to report the failure that can be updated later with success. DHCP will not be attempted if host_only=True and networking is down. @param error: Error to report. @param host_only: Only report to host (error may be recoverable). @return: The success status of sending the failure signal. z#Azure datasource failure occurred: )rhz>Using cached ephemeral dhcp context to report failure to Azure)endpointrTz@Failed to report failure using cached ephemeral dhcp context: %sNz3Using new ephemeral dhcp to report failure to Azurer)rz5Failed to report failure using new ephemeral dhcp: %sF)r*Zas_encoded_reportrirrZreport_failure_to_hostrrjr+rrrrrr)rrrZreportedrr0r0r1r sL       zDataSourceAzure._report_failure)r)rrScCsftjyt|j|j|d}Wn6tk rT}ztd|tjdWYdd}~XnXd|_d|_ |S)zTells the fabric provisioning has completed. :param pubkey_info: Fingerprints of keys to request from Wireserver. :raises Exception: if failed to report. :returns: List of SSH keys, if requested. )r6Ziso_devrzQError communicating with Azure fabric; You may experience connectivity issues: %s)rhNT) rZreport_success_to_hostr'rrrr*rirkr)rrrrr0r0r1rLs   zDataSourceAzure._report_readycCsHy|dddStk rB}ztd|tjddSd}~XnXdS)NZextendedrZppsTypez2Could not retrieve pps configuration from IMDS: %s)rh)rr*rirj)rrrr0r0r1rms z"DataSourceAzure._ppstype_from_imds)ovf_cfgrrScCstjj|jrtj}n|jddtjjks<|j |tjjkrDtj}np|jddtj jksj|j |tj jkrrtj }nB|jddks|jddtj jks|j |tj jkrtj }ntj }t d|jtjd|S)z@Determine PPS type using OVF, IMDS data, and reprovision marker.PreprovisionedVMTypeNPreprovisionedVmTz PPS type: %s)rh)rrr4rr4r=r r<rrr:r;r9r*rir')rr7rrr0r0r1rws"  z#DataSourceAzure._determine_pps_typec CsB|j}tjddtd t|\}}}|||d|ifSQRXdS)zrInitiate the reprovisioning workflow. Ephemeral networking is up upon successful reprovisioning. zreprovisioning-read-azure-ovfz$read azure ovf during reprovisioning)rrrz ovf-env.xmlN)r5rrr!read_azure_ovf)rrrudrr0r0r1rs zDataSourceAzure._reprovision)rrrSc Csdd}y|j|WnLttfk r^|jdd}dj|dk rFt|nd}t|tjdYnX|S)zDetermine the fingerprints we need to retrieve from Wireserver. :return: List of keys to request from Wireserver, if any, else None. N_pubkeysz"Retrieved {} fingerprints from OVFr)rh) rrrr rzrHr*rirj)rrrrrr0r0r1rs z1DataSourceAzure._determine_wireserver_pubkey_infocCstj|jdS)zCleanup any marker files.N)rdel_filer)rr0r0r1rsz DataSourceAzure._cleanup_markersc Cs<|jj}zt|||jjtddWdt|jdXdS)NF)is_new_instance preserve_ntfsZ def_log_file)rZ get_ipath_curaddress_ephemeral_resizerr DS_CFG_KEY_PRESERVE_NTFSr)r)rrr> instance_dirr0r0r1activates zDataSourceAzure.activatecCs|jjdijdijdS)NrrZplatformFaultDomain)rr )rr0r0r1availability_zonesz!DataSourceAzure.availability_zonecCs|jrl|jtjkrl|jjdrlyt|jd|jjddStk rj}ztjdt |WYdd}~XnXyt Stk r}ztjdt |WYdd}~XnXiS)z:Generate network configuration according to configuration.r~networkr)rz?Failed generating network config from IMDS network metadata: %sNz-Failed generating fallback network config: %s) rr rrr 6generate_network_config_from_instance_network_metadatarrirry-_generate_network_config_from_fallback_config)rrr0r0r1_generate_network_configs"   "z(DataSourceAzure._generate_network_configcCs(|jr|jtjkr|jS|j|_|jS)z,Provide network configuration v2 dictionary.)rr rrH)rr0r0r1network_configs zDataSourceAzure.network_configcCs|jjdijdijdS)Nrrlocation)rr )rr0r0r1regionszDataSourceAzure.regionc st}y|d}dd|dDWn,tk rPtd|jdtjddSXfdd|D}|sld Std ||ftjd|j s|jj rdStj |jj}| st |t  rdSt |}||krtd ||ftjddS) z=Validate IMDS network config and report telemetry for errors.rEcSsg|]}t|dqS) macAddress)r`)rbrgr0r0r1rdszBDataSourceAzure.validate_imds_network_metadata..rz6IMDS network metadata has incomplete configuration: %r)rhFcsg|]}|kr|qSr0r0)rbm) imds_macsr0r1rdsTz>IMDS network metadata is missing configuration for NICs %r: %rz3IMDS network metadata is missing primary NIC %r: %r) rfrr*r rirkrrr Zget_interface_macrryr`)rrZ local_macsrIZ missing_macsZ primary_macr0)rNr1rs<    z.DataSourceAzure.validate_imds_network_metadata)N)rr$)F)Mr6r7r8ZdsnamerZNETWORKrZBOOT_NEW_INSTANCEBOOTZdefault_update_eventsrr rrZ_ci_pkl_versionrintrrrr"rrrr ryrrrrrrrrrrrrrdictrrrrrr#floatr(r,r/r1socketr2rrrrbytesr5rrrrrr4rrrrrCpropertyrDrHrIrKr __classcell__r0r0)rr1r;s      W-  M     ! 9 $  >     rc Cs*y|dddStk r$dSXdS)Nr osProfileZ adminUsername)r) imds_datar0r0r1r-src Cs&y |ddStk r dSXdS)NrZuserData)r)rXr0r0r1r4s rc Cs*y|dddStk r$dSXdS)NrrWZ computerName)r)rXr0r0r1r;src Cs.y|ddddkStk r(dSXdS)NrrWZdisablePasswordAuthenticationtrue)r)rXr0r0r1rBs rc CsFd|jkrdStj}y|j|}Wntk r:dSX|jdk S)z? Validate whether or not the key is OpenSSH-formatted. z FN)rr ZAuthKeyLineParserparse TypeErrorZkeytype)rparserZaklr0r0r1rLs rcCsdx^dD]V}g}xDtd|D]6}||t|}tjj|r|j|tjj|fqW|r|SqWgS)N-partprsrB)r]r^rs)r&ryrrrr0realpath)rZmaxnumZsufffoundZpnumZppathr0r0r1_partitions_on_device]s  racCs*tjddd}tjd|tjj||kS)Nz TYPE=ntfsT)Zno_cachezntfs_devices found = %s)rfind_devs_withrirjrrr_)rZ ntfs_devicesr0r0r1_has_ntfs_filesystemjs rcc Cs|rddjttf}d|fStjj|s6dd|fStjd|tjj|t |}t |dkrldd|fSt |dkrd |d jd d |Df}d|fSt |dkr|d \}}n |d\}}t |sd|||f}d|fSt dd}d|||f}t jddtd}ytj||dddidd} WnTtjk r|} z4d|_dt| kr^d|dfSd|d|| ffSd} ~ XnX| dkrd| |_tjddjttd|d | fSWdQRXd|d!fS)"aDetermine if the ephemeral drive at devpath should be reformatted. A fresh ephemeral disk is formatted by Azure and will: a.) have a partition table (dos or gpt) b.) have 1 partition that is ntfs formatted, or have 2 partitions with the second partition ntfs formatted. (larger instances with >2TB ephemeral disk have gpt, and will have a microsoft reserved partition as part 1. LP: #1686514) c.) the ntfs partition will have no files other than possibly 'dataloss_warning_readme.txt' User can indicate that NTFS should never be destroyed by setting DS_CFG_KEY_PRESERVE_NTFS in dscfg. If data is found on NTFS, user is warned to set DS_CFG_KEY_PRESERVE_NTFS to make sure cloud-init does not accidentally wipe their data. If cloud-init cannot mount the disk to check for data, destruction will be allowed, unless the dscfg key is set.z:config says to never destroy NTFS (%s.%s), skipping checksrCFzdevice %s does not existzResolving realpath of %s -> %srzdevice %s was not partitionedr?z&device %s had 3 or more partitions: %srmcSsg|] }|dqS)rBr0)rbr^r0r0r1rdsz*can_dev_be_reformatted..rBz5partition %s (%s) on device %s was not ntfs formattedcs(tddgtfddtj|DS)Nzdataloss_warning_readme.txtzsystem volume informationcsg|]}|jkr|qSr0)r_)rbf)ignoredr0r1rdsz?can_dev_be_reformatted..count_files..)setrHrlistdir)Zmpr0)rer1 count_filess z+can_dev_be_reformatted..count_filesz1partition %s (%s) on device %s was ntfs formattedzmount-ntfs-and-count)rrrZntfsZLANGC)rZupdate_env_for_mountZ log_errorzcannot mount ntfszunknown filesystem type 'ntfs'Tz^ but this system cannot mount NTFS, assuming there are no important files. Formatting allowed.z but mount of %s failed: %sNzmounted and counted %d fileszxit looks like you're using NTFS on the ephemeral disk, to ensure that filesystem does not get wiped, set %s.%s in configz but had %d files on it.z3 and had no important files. Safe for reformatting.)r^rrArrrrirjr_rarHrcr"rrr!rrrrryrk) rr?rZ partitionsZ cand_partZ cand_pathrhbmsgZevtZ file_countrr0r0r1can_dev_be_reformattedqsr             rkF)rBrr>r?c Cstjj|s"td|tjddStd|tjdd}d}|rJd\}}nt||\}}tjd|||sndSxdD]}tjj|d d |}d ||f}tjj|rytj|tjd |Wn0t k r} ztj d|| WYdd} ~ XnXqttjd|qtWdS)Nz,Ephemeral resource disk '%s' does not exist.)rhz$Ephemeral resource disk '%s' exists.FTFirst instance boot.zreformattable=%s: %srmountsZsemZconfig_zMarker "%s" for module "%s"z %s removed.z%s: remove failed! (%s)z%s did not exist.)Trl)rrm) rrrr*rirjrkr^unlinkFileNotFoundErrorrk) rBrr>r?resultrmodZsempathrjrr0r0r1r@s6       "r@cCsndd}|sdS|si}tj||xD|jD]8\}}tjj||}d|krV|||}tj||ddq.WdS)Nc Ssfy@tj|}x*|jD]}d|jkr|jtkrt|_qWtj|Stk r`tj d||SXdS)z>Azure provides the UserPassword in plain text. So we redact itZ UserPasswordz#failed to redact userpassword in %sN) ETZ fromstringitertagtextDEF_PASSWD_REDACTIONZtostringrriZcritical)Zcntfnamerelemr0r0r1_redact_password s      z%write_files.._redact_passwordz ovf-env.xmli)filenamecontentmode)rZ ensure_dirrPrrr^r*)Zdatadirrrryrr{rwr0r0r1r s  rcCstj|}i}i}|jpd}|jr,|j|d<|jr<|j|d<|jdk rT|j |d<n|jrbd|d<i}|jrv|j|d<|jrd|d <t|jkrt |j|d <|rd |i|d <|j |d <t d|j t j d|j|d<t d|jt j d|||fS)zParse OVF XML contents. :return: Tuple of metadata, configuration, userdata dicts. :raises NonAzureDataSource: if XML is not in Azure's format. :raises BrokenAzureDataSource: if XML is unparseable or invalid. rszlocal-hostnamer<NZ ssh_pwauthTrFZ lock_passwdZ hashed_passwdrrr9zPreprovisionedVm: %s)rhr8zPreprovisionedVMType: %s)r Z parse_textZ custom_datarZ public_keysZdisable_ssh_password_authpasswordrrv encrypt_passZpreprovisioned_vmr*rir'Zpreprovisioned_vm_type)rZovf_envrrr;Zdefuserr0r0r1r:(s<            r:cCst|S)N)r2)r}r0r0r1r~Zsr~cCsHy"t|}|jddSQRXWn tk rBtjd|YnXdS)z;Return boolean indicating path to cdrom device has content.iTNzcdrom (%s) is not configuredF)openreadIOErrorrirj) cdrom_devfpr0r0r1_check_freebsd_cdrom^s  rcCs*|dkr dStj|ddd}tj|jS)zIReturn content random seed file if available, otherwise, return None.NTF)quietdecode)rrrZ b64encoder)sourcerr0r0r1rjs rccsX|VtVtjr(d}t|rJ|Vn"x dD]}tjd|EdHq.W|rT|VdS)Nz/dev/cd0iso9660rzTYPE=%s)rr)DEFAULT_PROVISIONING_ISO_DEVrrrrb)r cache_dirrZfstyper0r0r1rs rc Cs^tjj|d}tjj|s"tdt|d}|j}WdQRXt|\}}}|||d|ifS)Nz ovf-env.xmlzNo ovf-env file foundrb)rrr^r4rrrr:)Z source_dirZovf_filerrrr;rr0r0r1rs  r)network_metadatarrScCsdid}xvt|dD]d\}}d}dj|d}d|dd i}d |dd }xd#D]} |j| ijdg} | stjd| |qVd }| d krd} nd} | rd |d<||d<|sqVx`| ddD]P} || ddjd| } | d}|jdsg|d<|djdj|| dqWqVW|rp|rpt|d}|jd|ji|dt |}|rb||dd <||d!|<qtjd"|||qW|S)$zConvert imds network metadata dictionary to network v2 configuration. :param: network_metadata: Dict of "network" key from instance metdata. :return: Dictionary containing network version 2 standard configuration. r?)version ethernetsrFzeth{idx})idxz route-metricrBrT)Zdhcp4zdhcp4-overridesdhcp6ipv4ipv6Z ipAddresszNo %s addresses found for: %rZ24Z128rzdhcp6-overridesNZsubnetrprefixZprivateIpAddress addressesz {ip}/{prefix})ZiprrLZ macaddress)matchzset-namerrrzs      D "    +     {   n'  2   I  &