a '¡Dg¸lã@s6ddlZddlZddlZddlZddlZddlZddlmZmZm Z m Z m Z ddl m Z ddlmZe e¡Zddd„dfd e jifd d d„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©©Úxr r úG/usr/lib/python3.9/site-packages/cloudinit/sources/helpers/openstack.pyÚórÚÚmeta_jsÚauthorized_keyscCs|Sr r r r r rrr)zetc/network/interfaceszmeta.jszroot/.ssh/authorized_keys))zlocal-hostnameÚhostnameF)ú 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__r r r rrQsrc@s4eZdZdd„Zdd„Zdd„Zdd„Zd d „Zd S) Ú SourceMixincCs>|js dS|j di¡}| ¡D]\}}||kr |Sq dS)Nzblock-device-mapping)Z ec2_metadataÚgetÚitems)ÚselfÚnameZbdmZent_nameÚdevicer r rÚ_ec2_name_to_deviceVs zSourceMixin._ec2_name_to_devicecCs$d}|jdkrd}t |j |¡¡S)NZ public_keyséú public-keys)ÚversionrZnormalize_pubkey_dataÚmetadatar)rrr r rÚget_public_ssh_keys_s zSourceMixin.get_public_ssh_keyscCsPd}z2d|}|dkrd|}t |¡}|r4|d}WntjyJYn0|S)NzLABEL=%sZswapzTYPE=%sr)rZfind_devs_withrZProcessExecutionError)rrr ZcriteriaZ dev_entriesr r rÚ_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)rr Zremappedr r rÚ_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!r0r')rrÚnamesr Únr r rÚdevice_name_to_device€s2        z!SourceMixin.device_name_to_deviceN)rrrr!r&r'r0r6r r r rrUs   rc@sheZdZdd„Zejdd„ƒZejddd„ƒZejdd „ƒZejd d „ƒZ d d „Z ddd„Z dd„Z dS)Ú BaseReadercCs ||_dSr )Ú base_path©rr8r r rÚ__init__¢szBaseReader.__init__cGsdSr r ©rÚbaseÚadd_onsr r rÚ _path_join¥szBaseReader._path_joinFcCsdSr r ©rr+Údecoder r rÚ _path_read©szBaseReader._path_readcCsdSr r ©rr r rÚ_fetch_available_versions­sz$BaseReader._fetch_available_versionscCsdSr r rBr r rÚ_read_ec2_metadata±szBaseReader._read_ec2_metadatac CsŽz | ¡}Wn8tyD}z t d|j|¡g}WYd}~n d}~00dd„tttƒƒDƒ}t}|D]}||vrrqd|}q|qdt d||¡|S)Nz4Unable to read openstack versions from %s due to: %scSsg|]}|‘qSr r )Ú.0Úvr r rÚ Ârz4BaseReader._find_working_version..zSelected version '%s' from %s) rCÚ Exceptionr.r/r8ÚreversedÚlistÚ OS_VERSIONSÚ OS_LATEST)rZversions_availableÚeZ supportedZselected_versionZpotential_versionr r rÚ_find_working_versionµs, ýýz BaseReader._find_working_versioncCs^| dd¡ d¡}| d¡}dd„|Dƒ}|s:td|ƒ‚|j|jdg|¢RŽ}|j||d�S) NZ content_pathrr(cSsg|]}t|ƒr|‘qSr )Úlen)rEÚpr r rrGÕrz1BaseReader._read_content_path..z!Item %s has no valid content pathÚ openstack©r@)rÚlstripÚsplitrr>r8rA)rÚitemr@r+Z path_piecesZ valid_piecesr r rÚ_read_content_pathÒs  zBaseReader._read_content_pathc stjtjtttfd�‰‡‡fdd„}dddœ}|ˆ ¡ƒ}| ¡D]ð\}\}}}ˆ  ˆj |¡}d}d}zˆ  |¡}WnFt yº} z.|s˜t  d || ¡nt  d || ¡WYd} ~ nd} ~ 00d }|rÔ|sÔtd |ƒ‚|�r&|�r&z ||ƒ}Wn8t�y$} ztd || fƒ| ‚WYd} ~ n d} ~ 00|rB|||<qB|d} d| v�rš| d} zt | ¡| d<Wn8ttf�y˜} ztd| ƒ| ‚WYd} ~ n d} ~ 00i} |  dg¡} | D]h}d|v�rÀ�q®|d}zˆ |¡| |<Wn8t�y} ztd|| fƒ| ‚WYd} ~ n d} ~ 00�q®| |d<|  dd¡}|�r‚zˆj|d d�}||d<Wn4t �y€} ztd| ƒ| ‚WYd} ~ n d} ~ 00z| dd|d<Wnt�yªYn0ˆ ¡|d<tD]@\}}}|�râ|| v�râtd|ƒ‚|| v�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)NrQzmeta_data.jsonTr%Z user_dataFcSs|Sr r r r r rrõrz7BaseReader.read_v2..datafiles..Úuserdatazvendor_data.jsonZ vendordatazvendor_data2.jsonZ vendordata2znetwork_data.jsonZ networkdata)r>rÚ load_json)r$Úfiles©Zload_json_anytyperr rÚ datafilesès, ú ý ý ý ýz%BaseReader.read_v2..datafilesré)rWr$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: %srYr+z#Failed to read provided file %s: %sr rRz(Failed to read network configuration: %sÚmetaÚdsmodez ec2-metadatazNo '%s' entry in metadata)Ú functoolsÚpartialrrXÚdictrJÚstrrNrr>r8rAÚIOErrorr.r/rrHrÚbase64Z b64decodeÚ ValueErrorÚ TypeErrorrrVÚKeyErrorrDÚ KEY_COPIES)rr[ÚresultsÚdatarr+ÚrequiredÚ translatorÚfoundrMr%r^rYZmetadata_filesrUZnet_itemÚcontentZ target_keyZ source_keyZ is_requiredr rZrÚread_v2Ûs¨  ÿ!þ ÿÿ    ÿþ  ÿþ   ÿþ  ÿþ   zBaseReader.read_v2N)F)F) rrrr:ÚabcÚabstractmethodr>rArCrDrNrVrqr r r rr7¡s     r7)Ú metaclasscsFeZdZ‡fdd„Zdd„Zddd„Zdd „Zd d „Zd d „Z‡Z S)ÚConfigDriveReadercstt|ƒ |¡d|_dSr )Úsuperrur:Ú _versionsr9©Ú __class__r rr:fszConfigDriveReader.__init__cGs|gt|ƒ}tjj|ŽSr )rJr*r+Újoin)rr<r=Ú componentsr r rr>jszConfigDriveReader._path_joinFcCs|rt |¡St |¡Sr )rZload_text_fileZload_binary_filer?r r rrAnsÿ ýzConfigDriveReader._path_readcs@|jdur:| |jd¡‰‡fdd„t ˆ¡Dƒ}t|ƒ|_|jS)NrQcs$g|]}tj tj ˆ¡¡r|‘qSr )r*r+Úisdirrz©rEÚd©r+r rrGxsþz?ConfigDriveReader._fetch_available_versions..)rwr>r8r*ÚlistdirÚsorted)rror rrrCus  þ z+ConfigDriveReader._fetch_available_versionsc Csp| |jddd¡}tj |¡s"iSzt | |¡¡WStyj}zt d||fƒ|‚WYd}~n d}~00dS)Nrrzmeta-data.jsonr]) r>r8r*r+r,rrXrArHr)rr+rMr r rrD€s ÿ  ÿþz$ConfigDriveReader._read_ec2_metadatac Cs¦i}t ¡D]&}| |j|¡}tj |¡r |||<q t|ƒdkrNtd|jƒ‚i}t  ¡D]¼\}\}}}||v�r||}z|  |¡}Wn2t yº} zt d|ƒ| ‚WYd} ~ n d} ~ 00z||ƒ||<Wn8t �y} zt d|| fƒ| ‚WYd} ~ n d} ~ 00qZt |¡||<qZ|d} |d} |  d| ¡} | �rT|  ¡} d d „| Dƒ|d<d | v�rj| d |d <d |d œ} d| v�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)ú#)rOr))rEÚliner r rrG¹sþz-ConfigDriveReader.read_v1..rr")r$r%r`z user-datarrWrY)ÚFILES_V1Úkeysr>r8r*r+r,rOrrrArerrHÚcopyÚdeepcopyrÚ splitlines)rrorr+ZmdÚkeyrnÚdefaultÚcontentsrMZkeydatarÚlinesrkr r rÚread_v1ŽsT     $ ÿþ þ   þ  zConfigDriveReader.read_v1)F) rrrr:r>rArCrDr�Ú __classcell__r r rxrrues    rucs@eZdZd‡fdd„ Zdd„Zddd „Zd d „Zd d „Z‡ZS)ÚMetadataReaderNécs4tt|ƒ |¡||_t|ƒ|_t|ƒ|_d|_dSr ) rvr�r:Ú ssl_detailsÚfloatÚtimeoutÚintÚretriesrw)rZbase_urlr‘r“r•rxr rr:Ùs   zMetadataReader.__init__cCsb|jdur|jSg}| |jd¡}|j|dd�}| ¡D]}| ¡}|sJq8| |¡q8||_|jS)NrQTrR)rwr>r8rArˆÚstripr3)rroZ version_pathrprƒr r rrCàs   z(MetadataReader._fetch_available_versionsFcCs:dd„}tj||j|j|j|d�}|r0|j ¡S|jSdS)Nc Ss8zt|jƒ}|dkrWdSWnttfy2Yn0dS)Ni�FT)r”Úcoderhrg)Z _request_argsÚcauser—r r rÚshould_retry_cbðs  z2MetadataReader._path_read..should_retry_cb)r•r‘r“Z exception_cb)rZreadurlr•r‘r“r‹r@)rr+r@r™Zresponser r rrAïs û zMetadataReader._path_readcGstj|g|¢RŽSr )rZ combine_urlr;r r rr>szMetadataReader._path_joincCstj|j|j|jd�S)N)r‘r“r•)rZget_instance_metadatar‘r“r•rBr r rrD s ýz!MetadataReader._read_ec2_metadata)Nr�r�)F) rrrr:rCrAr>rDrŽr r rxrr�Øs  r�c sÊ|dur dSgd¢gd¢gd¢dœ‰| dg¡}| dg¡}| dg¡}g}i‰d }d }g}|D�]â‰g} t‡fd d „ˆ ¡Dƒƒ} d ˆvr˜ˆd | d <d} ˆ d¡rÀˆ d¡ ¡} | ˆˆd<|  d ¡| ˆdˆddœ} ‡fdd„|DƒD�]À} t‡fdd „|  ¡Dƒƒ}‡fdd„|  dg¡Dƒ}|�r<| d|i¡| ddk�rZ| ddi¡n˜| ddk�rx| ddi¡nz| ddv�rš| d| di¡nX| ddv�rÀ| d|  d¡dœ¡n2| dd v�rò|  d!d"i¡| d#|  d¡dœ¡d$d„|  dg¡Dƒ}|  dg¡D]:}| d¡d%k�r,�q|d&|v�r>�q| |d&¡�q|�r^||d'<| dd(v�rz|  d!d)i¡| dd*k�r�d)|d*<| dd+k�r¦d)|d+<|  |¡qî|  d,| i¡ˆdd-v�r€i}| �ræ|  d.| i¡ˆ ¡D]J\}}|d/k�r�qîn0| d0¡�rîd1 | d2d3¡d4¡}| ||i¡�qî||}|d37}| | d5d6t   ˆd/¡f¡|  ||d7œ¡|| d <n®ˆdd8v�rd9ˆd:ˆd;f}|  |ˆd;d<œ¡| | d:d6ˆd:f¡| | d d=ˆd;ˆd:f¡|  ˆd>|d?œ¡n.ˆdt v�rt   d@ˆd¡|  dA| dBœ¡| | ¡| ˆ| d<q`dCd„|Dƒ}|�s`|�rR|du�rrt ¡}ˆ ¡D]:\}}| d ¡�r’�qz| dD¡|v�rz||dD|d <�qz|D]D}| d.¡}|�sÚtdE|ƒ‚||v�rðtdF|ƒ‚|||d <�qº|D]L\} }‰}t|ttfƒ�r:‡‡fdGd„|Dƒ| |<nˆˆ|d | |<�qt ¡}|�r’|D],} | d |v�rd|| d | d.<dH| d<�qd|D](}t   |¡} |  ddIi¡| | ¡�q–d3|dJœS)Ka*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. N)rÚtypeÚ mac_addressÚsubnetsÚparamsZmtu) ršÚaddressÚnetmaskÚ broadcastÚmetricÚgatewayZ pointopointZscopeÚdns_nameserversZ dns_search)ÚnetworkZ destinationrŸr¢r¡)ÚphysicalÚsubnetÚroutesÚlinksÚnetworksÚserviceszbond%drc3s&|]\}}|ˆdvr||fVqdS)r¥Nr ©rEÚkrF©Ú valid_keysr rÚ Tsz#convert_net_json..rZethernet_mac_addressÚidrš)rÚmacr°ršcs g|]}|dˆdkr|‘qS)Úlinkr°r )rEr5)r²r rrGjrz$convert_net_json..c3s&|]\}}|ˆdvr||fVqdS)r¦Nr r«r­r rr¯kscs&g|]}t‡fdd„| ¡Dƒƒ‘qS)c3s&|]\}}|ˆdvr||fVqdS)r§Nr r«r­r rr¯rs þz.convert_net_json...)rcr)rEÚrouter­r rrGqsû þr§Z ipv4_dhcpZdhcp4Ú ipv6_dhcpZdhcp6)Z ipv6_slaaczipv6_dhcpv6-statelessúipv6_dhcpv6-stateful)Úipv4Ústaticr·Ú ip_address)ršrž)Úipv6Ústatic6z accept-raFrºcSs4g|],}| dg¡D]}| d¡dkr|d‘qqS)rªršÚdnsrž©r)rEr³Úservicer r rrGšsýr»ržr£)rµr´Tr¶r¹rœ)Úbondr›Z 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|vr|‘qS)ršr¥rr¼r}r r rrGòsr±z#No mac_address or name entry for %sz"Unable to find a system nic for %scsg|]}ˆˆ|d‘qS)rr )rEÚtarget)ÚfmtÚ link_id_infor rrG sZ infinibandZ nameserver)r$Úconfig)rrcrÚlowerÚupdater3r)ÚformatrTr†r‡ÚKNOWN_PHYSICAL_TYPESr.ZwarningrZget_interfaces_by_macrgÚ isinstancerJÚtupleZget_ib_hwaddrs_by_interface) Z network_jsonZ known_macsr¨r©rªZ link_updatesZ bond_name_fmtZ bond_numberrÄrœZcfgZ link_mac_addrZcurinfor¤r¦r§r£r½r�r¬rFZtranslated_keyZ link_namerZ need_namesZ_link_idÚinfor~r±r‰ÚtargetsZib_known_hwaddrsr )rÂr²rÃr®rÚconvert_net_jsons2 ë     ÿ   ü ÿ  ú þÿþÿ  þ    üÿ þÿÿý ÿ        ÿ   rÍ)NN))rrrfr†raZloggingr*Z cloudinitrrrrrZcloudinit.sourcesrZcloudinit.sources.helpersrZ getLoggerrr.rXr„rjrLZ OS_FOLSOMZ OS_GRIZZLYZ OS_HAVANAZ OS_LIBERTYZ OS_NEWTON_ONEZ OS_NEWTON_TWOZOS_OCATAZOS_ROCKYrKrÈrerrÚABCMetar7rur�rÍr r r rÚ sP      üø LEs: