Ë
    x[hÙ,  ã                   ó8  — d dl Z d dlZd dlZd dlmZ d dlmZmZmZ d dl	m
Z
 d dlmZmZ d dlmZ d dlmZ d dlmZ d d	lmZ  e j*                  e«      Z G d
„ d«      Z G d„ dej2                  «      Zd„ Zd„ Zd„ Zeej<                  ej>                  ffgZ d„ Z!y)é    N)Úsuppress)ÚgaierrorÚgetaddrinfoÚ	inet_ntoa)Úpack)ÚsourcesÚsubp)Ú
url_helper)Úutil)Údhcp)Úec2c                   ó"   — e Zd ZdZd„ Zd„ Zd„ Zy)ÚCloudStackPasswordServerClienta–  
    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                 ó   — || _         y ©N)Úvirtual_router_address)Úselfr   s     úH/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceCloudStack.pyÚ__init__z'CloudStackPasswordServerClient.__init__+   s
   € Ø&<ˆÕ#ó    c                 ó¸   — t        j                   ddddddddd	d
j                  |«      dj                  | j                  «      g«      \  }}|j                  «       S )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_requestz*CloudStackPasswordServerClient._do_request.   sf   € ô —I‘IàØØØØØØ#ØØØ#×*Ñ*¨<Ó8Ø×!Ñ! $×"=Ñ"=Ó>ðó
‰	ˆ�ð �|‰|‹~Ðr   c                 ót   — | j                  d«      }|dv ry |dk(  rt        d«      ‚| j                  d«       |S )NÚsend_my_password)Ú Úsaved_passwordÚbad_requestz-Error when attempting to fetch root password.r%   )r!   ÚRuntimeError)r   Úpasswords     r   Úget_passwordz+CloudStackPasswordServerClient.get_passwordC   sG   € Ø×#Ñ#Ð$6Ó7ˆØÐ-Ñ-ØØ�}Ò$ÜÐNÓOÐOØ×ÑÐ)Ô*Øˆr   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r!   r)   © r   r   r   r      s   „ ñ	ò=òó*r   r   c                   óf   ‡ — e Zd ZdZdZdZd„ Zd„ Z	 	 	 dˆ fd„	Zd„ Z	d„ Z
d	„ Zd
„ Zed„ «       Zˆ xZS )ÚDataSourceCloudStackÚ
CloudStackéx   é2   c                 ó\  — t         j                  j                  | |||«       t        j                  j                  |j                  d«      | _        d| _        || _        t        | j                  «      | _
        | j                  st        d«      ‚d| j                  › d�| _        i | _        y )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_cfgr>   Úpathss       r   r   zDataSourceCloudStack.__init__U   s…   € Ü×Ñ×#Ñ# D¨'°6¸5ÔAÜŸ™Ÿ™ U§^¡^°TÓ:ˆŒð  ˆŒàˆŒÜ% d§k¡kÓ2ˆŒØ�|Š|ÜÐ9Ó:Ð:Ø")¨$¯,©,¨°qÐ 9ˆÔØˆ�r   c                 óÚ  — t         j                  d«       t        j                  d«      }|r|S t         j                  d«       t	        t        j
                  «      5  t        j                  «       j                  | j                  d«      }|r|cddd«       S 	 ddd«       t         j                  d| j                  j                  j                  «       t	        t        «      5  | j                  j                  j                  | j                  j                  «      }|j                  d«      xs d}|cddd«       S # 1 sw Y   Œ¦xY w# 1 sw Y   nxY wt         j                  d«       y)z‰
        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_leaser>   Údhcp_clientÚclient_nameÚFileNotFoundErrorÚget_newest_leaseÚfallback_interfaceÚget)r   Ú
