File: //lib/python3/dist-packages/cloudinit/sources/__pycache__/DataSourceCloudStack.cpython-310.pyc
o
x[h�, � @ s� d dl Z d dlZd dlZd dlmZ d dlmZmZmZ d dl m
Z
d dlmZm
Z
d dlmZ d dlmZ d dlmZ d d lmZ e �e�ZG d
d� d�ZG dd
� d
ej�Zdd� Zdd� Zdd� ZeejejffgZ dd� Z!dS )� N)�suppress)�gaierror�getaddrinfo� inet_ntoa)�pack)�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 �H/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceCloudStack.py�__init__+ �
z'CloudStackPasswordServerClient.__init__c C s: t � ddddddddd d
�|�d�| j�g�\}}|�� S )N�wgetz--quietz--tries�3z --timeout�20z--output-document�-z--headerzDomU_Request: {0}z{0}:8080)r �formatr �strip)r �domu_request�output�_r r r �_do_request. s
��z*CloudStackPasswordServerClient._do_requestc C s4 | � d�}|dv rd S |dkrtd��| � d� |S )N�send_my_password)� �saved_password�bad_requestz-Error when attempting to fetch root password.r! )r �RuntimeError)r �passwordr r r �get_passwordC 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� Z d� fd d
� Zdd� Z d
d� Z
dd� Zdd� Ze
dd� �Z� ZS )�DataSourceCloudStack�
CloudStack�x �2 c C sd t j�| |||� tj�|jd�| _d| _|| _t | j�| _
| j
s%td��d| j
� d�| _i | _
d S )N�cs�latestzNo virtual router found!zhttp://�/)r �
DataSourcer �os�path�join�seed_dir�api_ver�distro�get_vr_address�vr_addrr# �metadata_address�cfg)r �sys_cfgr7 �pathsr r r r U s
zDataSourceCloudStack.__init__c C s� t �d� t�d�}|r|S t �d� ttj�� t�� �| jd�}|r-|W d � S W d � n1 s7w Y t �d| jj j
� tt�� | jj �| jj
�}|�d�pYd}|W d � S 1 sfw Y t �d� dS )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 dhclientzdomain-nameNzBCould not obtain FQDN from ISC dhclient leases. Falling back to %szNo dhcp leases found)�LOG�debugr �networkd_get_option_from_leasesr �NoDHCPLeaseMissingDhclientError�IscDhclient�get_key_from_latest_leaser7 �dhcp_client�client_name�FileNotFoundError�get_newest_lease�fallback_interface�get)r �
domainname�domain_name�latest_leaser r r �_get_domainnamec s:
�����
� �
z$DataSourceCloudStack._get_domainnameFc sn t � �|||�}|r5d|jvr5t�d� | �� }|r/|j� d|� �}t�d|� t�||j�S t�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.
�.zFQDN requestedzObtained the following FQDN: %szNCould not determine domain name for FQDN. Fall back to hostname as an FQDN: %s) �super�get_hostname�hostnamer? r@ rN r �DataSourceHostname�
is_default)r �fqdn�
resolve_ip�
metadata_onlyrR rK �� __class__r r rQ � s
�z!DataSourceCloudStack.get_hostnamec C s� | � � }|jdkrdS t�| jd�g}t�� }tj||j|jt j
d�\}}|r1t �d|� t|�S t �d|t
t�� | �� t|�S )Nr Fzlatest/meta-data/instance-id)�urls�max_wait�timeout� status_cbzUsing metadata source: '%s'z>Giving up on waiting for the metadata from %s after %s seconds)�get_url_params�max_wait_seconds�uhelp�combine_urlr: �time� monotonic�wait_for_url�timeout_secondsr? �warningr@ �critical�int�bool)r �
url_paramsrZ �
start_time�url� _responser r r �wait_for_metadata_service� s.
��
� ��z.DataSourceCloudStack.wait_for_metadata_servicec C s | j S r )r; �r r r r �get_config_obj� s z#DataSourceCloudStack.get_config_objc C s i }t j|| jd d�r|d | _|d | _t�d| j� dS zV| �� s'W dS t� � }t
�| j| j
�| _t
�| j| j
�| _t�dtt� � | �� t| j�}z|�� }W n tyg t �td | j� Y W dS w |rsd|d
did�| _W dS ty� t �td| j
� Y dS w )
Nr0 )�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 %s�expire)�
ssh_pwauthr$ �chpasswdz(Failed fetching from metadata service %s)r
�read_optional_seedr5 �userdata_raw�metadatar? r@ rn rb rc r �get_instance_userdatar6 r: �get_instance_metadatarh r
r9 r% � Exception�logexcr; )r �seed_retrk �password_client�set_passwordr r r � _get_data� s\
���
������zDataSourceCloudStack._get_datac C �
| j d S )Nzinstance-id�rw ro r r r �get_instance_id� r z$DataSourceCloudStack.get_instance_idc C r� )Nzavailability-zoner� ro r r r �availability_zone� s
z&DataSourceCloudStack.availability_zone)FFF)r&