+
    ˜qgj¶5  ã                   óœ  € ^ RI t ^ RIt^ RIt^ RIHt ^ RIHtHtHt ^ RI	H
t
 ^ RIHtHtHtHt ^ RIHt ^ RIHt ^ RIHt ^ R	IHt ^ R
IHt ^ RIHt ] P6                  ! ]4      tRt ! R R4      t ! R R]P@                  4      t! ! R R]!4      t"R t#R t$R t%R R lt&]"]PN                  33]!]PN                  ]PP                  33.t)R t*R# )é    N)Úsuppress)ÚgaierrorÚgetaddrinfoÚ	inet_ntoa)Úpack)ÚdmiÚnetÚperformanceÚsources)Ú
url_helper)Úutil)Údhcp)ÚNoDHCPLeaseError)ÚEphemeralIPNetwork)Úec2Ú
CloudStackc                   ód   a € ] tR t^#t o RtR tR t]P                  ! RRR7      R 4       t	Rt
V tR	# )
ÚCloudStackPasswordServerClientav  
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                ó   € Wn         R # ©N©Úvirtual_router_address)Úselfr   s   &&ÚH/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceCloudStack.pyÚ__init__Ú'CloudStackPasswordServerClient.__init__/   s   € Ø&<Ö#ó    c                óð   € R V P                    R2pRV/p\        P                  ! W#^^R7      pVP                  4       '       g   \	        R4      hVP
                  P                  R4      P                  4       # )úhttp://z:8080ÚDomU_Request)ÚheadersÚtimeoutÚretriesz+Failed to fetch VM password from CloudStackzutf-8)r   ÚuhelpÚreadurlÚokÚRuntimeErrorÚcontentsÚdecodeÚstrip)r   Údomu_requestÚurlr!   Úresps   &&   r   Ú_do_requestÚ*CloudStackPasswordServerClient._do_request2   sh   € Ø˜×3Ñ3Ð4°EÐ:ˆØ! <Ð0ˆä�}Š}˜S¸2ÀqÔIˆà�w‰w�yŠyÜÐLÓMÐMà�}‰}×#Ñ# GÓ,×2Ñ2Ó4Ð4r   zGetting passwordÚalways©Úlog_modec                ó€   € V P                  R 4      pVR9   d   R# VR8X  d   \        R4      hV P                  R4       V# )Úsend_my_passwordÚsaved_passwordNÚbad_requestz-Error when attempting to fetch root password.)Ú r5   )r.   r'   )r   Úpasswords   & r   Úget_passwordÚ+CloudStackPasswordServerClient.get_password=   sG   € à×#Ñ#Ð$6Ó7ˆØÐ-Ô-ÙØ�}Ô$ÜÐNÓOÐOØ×ÑÐ)Ô*Øˆr   r   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r.   r
   Útimedr9   Ú__static_attributes__Ú__classdictcell__)Ú__classdict__s   @r   r   r   #   s6   ø‡ € ñ	ò=ò	5ð ×ÒÐ)°HÔ=ñó >ör   r   c                   óÐ   a a€ ] tR t^Ht oRtRt^xt^2tV 3R ltR t	RV 3R llt
R tR t]V3R lR	 l4       tR
 t]P"                  ! RRR7      R 4       tR t]R 4       tRtVtV ;t# )ÚDataSourceCloudStackFr   c                ó°   <€ \         SV `  WV4       \        P                  P	                  VP
                  R 4      V n        RV n        / V n        RV n        R# )ÚcsÚlatestN)	Úsuperr   ÚosÚpathÚjoinÚseed_dirÚapi_verÚcfgÚvr_addr)r   Úsys_cfgÚdistroÚpathsÚ	__class__s   &&&&€r   r   ÚDataSourceCloudStack.__init__P   sC   ø€ Ü‰Ñ˜¨%Ô0ÜŸ™Ÿ™ U§^¡^°TÓ:ˆŒð  ˆŒØˆŒØˆŽr   c                ó²  € \         P                  R4       R
 F3  p\        P                  ! V4      pV'       g   K#  VP	                  4       u # 	  \         P                  R4       \        \        P                  4      ;_uu_ 4        \        P                  ! 4       P                  V P                  R4      pV'       d   VP	                  4       uuRRR4       #  RRR4       \         P                  R4       \        \        P                  \        P                  4      ;_uu_ 4        \        P                  ! R4      pV'       d   VP	                  4       uuRRR4       #  RRR4       \         P                  RV P                  P                  P                  4        V P                  P                  P                  V P                  P                  4      pVP!                  R4      pV'       d   VP	                  4       #  \         P                  R4       R	#   + '       g   i     ELG; i  + '       g   i     LÓ; i  \        \"        \$        3 d     LVi ; i)zåTry obtaining a "domain-name" DHCP lease parameter:
