Ë
    x[h‡¡  ã                   óR  — d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZ d dl	m	Z	m
Z
 d dlmZmZ d dlmZmZmZmZmZ d dlmZ d dlmZ d dlmZmZmZmZmZmZ d d	lm Z  d d
l!m"Z"  ejF                  e$«      Z%dZ&dZ'dZ(dZ)dZ* e jV                  ddd¬«      Z, ed«      Z-dede-f   dede-f   fd„Z.e.d„ «       Z/e.d„ «       Z0ddœde1de jd                  fd„Z3d„ Z4e.d„ «       Z5ed „ «       Z6e.dd!d"d#œd$e1d%e7d&ee8   d'e9d(e9dejt                  fd)„«       Z;d*e1d+e1d,e1de8fd-„Z< G d.„ d/«      Z= G d0„ d1e>«      Z? G d2„ d3«      Z@ G d4„ d5«      ZA G d6„ d7«      ZB G d8„ d9«      ZCe.	 	 dGd:e1d;ejˆ                  d<eee1      d=ee1   fd>„«       ZEe.d:e1d?d@fdA„«       ZFdB„ ZG G dC„ dDe>«      ZH G dE„ dF«      ZIy)Hé    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-telemetryzsystem-infoÚ
diagnosticÚ
compressedzazure-dsz initialize reporter for azure dsT)ÚnameÚdescriptionÚreporting_enabledÚTÚfunc.Úreturnc                 ó   ‡ — ˆ fd„}|S )Nc                  ó    •— t        j                  ‰j                  ‰j                  t        ¬«      5   ‰| i |¤Žcd d d «       S # 1 sw Y   y xY w)N©r   r   Úparent)r   ÚReportEventStackÚ__name__Úazure_ds_reporter)ÚargsÚkwargsr   s     €úA/usr/lib/python3/dist-packages/cloudinit/sources/helpers/azure.pyÚimplz)azure_ds_telemetry_reporter.<locals>.impl*   sF   ø€ Ü×$Ñ$Ø—‘ØŸ™Ü$ô
ñ 	)ñ
 ˜Ð( Ñ(÷	)÷ 	)ò 	)ús   ²AÁA© )r   r*   s   ` r)   Úazure_ds_telemetry_reporterr,   )   s   ø€ ô)ð €Kó    c                  ó,  — t        j                  «       st        d«      ‚t        j	                  d«       	 t        t        «       «      t        t        j                  «       «      z
  } 	 t        j                  g d¢d¬«      \  }}d}|rd|v r|j                  d«      d	   }|st        d
«      ‚| t        |«      dz  z   }	 t        j                  g d¢d¬«      \  }}d}|rd|v r|j                  d«      d	   }|st        d«      ‚| t        |«      dz  z   }t        j                  t        ddt!        j"                  | t$        j&                  «      j)                  «       ›dt!        j"                  |t$        j&                  «      j)                  «       ›dt!        j"                  |t$        j&                  «      j)                  «       ›�t        j*                  «      }t        j,                  |«       |S # t        $ r}t        d«      |‚d}~ww xY w# t        j                  $ r}t        d|z  «      |‚d}~wt        $ r}t        d|z  «      |‚d}~ww xY w# t        j                  $ r}t        d|z  «      |‚d}~wt        $ r}t        d|z  «      |‚d}~ww xY w)z[Report timestamps related to kernel initialization and systemd
    activation of cloud-initz1distro not using systemd, skipping boot telemetryzCollecting boot telemetryz*Failed to determine kernel start timestampN)Ú	systemctlÚshowú-pÚUserspaceTimestampMonotonicT)Úcaptureú=é   z8Failed to parse UserspaceTimestampMonotonic from systemdi@B z-Failed to get UserspaceTimestampMonotonic: %sz<Failed to parse UserspaceTimestampMonotonic from systemd: %s)r/   r0   zcloud-init-localr1   ÚInactiveExitTimestampMonotonicz;Failed to parse InactiveExitTimestampMonotonic from systemdz0Failed to get InactiveExitTimestampMonotonic: %sz?Failed to parse InactiveExitTimestampMonotonic from systemd: %sr   zkernel_start=z user_start=z cloudinit_activation=)r   Úuses_systemdÚRuntimeErrorÚLOGÚdebugÚfloatr   r   ÚuptimeÚ
ValueErrorr   ÚsplitÚProcessExecutionErrorr   ÚReportingEventÚBOOT_EVENT_TYPEr   Úfromtimestampr   ÚutcÚ	isoformatÚDEFAULT_EVENT_ORIGINÚreport_event)Úkernel_startÚeÚoutÚ_ÚtsmÚ
user_startÚcloudinit_activationÚevts           r)   Úget_boot_telemetryrO   5   s‡  € ô ×ÑÔ!ÜÐNÓOÐOä‡I�IÐ)Ô*ðPÜœT›V“}¤u¬T¯[©[«]Ó';Ñ;ˆðÜ—‘ÚFØô
‰ˆˆQð ˆÙ�3˜#‘:Ø—)‘)˜C“. Ñ#ˆCáÜØJóð ð "¤U¨3£Z°'Ñ%9Ñ:ˆ
ðÜ—‘òð ô	
‰ˆˆQð ˆÙ�3˜#‘:Ø—)‘)˜C“. Ñ#ˆCÙÜØMóð ð  ,¬u°S«z¸GÑ/CÑDÐô ×
Ñ
ÜÙô ×"Ñ" <´·±Ó>×HÑHÕJÜ×"Ñ" :¬x¯|©|Ó<×FÑFÕHÜ×"Ñ"Ø$¤h§l¡lóç‰i‹kðð		
ô 	×#Ñ#ó€Cô ×Ñ˜Ôð €JøôS ò PÜÐGÓHÈaÐOûðPûô$ ×%Ñ%ò ÜØ;¸aÑ?ó
àð	ûô ò ÜØJÈQÑNó
àð	ûðûô2 ×%Ñ%ò ÜØ>ÀÑBó
àð	ûô ò ÜØMØñó
ð ð	ûðúsa   ¶1G/ Á(AH Â?AI Ç/	H	Ç8HÈH	ÈIÈH.È.IÈ:I	É	IÉJÉ$I3É3JÉ?JÊJc                  ó0  — t        j                  «       } t        j                  t        ddt        j                  «       ›d| d   ›d| d   ›d| d   d	   ›d
| d   d   ›d| d   d   ›d| d   ›�t        j                  «      }t        j                  |«       |S )z%Collect and report system informationzsystem informationzcloudinit_version=z, kernel_version=Úreleasez
, variant=Úvariantz, distro_name=Údistr   z, distro_version=r5   z	, flavor=é   z, python_version=Úpython)	r   Úsystem_infor   r@   ÚSYSTEMINFO_EVENT_TYPEr   Úversion_stringrE   rF   )ÚinforN   s     r)   Úget_system_inforZ   ‹   s“   € ô ×ÑÓ€DÜ
×
Ñ
ÜÙô
 ×"Ñ"Õ$Ø�‹OØ�‹OØ�‰L˜‹OØ�‰L˜‹OØ�‰L˜‹OØ�ŠNð	
ô 	×#Ñ#ó€Cô" ×Ñ˜Ôð €Jr-   ©Úlogger_funcÚmsgc                ó°   — t        |«      r || «       t        j                  t        d| t        j                  «      }t        j
                  |dh¬«       |S )zReport a diagnostic eventzdiagnostic messageÚlog©Úexcluded_handler_types)Úcallabler   r@   ÚDIAGNOSTIC_EVENT_TYPErE   rF   )r]   r\   rN   s      r)   Úreport_diagnostic_eventrd   ¦   sQ   € ô �ÔÙ�CÔÜ
×
Ñ
ÜØØÜ×#Ñ#ó	€Cô ×Ñ˜°U°GÕ<ð €Jr-   c                 ó*  — t        j                  t        j                  |«      «      }d|j	                  d«      dœ}t        j                  t        | t        j                  |«      t
        j                  «      }t        j                  |h d£¬«       |S )zReport a compressed eventzgz+b64Úascii)ÚencodingÚdata>   r_   ÚprintÚwebhookr`   )Úbase64ÚencodebytesÚzlibÚcompressÚdecoder   r@   ÚCOMPRESSED_EVENT_TYPEÚjsonÚdumpsrE   rF   )Ú