domainnameÚdomain_nameÚlatest_leases       r   Ú_get_domainnamez$DataSourceCloudStack._get_domainnamec   s7  € ô 	�	‰	ÐBÔCÜ×9Ñ9¸,ÓGˆ
ÙØÐÜ�	‰	ð+ô	
ô ”d×:Ñ:Ó;ñ 	#Ü×*Ñ*Ó,×FÑFØ—‘˜]óˆKñ Ø"÷	#ñ 	#ð ÷		#ô 	�	‰	ð!à�K‰K×#Ñ#×/Ñ/ô	
ô Ô'Ó(ñ 	ØŸ;™;×2Ñ2×CÑCØ—‘×.Ñ.óˆLð '×*Ñ*¨=Ó9ÒA¸TˆKØ÷	ñ 	÷	#ð 	#ú÷	ð 	úô 	�	‰	Ð(Ô)Øs   Á2D?Ã%AEÄ?EÅEc                 óR  •— t         ‰| �  |||«      }|r’d|j                  vr„t        j	                  d«       | j                  «       }|rG|j                  › d|› �}t        j	                  d|«       t        j                  ||j                  «      S t        j	                  d|«       |S )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ÚhostnamerG   rH   rV   r   ÚDataSourceHostnameÚ
is_default)r   ÚfqdnÚ
resolve_ipÚmetadata_onlyr[   rS   Ú	__class__s         €r   rZ   z!DataSourceCloudStack.get_hostname�   s    ø€ ô ‘7Ñ'¨¨j¸-ÓHˆÙ�C˜x×0Ñ0Ñ0Ü�I‰IÐ&Ô'Ø×-Ñ-Ó/ˆJÙØ"×+Ñ+Ð,¨A¨j¨\Ð:�Ü—	‘	Ð;¸TÔBÜ×1Ñ1°$¸×8KÑ8KÓLÐLÜ�I‰Ið7àôð
 ˆr   c                 óî  — | j                  «       }|j                  dk  ryt        j                  | j                  d«      g}t        j                  «       }t        j                  ||j                  |j                  t        j                  ¬«      \  }}|r!t        j                  d|«       t        |«      S t        j                  d|t        t        j                  «       |z
  «      «       t        |«      S )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_urlrA   ÚtimeÚ	monotonicÚwait_for_urlÚtimeout_secondsrG   ÚwarningrH   ÚcriticalÚintÚbool)r   Ú
url_paramsrc   Ú
start_timeÚurlÚ	_responses         r   Úwait_for_metadata_servicez.DataSourceCloudStack.wait_for_metadata_service©   sØ   € Ø×(Ñ(Ó*ˆ
à×&Ñ&¨!Ò+Øô ×ÑØ×%Ñ%Ð'Eóð
ˆô
 —^‘^Ó%ˆ
Ü×+Ñ+ØØ×0Ñ0Ø×.Ñ.Ü—k‘kô	
‰ˆˆYñ Ü�I‰IÐ3°SÔ9ô �C‹yÐô �L‰Lð$àÜ”D—N‘NÓ$ zÑ1Ó2ô	ô �C‹yÐr   c                 ó   — | j                   S r   )rB   ©r   s    r   Úget_config_objz#DataSourceCloudStack.get_config_objÈ   s   € Ø�x‰xˆr   c                 ód  — i }t        j                  || j                  dz   ¬«      r5|d   | _        |d   | _        t
        j                  d| j                  «       y	 | j                  «       syt        j                  «       }t        j                  | j                  | j                  «      | _        t        j                  | j                  | j                  «      | _        t
        j                  dt        t        j                  «       |z
  «      «       t!        | j"                  «      }	 |j%                  «       }|rd|d	did
œ| _        y# t(        $ r( t        j*                  t
        d| j"                  «       Y yw xY w# t(        $ r( t        j*                  t
        d| j                  «       Y yw xY w)Nr7   )Ú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_seedr<   Úuserdata_rawÚmetadatarG   rH   rw   rk   rl   r   Úget_instance_userdatar=   rA   Úget_instance_metadatarq   r   r@   r)   rB   Ú	ExceptionÚlogexc)r   Úseed_retrt   Úpassword_clientÚset_passwords        r   Ú	_get_datazDataSourceCloudStack._get_dataË   s~  € ØˆÜ×"Ñ" 8°4·=±=À3Ñ3FÕHØ (¨Ñ 5ˆDÔØ$ [Ñ1ˆDŒMÜ�I‰IÐ=¸t¿}¹}ÔMØð'	Ø×1Ñ1Ô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=   ÁE> Á.B;E> Ä*E
 Ä:E> Å
