Ë
    x[hú5  ã                   óŽ  — d dl Z d dlZd dlZd dlmZ d dlmZmZmZm	Z	m
Z
 d dlmZ d dlmZmZ d dlmZ d dlmZ d dlmZ  ej,                  e«      Zd	Zd
eiZdZdZddiZdZ G d„ d«      Z G d„ dej@                  «      Z! G d„ de!«      Z"d„ Z#d„ Z$d1d„Z%d2d„Z&d„ Z'e"ejP                  ffe!ejP                  ejR                  ffgZ*d„ Z+edk(  r²d dl,Z,d dl-Z-d dlm.Z.  e,j^                  d¬ «      Z0e0jc                  d!d"d#e¬$«       e0jc                  d%d&d'd(d¬)«       e0je                  «       Z3 e&e3jh                  e3jj                  ¬*«      Z6d+e6v r	 e6d+   jo                  «       e6d+<    e; ejx                  e6d.dd/¬0«      «       yy# e8$ r= e-jr                  ju                  d,«       e6d+=  e.e6d+   «      jo                  «       e6d-<   Y Œ_w xY w)3é    N)Ú	b64decode)ÚdmiÚnetÚsourcesÚ
url_helperÚutil)Úug_util)Ú
EventScopeÚ	EventType)ÚNoDHCPLeaseError)ÚEphemeralDHCPv4)ÚDataSourceHostnamez3http://metadata.google.internal/computeMetadata/v1/Úmetadata_urlzLhttp://metadata.google.internal/computeMetadata/v1/instance/guest-attributesÚhostkeyszMetadata-FlavorÚGoogleÚens4c                   ó   — e Zd Zd„ Zdd„Zy)ÚGoogleMetadataFetcherc                 ó.   — || _         || _        || _        y ©N)Úmetadata_addressÚnum_retriesÚsec_between_retries)Úselfr   r   r   s       úA/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceGCE.pyÚ__init__zGoogleMetadataFetcher.__init__   s   € Ø 0ˆÔØ&ˆÔØ#6ˆÕ ó    c                 óî  — d }	 | j                   |z   }|r|dz  }t        j                  |t        | j                  | j
                  ¬«      }|j                  dk(  r@|r!t        j                  |j                  «      }|S |j                  j                  d«      }|S t        j                  d||j                  «       |S # t        j                  $ r$}d}t        j                  |||«       Y d }~|S d }~ww xY w)Nz/?recursive=True)ÚurlÚheadersÚretriesÚsec_betweenéÈ   úutf-8zurl %s returned code %szurl %s raised exception %s)r   r   ÚreadurlÚHEADERSr   r   Úcoder   Údecode_binaryÚcontentsÚdecodeÚLOGÚdebugÚUrlError)	r   ÚpathÚis_textÚis_recursiveÚvaluer   ÚrespÚexcÚmsgs	            r   Ú	get_valuezGoogleMetadataFetcher.get_value$   sï   € Øˆð	FØ×'Ñ'¨$Ñ.ˆCÙØÐ)Ñ)�Ü×%Ñ%ØÜØ×(Ñ(Ø ×4Ñ4ô	ˆDð �y‰y˜CÒÙÜ ×.Ñ.¨t¯}©}Ó=�Eð
 ˆð !ŸM™M×0Ñ0°Ó9�Eð ˆô —	‘	Ð3°T¸4¿9¹9ÔEØˆøô ×"Ñ"ò 	&Ø.ˆCÜ�I‰I�c˜4 ×%Ð%ð ˆûð	&ús   „AB= Â=C4ÃC/Ã/C4N)F)Ú__name__Ú
__module__Ú__qualname__r   r5   © r   r   r   r      s   „ ò7ô
r   r   c                   ó²   — e Zd ZdZdZej                  ej                  ej                  hiZ
d„ Zd„ Zed„ «       Zd„ Zd„ Zd„ Zdd	„Zed
„ «       Zed„ «       Zy)ÚDataSourceGCEÚGCEFc                 óz  — t         j                  j                  | |||«       d | _        |r6t	        j
                  ||«      \  }}t	        j                  |«      \  | _        }t        «       | _        t        j                  t        j                  |ddgi «      t        g«      | _        | j                  d   | _        y )NÚ
