Ë
    x[h 2  ã            	       ó´  — d dl Z d dlZd dlZd dlmZ d dlmZ d dlm	Z	 d dl
mZmZmZmZ d dlmZmZmZ d dlmZmZ d dlmZ d d	lmZmZmZ  ej8                  e«      Zd
ddœddddœddddddgdœZ G d„ de	«      Z  G d„ dejB                  «      Z" G d„ de"«      Z#e#ejH                  ffe"ejH                  ejJ                  ffgZ&deejB                     fd„Z'y)é    N)Ú	b64decode)Úsuppress)ÚEnum)ÚAnyÚListÚTupleÚUnion)ÚsourcesÚ
url_helperÚutil)Úfind_fallback_nicÚget_interfaces_by_mac)ÚEphemeralIPNetwork)Úget_dmi_configÚget_local_instance_idÚis_on_akamaizhttp://169.254.169.254zhttp://[fd00:a9fe:a9fe::1]©Úipv4Úipv6z	/v1/tokenz/v1/instancez/v1/user-data)ÚtokenÚmetadataÚuserdataTzf2:3)Ú	base_urlsÚpathsÚallow_local_stageÚallow_init_stageÚ
allow_dhcpÚ
allow_ipv4Ú
allow_ipv6Úpreferred_mac_prefixesc                   ó   — e Zd ZdZdZdZdZy)ÚMetadataAvailabilityResultzj
    Used to indicate how this instance should behave based on the availability
    of metadata to it
    r   é   é   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚNOT_AVAILABLEÚ	AVAILABLEÚDEFER© ó    úD/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceAkamai.pyr"   r"   -   s   „ ñð
 €MØ€IØ�Er-   r"   c                   ó¤   — e Zd ZdZdZd„ Zddededefd„Zde	fd„Z
de	fd	„Zde	fd
„Zdeeeeef   ef      fd„Zddedefd„Zdefd„Zdefd„Zy)ÚDataSourceAkamaiÚAkamaiFc                 ó  — t         j                  d«       t        j                  j	                  | |||«       t        «       | _        t        j                  t        «       t        j                  |ddgi «      t        g«      | _        y )NzSetting up Akamai DataSourceÚ
datasourcer1   )ÚLOGÚdebugr
   Ú
DataSourceÚ__init__Údictr   r   Úmergemanydictr   Úget_cfg_by_pathÚBUILTIN_DS_CONFIGÚds_cfg)ÚselfÚsys_cfgÚdistror   s       r.   r7   zDataSourceAkamai.__init__<   sr   € Ü�	‰	Ð0Ô1Ü×Ñ×#Ñ# D¨'°6¸5ÔAÜ›ˆŒô ×(Ñ(äÓ Ü×$Ñ$ØØ! 8Ð,Øóô
 "ðó

ˆ�r-   Ú	path_nameÚuse_v6Úreturnc                 óî   — || j                   d   vrt        dj                  |«      «      ‚d}|s| j                   d   sd}| j                   d   |   }| j                   d   |   }dj                  ||«      S )zÛ
        Looks up the path for a given name and returns a full url for it.  If
        use_v6 is passed in, the IPv6 base url is used; otherwise the IPv4 url
        is used unless IPv4 is not allowed in ds_cfg
        r   zUnknown path name {}r   r   r   r   z{}{})r<   Ú
ValueErrorÚformat)r=   r@   rA   Úversion_keyÚbase_urlÚpaths         r.   Ú
_build_urlzDataSourceAkamai._build_urlN   s{   € ð ˜DŸK™K¨Ñ0Ñ0ÜÐ3×:Ñ:¸9ÓEÓFÐFàˆÙ˜Ÿ™ \Ò2Ø ˆKà—;‘;˜{Ñ+¨KÑ8ˆØ�{‰{˜7Ñ# IÑ.ˆà�}‰}˜X tÓ,Ð,r-   c                 ó  — | j                   d   s| j                   d   r| j                   d   s4| j                   d   s%t        j                  d«       t        j                  S | j
                  r| j                  «       S | j                  «       S )zŸ
        Returns whether metadata should be retrieved at this stage, at the next
        stage, or never, in the form of a MetadataAvailabilityResult.
        r   r   r   r   z*Configuration prohibits fetching metadata.)r<   r4   Úinfor"   r)   Úlocal_stageÚ_should_fetch_data_localÚ_should_fetch_data_network©r=   s    r.   Ú_should_fetch_dataz#DataSourceAkamai._should_fetch_data`   sw   € ð —‘˜LÒ)°$·+±+¸lÒ2Kà—‘Ð/Ò0Ø—K‘KÐ 2Ò3ô �H‰HÐAÔBÜ-×;Ñ;Ð;à×ÒØ×0Ñ0Ó2Ð2à×2Ñ2Ó4Ð4r-   c                 ó  — | j                   d   s%t        j                  d«       t        j                  S | j                   d   s4| j                   d   s%t        j                  d«       t        j                  S t        j
                  S )z‡
        Returns whether metadata should be retrieved during the local stage, or
        if it should wait for the init stage.
        r   z)Configuration prohibits local stage setupr   r   z9Configuration does not allow for ephemeral network setup.©r<   r4   rK   r"   r+   r*   rO   s    r.   rM   z)DataSourceAkamai._should_fetch_data_localt   sl   € ð
 �{‰{Ð.Ò/ä�H‰HÐ@ÔAÜ-×3Ñ3Ð3à�{‰{˜<Ò(°·±¸\Ò1Jô �H‰HØKôô .×3Ñ3Ð3ä)×3Ñ3Ð3r-   c                 óŠ   — | j                   d   s%t        j                  d«       t        j                  S t        j
                  S )zS
        Returns whether metadata should be fetched during the init stage.
        r   z1Configuration does not allow for init stage setuprR   rO   s    r.   rN   z+DataSourceAkamai._should_fetch_data_network‰   s6   € ð �{‰{Ð-Ò.ä�H‰HÐHÔIÜ-×3Ñ3Ð3ä)×3Ñ3Ð3r-   c           	      óÞ  — g }| j                   �rt        «       }d}| j                  d   }|j                  «       D ]1  \  }}t	        |D �cg c]  }|j                  |«      ‘Œ c}«      sŒ/|} n |€t        j                  d«       t        «       }g }| j                  d   r*|j                  t        | j                  |dd¬«      df«       | j                  d   r8| j                  d	   r)|j                  t        | j                  |d¬
