
    &g1                     4   d Z ddlZddlmZ ddlZddlZddlZddlm	Z	 ddl
mZ ddl
mZ ddl
mZ ddl
mZ ddl
mZ dd	lmZ  ej        e          Z ej        ej        d          Zes ej        ej        d
          Zd                    e          Zd                     ej        ej        d                    ZdZdZeeiZ	  e  ej        dd                    Z!n# e"$ r dZ!Y nw xY wdZ#dZ$d Z%d Z&e!dfdZ'edddddfdZ(d Z)d Z*ddZ+ddZ,dS ) zProvides helper methods for talking to the Compute Engine metadata server.

See https://cloud.google.com/compute/docs/metadata for more details.
    N)urljoin)_helpers)environment_vars)
exceptions)metrics)	transport)ExponentialBackoffzmetadata.google.internalzhttp://{}/computeMetadata/v1/z	http://{}z169.254.169.254zmetadata-flavorGoogleGCE_METADATA_TIMEOUT   z/sys/class/dmi/id/product_namec                 d    t          |           rdS t          j        dk    rdS t                      S )a  Checks to see if the code runs on Google Compute Engine

    Args:
        request (google.auth.transport.Request): A callable used to make
            HTTP requests.

    Returns:
        bool: True if the code runs on Google Compute Engine, False otherwise.
    TntF)pingosnamedetect_gce_residency_linuxrequests    V/var/www/api/venv/lib/python3.11/site-packages/google/auth/compute_engine/_metadata.py	is_on_gcer   D   s5     G}} t	w$u &'''    c                     	 t          t          d          5 } |                                                                 }ddd           n# 1 swxY w Y   n# t          $ r Y dS w xY w|                    t                    S )zDetect Google Compute Engine residency by smbios check on Linux

    Returns:
        bool: True if the GCE product name file is detected, False otherwise.
    rNF)open_GCE_PRODUCT_NAME_FILEreadstrip	Exception
startswith_GOOGLE)file_objcontents     r   r   r   Y   s    (#.. 	.(mmoo++--G	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	.    uu g&&&s3   A 'A
A 
AA AA 
A$#A$c                    t                                           }t          j                    |t          j        <   t          |          }|D ]}	  | t          d||          }|j                            t                    }|j
        t          j        k    o
|t          k    c S # t          j        $ r'}t                               d|||           Y d}~d}~ww xY wdS )a  Checks to see if the metadata server is available.

    Args:
        request (google.auth.transport.Request): A callable used to make
            HTTP requests.
        timeout (int): How long to wait for the metadata server to respond.
        retry_count (int): How many times to attempt connecting to metadata
            server using above timeout.

    Returns:
        bool: True if the metadata server is reachable, False otherwise.
    total_attemptsGET)urlmethodheaderstimeoutJCompute Engine Metadata server unavailable on attempt %s of %s. Reason: %sNF)_METADATA_HEADERScopyr   mds_pingAPI_CLIENT_HEADERr	   _METADATA_IP_ROOTr)   get_METADATA_FLAVOR_HEADERstatushttp_clientOK_METADATA_FLAVOR_VALUEr   TransportError_LOGGERwarning)	r   r*   retry_countr)   backoffattemptresponsemetadata_flavores	            r   r   r   i   s   &  $$&&G)0)9););GG%& <<<G  	w%eWg  H '.223JKKO;>1 >#'==  
 ( 	 	 	OO/       	 5s   AB$$C3CCF   c                    t          ||          }|i n|}	t                                          }
|r|
                    |           |rd|	d<   t	          j        ||	          }t          |          }d}|D ]}	  | |d|
          }|j        t          j	        v rYt                              d|||j                   t          |j        d          r|j                            d	          n|j        }} nc# t          j        $ r)}t                              d
|||           |}Y d}~d}~ww xY wt          j        d                    ||                    t	          j        |j                  }|j        t&          j        k    r|rdS |j        t&          j        k    rvt	          j        |j        d                   dk    rQ	 t1          j        |          S # t4          $ r/}t          j        d                    |                    }||d}~ww xY w|S t          j        d                    ||j        |j                  |          )a  Fetch a resource from the metadata server.

    Args:
        request (google.auth.transport.Request): A callable used to make
            HTTP requests.
        path (str): The resource to retrieve. For example,
            ``'instance/service-accounts/default'``.
        root (str): The full path to the metadata server root.
        params (Optional[Mapping[str, str]]): A mapping of query parameter
            keys to values.
        recursive (bool): Whether to do a recursive query of metadata. See
            https://cloud.google.com/compute/docs/metadata#aggcontents for more
            details.
        retry_count (int): How many times to attempt connecting to metadata
            server using above timeout.
        headers (Optional[Mapping[str, str]]): Headers for the request.
        return_none_for_not_found_error (Optional[bool]): If True, returns None
            for 404 error instead of throwing an exception.

    Returns:
        Union[Mapping, str]: If the metadata server returns JSON, a mapping of
            the decoded JSON is returned. Otherwise, the response content is
            returned as a string.

    Raises:
        google.auth.exceptions.TransportError: if an error occurred while
            retrieving metadata.
    Ntrue	recursiver$   r&   )r'   r(   r)   zSCompute Engine Metadata server unavailable on attempt %s of %s. Response status: %sdecodezutf-8r+   z{Failed to retrieve {} from the Google Compute Engine metadata service. Compute Engine Metadata server unavailable due to {}zcontent-typezapplication/jsonzMReceived invalid JSON from the Google Compute Engine metadata service: {:.20}z^Failed to retrieve {} from the Google Compute Engine metadata service. Status: {} Response:
{})r   r,   r-   updater   update_queryr	   r3   r   DEFAULT_RETRYABLE_STATUS_CODESr8   r9   hasattrdatarD   r   r7   format
from_bytesr4   	NOT_FOUNDr5   parse_content_typer)   jsonloads
ValueError)r   pathrootparamsrC   r:   r)   return_none_for_not_found_errorbase_urlquery_paramsheaders_to_user'   r;   failure_reasonr<   r=   r?   r"   
caught_excnew_excs                       r   r1   r1      s   L tT""H22VL&++--N 'g&&& +$*[!

,
7
7C <<<GN #
 #
	w3unMMMH)"JJJ<O   x}h77'HM((111! 
 ( 	 	 	OO/   NNNNNN	 'UU[U[^V V
 
 	
 !(-00G+///4S/t+.(('(8(HII!" ".z'*** . . .$3//5vg  :-. N

#	55;V(-6
 6
 	  s1   :A9C66D.D))D.G 
H"*HHc                 "    t          | d          S )aO  Get the Google Cloud Project ID from the metadata server.

    Args:
        request (google.auth.transport.Request): A callable used to make
            HTTP requests.

    Returns:
        str: The project ID

    Raises:
        google.auth.exceptions.TransportError: if an error occurred while
            retrieving metadata.
    zproject/project-idr1   r   s    r   get_project_idr]     s     w,---r   c                 2    t          | dd          }|sdS |S )a  Get the universe domain value from the metadata server.

    Args:
        request (google.auth.transport.Request): A callable used to make
            HTTP requests.

    Returns:
        str: The universe domain value. If the universe domain endpoint is not
        not found, return the default value, which is googleapis.com

    Raises:
        google.auth.exceptions.TransportError: if an error other than
            404 occurs while retrieving metadata.
    zuniverse/universe-domainT)rT   zgoogleapis.comr\   )r   universe_domains     r   get_universe_domainr`   !  s6     +T  O   r   defaultc                 T    d                     |          }t          | |ddi          S )a  Get information about a service account from the metadata server.

    Args:
        request (google.auth.transport.Request): A callable used to make
            HTTP requests.
        service_account (str): The string 'default' or a service account email
            address. The determines which service account for which to acquire
            information.

    Returns:
        Mapping: The service account's information, for example::

            {
                'email': '...',
                'scopes': ['scope', ...],
                'aliases': ['default', '...']
            }

    Raises:
        google.auth.exceptions.TransportError: if an error occurred while
            retrieving metadata.
    zinstance/service-accounts/{0}/rC   rB   )rS   )rJ   r1   )r   service_accountrQ   s      r   get_service_account_inford   8  s3    . ,22?CCD wk6%:;;;;r   c                 h   |r/t          |t                    sd                    |          }d|i}nd}t          j        t          j                    i}d                    |          }t          | |||          }t          j	                    t          j        |d                   z   }|d         |fS )	a  Get the OAuth 2.0 access token for a service account.

    Args:
        request (google.auth.transport.Request): A callable used to make
            HTTP requests.
        service_account (str): The string 'default' or a service account email
            address. The determines which service account for which to acquire
            an access token.
        scopes (Optional[Union[str, List[str]]]): Optional string or list of
            strings with auth scopes.
    Returns:
        Tuple[str, datetime]: The access token and its expiration.

    Raises:
        google.auth.exceptions.TransportError: if an error occurred while
            retrieving metadata.
    ,scopesNz#instance/service-accounts/{0}/token)rS   r)   
expires_in)secondsaccess_token)
isinstancestrjoinr   r/   token_request_access_token_mdsrJ   r1   r   utcnowdatetime	timedelta)r   rc   rg   rS   metrics_headerrQ   
token_jsontoken_expirys           r   get_service_account_tokenru   U  s    $  &#&& 	&XXf%%FF# 	!7#I#K#KN 177HHDWd6>JJJJ?$$x'9<(( ( ( L n%|33r   )ra   )ra   N)-__doc__rp   http.clientclientr4   rN   loggingr   urllib.parser   google.authr   r   r   r   r    google.auth._exponential_backoffr	   	getLogger__name__r8   getenvGCE_METADATA_HOST_GCE_METADATA_HOSTGCE_METADATA_ROOTrJ   _METADATA_ROOTGCE_METADATA_IPr0   r2   r6   r,   int_METADATA_DEFAULT_TIMEOUTrP   r    r   r   r   r   r1   r]   r`   rd   ru    r   r   <module>r      s   
  ! ! ! ! ! !   				                         ( ( ( ( ( ( " " " " " "       ! ! ! ! ! ! ? ? ? ? ? ?
'
H
%
% RY/A4HH  "*,F  1778JKK  &&BI.0ABB   , ! ,.DE " #IBI.Da$H$H I I " " " !" 9 ( ( (*' ' '  4 - - - -f 
$)t t t tn. . ."  .< < < <:"4 "4 "4 "4 "4 "4s   C# #C-,C-