datasourcer<   r   )r   Ú
DataSourcer   Údefault_userr	   Únormalize_users_groupsÚextract_defaultÚdictÚmetadatar   ÚmergemanydictÚget_cfg_by_pathÚBUILTIN_DS_CONFIGÚds_cfgr   )r   Úsys_cfgÚdistroÚpathsÚusersÚ_groupsÚ_user_configs          r   r   zDataSourceGCE.__init__I   s£   € Ü×Ñ×#Ñ# D¨'°6¸5ÔAØ ˆÔÙÜ&×=Ñ=¸gÀvÓNÑˆU�GÜ07×0GÑ0GÈÓ0NÑ-ˆTÔ Ü›ˆŒÜ×(Ñ(ä×$Ñ$ W¨|¸UÐ.CÀRÓHÜ!ðó
ˆŒð !%§¡¨NÑ ;ˆÕr   c                 ó¦  — | j                  «       }i }| j                  �rt        j                  «       }t        |v r+|j                  t        «       |j                  dt        «       t        j                  d|«       t        |«      dk\  sJ d«       ‚|D ]l  }t        | j                  |¬«      }	 |5  	 t        | j                  |¬«      }	 d d d «       |d	   sŒE|| j                  _        t        j                  d
|«        n | j                  j                   €8t        j#                  d| j$                  «       nt        | j                  |¬«      }|j'                  d	«      s[|j'                  d«      r%t        j#                  |j'                  d«      «       yt        j                  |j'                  d«      «       y|j'                  d«      | _        |j'                  d«      | _        y# t        $ r*}t        j                  d||«       Y d }~d d d «       �Œ„d }~ww xY w# 1 sw Y   �ŒWxY w# t        $ r t        j                  d|«       Y �Œ»w xY w)Nr   z"Looking for the primary NIC in: %sé   z3The instance has to have at least one candidate NIC)Úiface)ÚaddressÚ
url_paramsz,Error fetching IMD with candidate NIC %s: %sz$Unable to obtain a DHCP lease for %sÚsuccesszPrimary NIC found: %s.z(Did not find a fallback interface on %s.Úplatform_reports_gceÚreasonFú	meta-dataú	user-dataT)Úget_url_paramsÚperform_dhcp_setupr   Úfind_candidate_nicsÚDEFAULT_PRIMARY_INTERFACEÚremoveÚinsertr+   r,   Úlenr   rJ   Úread_mdr   Ú	Exceptionr   Úfallback_interfaceÚwarningÚ
cloud_nameÚgetrD   Úuserdata_raw)r   rS   ÚretÚcandidate_nicsÚcandidate_nicÚnetwork_contextÚes          r   Ú	_get_datazDataSourceGCE._get_dataX   s  € Ø×(Ñ(Ó*ˆ
ØˆØ×"Ó"Ü ×4Ñ4Ó6ˆNÜ(¨NÑ:Ø×%Ñ%Ô&?Ô@Ø×%Ñ% aÔ)BÔCÜ�I‰IÐ:¸NÔKä�NÓ# qÒ(ðEàDóEØ(à!/ò �Ü"1Ø—K‘KØ'ô#�ðØ(ñ %ð%Ü")Ø(,×(=Ñ(=Ø+5ô#™C÷%ð$ �y“>Ø5B�D—K‘KÔ2Ü—I‘IÐ6¸ÔFÙð7ð8 �{‰{×-Ñ-Ð5Ü—‘Ø>ÀÇÁõô  $×"7Ñ"7ÀJÔOˆCà�w‰w�yÔ!Ø�w‰wÐ-Ô.Ü—‘˜CŸG™G HÓ-Ô.ð ô —	‘	˜#Ÿ'™' (Ó+Ô,ØØŸ™ Ó,ˆŒØŸG™G KÓ0ˆÔØøô?  )ò %ÜŸI™IØ NØ -Ø !ôó
 %÷%ñ %ûð%ú÷%ñ %ûô (ò Ü—I‘IØ>Àôò ð	úsT   Â/H-Â1H Â3G*ÃH-Ç*	HÇ3HÈ
H ÈH-ÈHÈH È H*	È%H-È-IÉIc                  ó   — y r   r9   ©r   s    r   Úlaunch_indexzDataSourceGCE.launch_index‘   s   € ð r   c                 ó    — | j                   d   S )Núinstance-id©rD   rn   s    r   Úget_instance_idzDataSourceGCE.get_instance_id–   s   € Ø�}‰}˜]Ñ+Ð+r   c                 óL   — | j                   d   }t        || j                  «      S )Núpublic-keys-data)rD   Ú_parse_public_keysr@   )r   Úpublic_keys_datas     r   Úget_public_ssh_keysz!DataSourceGCE.get_public_ssh_keys™   s&   € ØŸ=™=Ð);Ñ<ÐÜ!Ð"2°D×4EÑ4EÓFÐFr   c                 ó"   — |D ]
  }t        |Ž  Œ y r   )Ú#_write_host_key_to_guest_attributes)r   r   Úkeys      r   Úpublish_host_keyszDataSourceGCE.publish_host_keys�   s   € Øò 	6ˆCÜ/°Ò5ñ	6r   c                 óX   — t        | j                  d   j                  d«      d   d«      S )Núlocal-hostnameú.r   F)r   rD   Úsplit)r   ÚfqdnÚ
