
    쑛hv3                        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mZmZmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ  e j8                  e      ZdZ G d d      Z  G d dejB                        Z" G d de"      Z#d Z$d Z%d Z&de'fdZ(e#ejR                  ffe"ejR                  ejT                  ffgZ+d Z,y)    N)suppress)gaierrorgetaddrinfo	inet_ntoa)pack)dminetperformancesourcessubp)
url_helper)util)dhcp)NoDHCPLeaseError)EphemeralIPNetwork)ec2
CloudStackc                   P    e Zd ZdZd Zd Z ej                  dd      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_request2   sf     II##**<8!!$"="=>
	 ||~r   zGetting passwordalwayslog_modec                 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_passwordG   sG    ##$67--}$NOO)*r   N)	__name__
__module____qualname____doc__r   r'   r
   timedr2    r   r   r   r   #   s5    	=* [)H= >r   r   c                        e Zd ZdZdZdZdZ fdZd Z	 	 	 d fd	Z	d Z
d	 Zed
efd       Zd Z ej"                  dd      d        Zd Zed        Z xZS )DataSourceCloudStackFr   x   2   c                     t         |   |||       t        j                  j	                  |j
                  d      | _        d| _        i | _        y )Ncslatest)superr   ospathjoinseed_dirapi_vercfg)r   sys_cfgdistropaths	__class__s       r   r   zDataSourceCloudStack.__init__Z   s>    &%0U^^T:  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_leaserH   dhcp_clientclient_nameFileNotFoundErrorget_newest_leasefallback_interfaceget)r   
domainnamedomain_namelatest_leases       r   _get_domainnamez$DataSourceCloudStack._get_domainnameb   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)	r@   get_hostnamehostnamerM   rN   r\   r   DataSourceHostname
is_default)r   fqdn
resolve_ipmetadata_onlyr`   rY   rJ   s         r   r_   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_urlmetadata_addresstime	monotonicwait_for_urltimeout_secondsrM   warningrN   criticalintbool)r   
url_paramsrg   
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   )rF   r   s    r   get_config_objz#DataSourceCloudStack.get_config_obj   s    xxr   returnc                      t               S )z#Check if running on this datasource)is_platform_viabler8   r   r   	ds_detectzDataSourceCloudStack.ds_detect   s     "##r   c                 |   i }t        j                  || j                  dz         r5|d   | _        |d   | _        t
        j                  d| j                         y| j                  rAt        j                         }t
        j                  d|       t        | j                  |      }nt        j                         }	 |5  t        | j                        }t        |t              r|j!                  d      n|| _        | j"                  st%        d	      d
| j"                   d| _        | j)                         s
	 d d d        y| j+                         cd d d        S # 1 sw Y   y xY w# t,        $ r t
        j/                  d       Y yt0        $ r)}t
        j/                  dt3        |             Y d }~yd }~ww xY w)N/)basez	user-dataz	meta-dataz%Using seeded cloudstack data from: %sTzAttempting DHCP on: %sdhcp-server-identifierzNo virtual router found!zhttp://Fz#Unable to obtain a DHCP lease on %sz$Failed fetching metadata service: %s)r   read_optional_seedrD   userdata_rawmetadatarM   rN   perform_dhcp_setupr	   find_fallback_nicr   rH   nullcontextget_vr_address
isinstancedictrX   vr_addrr0   ro   r|   _crawl_metadatar   rt   	Exceptionstr)r   seed_retprimary_nicnetwork_contextr   es         r   	_get_datazDataSourceCloudStack._get_data   su   ""84==33FH ( 5D$[1DMII=t}}M""//1KII.<0kJO"..0O	  .(5 "'40 KK 89  
 ||&'ABB*1$,,q(A%557 . . ++-. . .   	KK={K 	KK>AG	sI   >E)  A;E;E) E	E) E&"E) &E) )F;
F;F66F;zCrawling metadatar(   r)   c                    t        j                  | j                  | j                        | _        t        j
                  | j                  | j                        | _        t        | j                        }	 |j                         }|rd|ddid| _
        y# t        $ r( t        j                  t        d| j                         Y yw xY w)NTexpireF)
ssh_pwauthr1   chpasswdz/Failed to fetch password from virtual router %s)r   get_instance_userdatarE   ro   r   get_instance_metadatar   r   r   r2   rF   r   r   logexcrM   )r   password_clientset_passwords      r   r   z$DataSourceCloudStack._crawl_metadata   s    55LL$//
 11LL$//
 9F	*779L "& , %!   	KKA 	s   5B .CCc                      | j                   d   S )Nzinstance-idr   r~   s    r   get_instance_idz$DataSourceCloudStack.get_instance_id  s    }}]++r   c                      | j                   d   S )Nzavailability-zoner   r~   s    r   availability_zonez&DataSourceCloudStack.availability_zone  s    }}011r   )FFF)r3   r4   r5   r   dsnameurl_max_waiturl_timeoutr   r\   r_   r|   r   staticmethodrw   r   r   r
   r7   r   r   propertyr   __classcell__)rJ   s   @r   r:   r:   R   s    F LK(X 	8> $t $ $"H [*X> ?8, 2 2r   r:   c                       e Zd ZdZdZy)DataSourceCloudStackLocalau  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.
    TN)r3   r4   r5   r6   r   r8   r   r   r   r     s     r   r   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   rM   rN   )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   rv   rM   rN   )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_leasesr   z&Found SERVER_ADDRESS '%s' via dhclientz1Found SERVER_ADDRESS '%s' via ephemeral %s lease z$No DHCP found, using default gateway)r   rM   rN   r   rO   r   rP   rQ   rR   rU   rS   rV   rT   r   )rH   latest_addressr[   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r   c                      t        j                  d      } | st        j                  d       y| j	                  t
              S )Nzsystem-product-namez-system-product-name not available in dmi dataF)r   read_dmi_datarM   rN   
startswithCLOUD_STACK_DMI_NAME)product_names    r   r   r   l  s8    $$%:;L		AB""#788r   c                 6    t        j                  | t              S r   )r   list_from_dependsdatasources)dependss    r   get_datasource_listr   |  s    $$Wk::r   )-loggingrA   rp   
contextlibr   socketr   r   r   structr   	cloudinitr   r	   r
   r   r   r   rm   r   cloudinit.netr   cloudinit.net.dhcpr   cloudinit.net.ephemeralr   cloudinit.sources.helpersr   	getLoggerr3   rM   r   r   
DataSourcer:   r   r   r   r   rw   r   DEP_FILESYSTEMDEP_NETWORKr   r   r8   r   r   <module>r      s     	   3 3  : : )   / 6 )g!# , ,^C27-- C2L	 4 	!
-!`9D 9 !7!7 9:G22G4G4GHI;r   