HEX
Server: Apache
System: Linux scp1.abinfocom.com 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64
User: confeduphaar (1010)
PHP: 8.1.33
Disabled: exec,passthru,shell_exec,system
Upload Files
File: //usr/lib/python3/dist-packages/cloudinit/sources/helpers/__pycache__/openstack.cpython-38.pyc
U

Ӈg�l�@s6ddlZddlZddlZddlZddlZddlZddlmZmZm	Z	m
Z
mZddlm
Z
ddlmZe�e�Zddd�dfd	ejifd
dd�dfd�Zd
ZdZdZdZdZdZdZdZdZdZeeeeeeeefZdZ Gdd�de!�Z"Gdd�d�Z#Gdd�dej$d�Z%Gdd �d e%�Z&Gd!d"�d"e%�Z'd%d#d$�Z(dS)&�N)�net�sources�subp�
url_helper�util)�BrokenMetadata)�ec2�network_configcCs|S�N���xrr�E/usr/lib/python3/dist-packages/cloudinit/sources/helpers/openstack.py�<lambda>�r��meta_js�authorized_keyscCs|Sr
rrrrrrr)zetc/network/interfaceszmeta.jszroot/.ssh/authorized_keys))zlocal-hostnameZhostnameF)�instance-idZuuidT�latestz
2012-08-10z
2013-04-04z
2013-10-17z
2015-10-15z
2016-06-30z
2016-10-06z
2017-02-22z
2018-08-27)
NZbgpovsZbridgeZ	cascadingZdvsZethernetZhw_vebZhypervZovsZphyZtapZ	vhostuserZvifc@seZdZdS)�NonReadableN)�__name__�
__module__�__qualname__rrrrrQsrc@s4eZdZdd�Zdd�Zdd�Zdd�Zd	d
�ZdS)�SourceMixincCs>|js
dS|j�di�}|��D]\}}||kr |Sq dS)Nzblock-device-mapping)Zec2_metadata�get�items)�self�nameZbdmZent_name�devicerrr�_ec2_name_to_deviceVs
zSourceMixin._ec2_name_to_devicecCs$d}|jdkrd}t�|j�|��S)NZpublic_keys��public-keys)�versionrZnormalize_pubkey_data�metadatar)rrrrr�get_public_ssh_keys_s
zSourceMixin.get_public_ssh_keyscCsRd}z2d|}|dkrd|}t�|�}|r4|d}Wntjk
rLYnX|S)NzLABEL=%sZswapzTYPE=%sr)rZfind_devs_withrZProcessExecutionError)rrrZcriteriaZdev_entriesrrr�_os_name_to_devicees
zSourceMixin._os_name_to_devicecCsV|sdS|�d�sd|}tj�|�r*|S|�tj�|��}|rRt�d||�|SdS)N�/z/dev/%szRemapped device name %s => %s)�
startswith�os�path�existsZ
_remap_device�basename�LOG�debug)rrZremappedrrr�_validate_device_namers
z!SourceMixin._validate_device_namecCs�|sdS|g}|dkr"|�dd�|dkr4|�d�d}t�d|�|D] }|�|�}|�|�}|rHqjqH|s�t�d|�|D] }|�|�}|�|�}|r~q�q~|s�dSt�d||�|SdS)N�rootrZamiz(Using ec2 style lookup to find device %sz.Using openstack style lookup to find device %szMapped %s to device %s)�insert�appendr-r.r r/r&)rr�namesr�nrrr�device_name_to_device�s2




z!SourceMixin.device_name_to_deviceN)rrrr r%r&r/r5rrrrrUs
	