resolve_ipÚmetadata_onlys       r   Úget_hostnamezDataSourceGCE.get_hostname¡   s.   € ä!Ø�M‰MÐ*Ñ+×1Ñ1°#Ó6°qÑ9¸5ó
ð 	
r   c                 ó    — | j                   d   S )Núavailability-zonerr   rn   s    r   Úavailability_zonezDataSourceGCE.availability_zone§   s   € à�}‰}Ð0Ñ1Ð1r   c                 ó@   — | j                   j                  dd«      d   S )Nú-rP   r   )r‡   Úrsplitrn   s    r   ÚregionzDataSourceGCE.region«   s    € à×%Ñ%×,Ñ,¨S°!Ó4°QÑ7Ð7r   N)FFF)r6   r7   r8   ÚdsnamerZ   r
   ÚNETWORKr   ÚBOOT_NEW_INSTANCEÚBOOTÚdefault_update_eventsr   rl   Úpropertyro   rs   rx   r|   r„   r‡   r‹   r9   r   r   r;   r;   >   s�   „ à€FØÐà×ÑØ×'Ñ'Ø�N‰Nð
ðÐò<ò7ðr ñó ðò,òGò6ó
ð ñ2ó ð2ð ñ8ó ñ8r   r;   c                   ó   — e Zd ZdZy)ÚDataSourceGCELocalTN)r6   r7   r8   rZ   r9   r   r   r“   r“   °   s   „ ØÑr   r“   c                 ó   — t         ›dt        ›d| ›�}|j                  d«      }t        j                  ||t
        dd¬«      }|j                  «       rt        j                  d| «       y t        j                  d| «       y )Nú/r$   ÚPUTF)r   Údatar    Úrequest_methodÚcheck_statusz&Wrote %s host key to guest attributes.z0Unable to write %s host key to guest attributes.)	ÚGUEST_ATTRIBUTES_URLÚHOSTKEY_NAMESPACEÚencoder   r%   r&   Úokr+   r,   )Úkey_typeÚ	key_valuer   r2   s       r   rz   rz   ´   sg   € Þ,Ö.?ÁÐ
J€CØ× Ñ  Ó)€IÜ×ÑØØÜØØô€Dð ‡w�w„yÜ�	‰	Ð:¸HÕEä�	‰	ÐDÀhÕOr   c                 ó   — 	 | j                  d d«      dd  \  }}|dk7  ry	 t        j                  |«      }d|vry|d   }d}	 t
        j
                  j                  ||«      }t
        j
                  j                  t
        j                  j                  «      |kD  S # t        t        f$ r Y yw xY w# t        $ r Y yw xY w# t        $ r Y yw xY w)Né   é   Fz