- From systemd-networkd lease (case-insensitive)
- From ISC dhclient
- From network manager dhcp client
- From dhcpcd (ephemeral)
- Return empty string if not found (non-fatal)
z.Try obtaining domain name from networkd leasesúdomain-namezHCould not obtain FQDN from networkd leases. Falling back to ISC dhclientNzVCould not obtain FQDN from ISC dhclient leases. Falling back to Network Manager leasesÚdomain_namez8Could not obtain FQDN from NM leases. Falling back to %sz7No domain name found in any DHCP lease; returning emptyr7   )Ú
DOMAINNAMEÚDomainrW   )ÚLOGÚdebugr   Únetworkd_get_option_from_leasesr*   r   ÚNoDHCPLeaseMissingDhclientErrorÚIscDhclientÚget_key_from_latest_leaserR   r   Ú&network_manager_get_option_from_leasesÚdhcp_clientÚclient_nameÚget_newest_leaseÚfallback_interfaceÚgetÚFileNotFoundErrorÚAttributeError)r   ÚkeyÚ
domainnamerX   Úlatest_leases   &    r   Ú_get_domainnameÚ$DataSourceCloudStack._get_domainnameY   sÕ  € ô 	�	‰	ÐBÔCÛ:ˆCÜ×=Ò=¸cÓBˆJß‰zØ!×'Ñ'Ó)Ò)ñ ;ô
 	�	‰	ðô	
ô ”d×:Ñ:×;Õ;Ü×*Ò*Ó,×FÑFØ—‘˜]óˆK÷ Ø"×(Ñ(Ó*÷ <Ò;ð ÷	 <ô 	�	‰	ð%ô	
ô Ü×0Ñ0´$×2GÑ2G÷
õ 
ô ×EÒEØóˆK÷ Ø"×(Ñ(Ó*÷
ò 
ð ÷
ô 	�	‰	ØFØ�K‰K×#Ñ#×/Ñ/ô	
ð	ØŸ;™;×2Ñ2×CÑCØ—‘×.Ñ.óˆLð '×*Ñ*¨=Ó9ˆKßØ"×(Ñ(Ó*Ð*ð ô
 	�	‰	ÐKÔLÙ÷G <×;Ð;ú÷
÷ 
ûô( !Ô"3´^ÐDô 	Ùð	ús2   ÂAHÄ%.H*ÆAH= Ç.H= ÈH'	È*H:	È=IÉIc                ón  <€ \         SV `  WV4      pV'       dœ   RVP                  9  d‹   \        P	                  R4       V P                  4       pV'       dH   VP                   RV 2p\        P	                  RV4       \        P                  ! WP                  4      # \        P	                  RV4       V# )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)	rI   Úget_hostnameÚhostnamer[   r\   rl   r   ÚDataSourceHostnameÚ
is_default)r   ÚfqdnÚ
resolve_ipÚmetadata_onlyrq   rj   rT   s   &&&&  €r   rp   Ú!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                óú  € V P                  4       pVP                  ^ 8:  d   R# \        P                  ! V P                  R4      .p\
        P                  ! 4       p\        P                  ! VVP                  VP                  \        P                  R7      w  rEV'       d   \        P                  RV4       M:\        P                  RV\        \
        P                  ! 4       V,
          4      4       \        V4      # )r   Fzlatest/meta-data/instance-id)ÚurlsÚmax_waitr"   Ú	status_cbzUsing metadata source: '%s'z>Giving up on waiting for the metadata from %s after %s seconds)Úget_url_paramsÚmax_wait_secondsr$   Úcombine_urlÚmetadata_addressÚtimeÚ	monotonicÚwait_for_urlÚtimeout_secondsr[   Úwarningr\   ÚcriticalÚintÚbool)r   Ú
