
"T`1&                 @   s\  d  d l  Z  d  d l m Z m Z m Z d  d l m Z d  d l 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 d  d
 l m Z e j e  Z Gd d   d e  Z Gd d   d e j  Z d d   Z d d   Z d d   Z d d d  Z d d   Z e e j  e j! f f g Z" d d   Z# d S)    N)	inet_ntoagetaddrinfogaierror)pack)	ec2_utils)log)dhcp)sources)
url_helper)subp)utilc               @   s:   e  Z d  Z d Z d d   Z d d   Z d d   Z d S)	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             C   s   | |  _  d  S)N)virtual_router_address)selfr    r   H/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceCloudStack.py__init__+   s    z'CloudStackPasswordServerClient.__init__c             C   sU   t  j  d d d d d d d d d	 d
 j |  d j |  j  g  \ } } | j   S)NZwgetz--quietz--tries3z	--timeoutZ20z--output-document-z--headerzDomU_Request: {0}z{0}:8080)r   formatr   strip)r   Zdomu_requestoutput_r   r   r   _do_request.   s    	z*CloudStackPasswordServerClient._do_requestc             C   sH   |  j  d  } | d k r d  S| d k r7 t d   |  j  d  | S)NZsend_my_password saved_passwordZbad_requestz-Error when attempting to fetch root password.)r   r   )r   RuntimeError)r   passwordr   r   r   get_password:   s    z+CloudStackPasswordServerClient.get_passwordN)__name__
__module____qualname____doc__r   r   r   r   r   r   r   r      s   
r   c               @   sp   e  Z d  Z d Z d Z d Z d d   Z d d   Z d d	   Z d
 d   Z	 d d   Z
 e d d    Z d S)DataSourceCloudStackZ
CloudStackx   2   c             C   s~   t  j j |  | | |  t j j | j d  |  _ d |  _ t   |  _	 |  j	 s^ t
 d   d |  j	 f |  _ i  |  _ d  S)NZcsZlatestzNo virtual router found!z
http://%s/)r	   
DataSourcer   ospathjoinseed_dirapi_verget_vr_addressvr_addrr   metadata_addresscfg)r   Zsys_cfgZdistropathsr   r   r   r   L   s    		zDataSourceCloudStack.__init__c          	   C   s   |  j    } | j d k r d St j |  j d  g } t j   } t j d | d | j d | j d t j	  \ } } | r t j
 d |  n# t j d	 | t t j   |   t |  S)
Nr   Fzlatest/meta-data/instance-idurlsZmax_waitZtimeoutZ	status_cbzUsing metadata source: '%s'z>Giving up on waiting for the metadata from %s after %s seconds)Zget_url_paramsZmax_wait_secondsuhelpZcombine_urlr.   timeZwait_for_urlZtimeout_secondsLOGZwarningdebugZcriticalintbool)r   Z
url_paramsr1   
start_timeZurlZ	_responser   r   r   wait_for_metadata_serviceX   s    		z.DataSourceCloudStack.wait_for_metadata_servicec             C   s   |  j  S)N)r/   )r   r   r   r   get_config_objn   s    z#DataSourceCloudStack.get_config_objc             C   sq  i  } t  j | d |  j d rS | d |  _ | d |  _ t j d |  j  d Sy |  j   sf d St j   } t	 j
 |  j |  j  |  _ t	 j |  j |  j  |  _ t j d t t j   |   t |  j  } y | j   } Wn( t k
 rt  j t d	 |  j  Yn( X| r9d
 d d | d d d i i |  _ d SWn, t k
 rlt  j t d |  j  d SYn Xd  S)Nbase/z	user-dataz	meta-dataz%Using seeded cloudstack data from: %sTFz)Crawl of metadata service took %s secondsz/Failed to fetch password from virtual router %sZ
ssh_pwauthr   ZchpasswdZexpirez(Failed fetching from metadata service %s)r   Zread_optional_seedr*   Zuserdata_rawmetadatar4   r5   r9   r3   ec2Zget_instance_userdatar+   r.   Zget_instance_metadatar6   r   r-   r   	ExceptionZlogexcr/   )r   Zseed_retr8   Zpassword_clientZset_passwordr   r   r   	_get_dataq   sB    		
zDataSourceCloudStack._get_datac             C   s   |  j  d S)Nzinstance-id)r=   )r   r   r   r   get_instance_id   s    z$DataSourceCloudStack.get_instance_idc             C   s   |  j  d S)Nzavailability-zone)r=   )r   r   r   r   availability_zone   s    z&DataSourceCloudStack.availability_zoneN)r   r    r!   ZdsnameZurl_max_waitZurl_timeoutr   r9   r:   r@   rA   propertyrB   r   r   r   r   r#   D   s   'r#   c              C   sM   y t  d d  }  Wn# t k
 r8 t j d  d  SYn X|  d d d Sd  S)Nzdata-server.P   zDNS Entry data-server not foundr      )r   r   r4   r5   )Zaddrinfor   r   r   get_data_server   s    	rF   c              C   s   t  j d  j   }  xc |  D][ } | j d  } | d d k r t t d t | d d    } t j d |  | Sq Wd  S)	Nz/proc/net/route	   Z00000000z<L      z"Found default route, gateway is %s)	r   Z	load_file
splitlinessplitr   r   r6   r4   r5   )lineslineitemsZgwr   r   r   get_default_gateway   s    "rP   c              C   se   d d d g }  xO |  D]G } t  j j |  r t t  j |   d k r t j d |  | Sq Wd  S)Nz/var/lib/dhclientz/var/lib/dhcpz/var/lib/NetworkManagerr   zUsing %s lease directory)r'   r(   existslenlistdirr4   r5   )Zsupported_dirsdr   r   r   get_dhclient_d   s    	-rU   c             C   s   |  d  k r t    }  |  s d  St j |   } d } d  } x | D]x } | j d  rY qA | j d  pt | j d  sz qA t j j |  |  } t j j |  } | | k rA | } | } qA W| S)NrH   Z	dhclient6z.leasez.leases)rU   r'   rS   
startswithendswithr(   r)   getmtime)Zlease_dZlease_filesZlatest_mtimeZlatest_filefnameZabs_pathmtimer   r   r   get_latest_lease   s$    	

r\   c              C   s  t    }  |  r# t j d |   |  St j d  }  |  rL t j d |   |  St   } | so t j d  t   St | d  n } xd | D]\ } d | k r | j d  j	 d  } t
 |  d	 k r | d	 } t j d
 |  | }  q WWd  QRX|  s	t j d  t   S|  S)Nz4Found metadata server '%s' via data-server DNS entryZSERVER_ADDRESSz-Found SERVER_ADDRESS '%s' via networkd_leasesz*No lease file found, using default gatewayrzdhcp-server-identifierz ;
 rI   zFound DHCP identifier %sz$No DHCP found, using default gateway)rF   r4   r5   r   Znetworkd_get_option_from_leasesr\   rP   openr   rL   rR   )Zlatest_addressZ
lease_filefdrN   ZwordsZdhcptokr   r   r   r,      s4    				
r,   c             C   s   t  j |  t  S)N)r	   Zlist_from_dependsdatasources)Zdependsr   r   r   get_datasource_list  s    rb   )$r'   Zsocketr   r   r   Zstructr   r3   Z	cloudinitr   r>   r   ZloggingZcloudinit.netr   r	   r
   r2   r   r   Z	getLoggerr   r4   objectr   r&   r#   rF   rP   rU   r\   r,   ZDEP_FILESYSTEMZDEP_NETWORKra   rb   r   r   r   r   <module>   s(   %\!*