google-sshÚexpireOnz%Y-%m-%dT%H:%M:%S%z)
r€   Ú
ValueErrorÚAttributeErrorÚjsonÚloadsÚdatetimeÚstrptimeÚnowÚtimezoneÚutc)Ú
public_keyÚschemaÚjson_strÚjson_objÚ
expire_strÚ
format_strÚexpire_times          r   Ú_has_expiredr´   Ä   sç   € ðà%×+Ñ+¨D°!Ó4°Q°RÐ8Ñˆ�ð
 �ÒØðÜ—:‘:˜hÓ'ˆð
 ˜Ñ!Øà˜*Ñ%€JØ&€JðÜ×'Ñ'×0Ñ0°¸ZÓHˆô
 ×Ñ× Ñ ¤×!2Ñ!2×!6Ñ!6Ó7¸+ÑEÐEøô1 œÐ'ò Ùðûô ò Ùðûô ò Ùðús4   ‚B ¡B2 Á C ÂB/Â.B/Â2	B>Â=B>Ã	CÃCc                 óÞ   — g }| s|S | D ]a  }|rt        d„ |D «       «      sŒ|j                  dd«      }t        |«      dk7  rŒ9|\  }}|d|fv sŒEt        |«      rŒQ|j	                  |«       Œc |S )Nc              3   ó8   K  — | ]  }t        |«      d k  –— Œ y­w)é€   N)Úord)Ú.0Úcs     r   ú	<genexpr>z%_parse_public_keys.<locals>.<genexpr>ï   s   è ø€ Ò$F°a¤S¨£V¨c¥\Ñ$Fùs   ‚ú:rP   r¢   Ú	cloudinit)Úallr€   r_   r´   Úappend)rw   r@   Úpublic_keysr­   Úsplit_public_keyÚuserr{   s          r   rv   rv   æ   s‹   € ð
 €KÙØÐØ&ò $ˆ
Ù¤Ñ$F¸:Ô$FÔ!FØØ%×+Ñ+¨C°Ó3ÐÜÐÓ  AÒ%ØØ$‰	ˆˆcØ�K Ð.Ò.´|ÀCÕ7HØ×Ñ˜sÕ#ð$ð Ðr   Tc                 ó°  — | €t         } d d dd dœ}t        «       |d<   |r|d   sd|d<   |S t        j                  | «      s t        j                  d| «       d| z  |d<   |S g d¢}t        | |j                  |j                  «      }i }|D ]@  \  }}}	}
}d }|D ]  }|j                  ||
|«      }|€Œ|}Œ |	r|€d	}||z  |d<   |c S |||<   ŒB t        j                  |d
   xs d«      }t        j                  |d   xs d«      }|j                  d«      |j                  d«      g}|j                  dd«      j                  «       }|dk7  rQ|j                  d«      s@|j                  |j                  d«      «       |j                  |j                  d«      «       dj                  |D �cg c]  }|sŒ|‘Œ	 c}«      }|j!                  «       |d<   |d   r|d   j#                  d«      d   |d<   d|v rS|d   j%                  d«      }|j                  d«      }|dk(  rt'        |«      }n|rt        j)                  d|«       ||d<   ||d<   d|d<   |S c c}w )NF)rW   rX   rT   rV   rU   zNot running on GCE.rV   z%s is not resolvablezaddress "%s" is not resolvable))rq   )zinstance/idTTF)r†   )zinstance/zoneTTF)r~   )zinstance/hostnameTTF)úinstance-data)zinstance/attributesFFT)úproject-data)zproject/attributesFFTz)required key %s returned nothing. not GCErÄ   z{}rÅ   ÚsshKeyszssh-keyszblock-project-ssh-keysÚ Útrueú
