a
    !fl*                     @   sR  d Z ddlZddl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 eeZeejdZeseejd	Zd
eZdeejdZdZdZeeiZzeeddZW n e y   dZY n0 dZ!dZ"dd Z#dd Z$edfddZ%eddddfddZ&dd Z'd#dd Z(d$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)http_client)parse)_helpers)environment_vars)
exceptions)metricszmetadata.google.internalzhttp://{}/computeMetadata/v1/z	http://{}z169.254.169.254zmetadata-flavorZGoogleZGCE_METADATA_TIMEOUT   z/sys/class/dmi/id/product_namec                 C   s    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request r   e/var/www/html/python-backend/venv/lib/python3.9/site-packages/google/auth/compute_engine/_metadata.py	is_on_gceD   s
    

r   c                  C   sZ   z:t td} |   }W d   n1 s.0    Y  W n tyN   Y dS 0 |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)Zfile_objcontentr   r   r   r   Y   s    .r   c              
   C   s   d}t  }t |tj< ||k rz2| td||d}|jt}|j	t
jkoR|tkW S  tjy } z(td|d || |d7 }W Y d}~qd}~0 0 q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.
    r   GET)urlmethodheaderstimeoutJCompute Engine Metadata server unavailable on attempt %s of %s. Reason: %s   NF)_METADATA_HEADERScopyr   Zmds_pingAPI_CLIENT_HEADER_METADATA_IP_ROOTr   get_METADATA_FLAVOR_HEADERstatusr   OK_METADATA_FLAVOR_VALUEr   TransportError_LOGGERwarning)r   r    retry_countretriesr   responseZmetadata_flavorer   r   r   r
   i   s*     r
   F   c              
   C   sb  t ||}|du ri n|}t }	|r2|	| |r>d|d< t||}
d}||k rz| |
d|	d}W qW qN tjy } z(t	
d|d || |d7 }W Y d}~qNd}~0 0 qNtd	|
|jtjkrDt|j}|jd
 dkr>zt|W S  ty: } z(td|}t|| W Y d}~n
d}~0 0 n|S ntd|
|j|j|dS )ab  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.

    Returns:
        Union[Mapping, str]: If the metadata server returns JSON, a mapping of
            the decoded JSON is return. 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   r!   r"   zqFailed to retrieve {} from the Google Compute Engine metadata service. Compute Engine Metadata server unavailablez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:
{})urlparseurljoinr#   r$   updater   Zupdate_queryr   r,   r-   r.   formatr)   r   r*   
from_bytesdatar   jsonloads
ValueErrorsix
raise_from)r   pathrootparamsr5   r/   r   base_urlZquery_paramsZheaders_to_user   r0   r1   r2   r   Z
caught_excnew_excr   r   r   r'      sZ    #
 $
r'   c                 C   s
   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)r'   r   r   r   r   get_project_id   s    rF   defaultc                 C   s   d |}t| |ddid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}/r5   r4   )rC   )r9   r'   )r   service_accountrA   r   r   r   get_service_account_info  s    
rI   c                 C   sr   |r"t |tsd|}d|i}nd}tjt i}d|}t| |||d}t	 t
j|d d }|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)rC   r   Z
expires_in)secondsZaccess_token)
isinstancestrjoinr   r%   Ztoken_request_access_token_mdsr9   r'   r   utcnowdatetime	timedelta)r   rH   rK   rC   Zmetrics_headerrA   Z
token_jsonZtoken_expiryr   r   r   get_service_account_token"  s    





rS   )rG   )rG   N)*__doc__rQ   r<   loggingr   r?   Z	six.movesr   Zsix.moves.urllibr   r6   Zgoogle.authr   r   r   r   	getLogger__name__r-   getenvZGCE_METADATA_HOSTZ_GCE_METADATA_HOSTZGCE_METADATA_ROOTr9   Z_METADATA_ROOTZGCE_METADATA_IPr&   r(   r+   r#   intZ_METADATA_DEFAULT_TIMEOUTr>   r   r   r   r   r
   r'   rF   rI   rS   r   r   r   r   <module>   sT   


3
[
