܍~c%xddlZddlZddlZddlZddlZddlmZddlmZddl m Z ddl m Z ddl m Z mZmZmZddlmZmZddlmZdd lmZdd lmZe jeZd Zed zed zedzdZdZdZ dZ!Gddej"j#Z$dZ%dZ&Gddej'Z(e(ej)ffgZ*dZ+dS)N)HTTPConnection) PoolManager)dmi)log)netsources url_helperutil) EventScope EventType)NoDHCPLeaseError)EphemeralDHCPv4)DataSourceHostnamezhttp://169.254.42.42z/conf?format=jsonz/user_data/cloud-initz/vendor_data/cloud-init) metadata_url userdata_urlvendordata_url ctjd}|dkrdStjdrdSt j}d|vrdSdS)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-manufacturerScalewayTz/var/run/scalewayscalewayF)r read_dmi_dataospathexistsr get_cmdline) vendor_namecmdlines F/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceScaleway.py on_scalewayr )sd#$9::Kj  t w~~)**t  GWt 5c*eZdZdZfdZddZxZS)SourceAddressAdapterzF Adapter for requests to choose the local address to bind to. c V||_tt|jdi|dS)N)source_addresssuperr#__init__)selfr&kwargs __class__s rr(zSourceAddressAdapter.__init__Es5,2"D))2<   3Q 7B  '!.)    r!)F)__name__ __module__ __qualname____doc__r(r8 __classcell__r+s@rr#r#@sV=====         r!r#c tj|d|d|d}tj|jS#tj$r}|jdkrYd}~dSd}~wwxYw)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. Nrcb|jdko$t|jtjj S)N)code isinstancecauserequests exceptionsConnectionError)_excs rz%query_data_api_once..qs,C)sy(*=*MNNNr!)datatimeoutretriessession exception_cbrA)r readurlr decode_binarycontentsUrlErrorrB) api_addressrLrequests_sessionresprIs rquery_data_api_oncerWVs ! $   !$-000   8s??44444 s36A AAActdt|dD]} td||t j}|dtd|ft|||}td||cS#tj $r<}t d ||tj d |}Yd }~d }~wwxYw|) 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-z*Trying to get %s data (bind on port %d)...zhttp://z0.0.0.0)r&)rLrUz%s-data downloadedz%Error while trying to get %s data: %srN)rangemaxLOGdebugrESessionmountr#rWr rSwarningtimesleep) api_typerTrMrLportrUrKrIlast_excs rquery_data_apirf~s!aWa))  II"?4;??9nEEFF 4;??9nEEFF #' &}r!cJtj|j|j|j}t jtj|j |_ td|j |j|j|_ td|j|j|j|_dS)N)rLrMz user-dataz vendor-data)r rProrLrMjsonloadsr rQrRmetadatarfrp userdata_rawrqvendordata_raw)r)rVs r_crawl_metadataz"DataSourceScaleway._crawl_metadatas!  !4<    4#5dm#D#DEE * . dl  - 42DL$,  r!ctsdS|jtj|_ t |j|j5tjtj d|j dddn #1swxYwYn?#t$r2}tj tt|Yd}~dSd}~wwxYwdS)NF)tmp_dirzCrawl of metadata service)logfuncmsgfuncT)r rvrfind_fallback_nicrrzget_tmp_exec_pathr log_timer\r]rr logexcstr)r)es r _get_datazDataSourceScaleway._get_datas*}} 5  # +'*'<'>'>D $  ( 5577   I3-                !    KSVV $ $ $55555 ts;-B'B BBBBB C''CCc |j6tdtjtj|_|jtjkr|jS|jt j|_dd|jzd}ddig}|jdrL|d d|jdd zd|jdd zd d d|jddzdgdgz }||d<d|gd|_|jS)z` Configure networking according to data received from the metadata API. Nz5Found None as cached _network_config. Resetting to %sphysicalz%s)typenamerdhcp4ipv6staticaddressnetmaskz::0gateway)networkprefixr)rrrroutessubnetsr-)versionconfig) rxr\r`rrwrvrrr)r)netcfgrs rnetwork_configz!DataSourceScaleway.network_configs1   ' KKG    $+=D  7= 0 0' '  # +'*'<'>'>D $$dT5M.MNNG$% =   $#dmF&;I&FF#dmF&;I&FF(,&)'+dmF.CI.N'N    G$y+,AA##r!cdSNr%r)s r launch_indexzDataSourceScaleway.launch_index tr!c|jdS)Nid)rrs rget_instance_idz"DataSourceScaleway.get_instance_ids}T""r!c d|jdD}d}t|}|jdgD]I}||s||d|ddJ|S)Ncg|] }|d S)keyr%).0rs r z:DataSourceScaleway.get_public_ssh_keys..sKKK3CJKKKr!ssh_public_keyszAUTHORIZED_KEY=tagsrH )rlenrs startswithappendreplace)r)ssh_keysakeypreplentags rget_public_ssh_keysz&DataSourceScaleway.get_public_ssh_keyssKK$-8I*JKKK#7||=$$VR00 : :C>>'**  OOCJ..sC88 9 9 9 9r!Fc8t|jddS)NhostnameF)rr)r)fqdn resolve_ip metadata_onlys r get_hostnamezDataSourceScaleway.get_hostnames!$- ";UCCCr!cdSrr%rs ravailability_zonez$DataSourceScaleway.availability_zone!rr!cdSrr%rs rregionzDataSourceScaleway.region%rr!)FFF)r9r:r;dsnamer NETWORKr BOOT_NEW_INSTANCEBOOT BOOT_LEGACYdefault_update_eventsr(rrpropertyrrrrrrrr=r>s@rrhrhs" F  ' N  ! -----&    *%$%$X%$NX###   DDDDXXr!rhc6tj|tSr)rlist_from_depends datasources)dependss rget_datasource_listr/s  $Wk : ::r!),r}rr3rarEurllib3.connectionrurllib3.poolmanagerr cloudinitrrloggingrrr r cloudinit.eventr r cloudinit.net.dhcpr cloudinit.net.ephemeralrcloudinit.sourcesr getLoggerr9r\ DS_BASE_URLrmrtrur adapters HTTPAdapterr#rWrf DataSourcerhDEP_FILESYSTEMrrr%r!rrs .-----++++++$$$$$$44444444444411111111//////333333000000g!!$  "55"99!$== .     8,8   ,%%%P###LCCCCC+CCCN'023 ;;;;;r!