ru   r†   r•   éÿÿÿÿrX   r$   zuser-data-encodingÚbase64z(unknown user-data-encoding: %s, ignoringrW   TrT   )Ú	MD_V1_URLrU   r   Úis_resolvable_urlr+   r,   r   r   r   r5   r¦   r§   re   Úlowerr¿   ÚjoinÚ
splitlinesr€   rœ   r   rc   )rR   rS   Úplatform_checkrg   Úurl_mapÚmetadata_fetcherÚmdÚmkeyrK   Úrequiredr/   r0   r1   r.   Ú	new_valuer4   Úinstance_dataÚproject_dataÚ
valid_keysÚblock_projectr{   rw   ÚudÚencodings                           r   r`   r`   ú   s¨  € à€Üˆð ØØØñ	€Cô #7Ó"8€CÐÑá˜cÐ"8Ò9Ø-ˆˆH‰Øˆ
ô ×!Ñ! 'Ô*Ü�	‰	Ð(¨'Ô2Ø8¸7ÑBˆˆH‰Øˆ
ò€Gô -Ø�×'Ñ'¨×)GÑ)GóÐð 
€Bà8?ò 
Ñ4ˆˆe�X˜w¨ØˆØò 	"ˆDØ(×2Ñ2°4¸À,ÓOˆIØÑ$Ø!‘ð	"ñ ˜˜Ø=ˆCØ $™JˆC�‰MØŠJØˆˆ4Šð
ô —J‘J˜r /Ñ2Ò:°dÓ;€MÜ—:‘:˜b Ñ0Ò8°DÓ9€LØ×#Ñ# IÓ.°×0AÑ0AÀ*Ó0MÐN€JØ!×%Ñ%Ð&>ÀÓC×IÑIÓK€MØ˜Ò }×'8Ñ'8¸Ô'CØ×Ñ˜,×*Ñ*¨:Ó6Ô7Ø×Ñ˜,×*Ñ*¨9Ó5Ô6Ø—y‘y°Ö!C¨#ºs¢#Ò!CÓDÐØ-×8Ñ8Ó:€BÐÑà	Ð
ÒØ"$Ð%8Ñ"9×"?Ñ"?ÀÓ"DÀRÑ"HˆÐÑà�mÑ#à˜;Ñ'×.Ñ.¨wÓ7ˆØ ×$Ñ$Ð%9Ó:ˆØ�xÒÜ˜2“‰BÙÜ�K‰KÐBÀHÔMØˆˆKÑà€CˆÑØ€Cˆ	�Nà€Jùò' "Ds   Æ+IÆ3Ic                  óÐ   — t        j                  d«      xs d} | dk(  s| dk(  ryt        j                  d«      xs d}|j                  d«      ryt        j	                  d| |«       y	)
Nzsystem-product-namezN/AzGoogle Compute Enginer   Tzsystem-serial-numberzGoogleCloud-z6Not running on google cloud. product-name=%s serial=%sF)r   Úread_dmi_dataÚ
startswithr+   r,   )ÚpnameÚserials     r   rU   rU   G  sl   € Ü×ÑÐ3Ó4Ò=¸€EØÐ'Ò'¨5°HÒ+<Øô ×ÑÐ5Ó6Ò?¸%€FØ×Ñ˜Ô(Øä‡I�IØ@À%Èôð r   c                 ó6   — t        j                  | t        «      S r   )r   Úlist_from_dependsÚdatasources)Údependss    r   Úget_datasource_listrç   _  s   € Ü×$Ñ$ W¬kÓ:Ð:r   Ú__main__)Ú	b64encodezQuery GCE Metadata Service)Údescriptionz
--endpointÚURLz The url of the metadata service.)ÚmetavarÚhelpÚdefaultz--no-platform-checkrÑ   zIgnore smbios platform checkÚstore_false)Údestrí   Úactionrî   )rR   rÑ   rX   z/User-data cannot be decoded. Writing as base64
zuser-data-b64rP   )ú,z: )ÚindentÚ	sort_keysÚ
separatorsr   )NNT)=r¨   r¦   ÚloggingrË   r   r½   r   r   r   r   r   Úcloudinit.distrosr	   Úcloudinit.eventr
   r   Úcloudinit.net.dhcpr   Úcloudinit.net.ephemeralr   Úcloudinit.sourcesr   Ú	getLoggerr6   r+   rÌ   rG   rš   r›   r&   r\   r   r?   r;   r“   rz   r´   rv   r`   rU   ÚDEP_FILESYSTEMÚDEP_NETWORKrå   rç   ÚargparseÚsysré   ÚArgumentParserÚparserÚadd_argumentÚ
parse_argsÚargsÚendpointrÑ   r—   r*   ÚUnicodeDecodeErrorÚstderrÚwriteÚprintÚdumpsr9   r   r   ú<module>r     s  ðó
 Û Û Ý ç 9Õ 9Ý %ß 1Ý /Ý 3Ý 0à€g×Ñ˜Ó!€àA€	Ø# YÐ/Ð ð#ð ð Ð Ø˜hÐ
'€Ø"Ð ÷ñ ô@o8�G×&Ñ&ô o8ôd˜ô òPò FóDó(JòZð$ ˜'×0Ñ0Ð2Ð3Ø�W×+Ñ+¨W×-@Ñ-@ÐAÐBð€ò;ð ˆzÒÛÛÝ à$ˆX×$Ñ$Ð1MÔN€FØ
×ÑØØØ/Øð	 ô ð ×ÑØØØ+ØØð ô ð ×ÑÓ€DÙ˜4Ÿ=™=¸×9LÑ9LÔM€DØ�dÑð	JØ $ [Ñ 1× 8Ñ 8Ó :ˆD�Ññ 
ˆ*ˆ$�*‰*�T !¨tÀÔ
LÕMðG øð6 "ò 	JØ�J‰J×ÑØBôð �[Ð!á$-¨d°;Ñ.?Ó$@×$GÑ$GÓ$IˆD�Ó!ð	Jús   ÅF Æ?GÇG