509318396
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
ŠcjY   ã               @   sØ   d dl Z d dlZd dl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
„ d
ƒZG dd„ de
jƒZdd„ Zdd„ Zdd„ Zee
je
jffgZdd„ ZdS )é    N)ÚgaierrorÚgetaddrinfoÚ	inet_ntoa)Úpack)ÚsourcesÚsubp)Ú
url_helper)Úutil)Údhcp)Úec2c               @   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   ú*/usr/lib/python3.6/DataSourceCloudStack.pyÚ__init__*   s    z'CloudStackPasswordServerClient.__init__c             C   s:   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   s4   | j dƒ}|dkrd S |dkr&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_passwordB   s    

z+CloudStackPasswordServerClient.get_passwordN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r   r      s   
r   c               @   sL   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
CloudStackéx   é2   c             C   sX   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   T   s    zDataSourceCloudStack.__init__c             C   s~   | j ƒ }|jdkrdS tj| jdƒg}tjƒ }tj||j|jtj	d�\}}|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_paramsr0   Ú
start_timeZurlZ	_responser   r   r   Úwait_for_metadata_service`   s$    
z.DataSourceCloudStack.wait_for_metadata_servicec             C   s   | j S )N)r.   )r   r   r   r   Úget_config_obj   s    z#DataSourceCloudStack.get_config_objc             C   s  i }t j|| jd d�r>|d | _|d | _tjd| jƒ dS y¦| jƒ sLdS tjƒ }t	j
| j| jƒ| _t	j| j| jƒ| _tjdttjƒ | ƒƒ t| jƒ}y|jƒ }W n$ tk
rÊ   t jtd	| jƒ Y nX |râd|d
didœ| _dS  tk
�r
   t jtd| jƒ dS X d S )Nú/)Úbasez	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expire)Z
ssh_pwauthr   Zchpasswdz(Failed fetching from metadata service %s)r	   Zread_optional_seedr)   Zuserdata_rawÚmetadatar3   r4   r8   r2   r   Zget_instance_userdatar*   r-   Zget_instance_metadatar5   r   r,   r   Ú	ExceptionZlogexcr.   )r   Zseed_retr7   Zpassword_clientZset_passwordr   r   r   Ú	_get_data‚   sH    


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   r8   r9   r>   r?   Úpropertyr@   r   r   r   r   r"   L   s   0r"   c              C   sB   yt ddƒ} W n tk
r,   tjdƒ d S X | d d d S d S )Nzdata-serveréP   zDNS Entry data-server not foundr   é   )r   r   r3   r4   )Zaddrinfor   r   r   Úget_data_serverº   s    
rD   c              C   s^   t jdƒjƒ } xJ| D ]B}|jdƒ}|d dkrttdt|d dƒƒƒ}tjd|ƒ |S qW d S )	Nz/proc/net/routeú	é   Z00000000z<Lé   é   z"Found default route, gateway is %s)	r	   Z	load_fileÚ
splitlinesÚsplitr   r   r5   r3   r4   )ÚlinesÚlineÚitemsZgwr   r   r   Úget_default_gatewayÅ   s    

rN   c              C   sj   t ƒ } | rtjd| ƒ | S tjdƒ} | r8tjd| ƒ | S tjjƒ }|rZtjj|ƒ} | rZ| S tjdƒ tƒ S )Nz4Found metadata server '%s' via data-server DNS entryZSERVER_ADDRESSz-Found SERVER_ADDRESS '%s' via networkd_leasesz$No DHCP found, using default gateway)	rD   r3   r4   r
   Znetworkd_get_option_from_leasesZIscDhclientZget_latest_leaseZ!parse_dhcp_server_from_lease_filerN   )Zlatest_addressZ
lease_filer   r   r   r+   Ò   s&    


r+   c             C   s   t j| tƒS )N)r   Zlist_from_dependsÚdatasources)Zdependsr   r   r   Úget_datasource_listý   s    rP   ) Zloggingr&   r2   Zsocketr   r   r   Ústructr   Z	cloudinitr   r   r   r1   r	   Zcloudinit.netr
   Zcloudinit.sources.helpersr   Z	getLoggerr   r3   r   r%   r"   rD   rN   r+   ZDEP_FILESYSTEMZDEP_NETWORKrO   rP   r   r   r   r   Ú<module>   s"   
.n&