
    x[hk,                        S r SSKrSSKrSSKrSSKrSSKJr  SSKJrJ	r	  SSK
Jr  SSKJrJrJr  SSKJr  SSKJr  S	r\R*                  " \5      rSS
 jrS rS\4S jrS\S\S\S\4S jrS rS r \S:X  a  \ " 5         gg)aT  Query standardized instance metadata provided to machine, returning a JSON
structure.

Some instance-data values may be binary on some platforms, such as userdata and
vendordata. Attempt to decompress and decode UTF-8 any binary values.

Any binary values in the instance metadata will be base64-encoded and prefixed
with "ci-b64:" in the output. userdata and, where applicable, vendordata may
be provided to the machine gzip-compressed (and therefore as binary data).
query will attempt to decompress these to a string before emitting the JSON
output; if this fails, they are treated as binary.
    N)EACCES)atomic_helperutil)read_cfg_paths)convert_jinja_instance_dataget_jinja_variable_aliasrender_jinja_payload)REDACT_SENSITIVE_VALUE)JinjaSyntaxParsingExceptionqueryc           	         U (       d  [         R                  " [        [        S9n U R	                  SSSSSS9  U R	                  SS	[
        S
[        5       R                  S5       3S9  U R	                  SSSSSS9  U R	                  SS[
        SS9  U R	                  SS[
        SS9  U R	                  S[
        SSS9  U R	                  SSSSSSS9  U R	                  SS [
        S!S"S#9  U $ )$a  Build or extend an arg parser for query utility.

@param parser: Optional existing ArgumentParser instance representing the
    query subcommand which will be extended to support the args of
    this utility.

@returns: ArgumentParser with proper argument configuration.
)progdescriptionz-dz--debug
store_trueFz+Add verbose messages during template render)actiondefaulthelpz-iz--instance-dataz,Path to instance-data.json file. Default is instance_data)typer   z-lz--list-keyszBList query keys available at the provided instance-data <varname>.z-uz--user-datazHPath to user-data file. Default is /var/lib/cloud/instance/user-data.txtz-vz--vendor-datazLPath to vendor-data file. Default is /var/lib/cloud/instance/vendor-data.txtvarname?zA dot-delimited specific variable to query from instance-data. For example: v1.local_hostname. If the value is not JSON serializable, it will be base64-encoded and will contain the prefix "ci-b64:". )r   nargsr   z-az--alldump_allz Dump all available instance-data)r   r   destr   z-fz--formatformatzOptionally specify a custom output format string. Any instance-data variable can be specified between double-curly braces. For example -f "{{ v2.cloud_name }}")r   r   r   )argparseArgumentParserNAME__doc__add_argumentstrr   get_runpathparsers    5/usr/lib/python3/dist-packages/cloudinit/cmd/query.py
get_parserr&   &   sX    ((dH
:   :++O<=?     	 5   7   3  
 /   <  
 M    c                     [         R                  " U SS9n UR                  S5      $ ! [         a    [         R                  " USSS9s $ f = f)zAttempt to return a string of user-data from ud_file_path

Attempt to decode or decompress if needed.
If unable to decode the content, raw bytes will be returned.

@returns: String of uncompressed userdata if possible, otherwise bytes.
T)quietzutf-8F)r)   decode)r   load_binary_filer*   UnicodeDecodeErrordecomp_gzip)ud_file_pathbdatas     r%   load_userdatar0   ~   sQ     !!,d;EA||G$$ AU4@@As   (  A
Areturnc                 j   [         R                  " 5       n[        5       nU (       a  U nOkUR                  S5      nUS:X  aR  UR                  S5      n[         R                  R                  U5      (       a  UnO[        R                  SUU5        UnOUnU(       a  UnO*[         R                  R                  UR                  S5      nU(       a  Un	O*[         R                  R                  UR                  S5      n	UR                  S5      n
 [        R                  " U5      n[        R"                  " U5      n  [        R"                  " [        R                  " U
5      5      nUS:w  a5  S[$        < SU< 3U S'   S[$        < SU	< 3U S'   S[$        < SU
< 3U S'   U $ ['        U5      U S'   ['        U	5      U S'   XS'   U $ ! [        [        4 aG  nUR                  [        :X  a  [        R!                  SU5        e [        R!                  S	U5        e S
nAff = f! [        [        4 a    S
n Nf = f)a~  Return a dict of merged instance-data, vendordata and userdata.

The dict will contain supplemental userdata and vendordata keys sourced
from default user-data and vendor-data files.

Non-root users will have redacted INSTANCE_JSON_FILE content and redacted
vendordata and userdata values.

:raise: IOError/OSError on absence of instance-data.json file or invalid
    access perms.
r   r   instance_data_sensitivez4Missing root-readable %s. Using redacted %s instead.zuser-data.txtzvendor-data.txtcombined_cloud_configz$No read permission on '%s'. Try sudozMissing instance-data file: %sN<z> file:userdata
vendordata)osgetuidr   r"   pathexistsLOGwarningjoininstance_linkr   load_text_fileIOErrorOSErrorerrnor   error	load_jsonr
   r0   )r   	user_datavendor_datauidpathsinstance_data_fnredacted_data_fnsensitive_data_fnuser_data_fnvendor_data_fncombined_cloud_config_fninstance_jsoner4   s                 r%   _read_instance_datarR      s    ))+CE( ,,_=!8 % 1 12K Lww~~/00#4 J%$
 $4 / ww||E$7$7I$e&9&9;LM$001HI++,<= NN=1M% $ 89!
 ax"%
j!
 #'
l#
 #$2
-.  %2,$?j!&3N&Cl#1F-.E W 77fII<>NO 	 II68HI W % !%%s+   G <*H HAHHH21H2jinja_vars_without_aliasesjinja_vars_with_aliasesr   	list_keysc                 D   SnU nUR                  S5       H@  n X   nXe;   a  XV   nOU H  n	[	        U	5      U:X  d  M  XY   n  O   U(       a  US-  nXF-  nMB     U$ ! [         a9  nU(       a  SR                  XdS9nOSR                  U5      n[        U5      UeSnAff = f)a  Return the value of the dot-delimited varname path in instance-data

Split a dot-delimited jinja variable name path into components, walk the
path components into the instance_data and look up a matching jinja
variable name or cloud-init's underscore-delimited key aliases.

:raises: ValueError when varname represents an invalid key name or path or
    if list-keys is provided by varname isn't a dict object.
 .z*instance-data '{key_path}' has no '{leaf}')leafkey_pathz Undefined instance-data key '{}'N)splitKeyErrorr   
ValueErrorr   )
rS   rT   r   rU   walked_key_pathresponsekey_path_partrQ   msgkeys
             r%   (_find_instance_data_leaf_by_varname_pathrc      s     O)H s+	) '>&L# $.H+C0MA'}H   s"O(- ,. O%  	)BII& J  9??HS/q(	)s   A
B&4BBc                    [        UR                  UR                  UR                  UR                  /5      (       d.  [
        R                  S5        [        5       R                  5         g [        UR                  UR                  UR                  5      nUR                  (       aM  SR                  UR                  S9n [        USUUR                   (       a  SOSS9nU(       a  ['        U5        gg[)        U5      nUR                  (       a+  [)        USS9n [+        UUUR                  UR                  S9nUR                  (       a^  [1        U[2        5      (       d!  [
        R                  SUR                  5        gSR5                  [7        UR9                  5       5      5      n[1        U[$        5      (       d  [:        R<                  " U5      n['        U5        g! [        [        4 a     gf = f! ["         a)  n[
        R                  S	[%        U5      5         S
nAgS
nAff = f! [,        [.        4 a  n[
        R                  U5         S
nAgS
nAff = f)z3Handle calls to 'cloud-init query' as a subcommand.zDExpected one of the options: --all, --format, --list-keys or varname   z## template: jinja
{fmt})fmtzquery command lineTF)payload
payload_fnr   debugz#Failed to render templated data. %sNr   )include_key_aliases)rS   rT   r   rU   z+--list-keys provided but '%s' is not a dict
)anyrU   r   r   r   r<   rD   r&   
print_helprR   r   rF   rG   rA   rB   r	   ri   r   r!   printr   rc   r\   r]   
isinstancedictr>   sortedkeysr   
json_dumps)nameargsr   rg   rendered_payloadrQ   r_   rT   s           r%   handle_argsrw     s   dkk4==IJJ		&	
 	!+0@0@

 {{-444E	3/+"jjde	  "# +=9H||"=t#
		?+3(?..	H ~~(D))II=t|| 99VHMMO45h$$ ++H5	(Og W  + 	II5A 	6 *% 	IIaL	sB   ,+G" G8  H. "G54G58
H+H&&H+.I>IIc                  |    [        5       n [        R                  " [        [        U R                  5       5      5        g)z,Tool to query specific instance-data values.N)r&   sysexitrw   r   
parse_argsr#   s    r%   mainr|   K  s%    \FHH[v00234r'   __main__)N)!r   r   loggingr8   ry   rC   r   	cloudinitr   r   cloudinit.cmd.develr   !cloudinit.handlers.jinja_templater   r   r	   cloudinit.sourcesr
   cloudinit.templaterr   r   	getLogger__name__r<   r&   r0   rp   rR   r!   boolrc   rw   r|    r'   r%   <module>r      s   
   	 
  ) . 
 5 ;!UpAM$ M`( $(!( ( 	(V@F5 zF r'   