url_paramsry   Ú
start_timer,   Ú	_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                ó   € V P                   # r   )rO   ©r   s   &r   Úget_config_objÚ#DataSourceCloudStack.get_config_objÌ   s   € Ø�x‰xˆr   c                ó    <€ V ^8„  d   QhRS[ /# ©é   Úreturn©r‡   )ÚformatrC   s   "€r   Ú__annotate__Ú!DataSourceCloudStack.__annotate__Ð   s   ø€ ÷ $ñ $‘tñ $r   c                 ó   € \        4       # )z#Check if running on this datasource)Úis_platform_viable© r   r   Ú	ds_detectÚDataSourceCloudStack.ds_detectÏ   s   € ô "Ó#Ð#r   c                ó  € / p\         P                  ! WP                  R ,           R7      '       d?   VR,          V n        VR,          V n        \
        P                  RV P                  4       R# V P                  '       dC   \        P                  ! 4       p\
        P                  RV4       \        V P                  V4      pM\         P                  ! 4       p T;_uu_ 4        \        V P                  4      p\        V\        4      '       d   VP!                  R4      MTV n        V P"                  '       g   \%        R4      hR	V P"                   R 2V n        V P)                  4       '       g    R
R
R
4       R# V P+                  4       uuR
R
R
4       #   + '       g   i     R
# ; i  \,         d    \
        P/                  RX4        R# \0         d+   p\
        P/                  R\3        T4      4        R
p?R# R
p?ii ; i)Ú/)Úbasez	user-dataz	meta-dataz%Using seeded cloudstack data from: %sTzAttempting DHCP on: %súdhcp-server-identifierzNo virtual router found!r   NFz#Unable to obtain a DHCP lease on %sz$Failed fetching metadata service: %s)r   Úread_optional_seedrM   Úuserdata_rawÚmetadatar[   r\   Úperform_dhcp_setupr	   Úfind_fallback_nicr   rR   ÚnullcontextÚget_vr_addressÚ
isinstanceÚdictrf   rP   r'   r   r‹   Ú_crawl_metadatar   r„   Ú	ExceptionÚstr)r   Úseed_retÚprimary_nicÚnetwork_contextrP   Úes   &     r   Ú	_get_dataÚDataSourceCloudStack._get_dataÔ   sw  € ØˆÜ×"Ò" 8·=±=À3Õ3F×HÓHØ (¨Õ 5ˆDÔØ$ [Õ1ˆDŒMÜ�I‰IÐ=¸t¿}¹}ÔMÙØ×"×"Ð"Ü×/Ò/Ó1ˆKÜ�I‰IÐ.°Ô<Ü0°·±¸kÓJ‰Oä"×.Ò.Ó0ˆOð	ß ’Ü(¨¯©Ó5�ô " '¬4×0Ò0ð —K‘KÐ 8Ô9à ð ”ð
 —|—|�|Ü&Ð'AÓBÐBØ*1°$·,±,°¸qÐ(A�Ô%Ø×5Ñ5×7Ò7Ø ÷ !‘ð ×+Ñ+Ó-÷ !——“ûô  ô 	Ü�K‰KÐ=¸{ÔKÚÜô 	Ü�K‰KÐ>ÄÀAÃÔGÝûð	ús[   Ã
