a 'Dg:@s.ddlZddlZddlZddlZddlZddlmZddlZddlm Z ddl m Z ddl m Z ddlmZmZmZmZmZddlmZmZddlmZdd lmZmZdd lmZdd lmZe e!Z"d d gZ#dZ$dZ%dZ&Gdddej'j(Z)ddZ*ddZ+Gdddej,Z-e-ej.ffgZ/ddZ0dS)N)urlparse)ConnectionError)HTTPConnection) PoolManager)dmi performancesources url_helperutil) EventScope EventType)NoDHCPLeaseError)EphemeralDHCPv4EphemeralIPv6Network)DataSourceHostname)ProcessExecutionErrorzhttp://169.254.42.42zhttp://[fd00:42::42] cs*eZdZdZfddZdddZZS)SourceAddressAdapterzF Adapter for requests to choose the local address to bind to. c s ||_tt|jfi|dSN)source_addresssuperr__init__)selfrkwargs __class__H/usr/lib/python3.9/site-packages/cloudinit/sources/DataSourceScaleway.pyr+szSourceAddressAdapter.__init__FcCs0tjtjtjdfg}t||||j|d|_dS)N)Z num_poolsmaxsizeblockrsocket_options)rZdefault_socket_optionssocketZ SOL_SOCKETZ SO_REUSEPORTrrZ poolmanager)rZ connectionsr!r"r#rrrinit_poolmanager/s z%SourceAddressAdapter.init_poolmanager)F)__name__ __module__ __qualname____doc__rr% __classcell__rrrrr&s rc Csnz(tj|d|d|ddd}t|jWStjyh}z&|jdkrRWYd}~dSWYd}~n d}~00dS)aQ Retrieve user data or vendor data. Scaleway user/vendor data API returns HTTP/404 if user/vendor data is not set. This function calls `url_helper.readurl` but instead of considering HTTP/404 as an error that requires a retry, it considers it as empty user/vendor data. Also, be aware the user data/vendor API requires the source port to be below 1024 to ensure the client is root (since non-root users can't bind ports below 1024). If requests raises ConnectionError (EADDRINUSE), the caller should retry to call this function on an other port. NrcSs|jdkot|jtjj S)N)code isinstancecauserequests exceptionsr)_excrrrWs z%query_data_api_once..)datatimeoutretriesZsessionZ exception_cbr+)r readurlr decode_binarycontentsUrlErrorr,) api_addressr5requests_sessionrespr2rrrquery_data_api_once<s r>c Cs,tdt|dD]}ztd||t}d}zRt|j}|}|ddkrZ|dd}tj |dtj d dd} | tj krd }Wnt yYn0| d t||fd t|||d } td|| WStjy } z4td|| td| } WYd} ~ qWYd} ~ qd} ~ 00q| dS)a/Get user or vendor data. Handle the retrying logic in case the source port is used. Scaleway metadata service requires the source port of the client to be a privileged port (<1024). This is done to ensure that only a privileged user on the system can access the metadata service. r rz*Trying to get %s data (bind on port %d)...z0.0.0.0r[N)protoz0::zhttp://)r)r5r<z%s-data downloadedz%Error while trying to get %s data: %s)rangemaxLOGdebugr/ZSessionrnetlocr$Z getaddrinfoZ IPPROTO_TCPZAF_INET6 ValueErrorZmountrr>r r:warningtimesleep) Zapi_typer;r6r5portr<Z localhostZ url_addressaddressZ addr_protor4r2last_excrrrquery_data_apidsL          $rOcseZdZdZejejejej hiZ fddZ e ddfdd Z dd Zd d Zed d ZddZeddZeddZddZddZdddZeddZeddZZS) DataSourceScalewayScalewaycstt||||tt|ddgig|_t|jdt |_ t|jdt |_ t|jdt |_tj|_t|_d|_d|_d|_d|_d|_d|jvr|j|jd7_dS)NZ datasourcerQr6r5max_waitT metadata_urls)rrPrr Z mergemanydictZget_cfg_by_pathZds_cfgintgetDEF_MD_RETRIESr6DEF_MD_TIMEOUTr5DEF_MD_MAX_WAITrRrUNSET_network_config DS_BASE_URLSrS metadata_url userdata_urlvendordata_urlephemeral_fixed_addresshas_ipv4keys)rZsys_cfgdistropathsrrrrs"zDataSourceScaleway.__init__N)ci_pkl_versionreturncsFt|ddttddd}|D]}t||s"t||||q"dS)NT)r_r`rRrSr]r^)r _unpicklerXr[hasattrsetattr)rrdZ attr_defaultsattrrrrrfs  zDataSourceScaleway._unpicklecCs|t}tj||j|jdd\}}|rZtd||d|_|d|_ |d|_ dStd|t t|t dS) zO Define metadata_url based upon api-metadata URL availability. F)urlsrRr5Zconnect_synchronouslyz%s is reachablez/conf?format=jsonz/user_data/cloud-initz/vendor_data/cloud-initNz3Unable to reach api-metadata at %s after %s seconds) rJ monotonicr Z wait_for_urlrRr5rErFr\r]r^rTr)rrjZ start_timeZ avail_urlr1rrr_set_metadata_urls&     z$DataSourceScaleway._set_metadata_urlcCsZtj|j|j|jd}tt|j |_ t d|j |j|j|_ t d|j|j|j|_dS)N)r5r6z user-dataz vendor-data)r r7r\r5r6jsonloadsr r8r9metadatarOr]Z userdata_rawr^Zvendordata_raw)rr=rrr_crawl_metadatas z"DataSourceScaleway._crawl_metadatacCs>td}|dkrdStjdr&dSt}d|vr:dSdS)a  There are three ways to detect if you are on Scaleway: * check DMI data: not yet implemented by Scaleway, but the check is made to be future-proof. * the initrd created the file /var/run/scaleway. * "scaleway" is in the kernel cmdline. zsystem-manufacturerrQTz/var/run/scalewayZscalewayN)rZ read_dmi_dataospathexistsr Z get_cmdline)Z vendor_nameZcmdlinerrr ds_detects  zDataSourceScaleway.ds_detectc Csr|jrzt|j|jjb}td||jWdn1sF0Y||d|_ d|j d<Wdn1s0YWn@t t t fy}z"ttt|d|_WYd}~n d}~00|jsnzt|j|jjZtd||jWdn1s0Y|d|j d<Wdn1sJ0YWnt ylYdS0dS) Nz7Setting api-metadata URL depending on IPv4 availabilityz fixed-addressipv4Z net_in_useFz7Setting api-metadata URL depending on IPv6 availabilityipv6T)r`rrbfallback_interfacerZTimedrlrSrpr_ror rrr ZlogexcrEstrr)rruerrr _get_datasH* , ,.zDataSourceScaleway._get_datac Cs|jdur tdtjtj|_|jtjkr2|jS|jddurVi}i}|jdD]}|d|jkrd|d<ddd d }d |vr|d |g7<n |g|d <qTd |vr|d |dd |df7<n|dd |df|d <|ddkrT|ddd}d |vr0|d |g7<qT|g|d <qT|||jj <d|d|_ndd|jj d}ddig}|jdr|dd|jddd|jddddd|jdddgdg7}||d <d!|gd"|_t d#|j|jS)$z` Configure networking according to data received from the metadata API. Nz5Found None as cached _network_config. Resetting to %sZ private_ipZ public_ipsrMTZdhcp4z169.254.42.42/32z 62.210.0.1)zon-linktoviaroutes addresses/netmaskZfamilyZinet6gatewayz::/0)r|r{r)versionZ ethernetsZphysicalz%s)typenamerrvZstaticz::0)networkprefixr)rrMrr}subnetsr )rZconfigznetwork_config : %s) rZrErIrrYror_rarbrwrF)rZnetcfgZip_cfgipZrouterrrrnetwork_config4sp             z!DataSourceScaleway.network_configcCsdSrrrrrr launch_indexszDataSourceScaleway.launch_indexcCs |jdS)Nid)rorrrrget_instance_idsz"DataSourceScaleway.get_instance_idcCs^dd|jdD}d}t|}|jdgD]*}||s>q.|||dddq.|S)NcSsg|] }|dqS)keyr).0rrrr z:DataSourceScaleway.get_public_ssh_keys..Zssh_public_keyszAUTHORIZED_KEY=tagsr1 )rolenrU startswithappendreplace)rZssh_keysZakeypreplentagrrrget_public_ssh_keyss z&DataSourceScaleway.get_public_ssh_keysFcCst|jddS)NhostnameF)rro)rZfqdnZ resolve_ipZ metadata_onlyrrr get_hostnameszDataSourceScaleway.get_hostnamecCsdSrrrrrravailability_zonesz$DataSourceScaleway.availability_zonecCsdSrrrrrrregionszDataSourceScaleway.region)FFF)r&r'r(Zdsnamer ZNETWORKr ZBOOT_NEW_INSTANCEZBOOTZ BOOT_LEGACYZdefault_update_eventsrrTrfrlrp staticmethodrtrzpropertyrrrrrrrr*rrrrrPs2   2 O   rPcCs t|tSr)rZlist_from_depends datasources)Zdependsrrrget_datasource_listsr)1rmZloggingrqr$rJ urllib.parserr/Zrequests.exceptionsrZurllib3.connectionrZurllib3.poolmanagerrZ cloudinitrrrr r Zcloudinit.eventr r Zcloudinit.net.dhcpr Zcloudinit.net.ephemeralrrZcloudinit.sourcesrZcloudinit.subprZ getLoggerr&rEr[rVrXrWZadaptersZ HTTPAdapterrr>rOZ DataSourcerPZDEP_FILESYSTEMrrrrrrs:        (4