name : azure.cpython-39.opt-1.pyc
a

'�Dg���	@srddlZddlZddlZddlZddlZddlZddlZddlmZddl	m	Z	m
Z
ddlmZmZddl
mZmZmZmZmZddlmZddlmZddlmZmZmZmZmZmZdd	lm Z dd
l!m"Z"e�#e$�Z%dZ&dZ'd
Z(dZ)dZ*e j+dddd�Z,ed�Z-ede-fede-fd�dd�Z.e.dd��Z/e.dd��Z0dd�e1e j2d�dd �Z3d!d"�Z4e.d#d$��Z5ed%d&��Z6e.dd'd(d)�e1e7ee8e9e9ej:d*�d+d,��Z;e1e1e1e8d-�d.d/�Z<Gd0d1�d1�Z=Gd2d3�d3e>�Z?Gd4d5�d5�Z@Gd6d7�d7�ZAGd8d9�d9�ZBGd:d;�d;�ZCe.dIe1ejDeee1ee1d<�d=d>��ZEe.e1d?d@�dAdB��ZFdCdD�ZGGdEdF�dFe>�ZHGdGdH�dH�ZIdS)J�N)�contextmanager)�datetime�timezone)�sleep�time)�Callable�List�Optional�TypeVar�Union)�ElementTree)�escape)�distros�subp�
temp_utils�
url_helper�util�version)�events)�errorsz
168.63.129.16�boot-telemetryzsystem-infoZ
diagnostic�
compressedzazure-dsz initialize reporter for azure dsT)�name�descriptionZreporting_enabled�T.)�func�returncs�fdd�}|S)NcsFtj�j�jtd���|i|��Wd�S1s80YdS)N�rr�parent)r�ReportEventStack�__name__�azure_ds_reporter)�args�kwargs�r��C/usr/lib/python3.9/site-packages/cloudinit/sources/helpers/azure.py�impl*s�z)azure_ds_telemetry_reporter.<locals>.implr%)rr'r%r$r&�azure_ds_telemetry_reporter)sr(cCs8t��std��t�d�ztt��tt���}Wn.t	yb}ztd�|�WYd}~n
d}~00zTt
j
gd�dd�\}}d}|r�d|vr�|�d�d	}|s�td
��|t|�d}Wnft
jy�}ztd|�|�WYd}~n<d}~0t	�y}ztd
|�|�WYd}~n
d}~00zZt
j
gd�dd�\}}d}|�rZd|v�rZ|�d�d	}|�shtd��|t|�d}Wnht
j�y�}ztd|�|�WYd}~n<d}~0t	�y�}ztd|�|�WYd}~n
d}~00t
�tddt�|tj���t�|tj���t�|tj���ft
j�}t
�|�|S)z[Report timestamps related to kernel initialization and systemd
    activation of cloud-initz1distro not using systemd, skipping boot telemetryzCollecting boot telemetryz*Failed to determine kernel start timestampN)�	systemctl�show�-pZUserspaceTimestampMonotonicT)�capture�=�z8Failed to parse UserspaceTimestampMonotonic from systemdi@Bz-Failed to get UserspaceTimestampMonotonic: %sz<Failed to parse UserspaceTimestampMonotonic from systemd: %s)r)r*zcloud-init-localr+ZInactiveExitTimestampMonotonicz;Failed to parse InactiveExitTimestampMonotonic from systemdz0Failed to get InactiveExitTimestampMonotonic: %sz?Failed to parse InactiveExitTimestampMonotonic from systemd: %srz5kernel_start=%s user_start=%s cloudinit_activation=%s)rZuses_systemd�RuntimeError�LOG�debug�floatrrZuptime�
ValueErrorr�splitZProcessExecutionErrorr�ReportingEvent�BOOT_EVENT_TYPErZ
fromtimestamprZutcZ	isoformat�DEFAULT_EVENT_ORIGIN�report_event)Zkernel_start�e�out�_ZtsmZ
user_startZcloudinit_activation�evtr%r%r&�get_boot_telemetry5s�
 �
������

