x[h:ddlZddlZddlZddlZddlZddlmZddlZddlm Z ddl m Z ddl m Z ddlmZmZmZmZmZddlmZmZddlmZdd lmZmZdd lmZdd lmZej@e!Z"d d gZ#dZ$dZ%dZ&GddejNjPZ)dZ*dZ+GddejXZ-e-ej\ffgZ/dZ0y)N)urlparse)ConnectionError)HTTPConnection) PoolManager)dmi performancesources 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@r rr&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 r z%query_data_api_once..Ws3SXX_&syy(*=*=*M*MNNr!)datatimeoutretriessession exception_cbr7)r readurlr decode_binarycontentsUrlErrorr8) api_addressr@requests_sessionrespr=s r query_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[N)protoz0::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 r query_data_apirfdsaaWa)#"  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  Ec eZdZdZej ejejejhiZ fdZ de ddffd Z dZdZed Zd Zed Zed Zd ZdZddZedZedZxZS)DataSourceScalewayScalewayctt| |||tjtj |ddgig|_t|j jdt|_ t|j jdt|_ t|j jdt|_tj |_t$|_d|_d|_d|_d|_d|_d|j j3vr#|xj&|j dz c_yy)N datasourcerirAr@max_waitT metadata_urls)rrhrr mergemanydictget_cfg_by_pathds_cfgintgetDEF_MD_RETRIESrADEF_MD_TIMEOUTr@DEF_MD_MAX_WAITrlr UNSET_network_config DS_BASE_URLSrm metadata_url userdata_urlvendordata_urlephemeral_fixed_addresshas_ipv4keys)rsys_cfgdistropathsrs r rzDataSourceScaleway.__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}rlrmrzr{)r _unpicklerurxhasattrsetattr)rr attr_defaultsattrrs r rzDataSourceScaleway._unpicklesU .)'+') "  " 9D4&dM$$78 9r!cntj}tj||j|j d\}}|r5t jd||d|_|d|_ |d|_ yt jd|ttj|z t) zO Define metadata_url based upon api-metadata URL availability. F)urlsrlr@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] monotonicr wait_for_urlrlr@rSrTryrzr{rqr)rr start_time avail_url_s r _set_metadata_urlz$DataSourceScaleway._set_metadata_urls ^^% !..]]LL"'  1  II' 3#,+-> ?D #,+-B CD %.K/F"GD   IIEDNN$z12  " !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 rDryr@rAjsonloadsr rErFmetadatarfrz 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-manufacturerriTz/var/run/scalewayscalewayN)r read_dmi_dataospathexistsr get_cmdline) vendor_namecmdlines r ds_detectzDataSourceScaleway.ds_detectsR''(=> * $ 77>>- .""$   !r!c|jr t|j|jj5}t j d5|j |jddd|j|d|_ d|jd<ddd|js t%|j|jj5t j d5|j |jddd|jd|jd<dddyy#1swYxYw#1swYxYw#tttf$r4}tjt t#|d|_Yd}~d}~wwxYw#1swYxYw#1swYyxYw#t$rYywxYw) Nz7Setting api-metadata URL depending on IPv4 availabilityz fixed-addressipv4 net_in_useFz7Setting api-metadata URL depending on IPv6 availabilityipv6T)r}rrfallback_interfacerTimedrrmrr|rrrrr logexcrSstrr)rres r _get_datazDataSourceScaleway._get_datas == &%KKKK22 9$**9C..t/A/AB C ((*373HD028DMM,/ 9.}} )KKKK22 9%**,C..t/A/AB C ((*28DMM,/ 9ECC 9 9!% &  CQ(!&  &"CC 9#  s*EE D=*1E E0*F8F,0F  'F,3F8=E E  EEF)*FF F) %F,,F51F85F88 GGc R|j9tjdtjtj|_|jtjk7r |jS|j di}i}|j dD]}|d|j k(r3d|d<dddd }d |jvr|d xx|gz cc<A|g|d <Hd |jvr|d xx|dd |d fz cc<n|dd |d f|d <|ddk(s|ddd}d |jvr|d xx|gz cc<|g|d <|||jj<d|d|_ndd|jjzd}ddig}|j drI|dd|j ddzd|j dd zddd|j ddzdgdgz }||d<d |gd!|_tjd"|j|jS)#z` Configure networking according to data received from the metadata API. z5Found None as cached _network_config. Resetting to %s private_ip public_ipsrcTdhcp4z169.254.42.42/32z 62.210.0.1)zon-linktoviaroutes addresses/netmaskfamilyinet6gatewayz::/0)rrr)version ethernetsphysicalz%s)typenamerrstaticz::0)networkprefixr)rrcrrsubnetsr#)rconfigznetwork_config : %s) rwrSr\r rvrr|r~rrrT)rnetcfgip_cfgiprouters r network_configz!DataSourceScaleway.network_config4s    ' KKG  $+==D   7== 0'' ' == & .FFmmL1 7i=D$@$@@&*F7O$(0+E  6;;=0x(UG3(,17x("fkkm3{+!)}oQr)}o>0+ ")}oQr)}o>/{+(|w.(*9 V D#v{{}4"8,7,05wF8,9 7:6###r!cyNrrs r launch_indexzDataSourceScaleway.launch_indexr!c |jdS)Nid)rrs r get_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 )rlenrr startswithappendreplace)rrssh_keysakeypreplentags r get_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 r availability_zonez$DataSourceScaleway.availability_zonerr!cyrrrs r regionzDataSourceScaleway.regionrr!)FFF)r/r0r1dsnamer NETWORKr BOOT_NEW_INSTANCEBOOT BOOT_LEGACYdefault_update_eventsrrqrrr staticmethodrrpropertyrrrrrrrr3r4s@r rhrhs F  ' ' NN  ! ! ?, 9 9 9"4  (0dM$M$^# Dr!rhc6tj|tSr)r list_from_depends datasources)dependss r get_datasource_listrs  $ $Wk ::r!)1rloggingrr)r] urllib.parserr;requests.exceptionsrurllib3.connectionrurllib3.poolmanagerr cloudinitrrr r r cloudinit.eventr r cloudinit.net.dhcprcloudinit.net.ephemeralrrcloudinit.sourcesrcloudinit.subpr getLoggerr/rSrxrsrurtadapters HTTPAdapterrrKrf DataSourcerhDEP_FILESYSTEMrrrr!r rs  !/.+AA1/I00g!&(>?  8,,88 ,%P1hH++HX'0023 ;r!