File: //lib/python3.6/site-packages/cloudinit/sources/__pycache__/DataSourceCloudStack.cpython-36.pyc
3
�q�h� � @ s� d dl Z d dlZd dlmZmZmZ d dlmZ d dlm Z
d dlmZmZ d dlm
Z d dlmZ d dlmZ d d lmZ e
je�ZG d
d� d�ZG dd
� d
ej�Zdd� Zdd� Zdd� ZeejejffgZdd� Z dS )� N)�gaierror�getaddrinfo� inet_ntoa)�pack)�log)�sources�subp)�
url_helper)�util)�dhcp)�ec2c @ s( e Zd ZdZdd� Zdd� Zdd� ZdS ) �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 ddddddddd d
j|�dj| j�g�\}}|j� S )NZwgetz--quietz--tries�3z --timeoutZ20z--output-document�-z--headerzDomU_Request: {0}z{0}:8080)r �formatr �strip)r Zdomu_request�output�_r r r �_do_request- s z*CloudStackPasswordServerClient._do_requestc C s4 | j d�}|dkrd S |dkr&td��| j d� |S )NZsend_my_password� �saved_passwordZbad_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 Zd ZdZdZdZdd� Zdd� Zdd � Zd
d� Z dd
� Z
edd� �ZdS )�DataSourceCloudStackZ
CloudStack�x �2 c C sX t jj| |||� tjj|jd�| _d| _t� | _ | j s@t
d��d| j f | _i | _d S )NZcsZlatestzNo virtual router found!z
http://%s/)
r �
DataSourcer �os�path�join�seed_dir�api_ver�get_vr_address�vr_addrr �metadata_address�cfg)r Zsys_cfgZdistro�pathsr r r r T s zDataSourceCloudStack.__init__c C s~ | j � }|jdkrdS tj| jd�g}tj� }tj||j|jtj d�\}}|r\tj
d|� ntjd|ttj� | �� t
|�S )Nr Fzlatest/meta-data/instance-id)�urlsZmax_waitZtimeoutZ status_cbzUsing metadata source: '%s'z>Giving up on waiting for the metadata from %s after %s seconds)Zget_url_paramsZmax_wait_seconds�uhelpZcombine_urlr. �timeZwait_for_urlZtimeout_seconds�LOGZwarning�debugZcritical�int�bool)r Z
url_paramsr1 �
start_timeZurlZ _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|| jd d�r>|d | _|d | _tjd| j� dS y�| j� sLdS tj� }t j
| j| j�| _t j
| j| j�| _tjdttj� | �� t| j�}y|j� }W n$ tk
r� t jtd | j� Y nX |r�d|d
did�| _dS tk
�r
t jtd| j� dS 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 %sZexpire)Z
ssh_pwauthr Zchpasswdz(Failed fetching from metadata service %s)r
Zread_optional_seedr* Zuserdata_raw�metadatar4 r5 r9 r3 r Zget_instance_userdatar+ r. Zget_instance_metadatar6 r
r- r � ExceptionZlogexcr/ )r Zseed_retr8 Zpassword_clientZset_passwordr r r � _get_data� sH
zDataSourceCloudStack._get_datac C s
| j d S )Nzinstance-id)r= )r r r r �get_instance_id� s z$DataSourceCloudStack.get_instance_idc C s
| j d S )Nzavailability-zone)r= )r r r r �availability_zone� s z&DataSourceCloudStack.availability_zoneN)
r r r! ZdsnameZurl_max_waitZurl_timeoutr r9 r: r? r@ �propertyrA r r r r r# L s 0r# c C sB yt dd�} W n tk
r, tjd� d S X | d d d S d S )Nzdata-server�P zDNS Entry data-server not foundr � )r r r4 r5 )Zaddrinfor r r �get_data_server� s
rE c C s^ t jd�j� } xJ| D ]B}|jd�}|d dkrttdt|d d���}tjd|� |S qW d S ) Nz/proc/net/route� � Z00000000z<L� � z"Found default route, gateway is %s) r
Z load_file�
splitlines�splitr r r6 r4 r5 )�lines�line�itemsZgwr r r �get_default_gateway� s
rO c C sz t � } | rtjd| � | S tjd�} | r8tjd| � | S tjj� }|sVtjd� t� S tjj|�}| svtjd� t� S | S )Nz4Found metadata server '%s' via data-server DNS entryZSERVER_ADDRESSz-Found SERVER_ADDRESS '%s' via networkd_leasesz*No lease file found, using default gatewayz$No DHCP found, using default gateway) rE r4 r5 r Znetworkd_get_option_from_leasesZIscDhclientZget_latest_leaserO Z!parse_dhcp_server_from_lease_file)Zlatest_addressZ
lease_filer r r r, � s(
r, c C s t j| t�S )N)r Zlist_from_depends�datasources)Zdependsr r r �get_datasource_list� s rQ )!r'