
    x[h5              	       |   S SK r S SKrS SKrS SKJr  S SKJrJrJrJ	r	J
r
  S SKJr  S SKJrJr  S SKJr  S SKJr  S SKJr  \R,                  " \5      rS	rS
\0rSrSrSS0rSr " S S5      r " S S\R@                  5      r! " S S\!5      r"S r#S r$S1S jr%S2S jr&S r'\"\RP                  44\!\RP                  \RR                  44/r*S r+\S:X  a  S SK,r,S SK-r-S SKJ.r.  \,R^                  " SS 9r0\0Rc                  S!S"S#\S$9  \0Rc                  S%S&S'S(SS)9  \0Re                  5       r3\&" \3Rh                  \3Rj                  S*9r6S+\6;   a   \6S+   Ro                  5       \6S+'   \;" \Rx                  " \6S.SS/S095        gg! \8 a=    \-Rr                  Ru                  S,5        \6S+	 \." \6S+   5      Ro                  5       \6S-'    N]f = f)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                   $    \ rS rSrS rSS jrSrg)GoogleMetadataFetcher   c                 (    Xl         X l        X0l        g Nmetadata_addressnum_retriessec_between_retries)selfr   r   r   s       A/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceGCE.py__init__GoogleMetadataFetcher.__init__   s     0&#6     c                    S n U R                   U-   nU(       a  US-  n[        R                  " U[        U R                  U R
                  S9nUR                  S:X  aG  U(       a"  [        R                  " UR                  5      nU$ UR                  R                  S5      n U$ [        R                  SXR                  5         U$ ! [        R                   a#  nSn[        R                  XU5         S nAU$ S nAff = f)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_valueGoogleMetadataFetcher.get_value$   s    	F''$.C))%%(( 44	D yyC ..t}}=E
  !MM009E  		3T99E "" 	&.CIIc%% 	&s   A
C C?C::C?r   N)F)__name__
__module____qualname____firstlineno__r   r8   __static_attributes__ r    r   r   r      s    7
r    r   c                       \ rS rSrSrSr\R                  \R                  \R                  10rS rS r\S 5       rS rS rS	 rSS
 jr\S 5       r\S 5       rSrg)DataSourceGCE>   GCEFc                    [         R                  R                  XX#5        S U l        U(       a6  [        R
                  " X5      u  pE[        R                  " U5      u  U l        n[        5       U l        [        R                  " [        R                  " USS/0 5      [        /5      U l        U R                  S   U l        g )N
datasourcerC   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   DataSourceGCE.__init__I   s    ##D6A &==gNU070G0G0N-T(($$W|U.CRH!
 !%N ;r    c                    U R                  5       n0 nU R                  (       Ga  [        R                  " 5       n[        U;   a+  UR                  [        5        UR                  S[        5        [        R                  SU5        [        U5      S:  d   S5       eU Hk  n[        U R                  US9n U    [        U R                  US9n S S S 5        US	   (       d  ME  X@R                  l        [        R                  S
U5          O   U R                  R                   c   [        R#                  SU R$                  5        O[        U R                  US9nUR'                  S	5      (       d`  UR'                  S5      (       a%  [        R#                  UR'                  S5      5        g[        R                  UR'                  S5      5        gUR'                  S5      U l        UR'                  S5      U l        g! [         a+  n[        R                  SUU5         S nAS S S 5        GM  S nAff = f! , (       d  f       GNl= f! [         a    [        R                  SU5         GM  f = f)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   rQ   read_mdr   	Exceptionr   fallback_interfacewarning
cloud_namegetrK   userdata_raw)r   r[   retcandidate_nicscandidate_nicnetwork_contextes          r   	_get_dataDataSourceGCE._get_dataX   s   ((*
""" 446N(N:%%&?@%%a)BCII:NKN#q(EDE(!/"1KK'#(%")(,(=(=+5#C )$ y>>5BKK2II6F7 "08 {{--5> $"7"7JOCwwy!!ww-..CGGH-.  		#''(+,,GGK0?  ) %II N - !
 % )% ) ( II> 	sZ   5I7H39G;I;
H0H+H3 I+H00H33
I	=II I*)I*c                     g r   r?   r   s    r   launch_indexDataSourceGCE.launch_index   s     r    c                      U R                   S   $ )Ninstance-idrK   rw   s    r   get_instance_idDataSourceGCE.get_instance_id   s    }}]++r    c                 J    U R                   S   n[        XR                  5      $ )Npublic-keys-data)rK   _parse_public_keysrG   )r   public_keys_datas     r   get_public_ssh_keys!DataSourceGCE.get_public_ssh_keys   s$    ==);<!"24E4EFFr    c                 &    U H  n[        U6   M     g r   )#_write_host_key_to_guest_attributes)r   r   keys      r   publish_host_keysDataSourceGCE.publish_host_keys   s    C/5 r    c                 X    [        U R                  S   R                  S5      S   S5      $ )Nlocal-hostname.r   F)r   rK   split)r   fqdn
resolve_ipmetadata_onlys       r   get_hostnameDataSourceGCE.get_hostname   s.    !MM*+11#6q95
 	
r    c                      U R                   S   $ )Navailability-zoner|   rw   s    r   availability_zoneDataSourceGCE.availability_zone   s    }}011r    c                 @    U R                   R                  SS5      S   $ )N-rX   r   )r   rsplitrw   s    r   regionDataSourceGCE.region   s     %%,,S!4Q77r    )rG   rO   rK   r   rn   N)FFF)r:   r;   r<   r=   dsnamerb   r
   NETWORKr   BOOT_NEW_INSTANCEBOOTdefault_update_eventsr   rt   propertyrx   r}   r   r   r   r   r   r>   r?   r    r   rA   rA   >   s    F''NN
<7r  ,G6
 2 2 8 8r    rA   c                       \ rS rSrSrSrg)DataSourceGCELocal   Tr?   N)r:   r;   r<   r=   rb   r>   r?   r    r   r   r      s    r    r   c                    [         < S[        < SU < 3nUR                  S5      n[        R                  " UU[
        SSS9nUR                  5       (       a  [        R                  SU 5        g [        R                  SU 5        g )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"   r5   s       r   r   r      si    ,.?
JC  )ID wwyy		:HE		DhOr    c                     U R                  S S5      SS  u  pUS:w  a  g [        R                  " U5      nSU;  a  gUS   nSn [
        R
                  R                  XE5      n[
        R
                  R                  [
        R                  R                  5      U:  $ ! [        [        4 a     gf = f! [         a     gf = f! [         a     gf = f)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!4QR8
 ::h'
 !*%J&J''00H
   !2!2!6!67+EE1 '     s4   B B5 C B21B25
CC
CCc                    / nU (       d  U$ U  Hw  nU(       a  [        S U 5       5      (       d  M#  UR                  SS5      n[        U5      S:w  a  MF  Uu  pVUSU4;   d  MT  [        U5      (       a  Mf  UR	                  U5        My     U$ )Nc              3   >   #    U  H  n[        U5      S :  v   M     g7f)   N)ord).0cs     r   	<genexpr>%_parse_public_keys.<locals>.<genexpr>   s     $F:aSVc\:s   :rX   r   	cloudinit)allr   rg   r   append)r   rG   public_keysr   split_public_keyuserr   s          r   r   r      s    
 K&
$F:$F!F!F%++C3 A%$	K..|C7H7Hs# ' r    Tc                 ,   U c  [         n S S SS S.n[        5       US'   U(       a  US   (       d  SUS'   U$ [        R                  " U 5      (       d   [        R                  SU 5        SU -  US'   U$ / SQn[        XR                  UR                  5      n0 nU HF  u  pxpnS nU H  nUR                  XU5      nUc  M  UnM     U	(       a  Uc  S	nX-  US'   Us  $ XU'   MH     [        R                  " US
   =(       d    S5      n[        R                  " US   =(       d    S5      nUR                  S5      UR                  S5      /nUR                  SS5      R                  5       nUS:w  aV  UR                  S5      (       d@  UR                  UR                  S5      5        UR                  UR                  S5      5        SR                  U Vs/ s H  nU(       d  M  UPM     sn5      nUR!                  5       US'   US   (       a  US   R#                  S5      S   US'   SU;   aY  US   R%                  S5      nUR                  S5      nUS:X  a  ['        U5      nOU(       a  [        R)                  SU5        UUS'   XcS'   SUS'   U$ s  snf )NF)r_   r`   r\   r^   r]   zNot running on GCE.r^   z%s is not resolvablezaddress "%s" is not resolvable))r{   )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
r   r   r   r`   r'   zuser-data-encodingbase64z(unknown user-data-encoding: %s, ignoringr_   Tr\   )	MD_V1_URLr]   r   is_resolvable_urlr.   r/   r   r   r   r8   r   r   rm   lowerr   join
splitlinesr   r   r   rk   )rZ   r[   platform_checkro   url_mapmetadata_fetchermdmkeyrR   requiredr2   r3   r4   r1   	new_valuer7   instance_dataproject_data
valid_keysblock_projectr   r   udencodings                           r   rh   rh      s    	C #7"8Cc"89-H
 !!'**		('287BH
G -'')G)G 
B8?4XD(224,OI$!  =CJCMJ4 9@ JJr/2:d;M::b08D9L##I.0A0A*0MNJ!%%&>CIIKM}'8'8'C'C,**:67,**956yy!C#s#!CD-88:B	
"$%8"9"?"?"DR"Hm#;'..w7 $$%9:x2BKKBHMKC	NJ' "Ds   J#Jc                      [         R                  " S5      =(       d    Sn U S:X  d  U S:X  a  g[         R                  " S5      =(       d    SnUR                  S5      (       a  g[        R	                  SX5        g	)
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   r]   r]   G  sm    34=E''5H+< 56?%F((II@% r    c                 8    [         R                  " U [        5      $ r   )r   list_from_dependsdatasources)dependss    r   get_datasource_listr   _  s    $$Wk::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   )rZ   r   r`   z/User-data cannot be decoded. Writing as base64
zuser-data-b64rX   ),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   	getLoggerr:   r.   r   rN   r   r   r)   rd   r   rF   rA   r   r   r   r   rh   r]   DEP_FILESYSTEMDEP_NETWORKr   r   argparsesysr   ArgumentParserparseradd_argument
parse_argsargsendpointr   r   r-   UnicodeDecodeErrorstderrwriteprintdumpsr?   r    r   <module>r     s  
     9 9 % 1 / 3 0!A	#Y/ #   h
'"  @o8G&& o8d P FD(JZ$ '0023W++W-@-@AB; z $$1MNF
/	   +   D4==9L9LMDd	J $[ 1 8 8 :D 
$**T!t
LMG 6 " 	JJJB [!$-d;.?$@$G$G$ID!	Js   E8 8A F;:F;