����������
r=c
Csbt��}t�tddt��|d|d|dd|dd|dd|d	ftj�}t�|�|S)
z%Collect and report system informationzsystem informationztcloudinit_version=%s, kernel_version=%s, variant=%s, distro_name=%s, distro_version=%s, flavor=%s, python_version=%s�releaseZvariantZdistrr.�Zpython)	rZsystem_inforr5�SYSTEMINFO_EVENT_TYPErZversion_stringr7r8)�infor<r%r%r&�get_system_info�s$


���
rB��logger_func)�msgrcCs6t|�r||�t�td|tj�}tj|dhd�|S)zReport a diagnostic eventzdiagnostic message�log�Zexcluded_handler_types)�callablerr5�DIAGNOSTIC_EVENT_TYPEr7r8)rErDr<r%r%r&�report_diagnostic_event�s�rJcCsNt�t�|��}d|�d�d�}t�t|t�	|�tj
�}tj|hd�d�|S)zReport a compressed eventzgz+b64�ascii)�encoding�data>�printZwebhookrFrG)�base64Zencodebytes�zlib�compress�decoderr5�COMPRESSED_EVENT_TYPE�json�dumpsr7r8)Z
event_nameZ
event_contentZcompressed_dataZ
event_datar<r%r%r&�report_compressed_event�s���rVc
Csnt�d�z$tjdgddd�\}}td|�Wn:tyh}z"tdt|�tjd�WYd}~n
d}~00dS)	zReport dmesg to KVP.zDumping dmesg log to KVPZdmesgFT)rRr,z$Exception when dumping dmesg log: %srCN)r0r1rrV�	ExceptionrJ�repr�warning)r:r;�exr%r%r&�report_dmesg_to_kvp�s

�r[c	cs@t��}t�tj�|��zdVWt�|�nt�|�0dS�N)�os�getcwd�chdir�path�
expanduser)ZnewdirZprevdirr%r%r&�cd�s
rb��)rM�retry_sleep�timeout_minutes)�url�headersrMrerfrc	
Cs�|dt�}d}d}|s�|d7}ztj|||dd�}Wq�Wnbtjy�}zHtd||||j|jftjd�t�||ks�d	t	|�vr��WYd}~n
d}~00t
|�qtd
||ftjd�|S)z�Readurl wrapper for querying wireserver.

    :param retry_sleep: Time to sleep before retrying.
    :param timeout_minutes: Retry up to specified number of minutes.
    :raises UrlError: on error fetching data.
    �<rNr.)rcri)rhrM�timeoutzdFailed HTTP request with Azure endpoint %s during attempt %d with exception: %s (code=%r headers=%r)rCzNetwork is unreachablez@Successful HTTP request with Azure endpoint %s after %d attempts)rrZreadurlZUrlErrorrJ�coderhr0r1�strr)	rgrhrMrerfrjZattempt�responser9r%r%r&�http_with_retries�s<���
�
�
��rn)�username�hostname�
disableSshPwdrcCs$t�d�}|j|||d�}|�d�S)Na.        <ns0:Environment xmlns:ns0="http://schemas.dmtf.org/ovf/environment/1"
         xmlns:ns1="http://schemas.microsoft.com/windowsazure"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
          <ns1:ProvisioningSection>
            <ns1:Version>1.0</ns1:Version>
            <ns1:LinuxProvisioningConfigurationSet>
              <ns1:ConfigurationSetType>LinuxProvisioningConfiguration
              </ns1:ConfigurationSetType>
              <ns1:UserName>{username}</ns1:UserName>
              <ns1:DisableSshPasswordAuthentication>{disableSshPwd}
              </ns1:DisableSshPasswordAuthentication>
              <ns1:HostName>{hostname}</ns1:HostName>
            </ns1:LinuxProvisioningConfigurationSet>
          </ns1:ProvisioningSection>
          <ns1:PlatformSettingsSection>
            <ns1:Version>1.0</ns1:Version>
            <ns1:PlatformSettings>
              <ns1:ProvisionGuestAgent>true</ns1:ProvisionGuestAgent>
            </ns1:PlatformSettings>
          </ns1:PlatformSettingsSection>
        </ns0:Environment>
        )rorprq�utf-8)�textwrap�dedent�format�encode)rorprqZOVF_ENV_TEMPLATE�retr%r%r&�build_minimal_ovfs��rxc@sHeZdZddd�Zdd�Zdejd�dd	�Zdee	ejd�dd