rc@sheZdZdd�Zejdd��Zejddd��Zejdd	��Zejd
d��Z	dd
�Z
ddd�Zdd�ZdS)�
BaseReadercCs
||_dSr
)�	base_path�rr7rrr�__init__�szBaseReader.__init__cGsdSr
r�r�base�add_onsrrr�
_path_join�szBaseReader._path_joinFcCsdSr
r�rr*�decoderrr�
_path_read�szBaseReader._path_readcCsdSr
r�rrrr�_fetch_available_versions�sz$BaseReader._fetch_available_versionscCsdSr
rrArrr�_read_ec2_metadata�szBaseReader._read_ec2_metadatac
Cs�z|��}Wn6tk
rB}zt�d|j|�g}W5d}~XYnXdd�ttt��D�}t}|D]}||krpqb|}qzqbt�d||�|S)Nz4Unable to read openstack versions from %s due to: %scSsg|]}|�qSrr)�.0�vrrr�
<listcomp>�sz4BaseReader._find_working_version.<locals>.<listcomp>zSelected version '%s' from %s)	rB�	Exceptionr-r.r7�reversed�list�OS_VERSIONS�	OS_LATEST)rZversions_available�eZ	supportedZselected_versionZpotential_versionrrr�_find_working_version�s,��z BaseReader._find_working_versioncCs\|�dd��d�}|�d�}dd�|D�}|s:td|��|j|jdf|��}|j||d�S)	NZcontent_pathrr'cSsg|]}t|�r|�qSr)�len)rD�prrrrF�sz1BaseReader._read_content_path.<locals>.<listcomp>z!Item %s has no valid content path�	openstack�r?)r�lstrip�splitrr=r7r@)r�itemr?r*Zpath_piecesZvalid_piecesrrr�_read_content_path�s
zBaseReader._read_content_pathcs�tjtjtttfd����fdd�}ddd�}|����}|��D]�\}\}}}��	�j
|�}d}d}z��|�}WnDtk
r�}	z&|s�t
�d	||	�nt
�d
||	�W5d}	~	XYnXd}|r�|s�td|��|�r"|�r"z||�}Wn6tk
�r }	ztd
||	f�|	�W5d}	~	XYnX|rB|||<qB|d}
d|
k�r�|
d}zt�|�|
d<Wn6ttfk
�r�}	ztd|	�|	�W5d}	~	XYnXi}|
�dg�}
|
D]f}d|k�r��q�|d}z��|�||<Wn6tk
�r
}	ztd||	f�|	�W5d}	~	XYnX�q�||d<|
�dd�}|�rxz�j|dd�}||d<Wn2tk
�rv}	ztd|	�|	�W5d}	~	XYnXz|
dd|d<Wntk
�r�YnX���|d<tD]@\}}}|�r�||
k�r�td|��||
k�r�|
�|�|
|<�q�|S)z�Reads a version 2 formatted location.

        Return a dict with metadata, userdata, ec2-metadata, dsmode,
        network_config, files and version (2).

        If not a valid location, raise a NonReadable exception.
        )Z
root_typescs�i}��d|d�dtjf|d<��d|d�ddd�f|d	<��d|d
�d�f|d<��d|d�d�f|d
<��d|d�d�f|d<|S)NrPzmeta_data.jsonTr$Z	user_dataFcSs|Sr
rrrrrr�rz7BaseReader.read_v2.<locals>.datafiles.<locals>.<lambda>�userdatazvendor_data.jsonZ
vendordatazvendor_data2.jsonZvendordata2znetwork_data.jsonZnetworkdata)r=r�	load_json)r#�files�Zload_json_anytyperrr�	datafiles�s,�	����z%BaseReader.read_v2.<locals>.datafilesr�)rVr#NFz*Failed reading optional path %s due to: %sz+Failed reading mandatory path %s due to: %sTzMissing mandatory path: %s�Failed to process path %s: %sr$�random_seedz.Badly formatted metadata random_seed entry: %srXr*z#Failed to read provided file %s: %sr	rQz(Failed to read network configuration: %s�meta�dsmodezec2-metadatazNo '%s' entry in metadata)�	functools�partialrrW�dictrI�strrMrr=r7r@�IOErrorr-r.rrGr�base64Z	b64decode�
ValueError�	TypeErrorrrU�KeyErrorrC�
KEY_COPIES)rrZ�results�datarr*Zrequired�
translator�foundrLr$r]rXZmetadata_filesrTZnet_item�contentZ
target_keyZ
source_keyZis_requiredrrYr�read_v2�s�	�!���
��

��

����
zBaseReader.read_v2N)F)F)
rrrr9�abc�abstractmethodr=r@rBrCrMrUrorrrrr6�s



	r6)�	metaclasscsFeZdZ�fdd�Zdd�Zddd�Zdd	�Zd
d�Zdd
�Z�Z	S)�ConfigDriveReadercstt|��|�d|_dSr
)�superrsr9�	_versionsr8��	__class__rrr9fszConfigDriveReader.__init__cGs|gt|�}tjj|�Sr
)rIr)r*�join)rr;r<Z
componentsrrrr=jszConfigDriveReader._path_joinFcCs|rt�|�St�|�Sr
)rZload_text_fileZload_binary_filer>rrrr@ns��zConfigDriveReader._path_readcs@|jdkr:|�|jd���fdd�t���D�}t|�|_|jS)NrPcs$g|]}tj�tj����r|�qSr)r)r*�isdirrx�rD�d�r*rrrFxs�z?ConfigDriveReader._fetch_available_versions.<locals>.<listcomp>)rur=r7r)�listdir�sorted)rrmrr|rrBus

