ruạṛ
a -@=j4- � @ 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 d d lmZ e �e�ZG dd� d�ZG d d� dej�Zdd� Zdd� Zdd� Zeej ej!ffgZ"dd� Z#dS )� N)�suppress)�gaierror�getaddrinfo� inet_ntoa)�pack)�sources�subp)� url_helper)�util)�dhcp)�NoDHCPLeaseError)�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 �J/usr/lib/python3.9/site-packages/cloudinit/sources/DataSourceCloudStack.py�__init__, s z'CloudStackPasswordServerClient.__init__c C s: t � ddddddddd d �|�d�| j�g�\}}|�� 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 | � d�}|dv rd S |dkr&td��| � d� |S )NZsend_my_password)� �saved_passwordZbad_requestz-Error when attempting to fetch root password.r )r �RuntimeError)r �passwordr r r �get_passwordD s z+CloudStackPasswordServerClient.get_passwordN)�__name__� __module__�__qualname__�__doc__r r r r r r r r s r c sf e Zd ZdZdZdZdd� Zdd� Zd� fd d � Zdd� Z d d� Z dd� Zdd� Ze dd� �Z� ZS )�DataSourceCloudStackZ CloudStack�x �2 c C sd t j�| |||� tj�|jd�| _d| _|| _t | j�| _ | j sJtd��d| j � d�| _i | _ d S )N�csZlatestzNo virtual router found!zhttp://�/)r � DataSourcer �os�path�join�seed_dir�api_ver�distro�get_vr_address�vr_addrr �metadata_address�cfg)r Zsys_cfgr0 �pathsr r r r V s zDataSourceCloudStack.__init__c C s� t �d� dD ]}t�|�}|r|�� S qt �d� ttj��< t�� �| j d�}|rp|�� W d � S W d � n1 s�0 Y t �d| j j j� z.| j j �| j j �}|�d�}|r�|�� W S W n tttfy� Y n0 t �d� dS ) z�Try obtaining a "domain-name" DHCP lease parameter: - From systemd-networkd lease (case-insensitive) - From ISC dhclient - From dhcpcd (ephemeral) - Return empty string if not found (non-fatal) z.Try obtaining domain name from networkd leases)Z DOMAINNAMEZDomain�domain-namezHCould not obtain FQDN from networkd leases. Falling back to ISC dhclientr6 NzBCould not obtain FQDN from ISC dhclient leases. Falling back to %sz7No domain name found in any DHCP lease; returning emptyr )�LOG�debugr �networkd_get_option_from_leasesr r �NoDHCPLeaseMissingDhclientError�IscDhclient�get_key_from_latest_leaser0 �dhcp_client�client_name�get_newest_lease�fallback_interface�getr �FileNotFoundError�AttributeError)r �key� domainnameZdomain_name�latest_leaser r r �_get_domainnamed s: ��4�� z$DataSourceCloudStack._get_domainnameFc sn t � �|||�}|rjd|jvrjt�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�hostnamer7 r8 rG r ZDataSourceHostnameZ is_default)r ZfqdnZ resolve_ipZ metadata_onlyrK rE �� __class__r r rJ � s �z!DataSourceCloudStack.get_hostnamec C s~ | � � }|jdkrdS t�| jd�g}t�� }tj||j|jt j d�\}}|r\t �d|� nt �d|t t�� | �� t|�S )Nr Fzlatest/meta-data/instance-id)�urlsZmax_wait�timeoutZ status_cbzUsing metadata source: '%s'z>Giving up on waiting for the metadata from %s after %s seconds)Zget_url_paramsZmax_wait_seconds�uhelpZcombine_urlr3 �time� monotonicZwait_for_urlZtimeout_secondsr7 Zwarningr8 Zcritical�int�bool)r Z url_paramsrN � start_time�urlZ _responser r r �wait_for_metadata_service� s, ��� �z.DataSourceCloudStack.wait_for_metadata_servicec C s | j S r )r4 �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 z�| �� sNW dS t� � }t �| j| j �| _t �| j| j �| _t�dtt� � | �� t| j�}z|�� }W n" ty� t �td | j� Y n0 |r�d|d did�| _W dS t�y t �td| j � Y dS 0 d S ) Nr) )�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�metadatar7 r8 rW rQ rR r Zget_instance_userdatar/ r3 Zget_instance_metadatarS r r2 r � ExceptionZlogexcr4 )r Zseed_retrU Zpassword_clientZset_passwordr r r � _get_data� sV ��� � ���zDataSourceCloudStack._get_datac C s | j d S )Nzinstance-id�r[ rX r r r �get_instance_id� s z$DataSourceCloudStack.get_instance_idc C s | j d S )Nzavailability-zoner^ rX r r r �availability_zone s z&DataSourceCloudStack.availability_zone)FFF)r! r"