event_nameÚevent_contentÚcompressed_dataÚ
event_datarN   s        r)   Úreport_compressed_eventrw   ¸   s}   € ä×(Ñ(¬¯©°}Ó)EÓF€OàØ×&Ñ& wÓ/ñ€Jô ×
Ñ
ÜØÜ�
‰
�:ÓÜ×#Ñ#ó	€Cô ×ÑØÒ$?õð
 €Jr-   c                  óú   — t         j                  d«       	 t        j                  dgdd¬«      \  } }t        d| «       y# t        $ r1}t        dt        |«      z  t         j                  ¬«       Y d}~yd}~ww xY w)	zReport dmesg to KVP.zDumping dmesg log to KVPÚdmesgFT)ro   r3   z$Exception when dumping dmesg log: %sr[   N)r9   r:   r   rw   Ú	Exceptionrd   ÚreprÚwarning)rI   rJ   Úexs      r)   Úreport_dmesg_to_kvpr~   Í   sh   € ô ‡I�IÐ(Ô)ð
Ü—‘˜G˜9¨U¸DÔA‰ˆˆQÜ ¨Õ-øÜò 
ÜØ2´T¸"³XÑ=ÜŸ™÷	
ò 	
ûð
ús   —(A  Á 	A:Á	'A5Á5A:c              #   ó   K  — t        j                  «       }t        j                  t         j                  j	                  | «      «       	 d –— t        j                  |«       y # t        j                  |«       w xY w­w©N)ÚosÚgetcwdÚchdirÚpathÚ
expanduser)ÚnewdirÚprevdirs     r)   Úcdrˆ   Û   sL   è ø€ ä�i‰i‹k€GÜ‡H�HŒR�W‰W×Ñ Ó'Ô(ðÛä
�‰�ÕøŒ�‰�Õüs   ‚AA>Á
A$ ÁA>Á$A;Á;A>é   é   )rh   Úretry_sleepÚtimeout_minutesÚurlÚheadersrh   r‹   rŒ   c          	      óº  — |dz  t        «       z   }d}d}|s |dz  }	 t        j                  | ||d¬«      }	 t	        d
| |fz  t        j                  ¬«       |S # t        j                  $ r_}t	        d| |||j
                  |j                  fz  t        j                  ¬«       t        «       |z   |k\  sd	t        |«      v r‚ Y d}~nd}~ww xY wt        |«       |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.
    é<   r   Nr5   )r‰   r�   )rŽ   rh   ÚtimeoutzdFailed HTTP request with Azure endpoint %s during attempt %d with exception: %s (code=%r headers=%r)r[   zNetwork is unreachablez@Successful HTTP request with Azure endpoint %s after %d attempts)r   r   ÚreadurlÚUrlErrorrd   ÚcoderŽ   r9   r:   Ústrr   )	r�   rŽ   rh   r‹   rŒ   r‘   ÚattemptÚresponserH   s	            r)   Úhttp_with_retriesr˜   å   sö   € ð  Ñ"¤T£VÑ+€Gà€GØ€HÙØ�1‰ˆð	Ü!×)Ñ)Ø˜W¨4¸ôˆHð ô, ð	Ø˜g˜ñ	'ä—I‘Iõð
 €Oøô5 ×"Ñ"ò 	Ü#ðEà˜  A§F¡F¨A¯I©IÐ6ñ7ô  ŸI™Iõ	ô “˜Ñ$¨Ò/Ø+¬s°1«vÑ5àô 6ûð	úô& 	ˆkÔò5 øs   �A ÁCÁ,ACÃCÚusernameÚhostnameÚdisableSshPwdc                 óv   — t        j                  d«      }|j                  | ||¬«      }|j                  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>
        )r™   rš   r›   úutf-8)ÚtextwrapÚdedentÚformatÚencode)r™   rš   r›   ÚOVF_ENV_TEMPLATEÚrets        r)   Úbuild_minimal_ovfr¤     sG   € ô  —‘ð	óÐð2 ×