.E;Å8E> Å:E;Å;E> Å>.F/Æ.F/c                 ó    — | j                   d   S )Nzinstance-id©r‚   ry   s    r   Úget_instance_idz$DataSourceCloudStack.get_instance_idû   s   € Ø�}‰}˜]Ñ+Ð+r   c                 ó    — | j                   d   S )Nzavailability-zonerŒ   ry   s    r   Úavailability_zonez&DataSourceCloudStack.availability_zoneþ   s   € à�}‰}Ð0Ñ1Ð1r   )FFF)r*   r+   r,   ÚdsnameÚurl_max_waitÚurl_timeoutr   rV   rZ   rw   rz   rŠ   r�   Úpropertyr�   Ú__classcell__)ra   s   @r   r0   r0   M   sX   ø„ à€Fð €LØ€Kòò(ðX ØØõ	ò8ò>ò.ò`,ð ñ2ó ô2r   r0   c                  óz   — 	 t        dd«      } | d   d   d   S # t        $ r t        j                  d«       Y y w xY w)Nzdata-serveréP   r   é   zDNS Entry data-server not found)r   r   rG   rH   )Úaddrinfos    r   Úget_data_serverr™     sI   € ð!Ü˜}¨bÓ1ˆð
 ˜‰{˜1‰~˜aÑ Ð øô	 ò Ü�	‰	Ð3Ô4Ùðús   ‚ ™:¹:c            
      ó  — t        j                  d«      j                  «       } | D ]W  }|j                  d«      }|d   dk(  sŒt	        t        dt        |d   d«      «      «      }t        j                  d|«       |c S  y )	Nz/proc/net/routeú	é   Ú00000000z<Lé   é   z"Found default route, gateway is %s)	r   Úload_text_fileÚ
splitlinesÚsplitr   r   rq   rG   rH   )ÚlinesÚlineÚitemsÚgws       r   Úget_default_gatewayr§     sz   € ä×ÑÐ 1Ó2×=Ñ=Ó?€EØò ˆØ—
‘
˜4Ó ˆØ�‰8�zÓ!äœ4 ¤c¨%°©(°BÓ&7Ó8Ó9ˆBÜ�I‰IÐ:¸BÔ?ØŠIðð r   c                 óÂ  — t        «       }|rt        j                  d|«       |S t        j                  d«      }|rt        j                  d|«       |S t        t        j                  «      5  t        j                  «       j                  | d«      }|r!t        j                  d|«       |cd d d «       S 	 d d d «       t        t        «      5  | j                  j                  | «      }|r6t        j                  d|| j                  j                  «       |cd d d «       S 	 d d d «       t        j                  d«       t        «       S # 1 sw Y   Œ”xY w# 1 sw Y   Œ4xY w)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™   rG   rH   r   rI   r   rJ   rK   rL   rO   rM   rP   rN   r§   )r>   Úlatest_addressrU   s      r   r?   r?     sF  € ô %Ó&€NÙÜ�	‰	ØBØô	
ð Ðô ×9Ñ9Ð:JÓK€NÙÜ�	‰	Ø;¸^ô	
ð Ðô
 
”$×6Ñ6Ó	7ñ "Ü×)Ñ)Ó+×EÑEØÐ,ó
ˆñ Ü�I‰IÐ>ÀÔOØ!÷"ñ "ð ÷	"ô 
Ô#Ó	$ñ  Ø×)Ñ)×:Ñ:¸6ÓBˆÙÜ�I‰IØCØØ×"Ñ"×.Ñ.ôð
  ÷ ñ  à÷ ô ‡I�IÐ4Ô5ÜÓ Ð ÷)"ð "ú÷ ð  ús   Á->E	ÃA
EÅ	EÅEc                 ó6   — t        j                  | t        «      S r   )r   Úlist_from_dependsÚdatasources)Údependss    r   Úget_datasource_listr¯   R  s   € Ü×$Ñ$ W¬kÓ:Ð:r   )"Úloggingr9   rk   Ú
contextlibr   Úsocketr   r   r   Ústructr   Ú	cloudinitr   r	   r
   ri   r   Úcloudinit.netr   Úcloudinit.sources.helpersr   Ú	getLoggerr*   rG   r   r8   r0   r™   r§   r?   ÚDEP_FILESYSTEMÚDEP_NETWORKr­   r¯   r.   r   r   ú<module>rº      s”   ðó Û 	Û Ý ß 3Ñ 3Ý ç #Ý )Ý Ý Ý )à€g×Ñ˜Ó!€÷+ñ +ô\s2˜7×-Ñ-ô s2òl!ò
ò-!ðd ˜G×2Ñ2°G×4GÑ4GÐHÐIð€ó;r   