
    }f
7                        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(  rd 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 yyC ..t}}=E
  !MM009E  		3T499E "" 	&.CIIc4%% 	&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'65A &==gvNUG070G0G0N-T(($$W|U.CRH!
 !%N ;r   c           
      j   | j                         }| j                  r;t        j                         }t        |v r+|j                  t               |j                  dt               t        j                  d|       t        |      dk\  sJ d       |D ]  }t        | j                  |      }	 |5  	 t        j                  t        j                  dt        | j                  |d      }	 d d d        d
   sf|| j                  _        t        j                  d|        n | j                  j$                  Yt        j'                  d| j(                         n8t        j                  t        j                  dt        | j                  |d      }d
   s7|d   rt        j'                  |d          yt        j                  |d          y|d   | _        |d   | _        y# t         $ r*}t        j                  d	||       Y d }~d d d        ~d }~ww xY w# 1 sw Y   0xY w# t"        $ r Y w xY w)Nr   z"Looking for the primary NIC in: %s   z3The instance has to have at least one candidate NIC)ifacezCrawl of GCE metadata service)address
url_params)kwargsz,Error fetching IMD with candidate NIC %s: %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   r   log_timeread_mdr   	Exceptionr   fallback_interfacewarning
cloud_namerD   userdata_raw)r   rS   candidate_nicscandidate_nicnetwork_contextretes          r   	_get_datazDataSourceGCE._get_dataX   s   ((*
"" 446N(N:%%&?@%%a)BCII:NKN#q(EDE(!/ "1KK'#( %%"&-- #		 ? '/3/D/D2<("	#C%( y>5BDKK2II6F;< {{--5> --		/#44",	C 9~)*CM*  		#h-(K(,I  ) %II N - !
 %#% %%% %$ ( sT   -H%/H18G"*H%"	H+HHH%HHH"	H%%	H21H2c                      y r   r9   r   s    r   launch_indexzDataSourceGCE.launch_index   s     r   c                      | j                   d   S )Ninstance-idrD   ro   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&    ==);<!"2D4E4E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     	6C/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.    !MM*+11#6q95
 	
r   c                      | j                   d   S )Navailability-zoners   ro   s    r   availability_zonezDataSourceGCE.availability_zone   s    }}011r   c                 @    | j                   j                  dd      d   S )N-rP   r   )r   rsplitro   s    r   regionzDataSourceGCE.region   s     %%,,S!4Q77r   N)FFF)r6   r7   r8   dsnamer[   r
   NETWORKr   BOOT_NEW_INSTANCEBOOTdefault_update_eventsr   rm   propertyrp   rt   ry   r}   r   r   r   r9   r   r   r;   r;   >   s    F''NN
<@D  ,G6
 2 2 8 8r   r;   c                       e Zd ZdZy)DataSourceGCELocalTN)r6   r7   r8   r[   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   r{   r{      sg    ,.?
JC  )ID wwy		:HE		DhOr   c                 n   	 | j                  d d      dd  \  }}|dk7  ry	 t        j                  |      }d|vry|d   }d}	 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+0000)r   
ValueErrorAttributeErrorjsonloadsdatetimestrptimeutcnow)
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ZH
 ##%331 '     s4   B B  B( BB	B%$B%(	B43B4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     $FaSVc\$Fs   :rP   r   	cloudinit)allr   r`   r   append)rx   r@   public_keysr   split_public_keyuserr|   s          r   rw   rw      s    
 K& $
$F:$F!F%++C3 A%$	cK..|C7H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)rX   rY   rU   rW   rV   zNot running on GCE.rW   z%s is not resolvablezaddress "%s" is not resolvable))rr   )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
rv   r   r   rY   r$   zuser-data-encodingbase64z(unknown user-data-encoding: %s, ignoringrX   TrU   )	MD_V1_URLrV   r   is_resolvable_urlr+   r,   r   r   r   r5   r   r   getlowerr   join
splitlinesr   r   r   re   )rR   rS   platform_checkrk   url_mapmetadata_fetchermdmkeyrK   requiredr/   r0   r1   r.   	new_valuer4   instance_dataproject_data
valid_keysblock_projectr|   rx   udencodings                           r   rb   rb     s    	C #7"8Cc"89-H
 !!'*		('287BH
G -'')G)G 
B:A 
6uh 	"D(224,OI$!	" =C$JCMJ4
 JJr/2:d;M::b08D9L##I.0A0A*0MNJ!%%&>CIIKM}'8'8'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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   rV   rV   P  sl    34=E''5H+< 56?%F(II@% r   c                 6    t        j                  | t              S r   )r   list_from_dependsdatasources)dependss    r   get_datasource_listr   h  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   )rR   r   rY   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   r{   r   rw   rb   rV   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
'"  @x8G&& x8v P 4D(JZ$ '0023W++W-@-@AB; z $X$$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   F ?GG