�
z+ConfigDriveReader._fetch_available_versionsc
Csn|�|jddd�}tj�|�s"iSzt�|�|��WStk
rh}zt	d||f�|�W5d}~XYnXdS)Nrrzmeta-data.jsonr\)
r=r7r)r*r+rrWr@rGr)rr*rLrrrrC�s �
��z$ConfigDriveReader._read_ec2_metadatacCs�i}t��D]&}|�|j|�}tj�|�r|||<qt|�dkrNtd|j��i}t�	�D]�\}\}}}||k�r||}z|�
|�}Wn0tk
r�}	ztd|�|	�W5d}	~	XYnXz||�||<Wn4t
k
r�}	ztd||	f�|	�W5d}	~	XYnXqZt�|�||<qZ|d}
|d}|�d|
�}
|
�rN|
��}d	d
�|D�|d<d|k�rd|d|d<d|d
�}
d|k�r�|d|
d<|�dd�|
d<i|
d<|
S)z�Reads a version 1 formatted location.

        Return a dict with metadata, userdata, dsmode, files and version (1).

        If not a valid path, raise a NonReadable exception.
        rz%s: no files foundzFailed to read: %sNr\rrr"cSs"g|]}t|�r|�d�s|�qS)�#)rNr()rD�linerrrrF�s
�z-ConfigDriveReader.read_v1.<locals>.<listcomp>rr!)r#r$r_z	user-datarrVrX)�FILES_V1�keysr=r7r)r*r+rNrrr@rdrrG�copy�deepcopyr�
splitlines)rrmrr*Zmd�keyrl�default�contentsrLZkeydatar�linesrjrrr�read_v1�sT

 
���

�
zConfigDriveReader.read_v1)F)
rrrr9r=r@rBrCr��
__classcell__rrrvrrses
rscs@eZdZd�fdd�	Zdd�Zddd	�Zd
d�Zdd
�Z�ZS)�MetadataReaderN�cs4tt|��|�||_t|�|_t|�|_d|_dSr
)	rtr�r9�ssl_details�float�timeout�int�retriesru)rZbase_urlr�r�r�rvrrr9�s


zMetadataReader.__init__cCsb|jdk	r|jSg}|�|jd�}|j|dd�}|��D]}|��}|sJq8|�|�q8||_|jS)NrPTrQ)rur=r7r@r��stripr2)rrmZversion_pathrnr�rrrrB�s
z(MetadataReader._fetch_available_versionsFcCs:dd�}tj||j|j|j|d�}|r0|j��S|jSdS)Nc	Ss:zt|j�}|dkrWdSWnttfk
r4YnXdS)Ni�FT)r��codergrf)�causer�rrr�should_retry_cb�s

z2MetadataReader._path_read.<locals>.should_retry_cb)r�r�r�Zexception_cb)rZreadurlr�r�r�r�r?)rr*r?r�Zresponserrrr@�s
�
zMetadataReader._path_readcGstj|f|��Sr
)rZcombine_urlr:rrrr=szMetadataReader._path_joincCstj|j|j|jd�S)N)r�r�r�)rZget_instance_metadatar�r�r�rArrrrC	s
�z!MetadataReader._read_ec2_metadata)Nr�r�)F)	rrrr9rBr@r=rCr�rrrvrr��s

r�c s�|dkrdSddddddgddd	d
ddd
dddg
ddd	ddgd��|�dg�}|�dg�}|�dg�}g}i�d}d}g}|D�]�g}	t�fdd����D��}
d�kr��d|
d<d}��d�rވ�d���}|��d<|
�d�|�d�dd�}�fdd�|D�D�]�}
t�fd d�|
��D��}�fd!d�|
�d"g�D�}|�rZ|�d"|i�|
dd#k�rx|�dd$i�n�|
dd%k�r�|�dd&i�nz|
dd'k�r�|�d|
di�nX|
dd(k�r�|�d)|
�d*�d+��n2|
dd,k�r|
�d-d.i�|�d/|
�d*�d+��d0d�|
�d"g�D�}|
�dg�D]:}|�d�d1k�rJ�q2|d|k�r\�q2|�|d��q2|�r|||d<|
dd2k�r�|
�d-d3i�|
dd4k�r�d3|d4<|
dd5k�r�d3|d5<|	�|��q|
�d|	i��dd6k�r�i}|�r|
�d|i����D]J\}}|d7k�r&�qn0|�d8��rd9�|�d:d;�d<�}|�||i��q||}|d;7}|�|
d=d>t	�
�d7�f�|
�||d?��||d<n��dd@k�r dA�dB�dCf}|
�|�dCdD��|�|
dBd>�dBf�|�|
ddE�dC�dBf�|��dF|dG��n.�dtk�r>t�
dH�d�|
�dI|dJ��|�|
�|�|d<q~dKd�|D�}|�s�|�rr|dk�r�t��}���D]:\}}|�d��r��q�|�dL�|k�r�||dL|d<�q�|D]D}|�d�}|�s�tdM|��||k�rtdN|��|||d<�q�|D]L\}
}�}t|ttf��rZ��fdOd�|D�|
|<n��|d|
|<�q$t��}|�r�|D],}
|
d|k�r�||
d|
d<dP|
d<�q�|D](}t	�
|�}
|
�ddQi�|�|
��q�d;|dR�S)Sa*Return a dictionary of network_config by parsing provided
       OpenStack ConfigDrive NetworkData json format

    OpenStack network_data.json provides a 3 element dictionary
      - "links" (links are network devices, physical or virtual)
      - "networks" (networks are ip network configurations for one or more
                    links)
      -  services (non-ip services, like dns)

    networks and links are combined via network items referencing specific
    links via a 'link_id' which maps to a links 'id' field.

    To convert this format to network_config yaml, we first iterate over the
    links and then walk the network list to determine if any of the networks
    utilize the current link; if so we generate a subnet entry for the device

    We also need to map network_data.json fields to network_config fields. For
    example, the network_data links 'id' field is equivalent to network_config
    'name' field for devices.  We apply more of this mapping to the various
    link types that we encounter.

    There are additional fields that are populated in the network_data.json
    from OpenStack that are not relevant to network_config yaml, so we
    enumerate a dictionary of valid keys for network_yaml and apply filtering
    to drop these superfluous keys from the network_config yaml.
    Nr�type�mac_address�subnets�paramsZmtu�addressZnetmaskZ	broadcastZmetricZgatewayZpointopointZscope�dns_nameserversZ