!Ñ
!Ø H¸Mð "ó €Cð �:‰:�gÓÐr-   c                   ól   — e Zd ZdddœZd„ Zd
dej                  fd„Z	 ddee	   dej                  fd	„Z
y)ÚAzureEndpointHttpClientÚWALinuxAgentz
2012-11-30)zx-ms-agent-namezx-ms-versionc                 ó   — d|dœ| _         y )NÚDES_EDE3_CBC)zx-ms-cipher-namez!x-ms-guest-agent-public-x509-cert)Úextra_secure_headers)ÚselfÚcertificates     r)   Ú__init__z AzureEndpointHttpClient.__init__D  s   € à .Ø1<ñ%
ˆÕ!r-   r   c                 ó¢   — | j                   }|r5| j                   j                  «       }|j                  | j                  «       t	        ||¬«      S )N)rŽ   )rŽ   ÚcopyÚupdaterª   r˜   )r«   r�   ÚsecurerŽ   s       r)   ÚgetzAzureEndpointHttpClient.getJ  s?   € Ø—,‘,ˆÙØ—l‘l×'Ñ'Ó)ˆGØ�N‰N˜4×4Ñ4Ô5Ü  ¨gÔ6Ð6r-   Nrh   c                 ó�   — | j                   }|�+| j                   j                  «       }|j                  |«       t        |||¬«      S )N)rh   rŽ   )rŽ   r¯   r°   r˜   )r«   r�   rh   Úextra_headersrŽ   s        r)   ÚpostzAzureEndpointHttpClient.postQ  s@   € ð —,‘,ˆØÐ$Ø—l‘l×'Ñ'Ó)ˆGØ�N‰N˜=Ô)Ü  ¨4¸ÔAÐAr-   )F©NN)r%   Ú
__module__Ú__qualname__rŽ   r­   r   ÚUrlResponser²   r
   Úbytesrµ   r+   r-   r)   r¦   r¦   >  sO   „ à)Ø$ñ€Gò

ñ7¨
×(>Ñ(>ó 7ð @DñBØ! %™ðBà	×	Ñ	ôBr-   r¦   c                   ó   — e Zd ZdZy)ÚInvalidGoalStateXMLExceptionz9Raised when GoalState XML is invalid or has missing data.N)r%   r·   r¸   Ú__doc__r+   r-   r)   r¼   r¼   [  s   „ ÚCr-   r¼   c            	       ó8   — e Zd Z	 ddeeef   dededdfd„Zd„ Z	y)	Ú	GoalStateÚunparsed_xmlÚazure_endpoint_clientÚneed_certificater   Nc                 óâ  — || _         	 t        j                  |«      | _        | j                  d«      | _	        | j                  d«      | _
        | j                  d«      | _        dD ]9  }t        | |«      �Œd|z  }t        |t        j                  ¬«       t        |«      ‚ d| _        | j                  d	«      }|�m|rjt        j                   d
