ó
    x[h 2  ã            	       ó¶  • S SK r S SKrS SKrS SKJr  S SKJr  S SKJ	r	  S SK
JrJrJrJr  S SKJrJrJr  S SKJrJr  S SKJr  S S	KJrJrJr  \R8                  " \5      rS
SS.SSSS.SSSSSS/S.r " S S\	5      r  " S S\RB                  5      r" " S S\"5      r#\#\RH                  44\"\RH                  \RJ                  44/r&S\\RB                     4S jr'g)é    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                   ó$   • \ rS rSrSrSrSrSrSrg)ÚMetadataAvailabilityResulté-   z^
Used to indicate how this instance should behave based on the availability
of metadata to it
r   é   é   © N)	Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__ÚNOT_AVAILABLEÚ	AVAILABLEÚDEFERÚ__static_attributes__r&   ó    ÚD/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceAkamai.pyr"   r"   -   s   † ñð
 €MØ€IØƒEr0   r"   c                   óÀ   • \ rS rSrSrSrS rSS\S\S\4S jjr	S\
4S	 jrS\
4S
 jrS\
4S jrS\\\\\4   \4      4S jrSS\S\4S jjrS\4S jrS\4S jrSrg)ÚDataSourceAkamaié8   ÚAkamaiFc                 ó  • [         R                  S5        [        R                  R	                  XX#5        [        5       U l        [        R                  " [        5       [        R                  " USS/0 5      [        /5      U l        g )NzSetting up Akamai DataSourceÚ
datasourcer5   )ÚLOGÚdebugr
   Ú
DataSourceÚ__init__Údictr   r   Úmergemanydictr   Úget_cfg_by_pathÚBUILTIN_DS_CONFIGÚds_cfg)ÚselfÚsys_cfgÚdistror   s       r1   r;   ÚDataSourceAkamai.__init__<   sn   € Ü�	‰	Ð0Ô1Ü×Ñ×#Ñ# D°6ÔAÜ›ˆŒô ×(Ò(äÓ Ü×$Ò$ØØ! 8Ð,Øóô
 "ðó