�Z
d
S)�AzureEndpointHttpClientZWALinuxAgentz
2012-11-30)zx-ms-agent-namezx-ms-versioncCsd|d�|_dS)NZDES_EDE3_CBC)zx-ms-cipher-namez!x-ms-guest-agent-public-x509-cert)�extra_secure_headers)�self�certificater%r%r&�__init__Ds�z AzureEndpointHttpClient.__init__F�rcCs,|j}|r |j��}|�|j�t||d�S)N)rh)rh�copy�updaterzrn)r{rg�securerhr%r%r&�getJs

zAzureEndpointHttpClient.getN)rMrcCs0|j}|dur"|j��}|�|�t|||d�S)N)rMrh)rhrr�rn)r{rgrM�
extra_headersrhr%r%r&�postQs


zAzureEndpointHttpClient.post)F)NN)r �
__module__�__qualname__rhr}r�UrlResponser�r	�bytesr�r%r%r%r&ry>s���ryc@seZdZdZdS)�InvalidGoalStateXMLExceptionz9Raised when GoalState XML is invalid or has missing data.N)r r�r��__doc__r%r%r%r&r�[sr�c@s2eZdZdeeefeedd�dd�Zdd�Z	dS)	�	GoalStateTN)�unparsed_xml�azure_endpoint_client�need_certificaterc
Cs*||_zt�|�|_Wn:tjyP}z td|tjd��WYd}~n
d}~00|�d�|_	|�d�|_
|�d�|_dD]0}t||�durzd|}t|tjd�t
|��qzd|_|�d	�}|du�r&|�r&tjd
dtd��8|jj|d
d�j|_|jdu�rt
d��Wd�n1�s0YdS)ahParses a GoalState XML string and returns a GoalState object.

        @param unparsed_xml: string representing a GoalState XML.
        @param azure_endpoint_client: instance of AzureEndpointHttpClient.
        @param need_certificate: switch to know if certificates is needed.
        @return: GoalState object representing the GoalState XML string.
        z!Failed to parse GoalState XML: %srCNz./Container/ContainerIdz4./Container/RoleInstanceList/RoleInstance/InstanceIdz