F( Ã#AFÄ95FÅ/FÅ0F( Å:FÆ	
F( ÆF%	ÆF( Æ%F( Æ(!H ÇH ÇH ÇG;Ç;H zCrawling metadatar0   r1   c                ó°  € \         P                  ! V P                  V P                  4      V n        \         P
                  ! V P                  V P                  4      V n        \        V P                  4      p VP                  4       pV'       d   R RRVRRR//V n
        R#   \         d+    \        P                  ! \        RT P                  4        R# i ; i)Ú
ssh_pwauthTr8   ÚchpasswdÚexpireFz/Failed to fetch password from virtual router %s)r   Úget_instance_userdatarN   r   r£   Úget_instance_metadatar¤   r   rP   r9   rO   r¬   r   Úlogexcr[   )r   Úpassword_clientÚset_passwords   &  r   r«   Ú$DataSourceCloudStack._crawl_metadataø   sÃ   € ä×5Ò5Ø�L‰L˜$×/Ñ/ó
ˆÔô ×1Ò1Ø�L‰L˜$×/Ñ/ó
ˆŒô 9¸¿¹ÓFˆð	Ø*×7Ñ7Ó9ˆL÷ à  $Ø ØØ  %ð!ð�”ñ øô ô 	Ü�KŠKÜØAØ—‘õñ ð	ús   Á7B  Â 1CÃCc                ó(   € V P                   R ,          # )zinstance-id©r¤   rŽ   s   &r   Úget_instance_idÚ$DataSourceCloudStack.get_instance_id  s   € Ø�}‰}˜]Õ+Ð+r   c                ó(   € V P                   R ,          # )zavailability-zoner¿   rŽ   s   &r   Úavailability_zoneÚ&DataSourceCloudStack.availability_zone  s   € à�}‰}Ð0Õ1Ð1r   )rN   rO   r¤   r   rM   r£   rP   )FFF)r;   r<   r=   r>   r¥   ÚdsnameÚurl_max_waitÚurl_timeoutr   rl   rp   r‹   r�   Ústaticmethodrœ   r²   r
   r@   r«   rÀ   ÚpropertyrÃ   rA   rB   Ú__classcell__)rT   rC   s   @@r   rE   rE   H   s�   ù‡ € ØÐØ€Fð €LØ€Kõò6÷pò8ò>ð ÷$ó ð$ò"ðH ×ÒÐ*°XÔ>ñó ?ðò8,ð ñ2ó ÷2ð 2r   rE   c                   ó   € ] tR tRtRtRtRtR# )ÚDataSourceCloudStackLocali  aa  Run in init-local using a dhcp discovery prior to metadata crawl.

In init-local, no network is available. This subclass sets up minimal
networking with dhclient on a viable nic so that it can talk to the
metadata service. If the metadata service provides network configuration
then render the network configuration for that instance based on metadata.
Tr›   N)r;   r<   r=   r>   r?   r¥   rA   r›   r   r   rÌ   rÌ     s   † ñð Ôr   rÌ   c                  ó˜   €  \        R ^P4      p V ^ ,          ^,          ^ ,          #   \         d    \        P                  R4        R# i ; i)zdata-serverzDNS Entry data-server not foundN)r   r   r[   r\   )Úaddrinfos    r   Úget_data_serverrÏ   )  sI   € ð!Ü˜}¨bÓ1ˆð
 ˜�{˜1�~˜aÕ Ð øô	 ô Ü�	‰	Ð3Ô4Úðús   ‚% ¥ A	ÁA	c            
      ó  € \         P                  ! R 4      P                  4       p V  Fb  pVP                  R4      pV^,          R8X  g   K$  \	        \        R\        V^,          ^4      4      4      p\        P                  RV4       Vu # 	  R# )z/proc/net/routeÚ	Ú00000000z<Lz"Found default route, gateway is %sN)	r   Úload_text_fileÚ
splitlinesÚsplitr   r   r†   r[   r\   )ÚlinesÚlineÚitemsÚgws       r   Úget_default_gatewayrÚ   4  su   € ä×ÒÐ 1Ó2×=Ñ=Ó?€EÛˆØ—
‘
˜4Ó ˆØ��8�zÖ!äœ4 ¤c¨%°­(°BÓ&7Ó8Ó9ˆBÜ�I‰IÐ:¸BÔ?ØŠIñ ñ r   c                 óf  € \        4       pV'       d   \        P                  R V4       V# \        P                  ! R4      pV'       d   \        P                  RV4       V# \        \        P                  4      ;_uu_ 4        \        P                  ! 4       P                  V R4      pV'       d#   \        P                  RV4       VuuRRR4       #  RRR4       \        \        P                  \        P                  4      ;_uu_ 4        \        P                  ! R4      pV'       d#   \        P                  RV4       VuuRRR4       #  RRR4       \        \        4      ;_uu_ 4        V P                  P                  V P                  4      pV'       d8   \        P                  RVV P                  P                  4       VuuRRR4       #  RRR4       \        P                  R	4       \!        4       #   + '       g   i     EL/; i  + '       g   i     LÈ; i  + '       g   i     LV; i)
z4Found metadata server '%s' via data-server DNS entryÚSERVER_ADDRESSz-Found SERVER_ADDRESS '%s' via networkd_leasesr¡   z&Found SERVER_ADDRESS '%s' via dhclientNÚdhcp_server_identifierz#Found SERVER_ADDRESS '%s' via nmcliz1Found SERVER_ADDRESS '%s' via ephemeral %s lease z$No DHCP found, using default gateway)rÏ   r[   r\   r   r]   r   r^   r_   r`   r   ra   rg   rb   rd   re   rc   rÚ   )rR   Úlatest_addressrk   s   &  r   r¨   r¨   A  s­  € ô %Ó&€NßÜ�	‰	ØBØô	
ð Ðô ×9Ò9Ð:JÓK€NßÜ�	‰	Ø;¸^ô	
ð Ðô
 
”$×6Ñ6×	7Õ	7Ü×)Ò)Ó+×EÑEØÐ,ó
ˆ÷ Ü�I‰IÐ>ÀÔOØ!÷ 
8Ò	7ð ÷	 
8ô 
”$×6Ñ6¼×8MÑ8M×	NÕ	NÜ×DÒDØ$ó
ˆ÷ Ü�I‰IÐ;¸^ÔLØ!÷ 
OÒ	Nð ÷	 
Oô 
Ô#×	$Õ	$Ø×)Ñ)×:Ñ:Ø×%Ñ%ó
ˆ÷ Ü�I‰IØCØØ×"Ñ"×.Ñ.ôð
  ÷ 
%Ò	$ð ÷	 
%ô ‡I�IÐ4Ô5ÜÓ Ð ÷? 
8×	7Ð	7ú÷ 
O×	Nú÷ 
%×	$ús&   ÂAG9Ä6HÅ,AH Ç9H
	ÈH	È H0	c                ó$   € V ^8„  d   QhR\         /# r’   r•   )r–   s   "r   r—   r—   |  s   € ÷ 9ñ 9œDñ 9r   c                  ó–   € \         P                  ! R 4      p V '       g   \        P                  R4       R# V P	                  \
        4      # )zsystem-product-namez-system-product-name not available in dmi dataF)r   Úread_dmi_datar[   r\   Ú
startswithÚCLOUD_STACK_DMI_NAME)Úproduct_names    r   rš   rš   |  s8   € Ü×$Ò$Ð%:Ó;€LßÜ�	‰	ÐAÔBÙØ×"Ñ"Ô#7Ó8Ð8r   c                 ó8   € \         P                  ! V \        4      # r   )r   Úlist_from_dependsÚdatasources)Údependss   &r   Úget_datasource_listré   Œ  s   € Ü×$Ò$ W¬kÓ:Ð:r   )+ÚloggingrJ   r€   Ú
contextlibr   Úsocketr   r   r   Ústructr   Ú	cloudinitr   r	   r
   r   r   r$   r   Úcloudinit.netr   Úcloudinit.net.dhcpr   Úcloudinit.net.ephemeralr   Úcloudinit.sources.helpersr   Ú	getLoggerr;   r[   rã   r   Ú
DataSourcerE   rÌ   rÏ   rÚ   r¨   rš   ÚDEP_FILESYSTEMÚDEP_NETWORKrç   ré   r›   r   r   Ú<module>r÷      sÄ   ðó Û 	Û Ý ß 3Ñ 3Ý ç 4Ó 4Ý )Ý Ý Ý /Ý 6Ý )à×Ò˜Ó!€à#Ð ÷"ñ "ôJR2˜7×-Ñ-ô R2ôj	Ð 4ô 	ò!ò
ò8!õv9ð  ×!7Ñ!7Ð 9Ð:Ø˜G×2Ñ2°G×4GÑ4GÐHÐIð€ô;r   