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