
    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     II##**<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$ )DataSourceCloudStackM   
CloudStackx   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    ##D6AU^^T:  %dkk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 " <; 	 < 			!KK##//	
 '(;;22CC..L '**=9ATK )( <; )( 			()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Cx000II&'--/J"++,Aj\:		;TB11$8K8KLLII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..kk	
 II3S9LL$DNN$z12	 Cyr   c                     U R                   $ r   )rJ   r   s    r   get_config_obj#DataSourceCloudStack.get_config_obj   s    xx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==33FH ( 5D$[1DMII=t}}M'	1133)J # 9 9d33!D  55d33DM II;DNN$z12 =T\\JO.;;=  &*$0$e% DH   ELL    	KK:%%
 	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-serverP   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 8z!4c%(B&789BII: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KN		;^	
 
 
$66	7))+EE,
 II>O! 
8	7 	 
8 
#	$))::6BIIC""..
   
%	$ 
% II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    $$Wk::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27-- s2l!
-!d G22G4G4GHI;r   