ˆ�r0   Ú	path_nameÚuse_v6Úreturnc                 ó  • XR                   S   ;  a  [        SR                  U5      5      eSnU(       d  U R                   S   (       d  SnU R                   S   U   nU R                   S   U   nSR                  XE5      $ )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)rA   rE   rF   Úversion_keyÚbase_urlÚpaths         r1   Ú
_build_urlÚDataSourceAkamai._build_urlN   sw   € ð ŸK™K¨Ñ0Ó0ÜÐ3×:Ñ:¸9ÓEÓFÐFàˆÞ˜Ÿ™ \×2Ø ˆKà—;‘;˜{Ñ+¨KÑ8ˆØ�{‰{˜7Ñ# IÑ.ˆà�}‰}˜XÓ,Ð,r0   c                 óN  • U R                   S   (       d  U R                   S   (       a(  U R                   S   (       d9  U R                   S   (       d%  [        R                  S5        [        R                  $ U R
                  (       a  U R                  5       $ U R                  5       $ )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@   r8   Úinfor"   r,   Úlocal_stageÚ_should_fetch_data_localÚ_should_fetch_data_network©rA   s    r1   Ú_should_fetch_dataÚ#DataSourceAkamai._should_fetch_data`   sw   € ð —‘˜L×)°$·+±+¸l×2Kà—‘Ð/×0Ø—K‘KÐ 2×3ô �H‰HÐAÔBÜ-×;Ñ;Ð;à××Ø×0Ñ0Ó2Ð2à×2Ñ2Ó4Ð4r0   c                 ó.  • U R                   S   (       d%  [        R                  S5        [        R                  $ U R                   S   (       d9  U R                   S   (       d%  [        R                  S5        [        R                  $ [        R
                  $ )zo
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@   r8   rQ   r"   r.   r-   rU   s    r1   rS   Ú)DataSourceAkamai._should_fetch_data_localt   sl   € ð
 �{‰{Ð.×/ä�H‰HÐ@ÔAÜ-×3Ñ3Ð3à�{‰{˜<×(°·±¸\×1Jô �H‰HØKôô .×3Ñ3Ð3ä)×3Ñ3Ð3r0   c                 ó”   • U R                   S   (       d%  [        R                  S5        [        R                  $ [        R
                  $ )zC
Returns whether metadata should be fetched during the init stage.
r   z1Configuration does not allow for init stage setuprY   rU   s    r1   rT   Ú+DataSourceAkamai._should_fetch_data_network‰   s6   € ð �{‰{Ð-×.ä�H‰HÐHÔIÜ-×3Ñ3Ð3ä)×3Ñ3Ð3r0   c           	      ó   • / nU R                   (       Ga  [        5       nSnU R                  S   nUR                  5        H8  u  pV[	        U Vs/ s H  ouR                  U5      PM     sn5      (       d  M6  Un  O   Uc  [        R                  S5        [        5       n/ nU R                  S   (       a'  UR                  [        U R                  USSS9S45        U R                  S   (       a:  U R                  S	   (       a&  UR                  [        U R                  USS
9S45        U$ U R                  S   (       a  UR                  [        5       S45        U R                  S   (       a  UR                  [        5       S45        U$ s  snf )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   )rR   r   r@   ÚitemsÚanyÚ
startswithr8   Úwarningr   Úappendr   rC   Únoop)rA   Únetwork_context_managersÚ
interfacesÚ	interfaceÚpreferred_prefixesÚmacÚinfÚprefixs           r1   Ú_get_network_context_managersÚ.DataSourceAkamai._get_network_context_managers”   s”  € ð ð 	!ð ××Ðô
 /Ó0ˆJØˆIØ!%§¡Ð-EÑ!FÐØ&×,Ñ,Ö.‘�äÙ:LÓMÒ:L°—^‘^ FÖ+Ñ:LÑM÷ó ð !$�IÙñ /ð Ñ Ü—‘ð)ôô .Ó/�	à')Ð$à�{‰{˜<×(Ø(×/Ñ/ä*Ø ŸK™KØ%Ø!&Ø!%ñ	ð ðô
ð �{‰{˜<×(¨T¯[©[¸×-FØ(×/Ñ/ä*Ø ŸK™KØ%Ø!%ñð
 ðô	ð6 (Ð'ð! �{‰{˜<×(Ø(×/Ñ/ä›Øðôð �{‰{˜<×(Ø(×/Ñ/ä›Øðôð (Ð'ùòo Ns   ÁF
c           	      ó   •  [         R                  " U R                  SUS9SSSSSS0S	9nUR                  S
:w  a!  [        R                  SUR                  5        g[        U5      n[         R                  " U R                  SUS9SSSSUS.S9n[        R                  " [        U5      5      U l	        [         R                  " U R                  SUS9SSSSU0S9n[        U5      U l
         [        U R                  5      U l
        g! [        R                   a   n[        R                  SU5         SnAgSnAff = f! [         R                   a*  n[        R                  SU(       a  SOSU5         SnAgSnAff = f)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   ©rF   Ú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)rt   ru   rv   rw   r   rz   z*Failed to base64 decode userdata due to %sNz1Failed to retrieve metadata using IPv%s due to %sÚ6Ú4F)r   ÚreadurlrN   Úcoder8   rQ   ÚstrÚjsonÚloadsr   Úuserdata_rawr   ÚbinasciiÚErrorra   ÚUrlError)rA   rF   Útoken_responser   r   r   Úes          r1   Ú_fetch_metadataÚ 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D? ÁBD? Ã-D ÄD<ÄD7Ä2D? Ä7D<Ä<D? Ä?E=Å E8Å8E=c                 ó–  • [         R                  S5        [        5       (       d  [         R                  S5        g[	        5       nSU0U l        U R                  5       nU[        R                  :w  a@  U[        R                  :X  a  [         R                  S5        g[         R                  S5        gU R                  5       nU H[  u  pEU   U R                  US9nU(       a4  U R
                  R                  S	U5      U R
                  S'    S
S
S
5          g S
S
S
5        M]     [         R                  S5        g! , (       d  f       M„  = f)zG
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.rn   ÚidNzHFailed to contact metadata service, falling back to local metadata only.)r8   r9   r   rQ   r   r   rV   r"   r-   r,   rk   rˆ   Úgetra   )rA   Úlocal_instance_idÚavailabilityrd   ÚmanagerrF   Údones          r1   Ú	_get_dataÚ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ÚØ×+Ñ+°6Ð+Ð:�Þà37·=±=×3DÑ3DØØ)ó4�D—M‘M -Ñ0ð ÷ �ð& ð# ÷ ‘ñ  8ô �K‰Kð!ôð
 ÷' –ús   ÃAD9Ä9
E	c                 óL   • [         R                  " U R                  5       S5      $ )zR
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)rA   rB   s     r1   Úcheck_instance_idÚ"DataSourceAkamai.check_instance_id[  s&   € ô
 ×6Ò6Ø× Ñ Ó"Ð$:ó
ð 	
r0   )r@   r   r‚   N)F)r'   r(   r)   r*   ÚdsnamerR   r;   r   ÚboolrN   r"   rV   rS   rT   r   r   r	   r   r   rk   rˆ   r‘   r–   r/   r&   r0   r1   r3   r3   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÷ 
r0   r3   c                   ó   • \ rS rSrSrSrSrg)ÚDataSourceAkamaiLocalie  z½
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.
Tr&   N)r'   r(   r)   r*   r+   rR   r/   r&   r0   r1   r›   r›   e  s   † ñð ƒKr0   r›   rG   c                 ó8   • [         R                  " U [        5      $ )N)r
   Úlist_from_dependsÚdatasources)Údependss    r1   Úget_datasource_listr      s   € Ü×$Ò$ W¬kÓ:Ð:r0   )(rƒ   r€   ÚloggingÚbase64r   Ú
contextlibr   rc   Úenumr   Útypingr   r   r   r	   Ú	cloudinitr
   r   r   Úcloudinit.netr   r   Úcloudinit.net.ephemeralr   Ú cloudinit.sources.helpers.akamair   r   r   Ú	getLoggerr'   r8   r?   r"   r:   r3   r›   ÚDEP_FILESYSTEMÚDEP_NETWORKrž   r    r&   r0   r1   Ú<module>r­      s  ðÛ Û Û Ý Ý 'Ý ß *Ó *ç /Ñ /ß BÝ 6÷ñ ð ×Ò˜Ó!€ð
 )Ø,ñð
 Ø"Ø#ñð ØØØØð 	ðñ%Ð ô0 ô ôj
�w×)Ñ)ô j
ôZ	Ð,ô ð ˜W×3Ñ3Ð5Ð6ð 	à×"Ñ"Ø×Ñð	
ðð	€ð ; D¨×);Ñ);Ñ$<õ ;r0   