«      df«       |S | j                  d   r|j                  t        «       df«       | j                  d   r|j                  t        «       df«       |S c c}w )zß
        Returns a list of context managers which should be tried when setting
        up a network context.  If we're running in init mode, this return a
        noop since networking should already be configured.
        Nr    zGFailed to find default interface, attempting DHCP on fallback interfacer   FTr   r   r   )r   )rL   r   r<   ÚitemsÚanyÚ
startswithr4   Úwarningr   Úappendr   r?   Únoop)r=   Únetwork_context_managersÚ
interfacesÚ	interfaceÚpreferred_prefixesÚmacÚinfÚprefixs           r.   Ú_get_network_context_managersz.DataSourceAkamai._get_network_context_managers”   s�  € ð ð 	!ð ×Óô
 /Ó0ˆJØˆIØ!%§¡Ð-EÑ!FÐØ&×,Ñ,Ó.ò ‘��SäØ:LÖM°�S—^‘^ FÕ+ÒMõð !$�IÙðð Ð Ü—‘ð)ôô .Ó/�	à')Ð$à�{‰{˜<Ò(Ø(×/Ñ/ä*Ø ŸK™KØ%Ø!&Ø!%ô	ð ðô
ð �{‰{˜<Ò(¨T¯[©[¸Ò-FØ(×/Ñ/ä*Ø ŸK™KØ%Ø!%ôð
 ðô	ð6 (Ð'ð! �{‰{˜<Ò(Ø(×/Ñ/ä›Øðôð �{‰{˜<Ò(Ø(×/Ñ/ä›Øðôð (Ð'ùòo Ns   Á
E*
c           	      ó  — 	 t        j                  | j                  d|¬«      ddddddi¬	«      }|j                  d
k7  r!t        j                  d|j                  «       yt        |«      }t        j                  | j                  d|¬«      dddd|dœ¬«      }t        j                  t        |«      «      | _	        t        j                  | j                  d|¬«      dddd|i¬«      }t        |«      | _
        	 t        | j                  «      | _
        y# t        j                  $ r }t        j                  d|«       Y d}~yd}~ww xY w# t         j                  $ r%}t        j                  d|rdnd|«       Y d}~yd}~ww xY w)z¶
        Runs through the sequence of requests necessary to retrieve our
        metadata and user data, creating a token for use in doing so, capturing
        the results.
        r   ©rA   ÚPUTé   r$   é   zMetadata-Token-Expiry-SecondsÚ300)Úrequest_methodÚtimeoutÚsec_betweenÚretriesÚheaderséÈ   z-Fetching token returned %s; not fetching dataTr   zapplication/json)ÚAcceptúMetadata-Token)rj   rk   rl   rm   r   rp   z*Failed to base64 decode userdata due to %sNz1Failed to retrieve metadata using IPv%s due to %sÚ6Ú4F)r   ÚreadurlrI   Úcoder4   rK   ÚstrÚjsonÚloadsr   Úuserdata_rawr   ÚbinasciiÚErrorrX   ÚUrlError)r=   rA   Útoken_responser   r   r   Úes          r.   Ú_fetch_metadataz DataSourceAkamai._fetch_metadataã   s…  € ð:	ä'×/Ñ/Ø—‘ °�Ó7Ø$ØØØà3°Uðô	ˆNð ×"Ñ" cÒ)Ü—‘ØCØ"×'Ñ'ôð ä˜Ó'ˆEô "×)Ñ)Ø—‘ 
°6�Ó:ØØØà0Ø&+ñô	ˆHô !ŸJ™J¤s¨8£}Ó5ˆDŒMô "×)Ñ)Ø—‘ 
°6�Ó:ØØØà$ eðôˆHô !$ H£ˆDÔðMÜ$-¨d×.?Ñ.?Ó$@�Ô!ð øô —>‘>ò MÜ—‘ÐHÈ!×LÐLð ûðMûä×"Ñ"ò 		ô �K‰KØCÙ‘ 3Øôô
 ûð		úsC   ‚AE Á BE Ã:D ÄEÄ(EÄ>E ÅEÅE ÅFÅE>Å>Fc                 óv  — t         j                  d«       t        «       st         j                  d«       yt	        «       }d|i| _        | j                  «       }|t        j                  k7  r?|t        j                  k(  rt         j                  d«       yt         j                  d«       y| j                  «       }|D ]Y  \  }}|5  | j                  |¬«      }|r4| j
                  j                  d	|«      | j
                  d<   	 d
d
d
«        y	 d
d
d
«       Œ[ t         j                  d«       y# 1 sw Y   Œ{xY w)zW
        Overrides _get_data in the DataSource class to actually retrieve data
        z#Getting data from Akamai DataSourcez#Not running on Akamai, not running.Fzinstance-idz5Metadata is not available, returning local data only.TzFConfigured not to fetch data at this stage; waiting for a later stage.rd   ÚidNzHFailed to contact metadata service, falling back to local metadata only.)r4   r5   r   rK   r   r   rP   r"   r*   r)   rb   r~   ÚgetrX   )r=   Úlocal_instance_idÚavailabilityr[   ÚmanagerrA   Údones          r.   Ú	_get_datazDataSourceAkamai._get_data'  s?  € ô 	�	‰	Ð7Ô8äŒ~Ü�H‰HÐ:Ô;Øä1Ó3ÐàÐ,ð
ˆŒð ×.Ñ.Ó0ˆàÔ5×?Ñ?Ò?ØÔ9×GÑGÒGÜ—‘ØKôð ä�H‰Hð!ôð à#'×#EÑ#EÓ#GÐ Ø7ò 	‰OˆG�VØñ Ø×+Ñ+°6Ð+Ó:�Ùà37·=±=×3DÑ3DØØ)ó4�D—M‘M -Ñ0ð ÷ð ð& ð# ÷ð ð	ô �K‰Kð!ôð
 ÷'ð ús   Ã?D/Ä/D8	c                 óJ   — t        j                  | j                  «       d«      S )zj
        A local-only check to see if the instance id matches the id we see on
        the system
        zsystem-serial-number)r
   Úinstance_id_matches_system_uuidÚget_instance_id)r=   r>   s     r.   Úcheck_instance_idz"DataSourceAkamai.check_instance_id[  s&   € ô
 ×6Ñ6Ø× Ñ Ó"Ð$:ó
ð 	
r-   N)F)r%   r&   r'   ÚdsnamerL   r7   ru   ÚboolrI   r"   rP   rM   rN   r   r   r	   r   r   rb   r~   r†   rŠ   r,   r-   r.   r0   r0   8   s¬   „ Ø€FØ€Kò
ñ$- Cð -°ð -À#ó -ð$5Ð$>ó 5ð(4Ð*Dó 4ð*	4Ð,Fó 	4ðM(à	ˆe�E˜#Ð1Ð1Ñ2°DÐ8Ñ9Ñ	:óM(ñ^B dð B°tó BðH2˜4ó 2ðh
¨Dô 
r-   r0   c                   ó   — e Zd ZdZdZy)ÚDataSourceAkamaiLocalzÍ
    A subclass of DataSourceAkamai that runs the same functions, but during the
    init-local stage.  This allows configuring networking via cloud-init, as
    networking hasn't been configured yet.
    TN)r%   r&   r'   r(   rL   r,   r-   r.   rŽ   rŽ   e  s   „ ñð �Kr-   rŽ   rB   c                 ó6   — t        j                  | t        «      S )N)r
   Úlist_from_dependsÚdatasources)Údependss    r.   Úget_datasource_listr“     s   € Ü×$Ñ$ W¬kÓ:Ð:r-   )(ry   rv   ÚloggingÚbase64r   Ú
contextlibr   rZ   Úenumr   Útypingr   r   r   r	   Ú	cloudinitr
   r   r   Úcloudinit.netr   r   Úcloudinit.net.ephemeralr   Ú cloudinit.sources.helpers.akamair   r   r   Ú	getLoggerr%   r4   r;   r"   r6   r0   rŽ   ÚDEP_FILESYSTEMÚDEP_NETWORKr‘   r“   r,   r-   r.   ú<module>r       s  ðÛ Û Û Ý Ý 'Ý ß *Ó *ç /Ñ /ß BÝ 6÷ñ ð €g×Ñ˜Ó!€ð
 )Ø,ñð
 Ø"Ø#ñð ØØØØð 	ðñ%Ð ô0 ô ôj
�w×)Ñ)ô j
ôZ	Ð,ô ð ˜W×3Ñ3Ð5Ð6ð 	à×"Ñ"Ø×Ñð	
ðð	€ð ; D¨×);Ñ);Ñ$<ô ;r-   