dns_search�networkZdestination)�physical�subnet�routes�links�networks�serviceszbond%drc3s&|]\}}|�dkr||fVqdS)r�Nr�rD�krE��
valid_keysrr�	<genexpr>Tsz#convert_net_json.<locals>.<genexpr>Zethernet_mac_address�id)r�macr�r�cs g|]}|d�dkr|�qS)�linkr�r)rDr4)r�rrrFjsz$convert_net_json.<locals>.<listcomp>c3s&|]\}}|�dkr||fVqdS)r�Nrr�r�rrr�kscs&g|]}t�fdd�|��D���qS)c3s&|]\}}|�dkr||fVqdS)r�Nrr�r�rrr�rs�z.convert_net_json.<locals>.<listcomp>.<genexpr>)rbr)rD�router�rrrFqs��r�Z	ipv4_dhcpZdhcp4�	ipv6_dhcpZdhcp6)Z
ipv6_slaaczipv6_dhcpv6-stateless�ipv6_dhcpv6-stateful)�ipv4�staticr�Z
ip_address)r�r�)�ipv6�static6z	accept-raFr�cSs4g|],}|�dg�D]}|�d�dkr|d�qqS)r�r��dnsr��r)rDr��servicerrrrF�s
�r�)r�r�Tr�r�)�bondZ
bond_linksr�zbond-{}Zbond_r!���Zbond_interfacesz%s)r�r)Zvlanz%s.%sZ	vlan_link�vlan_id)rr�z%%s.%sZvlan_mac_address)r�rz9Unknown network_data link type (%s); treating as physicalr�)r�r�cSs&g|]}|�d�dkrd|kr|�qS)r�r�rr�rzrrrrF�sr�z#No mac_address or name entry for %sz"Unable to find a system nic for %scsg|]}��|d�qS)rr)rD�target)�fmt�link_id_inforrrFsZ
infinibandZ
nameserver)r#�config)rrbr�lower�updater2r(�formatrSr�r��KNOWN_PHYSICAL_TYPESr-ZwarningrZget_interfaces_by_macrf�
isinstancerI�tupleZget_ib_hwaddrs_by_interface) Znetwork_jsonZ
known_macsr�r�r�Zlink_updatesZ
bond_name_fmtZbond_numberr�r�ZcfgZ
link_mac_addrZcurinfor�r�r�r�r�r�r�rEZtranslated_keyZ	link_namerZ
need_namesZ_link_id�infor{r�r�ZtargetsZib_known_hwaddrsr)r�r�r�r�r�convert_net_jsonsR�	��
�
��

�	����

�
��
����
�


�
r�)NN))rprer�r`Zloggingr)Z	cloudinitrrrrrZcloudinit.sourcesrZcloudinit.sources.helpersrZ	getLoggerrr-rWr�rirKZ	OS_FOLSOMZ
OS_GRIZZLYZ	OS_HAVANAZ
OS_LIBERTYZ
OS_NEWTON_ONEZ
OS_NEWTON_TWOZOS_OCATAZOS_ROCKYrJr�rdrr�ABCMetar6rsr�r�rrrr�<module>	sP

��LEs: