ó
    x[hÙ,  ã                   ó8  • S SK r S SKrS SKrS SKJr  S SKJrJrJr  S SK	J
r
  S SKJrJr  S SKJr  S SKJr  S SKJr  S S	KJr  \ R*                  " \5      r " S
 S5      r " S S\R2                  5      rS rS rS r\\R<                  \R>                  44/r S r!g)é    N)Úsuppress)ÚgaierrorÚgetaddrinfoÚ	inet_ntoa)Úpack)ÚsourcesÚsubp)Ú
url_helper)Úutil)Údhcp)Úec2c                   ó*   • \ rS rSrSrS rS rS rSrg)ÚCloudStackPasswordServerClienté   av  
Implements password fetching from the CloudStack password server.

http://cloudstack-administration.readthedocs.org/
   en/latest/templates.html#adding-password-management-to-your-templates
has documentation about the system.  This implementation is following that
found at
https://github.com/shankerbalan/cloudstack-scripts/
   blob/master/cloud-set-guest-password-debian
c                 ó   • Xl         g ©N©Úvirtual_router_address)Úselfr   s     ÚH/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceCloudStack.pyÚ__init__Ú'CloudStackPasswordServerClient.__init__+   s   € Ø&<Õ#ó    c                 ó¸   • [         R                   " SSSSSSSSS	S
R                  U5      SR                  U R                  5      /5      u  p#UR                  5       $ )NÚwgetz--quietz--triesÚ3z	--timeoutÚ20z--output-documentÚ-z--headerzDomU_Request: {0}z{0}:8080)r	   Úformatr   Ústrip)r   Údomu_requestÚoutputÚ_s       r   Ú_do_requestÚ*CloudStackPasswordServerClient._do_request.   sd   € ô —I’IàØØØØØØ#ØØØ#×*Ñ*¨<Ó8Ø×!Ñ! $×"=Ñ"=Ó>ðó
‰	ˆð �|‰|‹~Ðr   c                 óz   • U R                  S5      nUS;   a  g US:X  a  [        S5      eU R                  S5        U$ )NÚsend_my_password)Ú Úsaved_passwordÚbad_requestz-Error when attempting to fetch root password.r)   )r$   ÚRuntimeError)r   Úpasswords     r   Úget_passwordÚ+CloudStackPasswordServerClient.get_passwordC   sG   € Ø×#Ñ#Ð$6Ó7ˆØÐ-Ó-ØØ�}Ó$ÜÐNÓOÐOØ×ÑÐ)Ô*Øˆr   r   N)	Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r$   r-   Ú__static_attributes__© r   r   r   r      s   † ñ	ò=òõ*r   r   c                   ór   ^ • \ rS rSrSrSrSrS rS r   SU 4S jjr	S r
S	 rS
 rS r\S 5       rSrU =r$ )ÚDataSourceCloudStackéM   Ú
CloudStackéx   é2   c                 ó`  • [         R                  R                  XX#5        [        R                  R                  UR                  S5      U l        SU l        X l        [        U R                  5      U l
        U R                  (       d  [        S5      eSU R                   S3U l        0 U l        g )NÚcsÚlatestzNo virtual router found!zhttp://Ú/)r   Ú
DataSourcer   ÚosÚpathÚjoinÚseed_dirÚapi_verÚdistroÚget_vr_addressÚvr_addrr+   Úmetadata_addressÚcfg)r   Úsys_cfgrF   Úpathss       r   r   ÚDataSourceCloudStack.__init__U   s   € Ü×Ñ×#Ñ# D°6ÔAÜŸ™Ÿ™ U§^¡^°TÓ:ˆŒð  ˆŒàŒÜ% d§k¡kÓ2ˆŒØ�|�|ÜÐ9Ó:Ð:Ø")¨$¯,©,¨°qÐ 9ˆÔØˆ�r   c                 ó  • [         R                  S5        [        R                  " S5      nU(       a  U$ [         R                  S5        [	        [        R
                  5         [        R                  " 5       R                  U R                  S5      nU(       a  UsSSS5        $  SSS5        [         R                  SU R                  R                  R                  5        [	        [        5         U R                  R                  R                  U R                  R                  5      nUR                  S5      =(       d    SnUsSSS5        $ ! , (       d  f       N°= f! , (       d  f       O= f[         R                  S5        g)zi
Try obtaining a "domain-name" DHCP lease parameter:
- From systemd-networkd lease
- From dhclient lease
z.Try obtaining domain name from networkd leasesÚ
DOMAINNAMEzHCould not obtain FQDN from networkd leases. Falling back to ISC dhclientzdomain-nameNzBCould not obtain FQDN from ISC dhclient leases. Falling back to %szNo dhcp leases found)ÚLOGÚdebugr   Únetworkd_get_option_from_leasesr   ÚNoDHCPLeaseMissingDhclientErrorÚIscDhclientÚget_key_from_latest_leaserF   Údhcp_clientÚclient_nameÚFileNotFoundErrorÚget_newest_leaseÚfallback_interfaceÚget)r   Ú
domainnameÚdomain_nameÚlatest_leases       r   Ú_get_domainnameÚ$DataSourceCloudStack._get_domainnamec   s%  € ô 	�	‰	ÐBÔCÜ×9Ò9¸,ÓGˆ
ÞØÐÜ�	‰	ð+ô	
ô ”d×:Ñ:Õ;Ü×*Ò*Ó,×FÑFØ—‘˜]óˆKö Ø"÷ <Ñ;ð ÷	 <ô 	�	‰	ð!à�K‰K×#Ñ#×/Ñ/ô	
ô Ô'Õ(ØŸ;™;×2Ñ2×CÑCØ—‘×.Ñ.óˆLð '×*Ñ*¨=Ó9×A¸TˆKØ÷ )Ñ(÷ <Õ;ú÷ )Õ(úô 	�	‰	Ð(Ô)Øs   Á#8EÃ1AE!Å
EÅ!
E/c                 óh  >• [         TU ]  XU5      nU(       a™  SUR                  ;  a‰  [        R	                  S5        U R                  5       nU(       aG  UR                   SU 3n[        R	                  SU5        [        R                  " XR                  5      $ [        R	                  SU5        U$ )z¹
Returns instance's hostname / fqdn
First probes the parent class method.

If fqdn is requested, and the parent method didn't return it,
then attach the domain-name from DHCP response.
Ú.zFQDN requestedzObtained the following FQDN: %szNCould not determine domain name for FQDN. Fall back to hostname as an FQDN: %s)	ÚsuperÚget_hostnameÚhostnamerP   rQ   r_   r   ÚDataSourceHostnameÚ
is_default)r   ÚfqdnÚ
resolve_ipÚmetadata_onlyre   r\   Ú	__class__s         €r   rd   Ú!DataSourceCloudStack.get_hostname�   sœ   ø€ ô ‘7Ñ'¨¸-ÓHˆÞ�C˜x×0Ñ0Ó0Ü�I‰IÐ&Ô'Ø×-Ñ-Ó/ˆJÞØ"×+Ñ+Ð,¨A¨j¨\Ð:�Ü—	‘	Ð;¸TÔBÜ×1Ò1°$×8KÑ8KÓLÐLÜ�I‰Ið7àôð
 ˆr   c                 óæ  • U R                  5       nUR                  S::  a  g[        R                  " U R                  S5      /n[
        R                  " 5       n[        R                  " UUR                  UR                  [        R                  S9u  pEU(       a  [        R                  SU5        O6[        R                  SU[        [
        R                  " 5       U-
  5      5        [        U5      $ )Nr   Fzlatest/meta-data/instance-id)ÚurlsÚmax_waitÚtimeoutÚ	status_cbzUsing metadata source: '%s'z>Giving up on waiting for the metadata from %s after %s seconds)Úget_url_paramsÚmax_wait_secondsÚuhelpÚcombine_urlrI   ÚtimeÚ	monotonicÚwait_for_urlÚtimeout_secondsrP   ÚwarningrQ   ÚcriticalÚintÚbool)r   Ú
url_paramsrn   Ú
start_timeÚurlÚ	_responses         r   Úwait_for_metadata_serviceÚ.DataSourceCloudStack.wait_for_metadata_service©   sÈ   € Ø×(Ñ(Ó*ˆ
à×&Ñ&¨!Ó+Øô ×ÒØ×%Ñ%Ð'Eóð
ˆô
 —^’^Ó%ˆ
Ü×+Ò+ØØ×0Ñ0Ø×.Ñ.Ü—k‘kñ	
‰ˆö Ü�I‰IÐ3°SÕ9ä�L‰Lð$àÜ”D—N’NÓ$ zÑ1Ó2ô	ô �C‹yÐr   c                 ó   • U R                   $ r   )rJ   ©r   s    r   Úget_config_objÚ#DataSourceCloudStack.get_config_objÈ   s   € Ø�x‰xˆr   c                 óŒ  • 0 n[         R                  " XR                  S-   S9(       a5  US   U l        US   U l        [
        R                  SU R                  5        g U R                  5       (       d  g[        R                  " 5       n[        R                  " U R                  U R                  5      U l        [        R                  " U R                  U R                  5      U l        [
        R                  S[        [        R                  " 5       U-
  5      5        [!        U R"                  5      n UR%                  5       nU(       a  SUS	S0S
.U l        g! [(         a)    [         R*                  " [
        SU R"                  5         gf = f! [(         a)    [         R*                  " [
        SU R                  5         gf = f)Nr?   )Úbasez	user-dataz	meta-dataz%Using seeded cloudstack data from: %sTFz)Crawl of metadata service took %s secondsÚexpire)Ú
ssh_pwauthr,   Úchpasswdz/Failed to fetch password from virtual router %sz(Failed fetching from metadata service %s)r   Úread_optional_seedrD   Úuserdata_rawÚmetadatarP   rQ   r‚   rv   rw   r   Úget_instance_userdatarE   rI   Úget_instance_metadatar|   r   rH   r-   rJ   Ú	ExceptionÚlogexc)r   Úseed_retr   Úpassword_clientÚset_passwords        r   Ú	_get_dataÚDataSourceCloudStack._get_dataË   s  € ØˆÜ×"Ò" 8·=±=À3Ñ3F×HØ (¨Ñ 5ˆDÔØ$ [Ñ1ˆDŒMÜ�I‰IÐ=¸t¿}¹}ÔMØð'	Ø×1Ñ1×3Ñ3ØÜŸšÓ)ˆJÜ #× 9Ò 9Ø—‘˜d×3Ñ3ó!ˆDÔô  ×5Ò5Ø—‘˜d×3Ñ3óˆDŒMô �I‰IØ;Ü”D—N’NÓ$ zÑ1Ó2ôô =¸T¿\¹\ÓJˆOðØ.×;Ñ;Ó=�ö  à&*Ø$0à$ eð%ñ �D”Hð øô ó Ü—’ÜØEØ—L‘Lõð ðûô  ó 	Ü�KŠKÜØ:Ø×%Ñ%ôñ
 ð	ús=   ÁF Á5B?F Ä5E ÅF Å0FÆ
F ÆFÆF Æ0GÇGc                 ó    • U R                   S   $ )Nzinstance-id©r�   r…   s    r   Úget_instance_idÚ$DataSourceCloudStack.get_instance_idû   s   € Ø�}‰}˜]Ñ+Ð+r   c                 ó    • U R                   S   $ )Nzavailability-zonerš   r…   s    r   Úavailability_zoneÚ&DataSourceCloudStack.availability_zoneþ   s   € à�}‰}Ð0Ñ1Ð1r   )rE   rJ   rF   r�   rI   rD   rŽ   rH   )FFF)r/   r0   r1   r2   ÚdsnameÚurl_max_waitÚurl_timeoutr   r_   rd   r‚   r†   r—   r›   Úpropertyrž   r4   Ú__classcell__)rk   s   @r   r7   r7   M   sX   ø† à€Fð €LØ€Kòò(ðX ØØ÷	ò8ò>ò.ò`,ð ñ2ó ö2r   r7   c                  ó|   •  [        SS5      n U S   S   S   $ ! [         a    [        R                  S5         g f = f)Nzdata-serveréP   r   é   zDNS Entry data-server not found)r   r   rP   rQ   )Úaddrinfos    r   Úget_data_serverr©     sI   € ð!Ü˜}¨bÓ1ˆð
 ˜‰{˜1‰~˜aÑ Ð øô	 ó Ü�	‰	Ð3Ô4Ùðús   ‚ ™;º;c            
      ó
  • [         R                  " S5      R                  5       n U  HY  nUR                  S5      nUS   S:X  d  M  [	        [        S[        US   S5      5      5      n[        R                  SU5        Us  $    g )	Nz/proc/net/routeÚ	é   Ú00000000z<Lé   é   z"Found default route, gateway is %s)	r   Úload_text_fileÚ
splitlinesÚsplitr   r   r|   rP   rQ   )ÚlinesÚlineÚitemsÚgws       r   Úget_default_gatewayr·     su   € ä×ÒÐ 1Ó2×=Ñ=Ó?€EÛˆØ—
‘
˜4Ó ˆØ�‰8�zÕ!äœ4 ¤c¨%°©(°BÓ&7Ó8Ó9ˆBÜ�I‰IÐ:¸BÔ?ØŠIñ ð r   c                 ó  • [        5       nU(       a  [        R                  SU5        U$ [        R                  " S5      nU(       a  [        R                  SU5        U$ [        [        R                  5         [        R                  " 5       R                  U S5      nU(       a!  [        R                  SU5        UsS S S 5        $  S S S 5        [        [        5         U R                  R                  U 5      nU(       a6  [        R                  SUU R                  R                  5        UsS S S 5        $  S S S 5        [        R                  S5        [        5       $ ! , (       d  f       Nž= f! , (       d  f       N>= f)Nz4Found metadata server '%s' via data-server DNS entryÚSERVER_ADDRESSz-Found SERVER_ADDRESS '%s' via networkd_leaseszdhcp-server-identifierz&Found SERVER_ADDRESS '%s' via dhclientz1Found SERVER_ADDRESS '%s' via ephemeral %s lease z$No DHCP found, using default gateway)r©   rP   rQ   r   rR   r   rS   rT   rU   rX   rV   rY   rW   r·   )rF   Úlatest_addressr^   s      r   rG   rG     s4  € ô %Ó&€NÞÜ�	‰	ØBØô	
ð Ðô ×9Ò9Ð:JÓK€NÞÜ�	‰	Ø;¸^ô	
ð Ðô
 
”$×6Ñ6Õ	7Ü×)Ò)Ó+×EÑEØÐ,ó
ˆö Ü�I‰IÐ>ÀÔOØ!÷ 
8Ñ	7ð ÷	 
8ô 
Ô#Õ	$Ø×)Ñ)×:Ñ:¸6ÓBˆÞÜ�I‰IØCØØ×"Ñ"×.Ñ.ôð
  ÷ 
%Ñ	$à÷ 
%ô ‡I�IÐ4Ô5ÜÓ Ð ÷) 
8Õ	7ú÷ 
%Õ	$ús   Á8AEÃAE0Å
E-Å0
E>c                 ó8   • [         R                  " U [        5      $ r   )r   Úlist_from_dependsÚdatasources)Údependss    r   Úget_datasource_listr¿   R  s   € Ü×$Ò$ W¬kÓ:Ð:r   )"ÚloggingrA   rv   Ú
contextlibr   Úsocketr   r   r   Ústructr   Ú	cloudinitr   r	   r
   rt   r   Úcloudinit.netr   Úcloudinit.sources.helpersr   Ú	getLoggerr/   rP   r   r@   r7   r©   r·   rG   ÚDEP_FILESYSTEMÚDEP_NETWORKr½   r¿   r5   r   r   Ú<module>rÊ      s’   ðó Û 	Û Ý ß 3Ñ 3Ý ç #Ý )Ý Ý Ý )à×Ò˜Ó!€÷+ñ +ô\s2˜7×-Ñ-ô s2òl!ò
ò-!ðd ˜G×2Ñ2°G×4GÑ4GÐHÐIð€ó;r   