./Incarnation)�container_id�instance_id�incarnationzMissing %s in GoalState XMLzD./Container/RoleInstanceList/RoleInstance/Configuration/Certificateszget-certificates-xmlzget certificates xmlrT)r�z/Azure endpoint returned empty certificates xml.)r��ET�
fromstring�root�
ParseErrorrJr0rY�_text_from_xpathr�r�r��getattrr��certificates_xmlrrr!r��contents)r{r�r�r�r9�attrrErgr%r%r&r}`sH
��
���
�zGoalState.__init__cCs|j�|�}|dur|jSdSr\)r��find�text)r{Zxpath�elementr%r%r&r��szGoalState._text_from_xpath)T)
r r�r�rrlr�ry�boolr}r�r%r%r%r&r�_s�
�7r�c@s�eZdZddd�Zdd�Zdd�Zedd	��Zejd
d	��Ze	dd��Z
ee	d
d���Ze	dd��Z
e	dd��Ze	dd��Ze	dd��ZdS)�OpenSSLManagerzTransportPrivate.pemzTransportCert.pem)�private_keyr|cCst��|_d|_|��dSr\)rZmkdtemp�tmpdir�_certificate�generate_certificate�r{r%r%r&r}�s
zOpenSSLManager.__init__cCst�|j�dSr\)rZdel_dirr�r�r%r%r&�clean_up�szOpenSSLManager.clean_upcCs|jSr\�r�r�r%r%r&r|�szOpenSSLManager.certificatecCs
||_dSr\r�)r{�valuer%r%r&r|�scCs�t�d�|jdur"t�d�dSt|j��zt�ddddddd	d
ddd
|jdd|jdg�d}t�|jd��	�D]}d|vrx||�
�7}qx||_Wd�n1s�0Yt�d�dS)Nz7Generating certificate for communication with fabric...zCertificate already generated.�opensslZreqz-x509z-nodesz-subjz/CN=LinuxTransportz-daysZ32768z-newkeyzrsa:2048z-keyoutr�z-outr|�ZCERTIFICATEzNew certificate generated.)r0r1r|rbr�r�certificate_namesrZload_text_file�
splitlines�rstrip)r{r|�liner%r%r&r��s<


���$z#OpenSSLManager.generate_certificatecCs"ddd|g}tj||d�\}}|S)Nr�Zx509z-noout�rM)r)�actionZcert�cmd�resultr;r%r%r&�_run_x509_action�szOpenSSLManager._run_x509_actioncCs*|�d|�}gd�}tj||d�\}}|S)Nz-pubkey)z
ssh-keygenz-iz-mZPKCS8z-fz
/dev/stdinr�)r�r)r{r|Zpub_keyZ
keygen_cmd�ssh_keyr;r%r%r&�_get_ssh_key_from_cert�sz%OpenSSLManager._get_ssh_key_from_certcCs6|�d|�}|�d�}||dd��d�}d�|�S)aopenssl 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\n'

        Azure control plane passes that fingerprint as so:
        '073E19D14D1C799224C6A0FD8DDAB6A8BF27D473'
        z-fingerprintr-r.����:r�)r�r�r4�join)r{r|Zraw_fp�eq�octetsr%r%r&�_get_fingerprint_from_cert�s	
z)OpenSSLManager._get_fingerprint_from_certcCs�t�|��d�}|j}ddddd|�d�g}t|j��8tjdjfi|j	��d	d
�
|�d�\}}Wd�n1st0Y|S)
z�Decrypt the certificates XML document using the our private key;
        return the list of certs and private keys contained in the doc.
        z.//DatasMIME-Version: 1.0s<Content-Disposition: attachment; filename="Certificates.p7m"s?Content-Type: application/x-pkcs7-mime; name="Certificates.p7m"s!Content-Transfer-Encoding: base64�rrzuopenssl cms -decrypt -in /dev/stdin -inkey {private_key} -recip {certificate} | openssl pkcs12 -nodes -password pass:T�
)�shellrMN)r�r�r�r�rvrbr�rrur�r�)r{r��tagZcertificates_content�linesr:r;r%r%r&�_decrypt_certs_from_xml�s$���(z&OpenSSLManager._decrypt_certs_from_xmlc	Csv|�|�}g}i}|��D]V}|�|�t�d|�r:g}qt�d|�rd�|�}|�|�}|�|�}|||<g}q|S)z�Given the Certificates XML document, return a dictionary of
        fingerprints and associated SSH keys derived from the certs.z[-]+END .*?KEY[-]+$z[-]+END .*?CERTIFICATE[-]+$�
)r�r��append�re�matchr�r�r�)	r{r�r:�current�keysr�r|r��fingerprintr%r%r&�parse_certificatess




z!OpenSSLManager.parse_certificatesN)r r�r�r�r}r��propertyr|�setterr(r��staticmethodr�r�r�r�r�r%r%r%r&r��s,�


!



r�c@s�eZdZe�d�Ze�d�ZdZdZdZ	dZ
eee
dd�d	d
�Zedd�dd
��Zee
dd�dd��Zde
e
e
e
ed�dd�Zeedd�dd��ZdS)�GoalStateHealthReportera�        <?xml version="1.0" encoding="utf-8"?>
        <Health xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns:xsd="http://www.w3.org/2001/XMLSchema">
          <GoalStateIncarnation>{incarnation}</GoalStateIncarnation>
          <Container>
            <ContainerId>{container_id}</ContainerId>
            <RoleInstanceList>
              <Role>
                <InstanceId>{instance_id}</InstanceId>
                <Health>
                  <State>{health_status}</State>
                  {health_detail_subsection}
                </Health>
              </Role>
            </RoleInstanceList>
          </Container>
        </Health>
        z�        <Details>
          <SubStatus>{health_substatus}</SubStatus>
          <Description>{health_description}</Description>
        </Details>
        ZReadyZNotReadyZProvisioningFailediN)�
goal_stater��endpointrcCs||_||_||_dS)a?Creates instance that will report provisioning status to an endpoint

        @param goal_state: An instance of class GoalState that contains
            goal state info such as incarnation, container id, and instance id.
            These 3 values are needed when reporting the provisioning status
            to Azure
        @param azure_endpoint_client: Instance of class AzureEndpointHttpClient
        @param endpoint: Endpoint (string) where the provisioning status report
            will be sent to
        @return: Instance of class GoalStateHealthReporter
        N)�_goal_state�_azure_endpoint_client�	_endpoint)r{r�r�r�r%r%r&r}Fsz GoalStateHealthReporter.__init__r~c
Cs�|j|jj|jj|jj|jd�}t�d�z|j|d�Wn8t	yr}z t
d|tjd��WYd}~n
d}~00t�d�dS)N)r�r�r��statusz Reporting ready to Azure fabric.��documentz#exception while reporting ready: %srCzReported ready to Azure fabric.)
�build_reportr�r�r�r��PROVISIONING_SUCCESS_STATUSr0r1�_post_health_reportrWrJ�errorrA)r{r�r9r%r%r&�send_ready_signal[s �
�z)GoalStateHealthReporter.send_ready_signal�rrc
Cs�|j|jj|jj|jj|j|j|d�}z|j|d�Wn<tyr}z$d|}t	|t
jd��WYd}~n
d}~00t
�d�dS)N)r�r�r�r��	substatusrr�z%exception while reporting failure: %srCz!Reported failure to Azure fabric.)
r�r�r�r�r��PROVISIONING_NOT_READY_STATUS�PROVISIONING_FAILURE_SUBSTATUSr�rWrJr0r�rY)r{rr�r9rEr%r%r&�send_failure_signalos�z+GoalStateHealthReporter.send_failure_signal)r�r�r�r�rc	Csbd}|dur.|jjt|�t|d|j��d�}|jjtt|��t|�t|�t|�|d�}|�d�S)Nr�)Zhealth_substatusZhealth_description)r�r�r�Z
health_statusZhealth_detail_subsectionrr)�%HEALTH_DETAIL_SUBSECTION_XML_TEMPLATErur
�"HEALTH_REPORT_DESCRIPTION_TRIM_LEN�HEALTH_REPORT_XML_TEMPLATErlrv)	r{r�r�r�r�r�rZ
health_detailZ
health_reportr%r%r&r��s 	��
�z$GoalStateHealthReporter.build_report)r�rcCsBtd�t�d�d�|j�}|jj||ddid�t�d�dS)Nrz&Sending health report to Azure fabric.zhttp://{}/machine?comp=healthzContent-Typeztext/xml; charset=utf-8)rMr�z/Successfully sent health report to Azure fabric)rr0r1rur�r�r�)r{r�rgr%r%r&r��s
�z+GoalStateHealthReporter._post_health_report)NN)r r�r�rsrtr�r�r�r�r�r�r�ryrlr}r(r�r�r�r�r�r%r%r%r&r� s<��	���r�c@s�eZdZed�dd�Zdd�Zeejdd�dd	��Z	edeje
eed�d
d��Zeedd�d
d��Z
eeed�dd��Zeed�dd��Zeeeefeed�dd��Zeeeed�dd��Zeeeed�dd��ZdS)�WALinuxAgentShim�r�cCs||_d|_d|_dSr\)r��openssl_managerr�)r{r�r%r%r&r}�szWALinuxAgentShim.__init__cCs|jdur|j��dSr\)r�r�r�r%r%r&r��s
zWALinuxAgentShim.clean_upN)�distrorc
CsTt�d�z|�|�Wn6tyN}ztd|tjd�WYd}~n
d}~00dS)NzEjecting the provisioning isoz(Failed ejecting the provisioning iso: %srC)r0r1Zeject_mediarWrJr�)r{�iso_devr�r9r%r%r&�	eject_iso�s
�zWALinuxAgentShim.eject_isocCs�d}|jdur&|dur&t�|_|jj}|jdur:t|�|_|j|dud�}d}|durb|�||�}t||j|j�}|dur�|j	||d�|�
�|S)a�Gets the VM's GoalState from Azure, uses the GoalState information
        to report ready/send the ready signal/provisioning complete signal to
        Azure, and then uses pubkey_info to filter and obtain the user's
        pubkeys from the GoalState.

        @param pubkey_info: List of pubkey values and fingerprints which are
            used to filter and obtain the user's pubkey values from the
            GoalState.
        @return: The list of user's authorized pubkey values.
        N�r�)r�)r�r�r|r�ry�_fetch_goal_state_from_azure�_get_user_pubkeysr�r�r�r�)r{r��pubkey_infor�Zhttp_client_certificater��ssh_keys�health_reporterr%r%r&�"register_with_azure_and_fetch_data�s*
��
�z3WALinuxAgentShim.register_with_azure_and_fetch_datar�cCs@|jdurtd�|_|jdd�}t||j|j�}|j|d�dS)z�Gets the VM's GoalState from Azure, uses the GoalState information
        to report failure/send provisioning failure signal to Azure.

        @param: user visible error description of provisioning failure.
        NFr��r)r�ryr�r�r�r�)r{rr�r�r%r%r&�&register_with_azure_and_report_failure�s


�z7WALinuxAgentShim.register_with_azure_and_report_failure)r�rcCs|��}|�||�S)aFetches the GoalState XML from the Azure endpoint, parses the XML,
        and returns a GoalState object.

        @param need_certificate: switch to know if certificates is needed.
        @return: GoalState object representing the GoalState XML
        )�"_get_raw_goal_state_xml_from_azure�_parse_raw_goal_state_xml)r{r��unparsed_goal_state_xmlr%r%r&r�s
�z-WALinuxAgentShim._fetch_goal_state_from_azurer~c
Cs�t�d�d�|j�}z@tjddtd��|j�|�}Wd�n1sJ0YWn8t	y�}z t
d|tjd��WYd}~n
d}~00t�d	�|j
S)
z�Fetches the GoalState XML from the Azure endpoint and returns
        the XML as a string.

        @return: GoalState XML string
        zRegistering with Azure...z!http://{}/machine/?comp=goalstatezgoalstate-retrievalzretrieve goalstaterNz9failed to register with Azure and fetch GoalState XML: %srCz#Successfully fetched GoalState XML.)r0rArur�rrr!r�r�rWrJrYr1r�)r{rgrmr9r%r%r&r�s&
�.��
z3WALinuxAgentShim._get_raw_goal_state_xml_from_azure)r�r�rc
Cs�zt||j|�}Wn8tyJ}z td|tjd��WYd}~n
d}~00d�d|jd|jd|j	g�}t|tj
d�|S)aParses a GoalState XML string and returns a GoalState object.

        @param unparsed_goal_state_xml: GoalState XML string
        @param need_certificate: switch to know if certificates is needed.
        @return: GoalState object representing the GoalState XML
        z"Error processing GoalState XML: %srCNz, zGoalState XML container id: %szGoalState XML instance id: %szGoalState XML incarnation: %s)r�r�rWrJr0rYr�r�r�r�r1)r{r�r�r�r9rEr%r%r&r�2s(����z*WALinuxAgentShim._parse_raw_goal_state_xml)r�r�rcCsHg}|jdurD|durD|jdurDt�d�|j�|j�}|�||�}|S)a�Gets and filters the VM admin user's authorized pubkeys.

        The admin user in this case is the username specified as "admin"
        when deploying VMs on Azure.
        See https://docs.microsoft.com/en-us/cli/azure/vm#az-vm-create.
        cloud-init expects a straightforward array of keys to be dropped
        into the admin user's authorized_keys file. Azure control plane exposes
        multiple public keys to the VM via wireserver. Select just the
        admin user's key(s) and return them, ignoring any other certs.

        @param goal_state: GoalState object. The GoalState object contains
            a certificate XML, which contains both the VM user's authorized
            pubkeys and other non-user pubkeys, which are used for
            MSI and protected extension handling.
        @param pubkey_info: List of VM user pubkey dicts that were previously
            obtained from provisioning data.
            Each pubkey dict in this list can either have the format
            pubkey['value'] or pubkey['fingerprint'].
            Each pubkey['fingerprint'] in the list is used to filter
            and obtain the actual pubkey value from the GoalState
            certificates XML.
            Each pubkey['value'] requires no further processing and is
            immediately added to the return list.
        @return: A list of the VM user's authorized pubkey values.
        Nz/Certificate XML found; parsing out public keys.)r�r�r0r1r��_filter_pubkeys)r{r�r�r��keys_by_fingerprintr%r%r&r�Ts���
�z"WALinuxAgentShim._get_user_pubkeys)r�r�rcCs|g}|D]n}d|vr,|dr,|�|d�qd|vrj|drj|d}||vr\|�||�qvt�d|�qt�d|�q|S)a8Filter and return only the user's actual pubkeys.

        @param keys_by_fingerprint: pubkey fingerprint -> pubkey value dict
            that was obtained from GoalState Certificates XML. May contain
            non-user pubkeys.
        @param pubkey_info: List of VM user pubkeys. Pubkey values are added
            to the return list without further processing. Pubkey fingerprints
            are used to filter and obtain the actual pubkey values from
            keys_by_fingerprint.
        @return: A list of the VM user's authorized pubkey values.
        r�r�zIovf-env.xml specified PublicKey fingerprint %s not found in goalstate XMLzFovf-env.xml specified PublicKey with neither value nor fingerprint: %s)r�r0rY)r�r�r�Zpubkeyr�r%r%r&r�~s"
��z WALinuxAgentShim._filter_pubkeys)NN)r r�r�rlr}r�r(r�Distror�r	rr�r�r�r�r�r�r�rr��listr�r��dictr�r%r%r%r&r��s:
�
�%�
�!�)r�)r�r�r�r�cCs4t|d�}z|j|||d�W|��S|��0dS)Nr�)r�r�r�)r�r�r�)r�r�r�r��shimr%r%r&�get_metadata_from_fabric�s
��r�zerrors.ReportableError)r�r�cCs:t|d�}|��}z|j|d�W|��n
|��0dS)Nr�r�)r�Zas_encoded_reportr�r�)r�r�r�rr%r%r&�report_failure_to_fabric�s

r�cCs(td|tjd�td|tjd�dS)Nzdhclient output stream: %srCzdhclient error stream: %s)rJr0r1)r:�errr%r%r&�dhcp_log_cb�s
�
�r�c@seZdZdS)�NonAzureDataSourceN)r r�r�r%r%r%r&r��sr�c@s�eZdZddd�Zdddddddddd�	eeeeeeeeeeeee	eeeedd�
dd	�Z
ed
�dd�Zeedd
�dd��Z
deeed�dd�Zdeeeed�dd�Zdd�Zdd�Zdd�ZdS)�	OvfEnvXmlz)http://schemas.dmtf.org/ovf/environment/1z)http://schemas.microsoft.com/windowsazure)Zovf�waNF�	ro�passwordrp�custom_data�disable_ssh_password_auth�public_keys�preprovisioned_vm�preprovisioned_vm_type�provision_guest_proxy_agent)
rorrprrrrrrrc	
Cs>||_||_||_||_||_|p$g|_||_||_|	|_dSr\r)
r{rorrprrrrrrr%r%r&r}�s

zOvfEnvXml.__init__r~cCs|j|jkSr\)�__dict__)r{�otherr%r%r&�__eq__�szOvfEnvXml.__eq__)�ovf_env_xmlrc
Cs|zt�|�}Wn4tjyB}ztj|d�|�WYd}~n
d}~00|�d|j�dur^td��t�}|�	|�|�
|�|S)z�Parser for ovf-env.xml data.

        :raises NonAzureDataSource: if XML is not in Azure's format.
        :raises errors.ReportableErrorOvfParsingException: if XML is
                unparsable or invalid.
        )�	exceptionNz./wa:ProvisioningSectionz=Ignoring non-Azure ovf-env.xml: ProvisioningSection not found)r�r�r�rZ"ReportableErrorOvfParsingExceptionr��
NAMESPACESr�r��&_parse_linux_configuration_set_section� _parse_platform_settings_section)�clsrr�r9�instancer%r%r&�
parse_text�s$�

zOvfEnvXml.parse_textr)r�required�	namespacecCsp|�d||ftj�}t|�dkrFd|}t�|�|rBt�|��dSt|�dkrht�d|t|�f��|dS)Nz./%s:%sr�missing configuration for %rr.�*multiple configuration matches for %r (%d))�findallr�r�lenr0r1r�!ReportableErrorOvfInvalidMetadata)r{�noderrr�matchesrEr%r%r&�_finds �


��zOvfEnvXml._find)rr�
decode_base64�
parse_boolc
Cs�|�d|tj�}t|�dkrBd|}t�|�|r>t�|��|St|�dkrdt�d|t|�f��|dj}	|	durz|}	|r�|	dur�t	�
d�|	����}	|r�t
�|	�}	|	S)Nz./wa:rrr.rr�)rr�rrr0r1rrr�rOZ	b64decoder�r4rZtranslate_bool)
r{rrrrr�defaultrrEr�r%r%r&�_parse_propertys*	


��

zOvfEnvXml._parse_propertycCs�|j|ddd�}|j|ddd�}|j|dddd�|_|j|ddd�|_|j|d	dd�|_|j|d
dd�|_|j|dddd�|_|�|�dS)
NZProvisioningSectionT�rZ!LinuxProvisioningConfigurationSetZ
CustomDataF)rrZUserNameZUserPasswordZHostNameZ DisableSshPasswordAuthentication)rr)rr!rrorrpr�_parse_ssh_section)r{r�Zprovisioning_section�
config_setr%r%r&r?s<�������z0OvfEnvXml._parse_linux_configuration_set_sectioncCsb|j|ddd�}|j|ddd�}|j|ddddd�|_|j|ddd�|_|j|d	dddd�|_dS)
NZPlatformSettingsSectionTr"ZPlatformSettingsZPreprovisionedVmF)rr rZPreprovisionedVMTypeZProvisionGuestProxyAgent)rr!rrr)r{r�Zplatform_settings_sectionZplatform_settingsr%r%r&ras2�����z*OvfEnvXml._parse_platform_settings_sectionc	Cs�g|_|j|ddd�}|dur"dS|j|ddd�}|dur>dS|�dtj�D]N}|j|ddd�}|j|ddd�}|j|dd	dd
�}|||d�}|j�|�qLdS)NZSSHFr"Z
PublicKeysz./wa:PublicKeyZFingerprint�PathZValuer�)r r)r�r`r�)rrrr�rr!r�)	r{r$Zssh_sectionZpublic_keys_sectionZ
public_keyr�r`r�r�r%r%r&r#}s0�����zOvfEnvXml._parse_ssh_section)r)FFN)r r�r�rr	rlr�r�rr�r}r�classmethodrrr!rrr#r%r%r%r&r��sZ��
�����$"r�)NN)JrOrTZloggingr]r�rsrP�
contextlibrrrrr�typingrrr	r
rZ	xml.etreerr�Zxml.sax.saxutilsr
Z	cloudinitrrrrrrZcloudinit.reportingrZcloudinit.sources.azurerZ	getLoggerr r0ZDEFAULT_WIRESERVER_ENDPOINTr6r@rIrSrr!rr(r=rBrlr5rJrVr[rbr�r��intr�rnrxryrWr�r�r�r�r�r�r�r�r�r�r�r%r%r%r&�<module>s� 
� 
U
��


	��7�"?f�
�		

© 2025 Cubjrnet7