dt"        ¬«      5  | j                   j%                  |d¬«      j&                  | _        | j                  €t        d«      ‚	 ddd«       yyy# t        j                  $ r$}t        d|z  t        j                  ¬«       ‚ d}~ww xY w# 1 sw Y   yxY w)ah  Parses 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: %sr[   Nz./Container/ContainerIdz4./Container/RoleInstanceList/RoleInstance/InstanceIdz./Incarnation)Úcontainer_idÚinstance_idÚincarnationzMissing %s in GoalState XMLzD./Container/RoleInstanceList/RoleInstance/Configuration/Certificateszget-certificates-xmlzget certificates xmlr"   T)r±   z/Azure endpoint returned empty certificates xml.)rÁ   ÚETÚ
fromstringÚrootÚ
ParseErrorrd   r9   r|   Ú_text_from_xpathrÄ   rÅ   rÆ   Úgetattrr¼   Úcertificates_xmlr   r$   r&   r²   Úcontents)r«   rÀ   rÁ   rÂ   rH   Úattrr]   r�   s           r)   r­   zGoalState.__init__`  s…  € ð &;ˆÔ"ð	ÜŸ™ lÓ3ˆDŒIð !×1Ñ1Ð2KÓLˆÔØ×0Ñ0ØBó
ˆÔð  ×0Ñ0°ÓAˆÔàBò 	8ˆDÜ�t˜TÓ"Ñ*Ø3°dÑ:�Ü'¨¼¿¹ÕEÜ2°3Ó7Ð7ð		8ð !%ˆÔØ×#Ñ#ð*ó
ˆð ˆ?Ñ/Ü×(Ñ(Ø+Ø2Ü(ôñ ð
 )-×(BÑ(B×(FÑ(FØ ð )Gó )ç‘(ð Ô%ð ×(Ñ(Ð0Ü6ØIóð ð 1÷ð ð  0ˆ?øô1 �}‰}ò 	Ü#Ø3°aÑ7ÜŸK™Kõð ûð	ú÷2ð ús$   ‰D+ ÃAE%Ä+E"Ä>EÅE"Å%E.c                 óV   — | j                   j                  |«      }|�|j                  S y r€   )rÉ   ÚfindÚtext)r«   ÚxpathÚelements      r)   rË   zGoalState._text_from_xpath—  s'   € Ø—)‘)—.‘. Ó'ˆØÐØ—<‘<ÐØr-   )T)
r%   r·   r¸   r   r•   rº   r¦   Úboolr­   rË   r+   r-   r)   r¿   r¿   _  sA   „ ð
 "&ñ	5à˜C ˜JÑ'ð5ð  7ð5ð ð	5ð
 
ó5ónr-   r¿   c                   óÀ   — e Zd ZdddœZd„ Zd„ Zed„ «       Zej                  d„ «       Ze	d„ «       Z
ee	d	„ «       «       Ze	d
„ «       Ze	d„ «       Ze	d„ «       Ze	d„ «       Zy)ÚOpenSSLManagerzTransportPrivate.pemzTransportCert.pem)Úprivate_keyr¬   c                 ód   — t        j                  «       | _        d | _        | j	                  «        y r€   )r   ÚmkdtempÚtmpdirÚ_certificateÚgenerate_certificate©r«   s    r)   r­   zOpenSSLManager.__init__¤  s&   € Ü ×(Ñ(Ó*ˆŒØ ˆÔØ×!Ñ!Õ#r-   c                 óB   — t        j                  | j                  «       y r€   )r   Údel_dirrÛ   rÞ   s    r)   Úclean_upzOpenSSLManager.clean_up©  s   € Ü�‰�T—[‘[Õ!r-   c                 ó   — | j                   S r€   ©rÜ   rÞ   s    r)   r¬   zOpenSSLManager.certificate¬  s   € à× Ñ Ð r-   c                 ó   — || _         y r€   rã   )r«   Úvalues     r)   r¬   zOpenSSLManager.certificate°  s
   € à!ˆÕr-   c                 ó  — t         j                  d«       | j                  �t         j                  d«       y t        | j                  «      5  t        j
                  ddddddd	d
ddd| j                  d   d| j                  d   g«       d}t        j                  | j                  d   «      j                  «       D ]  }d|vsŒ||j                  «       z  }Œ || _        d d d «       t         j                  d«       y # 1 sw Y   ŒxY w)Nz7Generating certificate for communication with fabric...zCertificate already generated.ÚopensslÚreqz-x509z-nodesz-subjz/CN=LinuxTransportz-daysÚ32768z-newkeyzrsa:3072z-keyoutrØ   z-outr¬   Ú ÚCERTIFICATEzNew certificate generated.)r9   r:   r¬   rˆ   rÛ   r   Úcertificate_namesr   Úload_text_fileÚ
splitlinesÚrstrip)r«   r¬   Úlines      r)   rÝ   z#OpenSSLManager.generate_certificate´  s  € ä�	‰	ÐKÔLØ×ÑÐ'Ü�I‰IÐ6Ô7ØÜ�—‘‹_ñ 	+Ü�I‰IàØØØØØ(ØØØØØØ×*Ñ*¨=Ñ9ØØ×*Ñ*¨=Ñ9ðôð$ ˆKÜ×+Ñ+Ø×&Ñ& }Ñ5óç‰j‹lò1�ð !¨Ò,Ø 4§;¡;£=Ñ0‘Kð	1ð
  +ˆDÔ÷3	+ô4 	�	‰	Ð.Õ/÷5	+ð 	+ús   ÁA7C?ÃC?Ã?Dc                 óF   — ddd| g}t        j                   ||¬«      \  }}|S )Nrç   Úx509z-noout©rh   )r   )ÚactionÚcertÚcmdÚresultrJ   s        r)   Ú_run_x509_actionzOpenSSLManager._run_x509_actionÖ  s+   € ð ˜& (¨FÐ3ˆÜ—I‘I˜c¨Ô-‰	ˆ�Øˆr-   c                 óf   — | j                  d|«      }g d¢}t        j                  ||¬«      \  }}|S )Nz-pubkey)z
ssh-keygenz-iz-mÚPKCS8z-fz
/dev/stdinró   )rø   r   )r«   r¬   Úpub_keyÚ
keygen_cmdÚssh_keyrJ   s         r)   Ú_get_ssh_key_from_certz%OpenSSLManager._get_ssh_key_from_certÝ  s2   € à×'Ñ'¨	°;Ó?ˆÚLˆ
Ü—Y‘Y˜z°Ô8‰
ˆ�Øˆr-   c                 ó˜   — | j                  d|«      }|j                  d«      }||dz   d j                  d«      }dj                  |«      S )a  openssl 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-fingerprintr4   r5   éÿÿÿÿú:rê   )rø   rÑ   r>   Újoin)r«   r¬   Úraw_fpÚeqÚoctetss        r)   Ú_get_fingerprint_from_certz)OpenSSLManager._get_fingerprint_from_certä  sM   € ð ×&Ñ& ~°{ÓCˆØ�[‰[˜ÓˆØ˜˜Q™ Ð$×*Ñ*¨3Ó/ˆØ�w‰w�v‹Ðr-   c                 ór  — t        j                  |«      j                  d«      }|j                  }ddddd|j	                  d«      g}t        | j                  «      5  t        j                   dj                  di | j                  ¤Žd	d
j                  |«      ¬«      \  }}ddd«       |S # 1 sw Y   S xY w)z‘Decrypt the certificates XML document using the our private key;
        return the list of certs and private keys contained in the doc.
        z.//Datas   MIME-Version: 1.0s<   Content-Disposition: attachment; filename="Certificates.p7m"s?   Content-Type: application/x-pkcs7-mime; name="Certificates.p7m"s!   Content-Transfer-Encoding: base64r-   r�   zuopenssl cms -decrypt -in /dev/stdin -inkey {private_key} -recip {certificate} | openssl pkcs12 -nodes -password pass:Tó   
)Úshellrh   Nr+   )rÇ   rÈ   rÑ   rÒ   r¡   rˆ   rÛ   r   r    rì   r  )r«   rÍ   ÚtagÚcertificates_contentÚlinesrI   rJ   s          r)   Ú_decrypt_certs_from_xmlz&OpenSSLManager._decrypt_certs_from_xmlò  s¾   € ô
 �m‰mÐ,Ó-×2Ñ2°9Ó=ˆØ"Ÿx™xÐà ØKØNØ0ØØ ×'Ñ'¨Ó0ð
ˆô �—‘‹_ñ 	Ü—Y‘Yð*ð #ç#)¡6ñDà,0×,BÑ,BñDð Ø—Z‘Z Ó&ô‰FˆC�÷	ð ˆ
÷	ð ˆ
ús   ÁAB,Â,B6c                 óP  — | j                  |«      }g }i }|j                  «       D ]}  }|j                  |«       t        j                  d|«      rg }Œ-t        j                  d|«      sŒDdj                  |«      }| j                  |«      }| j                  |«      }|||<   g }Œ |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Í   rI   ÚcurrentÚkeysrð   r¬   rý   Úfingerprints	            r)   Úparse_certificatesz!OpenSSLManager.parse_certificates  s¨   € ð ×*Ñ*Ð+;Ó<ˆØˆØˆØ—N‘NÓ$ò 
	ˆDØ�N‰N˜4Ô Ü�x‰xÐ.°Ô5à‘Ü—‘Ð8¸$Õ?Ø"Ÿi™i¨Ó0�Ø×5Ñ5°kÓB�Ø"×=Ñ=¸kÓJ�Ø$+��[Ñ!Ø‘ð
	ð ˆr-   N)r%   r·   r¸   rì   r­   rá   Úpropertyr¬   Úsetterr,   rÝ   Ústaticmethodrø   rþ   r  r  r  r+   r-   r)   r×   r×   ž  sÉ   „ à-Ø*ñÐò
$ò
"ð ñ!ó ð!ð ×Ññ"ó ð"ð !ñ0ó !ð0ðB Ø ñó !ó ðð
 !ñó !ðð !ñó !ðð !ñó !ðð0 !ñó !ñr-   r×   c                   óä   — e Zd Z ej                  d«      Z ej                  d«      ZdZdZdZ	dZ
deded	ed
dfd„Zedd„«       Zeded
dfd„«       Z	 	 ddedededed
ef
d„Zeded
dfd„«       Zy)Ú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>
        ÚReadyÚNotReadyÚProvisioningFailedi   Ú
goal_staterÁ   Úendpointr   Nc                 ó.   — || _         || _        || _        y)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   s       r)   r­   z GoalStateHealthReporter.__init__F  s   € ð" &ˆÔØ&;ˆÔ#Ø!ˆ�r-   c                 ó”  — | j                  | j                  j                  | j                  j                  | j                  j                  | j
                  ¬«      }t        j                  d«       	 | j                  |¬«       t        j                  d«       y # t        $ r$}t        d|z  t        j                  ¬«       ‚ d }~ww xY w)N)rÆ   rÄ   rÅ   Ústatusz Reporting ready to Azure fabric.©Údocumentz#exception while reporting ready: %sr[   zReported ready to Azure fabric.)Úbuild_reportr"  rÆ   rÄ   rÅ   ÚPROVISIONING_SUCCESS_STATUSr9   r:   Ú_post_health_reportrz   rd   ÚerrorrY   )r«   r(  rH   s      r)   Úsend_ready_signalz)GoalStateHealthReporter.send_ready_signal[  s¯   € à×$Ñ$Ø×(Ñ(×4Ñ4Ø×)Ñ)×6Ñ6Ø×(Ñ(×4Ñ4Ø×3Ñ3ð	 %ó 
ˆô 	�	‰	Ð4Ô5ð	Ø×$Ñ$¨hÐ$Ô7ô 	�‰Ð2Õ3øô ò 	Ü#Ø5¸Ñ9ÜŸI™Iõð ûð	ús   Á2B Â	CÂ#CÃCr   c                 ó†  — | j                  | j                  j                  | j                  j                  | j                  j                  | j
                  | j                  |¬«      }	 | j                  |¬«       t        j                  d«       y # t        $ r&}d|z  }t        |t        j                  ¬«       ‚ d }~ww xY w)N)rÆ   rÄ   rÅ   r&  Ú	substatusr   r'  z%exception while reporting failure: %sr[   z!Reported failure to Azure fabric.)r)  r"  rÆ   rÄ   rÅ   ÚPROVISIONING_NOT_READY_STATUSÚPROVISIONING_FAILURE_SUBSTATUSr+  rz   rd   r9   r,  r|   )r«   r   r(  rH   r]   s        r)   Úsend_failure_signalz+GoalStateHealthReporter.send_failure_signalo  s«   € à×$Ñ$Ø×(Ñ(×4Ñ4Ø×)Ñ)×6Ñ6Ø×(Ñ(×4Ñ4Ø×5Ñ5Ø×9Ñ9Ø#ð %ó 
ˆð	Ø×$Ñ$¨hÐ$Ô7ô 	�‰Ð7Õ8øô ò 	Ø9¸AÑ=ˆCÜ# C´S·Y±YÕ?Øûð	ús   Á)B Â	C Â!B;Â;C rÆ   rÄ   rÅ   r&  c                 ó>  — d}|�<| j                   j                  t        |«      t        |d | j                   «      ¬«      }| j                  j                  t        t        |«      «      t        |«      t        |«      t        |«      |¬«      }|j                  d«      S )Nrê   )Úhealth_substatusÚhealth_description)rÆ   rÄ   rÅ   Úhealth_statusÚhealth_detail_subsectionr�   )Ú%HEALTH_DETAIL_SUBSECTION_XML_TEMPLATEr    r   Ú"HEALTH_REPORT_DESCRIPTION_TRIM_LENÚHEALTH_REPORT_XML_TEMPLATEr•   r¡   )	r«   rÆ   rÄ   rÅ   r&  r/  r   Úhealth_detailÚhealth_reports	            r)   r)  z$GoalStateHealthReporter.build_report‚  s£   € ð ˆØÐ Ø ×FÑF×MÑMÜ!'¨	Ó!2Ü#)ØÐ I $×"IÑ"IÐJó$ð Nó ˆMð ×7Ñ7×>Ñ>Üœs ;Ó/Ó0Ü Ó-Ü˜{Ó+Ü  ›.Ø%2ð ?ó 
ˆð ×#Ñ# GÓ,Ð,r-   r(  c                 óä   — t        d«       t        j                  d«       dj                  | j                  «      }| j
                  j                  ||ddi¬«       t        j                  d«       y )Nr   z&Sending health report to Azure fabric.zhttp://{}/machine?comp=healthzContent-Typeztext/xml; charset=utf-8)rh   r´   z/Successfully sent health report to Azure fabric)r   r9   r:   r    r$  r#  rµ   )r«   r(  r�   s      r)   r+  z+GoalStateHealthReporter._post_health_reportž  sc   € ô( 	ˆaŒä�	‰	Ð:Ô;Ø-×4Ñ4°T·^±^ÓDˆØ×#Ñ#×(Ñ(ØØØ)Ð+DÐEð 	)ô 	
ô
 	�	‰	ÐCÕDr-   )r   Nr¶   )r%   r·   r¸   rž   rŸ   r:  r8  r*  r0  r1  r9  r¿   r¦   r•   r­   r,   r-  r2  rº   r)  r+  r+   r-   r)   r  r     s  „ Ø!0 §¡ð	ó"Ðð, -<¨H¯O©Oð	ó-Ð)ð #*ÐØ$.Ð!Ø%9Ð"à),Ð&ð"àð"ð  7ð"ð ð	"ð
 
ó"ð* !ò4ó !ð4ð& !ð9¨sð 9°tò 9ó !ð9ð0 Øñ-àð-ð ð-ð ð	-ð
 ð-ð 
ó-ð8 !ðE¨Eð E°dò Eó !ñEr-   r  c                   ó8  — e Zd Zdefd„Zd„ Zedej                  ddfd„«       Z	e	 ddej                  de
ee      fd„«       Zed	eddfd
„«       Zededefd„«       Zedefd„«       Zedeeef   dedefd„«       Zedededefd„«       Zedededefd„«       Zy)ÚWALinuxAgentShimr   c                 ó.   — || _         d | _        d | _        y r€   )r   Úopenssl_managerrÁ   )r«   r   s     r)   r­   zWALinuxAgentShim.__init__¿  s   € Ø ˆŒØ9=ˆÔØHLˆÕ"r-   c                 óR   — | j                   �| j                   j                  «        y y r€   )rA  rá   rÞ   s    r)   rá   zWALinuxAgentShim.clean_upÄ  s%   € Ø×ÑÐ+Ø× Ñ ×)Ñ)Õ+ð ,r-   Údistror   Nc                 óº   — t         j                  d«       	 |j                  |«       y # t        $ r(}t	        d|z  t         j
                  ¬«       Y d }~y d }~ww xY w)NzEjecting the provisioning isoz(Failed ejecting the provisioning iso: %sr[   )r9   r:   Úeject_mediarz   rd   r,  )r«   Úiso_devrC  rH   s       r)   Ú	eject_isozWALinuxAgentShim.eject_isoÈ  sN   € ä�	‰	Ð1Ô2ð	Ø×Ñ˜wÕ'øÜò 	Ü#Ø:¸QÑ>ÜŸI™I÷ò ûð	ús   —) ©	A²AÁAc                 óˆ  — d}| j                   €'|�%t        «       | _         | j                   j                  }| j                  €t	        |«      | _        | j                  |du¬«      }d}|�| j                  ||«      }t        || j                  | j                  «      }|�| j                  ||¬«       |j                  «        |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Â   )rC  )rA  r×   r¬   rÁ   r¦   Ú_fetch_goal_state_from_azureÚ_get_user_pubkeysr  r   rG  r-  )r«   rC  Úpubkey_inforF  Úhttp_client_certificater  Ússh_keysÚhealth_reporters           r)   Ú"register_with_azure_and_fetch_dataz3WALinuxAgentShim.register_with_azure_and_fetch_dataÓ  sÖ   € ð #'ÐØ×ÑÐ'¨KÐ,CÜ#1Ó#3ˆDÔ Ø&*×&:Ñ&:×&FÑ&FÐ#Ø×%Ñ%Ð-Ü)@Ø'ó*ˆDÔ&ð ×6Ñ6Ø4¸DÐ@ð 7ó 
ˆ
ð ˆØÐ"Ø×-Ñ-¨j¸+ÓFˆHÜ1Ø˜×2Ñ2°D·M±Mó
ˆð ÐØ�N‰N˜7¨6ˆNÔ2à×)Ñ)Ô+Øˆr-   r   c                 óÆ   — | j                   €t        d«      | _         | j                  d¬«      }t        || j                   | j                  «      }|j                  |¬«       y)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.
        NFrI  ©r   )rÁ   r¦   rJ  r  r   r2  )r«   r   r  rO  s       r)   Ú&register_with_azure_and_report_failurez7WALinuxAgentShim.register_with_azure_and_report_failureù  s^   € ð ×%Ñ%Ð-Ü)@ÀÓ)FˆDÔ&Ø×6Ñ6ÈÐ6ÓNˆ
Ü1Ø˜×2Ñ2°D·M±Mó
ˆð 	×+Ñ+¸Ð+ÕDr-   rÂ   c                 óF   — | j                  «       }| j                  ||«      S )a   Fetches 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_xmls      r)   rJ  z-WALinuxAgentShim._fetch_goal_state_from_azure  s,   € ð #'×"IÑ"IÓ"KÐØ×-Ñ-Ø#Ð%5ó
ð 	
r-   c                 óž  — t         j                  d«       dj                  | j                  «      }	 t	        j
                  ddt        ¬«      5  | j                  j                  |«      }ddd«       t         j                  d	«       j                  S # 1 sw Y   Œ*xY w# t        $ r$}t        d|z  t         j                  ¬«       ‚ d}~ww xY w)
zŠFetches the GoalState XML from the Azure endpoint and returns
        the XML as a string.

        @return: GoalState XML string
        zRegistering with Azure...z!http://{}/machine/?comp=goalstatezgoalstate-retrievalzretrieve goalstater"   Nz9failed to register with Azure and fetch GoalState XML: %sr[   z#Successfully fetched GoalState XML.)r9   rY   r    r   r   r$   r&   rÁ   r²   rz   rd   r|   r:   rÎ   )r«   r�   r—   rH   s       r)   rU  z3WALinuxAgentShim._get_raw_goal_state_xml_from_azure  s¹   € ô 	�‰Ð,Ô-Ø1×8Ñ8¸¿¹ÓGˆð	Ü×(Ñ(Ø*Ø0Ü(ôñ ?ð
  ×5Ñ5×9Ñ9¸#Ó>�÷?ô 	�	‰	Ð7Ô8Ø× Ñ Ð ÷?ð ?ûô ò 	Ü#ØKØñäŸK™Kõð
 ûð	ús/   ²B ÁBÁ*B ÂBÂB Â	CÂ(CÃCrW  c                 óB  — 	 t        || j                  |«      }dj                  d|j                  z  d|j                  z  d|j                  z  g«      }t        |t        j                  ¬«       |S # t        $ r$}t        d|z  t        j
                  ¬«       ‚ d}~ww xY w)a  Parses 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: %sr[   Nz, zGoalState XML container id: %szGoalState XML instance id: %szGoalState XML incarnation: %s)r¿   rÁ   rz   rd   r9   r|   r  rÄ   rÅ   rÆ   r:   )r«   rW  rÂ   r  rH   r]   s         r)   rV  z*WALinuxAgentShim._parse_raw_goal_state_xml2  s£   € ð	Ü"Ø'Ø×*Ñ*Ø óˆJð �i‰ià0°:×3JÑ3JÑJØ/°*×2HÑ2HÑHØ/°*×2HÑ2HÑHðó
ˆô 	  ´·±Õ;ØÐøô ò 	Ü#Ø4°qÑ8ÜŸK™Kõð ûð	ús   ‚A1 Á1	BÁ:BÂBr  rL  c                 óÖ   — g }|j                   �Z|�X| j                  �Lt        j                  d«       | j                  j	                  |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.
        z/Certificate XML found; parsing out public keys.)rÍ   rA  r9   r:   r  Ú_filter_pubkeys)r«   r  rL  rN  Úkeys_by_fingerprints        r)   rK  z"WALinuxAgentShim._get_user_pubkeysT  sn   € ð: ˆà×'Ñ'Ð3ØÐ'Ø×$Ñ$Ð0ä�I‰IÐGÔHØ"&×"6Ñ"6×"IÑ"IØ×+Ñ+ó#Ðð ×+Ñ+Ð,?ÀÓMˆHØˆr-   r\  c                 óü   — g }|D ]t  }d|v r|d   r|j                  |d   «       Œ!d|v r:|d   r5|d   }|| v r|j                  | |   «       ŒHt        j                  d|«       Œ_t        j                  d|«       Œv |S )a8  Filter 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  r9   r|   )r\  rL  r  Úpubkeyr  s        r)   r[  z WALinuxAgentShim._filter_pubkeys~  s›   € ð ˆØ!ò 	ˆFØ˜&Ñ  V¨G¢_Ø—‘˜F 7™OÕ,Ø &Ñ(¨V°MÒ-BØ$ ]Ñ3�ØÐ"5Ñ5Ø—K‘KÐ 3°KÑ @ÕAä—K‘Kð8à#õô —‘ð0àõð	ð( ˆr-   r¶   )r%   r·   r¸   r•   r­   rá   r,   r   ÚDistrorG  r
   r	   rP  rS  rÕ   r¿   rJ  rº   rU  r   rV  ÚlistrK  r  Údictr[  r+   r-   r)   r?  r?  ¾  se  „ ðM ó Mò
,ð !ð¨¯©ð ¸Dò ó !ðð !à@Dñ#Ø—n‘nð#à	�$�s‘)Ñ	ò#ó !ð#ðJ !ðEÀ#ð EÈ$ò Eó !ðEð !ð
Ø $ð
à	ò
ó !ð
ð !ð!°Eò !ó !ð!ð4 !ðà!& s¨E zÑ!2ðð ðð 
ò	ó !ððB !ð'Ø#ð'Ø26ð'à	ò'ó !ð'ðR ð!¨Tð !Àð !Èò !ó ñ!r-   r?  r   rC  rL  rF  c                 óŽ   — t        | ¬«      }	 |j                  |||¬«      |j                  «        S # |j                  «        w xY w)N©r   )rC  rL  rF  )r?  rP  rá   )r   rC  rL  rF  Úshims        r)   Úget_metadata_from_fabricre  £  sB   € ô  XÔ.€DðØ×6Ñ6Ø {¸Gð 7ó 
ð 	�‰�øˆ�‰�ús	   Ž2 ²Ar,  zerrors.ReportableErrorc                 ó¬   — t        | ¬«      }|j                  «       }	 |j                  |¬«       |j                  «        y # |j                  «        w xY w)Nrc  rR  )r?  Úas_encoded_reportrS  rá   )r   r,  rd  r   s       r)   Úreport_failure_to_fabricrh  ³  sC   € ä XÔ.€DØ×)Ñ)Ó+€KðØ×3Ñ3ÀÐ3ÔLà�‰�øˆ�‰�ús   žA ÁAc                 ó|   — t        d| z  t        j                  ¬«       t        d|z  t        j                  ¬«       y )Nzdhclient output stream: %sr[   zdhclient error stream: %s)rd   r9   r:   )rI   Úerrs     r)   Údhcp_log_cbrk  ½  s0   € ÜØ$ sÑ*¼¿	¹	õô Ø# cÑ)´s·y±yör-   c                   ó   — e Zd Zy)ÚNonAzureDataSourceN)r%   r·   r¸   r+   r-   r)   rm  rm  Æ  s   „ Ør-   rm  c                   óü   — e Zd ZdddœZddddddddddœ	dee   dee   d	ee   d
ee   dee   deee	      dedee   deddfd„Z
defd„Zededd fd„«       Z	 ddededefd„Z	 	 	 d dedededefd„Zd„ Zd„ Zd„ Zy)!Ú	OvfEnvXmlz)http://schemas.dmtf.org/ovf/environment/1z)http://schemas.microsoft.com/windowsazure)ÚovfÚwaNF©	r™   Úpasswordrš   Úcustom_dataÚdisable_ssh_password_authÚpublic_keysÚpreprovisioned_vmÚpreprovisioned_vm_typeÚprovision_guest_proxy_agentr™   rs  rš   rt  ru  rv  rw  rx  ry  r   c       	         óŠ   — || _         || _        || _        || _        || _        |xs g | _        || _        || _        |	| _        y r€   rr  )
r«   r™   rs  rš   rt  ru  rv  rw  rx  ry  s
             r)   r­   zOvfEnvXml.__init__Ð  sN   € ð !ˆŒØ ˆŒØ ˆŒØ&ˆÔØ)BˆÔ&Ø'2Ò'8°bˆÔØ!2ˆÔØ&<ˆÔ#Ø+FˆÕ(r-   c                 ó4   — | j                   |j                   k(  S r€   )Ú__dict__)r«   Úothers     r)   Ú__eq__zOvfEnvXml.__eq__ç  s   € Ø�}‰} §¡Ñ.Ð.r-   Úovf_env_xmlc                 ó<  — 	 t        j                  |«      }|j                  d| j                  «      €t        d«      ‚t        «       }|j                  |«       |j                  |«       |S # t         j                  $ r}t        j                  |¬«      |‚d}~ww xY w)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Ê   r   Ú"ReportableErrorOvfParsingExceptionrÑ   Ú
NAMESPACESrm  ro  Ú&_parse_linux_configuration_set_sectionÚ _parse_platform_settings_section)Úclsr  rÉ   rH   Úinstances        r)   Ú
parse_textzOvfEnvXml.parse_textê  s“   € ð	PÜ—=‘= Ó-ˆDð
 �9‰9Ð/°·±Ó@ÐHÜ$ØOóð ô “;ˆØ×7Ñ7¸Ô=Ø×1Ñ1°$Ô7àˆøô �}‰}ò 	PÜ×;Ñ;ÀaÔHÈaÐOûð	Pús   ‚A, Á,BÁ?BÂBr   ÚrequiredÚ	namespacec                 ó"  — |j                  d|›d|›�t        j                  «      }|s2d|z  }t        j	                  |«       |rt        j                  |«      ‚y t        |«      dkD  r#t        j                  d|t        |«      fz  «      ‚|d   S )Nz./r  úmissing configuration for %rr5   ú*multiple configuration matches for %r (%d)r   )Úfindallro  rƒ  r9   r:   r   Ú!ReportableErrorOvfInvalidMetadataÚlen)r«   Únoder   r‰  rŠ  Úmatchesr]   s          r)   Ú_findzOvfEnvXml._find  s’   € ð —,’,Ú"¡DÐ)¬9×+?Ñ+?ó
ˆñ Ø0°4Ñ7ˆCÜ�I‰I�cŒNÙÜ×>Ñ>¸sÓCÐCØÜ�‹\˜AÒÜ×:Ñ:Ø<Øœ˜W›Ð&ñ'óð ð
 �q‰zÐr-   Údecode_base64Ú
parse_boolc                 óØ  — |j                  d|z   t        j                  «      }|s3d|z  }t        j	                  |«       |rt        j                  |«      ‚|S t        |«      dkD  r#t        j                  d|t        |«      fz  «      ‚|d   j                  }	|	€|}	|r4|	�2t        j                  dj                  |	j                  «       «      «      }	|rt        j                  |	«      }	|	S )Nz./wa:rŒ  r5   r�  r   rê   )rŽ  ro  rƒ  r9   r:   r   r�  r�  rÒ   rk   Ú	b64decoder  r>   r   Útranslate_bool)
r«   r‘  r   r‰  r”  r•  Údefaultr’  r]   rå   s
             r)   Ú_parse_propertyzOvfEnvXml._parse_property  sÜ   € ð —,‘,˜w¨™~¬y×/CÑ/CÓDˆÙØ0°4Ñ7ˆCÜ�I‰I�cŒNÙÜ×>Ñ>¸sÓCÐCØˆNäˆw‹<˜!ÒÜ×:Ñ:Ø<Øœ˜W›Ð&ñ'óð ð
 ˜‘
—‘ˆð ˆ=ØˆEá˜UÐ.Ü×$Ñ$ R§W¡W¨U¯[©[«]Ó%;Ó<ˆEáÜ×'Ñ'¨Ó.ˆEàˆr-   c                 ót  — | j                  |dd¬«      }| j                  |dd¬«      }| j                  |ddd¬«      | _        | j                  |dd¬«      | _        | j                  |d	d¬«      | _        | j                  |d
d¬«      | _        | j                  |ddd¬«      | _        | j                  |«       y )NÚProvisioningSectionT©r‰  Ú!LinuxProvisioningConfigurationSetÚ
CustomDataF)r”  r‰  ÚUserNameÚUserPasswordÚHostNameÚ DisableSshPasswordAuthentication)r•  r‰  )r“  rš  rt  r™   rs  rš   ru  Ú_parse_ssh_section)r«   rÉ   Úprovisioning_sectionÚ
config_sets       r)   r„  z0OvfEnvXml._parse_linux_configuration_set_section@  sø   € Ø#Ÿz™zØÐ'°$ð  *ó  
Ðð —Z‘ZØ Ø/Øð  ó 
ˆ
ð  ×/Ñ/ØØØØð	 0ó 
ˆÔð ×,Ñ,Ø˜
¨Tð -ó 
ˆŒð ×,Ñ,Ø˜°ð -ó 
ˆŒð ×,Ñ,Ø˜
¨Tð -ó 
ˆŒð *.×)=Ñ)=ØØ.ØØð	 *>ó *
ˆÔ&ð 	×Ñ 
Õ+r-   c                 óò   — | j                  |dd¬«      }| j                  |dd¬«      }| j                  |dddd¬«      | _        | j                  |dd¬«      | _        | j                  |d	ddd¬«      | _        y )
NÚPlatformSettingsSectionTr�  ÚPlatformSettingsÚPreprovisionedVmF)r•  r™  r‰  ÚPreprovisionedVMTypeÚProvisionGuestProxyAgent)r“  rš  rw  rx  ry  )r«   rÉ   Úplatform_settings_sectionÚplatform_settingss       r)   r…  z*OvfEnvXml._parse_platform_settings_sectionb  s²   € Ø$(§J¡JØÐ+°dð %/ó %
Ð!ð !ŸJ™JØ%Ð'9ÀDð 'ó 
Ðð "&×!5Ñ!5ØØØØØð "6ó "
ˆÔð '+×&:Ñ&:ØØ"Øð ';ó '
ˆÔ#ð
 ,0×+?Ñ+?ØØ&ØØØð ,@ó ,
ˆÕ(r-   c                 ót  — g | _         | j                  |dd¬«      }|€y | j                  |dd¬«      }|€y |j                  dt        j                  «      D ]`  }| j                  |dd¬«      }| j                  |dd¬«      }| j                  |dd	d¬
«      }|||dœ}| j                   j                  |«       Œb y )NÚSSHFr�  Ú
PublicKeysz./wa:PublicKeyÚFingerprintÚPathÚValuerê   )r™  r‰  )r  r„   rå   )rv  r“  rŽ  ro  rƒ  rš  r  )	r«   r¦  Ússh_sectionÚpublic_keys_sectionÚ
public_keyr  r„   rå   rý   s	            r)   r¤  zOvfEnvXml._parse_ssh_section~  sï   € ØˆÔà—j‘j ¨U¸U�jÓCˆØÐØà"Ÿj™jØ˜°ð )ó 
Ðð Ð&Øà-×5Ñ5Øœi×2Ñ2ó
ò 	-ˆJð ×.Ñ.Ø˜M°Eð /ó ˆKð ×'Ñ'¨
°FÀUÐ'ÓKˆDØ×(Ñ(Ø˜G¨R¸%ð )ó ˆEð  +ØØñˆGð
 ×Ñ×#Ñ# GÕ,ñ	-r-   )rq  )FFN)r%   r·   r¸   rƒ  r
   r•   rº   rÕ   r	   ra  r­   r~  Úclassmethodrˆ  r“  rš  r„  r…  r¤  r+   r-   r)   ro  ro  Ê  s`  „ à:Ø9ñ€Jð #'Ø"&Ø"&Ø'+Ø48Ø,0Ø"'Ø04Ø,1òGð ˜3‘-ðGð ˜3‘-ð	Gð
 ˜3‘-ðGð ˜e‘_ðGð $,¨D¡>ðGð ˜d 4™jÑ)ðGð  ðGð !)¨¡ðGð &*ðGð 
óGð./˜tó /ð ð Sð ¨[ò ó ðð: ñð ðð ð	ð
 óð: $Ø Øñ#ð ð#ð ð	#ð
 ð#ð ó#òJ ,òD
ó8-r-   ro  r¶   )Jrk   rq   Úloggingr�   r  rž   rm   Ú
contextlibr   r   r   r   r   Útypingr   r	   r
   r   r   Ú	xml.etreer   rÇ   Úxml.sax.saxutilsr   Ú	cloudinitr   r   r   r   r   r   Úcloudinit.reportingr   Úcloudinit.sources.azurer   Ú	getLoggerr%   r9   ÚDEFAULT_WIRESERVER_ENDPOINTrA   rW   rc   rp   r$   r&   r   r,   rO   rZ   r•   r@   rd   rw   r~   rˆ   ra  rº   Úintr¹   r˜   r¤   r¦   rz   r¼   r¿   r×   r  r?  r_  re  rh  rk  rm  ro  r+   r-   r)   ú<module>rÄ     s›  ðó
 Û Û Û 	Û 	Û Û Ý %ß 'ß ß ;Õ ;Ý 'Ý #ç J× JÝ &Ý *à€g×Ñ˜Ó!€ð .Ð à"€Ø%Ð Ø$Ð Ø$Ð Ø+�F×+Ñ+Ø	Ø2ØôÐ ñ ˆCƒL€ð	 h¨s°A¨vÑ&6ð 	¸8ÀCÈÀFÑ;Kó 	ð ñRó ðRðj ñó ðð6 "òØ	ðà×Ñóò$ð* ñ

ó ð

ð ñó ðð ð
 !ØØò3Ø	ð3ð ð3ð �5‰/ð	3ð
 ð3ð ð3ð ×Ñò3ó ð3ðlØðØ ðØ14ðà
ó÷DBñ Bô:D 9ô D÷<ñ <÷~ñ ÷D[Eñ [E÷|bñ bðJ ð (,Ø!ñ	Øðà�N‰Nðð ˜$˜s™)Ñ$ðð �c‰]ò	ó ðð ð sð Ð3Kò ó ðòô	˜ô 	÷P-ò P-r-   