f>ddlZddlZddlZddlZddlZddlmZddlZddlm Z ddl m Z ddl m Z ddlmZmZmZmZddlmZmZddlmZdd lmZmZdd lmZdd lmZej>e Z!d d gZ"dZ#dZ$dZ%GddejLjNZ(dZ)dZ*GddejVZ,e,ejZffgZ.dZ/y)N)urlparse)ConnectionError)HTTPConnection) PoolManager)dmisources url_helperutil) EventScope EventType)NoDHCPLeaseError)EphemeralDHCPv4EphemeralIPv6Network)DataSourceHostname)ProcessExecutionErrorzhttp://169.254.42.42zhttp://[fd00:42::42] c*eZdZdZfdZddZxZS)SourceAddressAdapterzF Adapter for requests to choose the local address to bind to. c :||_tt|di|y)N)source_addresssuperr__init__)selfrkwargs __class__s F/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceScaleway.pyrzSourceAddressAdapter.__init__+s, "D2>    3 3Q 7B  '!..)  r )F)__name__ __module__ __qualname____doc__rr- __classcell__rs@rrr&s=  r rc tj|d|d|d}tj|jS#tj $r}|j dk(rYd}~yd}~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. Nrc|jdk7xr/t|jtjj  S)N)code isinstancecauserequests exceptionsr)_excs rz%query_data_api_once..Ws3C)syy(*=*=*M*MNNr )datatimeoutretriessession exception_cbr6)r readurlr decode_binarycontentsUrlErrorr7) api_addressr@requests_sessionrespr=s rquery_data_api_oncerK<sk !! $ !!$--00    88s? s:=A*A%$A%%A*ctdt|dD]} tjd||t j }d} t |j}|}|ddk(r|dd}tj|dtj dd} | tjk(rd }|jd t||f t||| } tjd|| cS #t$rYTwxYw#t j"$r9} tj%d|| t'j(d| } Yd} ~ 6d} ~ 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"rz*Trying to get %s data (bind on port %d)...z0.0.0.0r[Nprotoz0::zhttp://)r)r@rIz%s-data downloadedz%Error while trying to get %s data: %s)rangemaxLOGdebugr:Sessionrnetlocr( getaddrinfo IPPROTO_TCPAF_INET6 ValueErrormountrrKr rGwarningtimesleep) api_typerHrAr@portrI localhost url_addressaddress addr_protor?r=last_excs rquery_data_apirgdsaaWa)#"  IIS()!B/G#//T);); 0 %I  " "$Y4EF 'W?OD II*H 5K9#L N)  ""  KK?3 O JJqMH   s=-D A%C7.AD7 DDDDE.E  EceZdZdZej ejejejhiZ fdZ de ddffd Z dZdZed Zd Zd Zed Zed ZdZdZddZedZedZxZS)DataSourceScalewayScalewayctt| |||tjtj |ddgig|_t|j jdt|_ t|j jdt|_ t|j jdt|_tj |_t$|_d|_d|_d|_d|_d|j j1vr#|xj&|j dz c_yy)N datasourcerjrAr@max_waitT metadata_urls)rrirr mergemanydictget_cfg_by_pathds_cfgintgetDEF_MD_RETRIESrADEF_MD_TIMEOUTr@DEF_MD_MAX_WAITrmrUNSET_network_config DS_BASE_URLSrn userdata_urlvendordata_urlephemeral_fixed_addresshas_ipv4keys)rsys_cfgdistropathsrs rrzDataSourceScaleway.__init__s  $0&%H(($$W|Z.H"M   4;;??9nEF 4;;??9nEF DKKOOJHI &}}) "'+$ dkk..0 0   $++o"> >  1r ci_pkl_versionreturnNct||ddttddd}|D]}t ||rt ||||!y)NT)r|r}rmrnrzr{)r _unpicklervryhasattrsetattr)rr attr_defaultsattrrs rrzDataSourceScaleway._unpicklesU .)'+') "  " 9D4&dM$$78 9r cntj}tj||j|jd\}}|r5t j d||d|_|d|_|d|_ yt j d|ttj|z t) zO Define metadata_url based upon api-metadata URL availability. F)urlsrmr@connect_synchronouslyz%s is reachablez/conf?format=jsonz/user_data/cloud-initz/vendor_data/cloud-initNz3Unable to reach api-metadata at %s after %s seconds) r^r wait_for_urlrmr@rTrU metadata_urlrzr{rrr)rr start_time avail_urlr<s r_set_metadata_urlz$DataSourceScaleway._set_metadata_urls YY[ !..]]LL"'  1  II' 3#,+-> ?D #,+-B CD %.K/F"GD   IIEDIIK*,-  " !r ctj|j|j|j}t j tj|j|_ td|j|j|j|_ td|j|j|j|_y)N)r@rAz user-dataz vendor-data)r rDrr@rAjsonloadsr rErFmetadatargrz userdata_rawr{vendordata_raw)rrJs r_crawl_metadataz"DataSourceScaleway._crawl_metadatas!!   t||T\\  4#5#5dmm#DE * **DLL$,, - 4.. dll r ctjd}|dk(rytjj dryt j }d|vryy)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-manufacturerrjTz/var/run/scalewayscalewayN)r read_dmi_dataospathexistsr get_cmdline) vendor_namecmdlines r ds_detectzDataSourceScaleway.ds_detectsR''(=> * $ 77>>- .""$   !r cj|dvrtjd|gSg}|D]}t|j}|ddk(r|dd}t j |dtj dd}|tjk(r |dk(r||gz }p|tjk(s|d k(s||gz }|S) N)ipv4ipv6zInvalid IP version : %srrMr"rNrOrr) rTrUrrWr(rXrYAF_INETrZ)rrPr filtered_urlsurlrdres r_set_urls_on_ip_versionz*DataSourceScaleway._set_urls_on_ip_versions ( ( II/ 7I  Csm**GqzS !!B-++V%7%7JV^^+#& v.5F?#&  r c|jr t|j|jj5}t j t jd|j|jft j t jd|j|d|_ d|jd<ddd|js t%|j|jj5t j t jd |j|jft j t jd|jd |jd<dddy y #1swYxYw#tttf$r5}t j t t#|d|_Yd}~ d}~wwxYw#1swYy xYw#t$rYywxYw) Nz3Set api-metadata URL depending on IPv4 availability)logfuncmsgfuncargszCrawl of metadata service)rrrz fixed-addressr net_in_useFz3Set api-metadata URL depending on IPv6 availabilityrT)r}rrfallback_interfacer log_timerTrUrrnrr|rr rrlogexcstrr)rres r _get_datazDataSourceScaleway._get_datas == &%KKKK229MM # ,!33"002 MM # 7!11 483HD028DMM,/#9:}} )KKKK229MM # ,!33"002 MM # 7!11 39DMM,/!9&e99&!% &  CQ(!&  &9&$  s`*FBF>F*G'=A0+ ")}oQr)}o>/{+(|w.(*9 V D#v{{}4"8,7,05wF8,- 7.6###r cyNrrs r launch_indexzDataSourceScaleway.launch_indexr c |jdS)Nid)rrs rget_instance_idz"DataSourceScaleway.get_instance_ids}}T""r c|jdDcgc]}|d }}d}t|}|jjdgD]8}|j|s|j ||dj dd:|Scc}w)Nssh_public_keyskeyzAUTHORIZED_KEY=tagsr< )rlenrs startswithappendreplace)rrssh_keysakeypreplentags rget_public_ssh_keysz&DataSourceScaleway.get_public_ssh_keyss*.--8I*JK3CJKK#7|==$$VR0 :C>>'* OOCJ..sC8 9 : Ls Bc4t|jddS)NhostnameF)rr)rfqdn resolve_ip metadata_onlys r get_hostnamezDataSourceScaleway.get_hostnames!$-- ";UCCr cyrrrs ravailability_zonez$DataSourceScaleway.availability_zonerr cyrrrs rregionzDataSourceScaleway.regionrr )FFF)r.r/r0dsnamer NETWORKr BOOT_NEW_INSTANCEBOOT BOOT_LEGACYdefault_update_eventsrrrrrr staticmethodrrrpropertyrrrrrrrr2r3s@rriris F  ' ' NN  ! ! ?* 9 9 9"4  (0<|G$G$R# Dr ric6tj|tSr)rlist_from_depends datasources)dependss rget_datasource_listrs  $ $Wk ::r )0rloggingrr(r^ urllib.parserr:requests.exceptionsrurllib3.connectionrurllib3.poolmanagerr cloudinitrrr r cloudinit.eventr r cloudinit.net.dhcpr cloudinit.net.ephemeralrrcloudinit.sourcesrcloudinit.subpr getLoggerr.rTryrtrvruadapters HTTPAdapterrrKrg DataSourceriDEP_FILESYSTEMrrrr rrs  !/.+441/I00g!&(>?  8,,88 ,%P1he++eR '0023 ;r