403Webshell
Server IP : 172.24.0.40  /  Your IP : 216.73.216.10
Web Server : Apache
System : Linux dbweb26.ust.edu.ph 4.18.0-513.5.1.el8_9.x86_64 #1 SMP Fri Sep 29 05:21:10 EDT 2023 x86_64
User : apache ( 48)
PHP Version : 8.2.18
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : OFF  |  Sudo : ON  |  Pkexec : ON
Directory :  /usr/lib64/python3.6/site-packages/rhsm/__pycache__/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /usr/lib64/python3.6/site-packages/rhsm/__pycache__/connection.cpython-36.pyc
3

a�e4�@s�ddlmZmZmZddlZddlmZddlZddlZ	ddl
Z
ddlZddlZddl
Z
ddlZddlZddlZddlZddlmZddlmZddlmZddlmZmZddlmZdd	lmZmZm Z dd
l!m"Z"ddlm#Z$ddlm%Z%yddl&Z'e'j(j)Z*Wne+k
�rd
Z*YnXe"�Z,dZ-dIdd�Z.dd�Z/dJdd�Z0Gdd�dej1�Z2e2�Z3ej4d�j5e3�ej4e6�Z7Gdd�de8�Z9Gdd�de8�Z:Gdd�de8�Z;Gdd �d e:�Z<Gd!d"�d"e:�Z=Gd#d$�d$e:�Z>Gd%d&�d&e?�Z@Gd'd(�d(e8�ZAGd)d*�d*e@�ZBGd+d,�d,e:�ZCGd-d.�d.eC�ZDGd/d0�d0e:�ZEGd1d2�d2e:�ZFGd3d4�d4eF�ZGGd5d6�d6eC�ZHGd7d8�d8eG�ZIGd9d:�d:eG�ZJGd;d<�d<e:�ZKd=d>�ZLGd?d@�d@e@�ZMdAdB�ZNGdCdD�dDe?�ZOGdEdF�dFeO�ZPGdGdH�dHe@�ZQdS)K�)�print_function�division�absolute_importN)�certificate)�Optional)�Path)�format_datetime)�httplib�ssl)�proxy_bypass)�	urlencode�quote�
quote_plus)�get_config_parser)�ourjson)�utils�unknownZmulti_environmentcCs"yt|�Stk
r|SXdS)N)�int�	Exception)�valueZ
safe_value�r�"/usr/lib64/python3.6/connection.py�safe_int7srcCsd|krd|S|SdS)a`
    When you want to use IPv6 address and port in e.g. HTTP header, then you cannot use following
    notation common for IPv4 (147.230.16.1:53). You have to use following notation for IPv6
    [2001:718:1c01:16::aa]:53.
    :param host: hostname or IPv4 or IPv6 address
    :return: When host is IPv6 address, then it encapsulated in [] brackets
    �:z[%s]Nr)�hostrrr�normalized_host>sr�cCszd}|rvy@tjj|�}tjj�j|jd�}tj|d�}t||�|k}Wn,t	k
rt}zt
j|�WYdd}~XnX|S)zx
    Takes in a RFC 1123 date and returns True if the current time
    is greater then the supplied number of hours
    F)�tzinfo)�hoursN)�dateutil�parser�parse�datetimeZutcnow�replacerZ	timedelta�absr�log�error)Zutc_time_stringrZdriftZutc_datetimeZlocal_datetimeZdelta�errr�drift_checkLsr(c@seZdZdd�ZdS)�NullHandlercCsdS)Nr)�self�recordrrr�emitbszNullHandler.emitN)�__name__�
__module__�__qualname__r,rrrrr)asr)�rhsmc@seZdZdZdS)�NoValidEntitlementzFThrow when there is no valid entitlement certificate for accessing CDNN)r-r.r/�__doc__rrrrr1lsr1c@seZdZdS)�ConnectionExceptionN)r-r.r/rrrrr3qsr3c@sZeZdZdZd
eeeed�dd�Ze	ed�dd��Z
e	ed�d	d
��Zed�dd�ZdS)�ProxyExceptionz?
    Thrown in case of errors related to the proxy server.
    N)�hostname�port�exccCs||_||_||_dS)N)�	_hostnamer6r7)r*r5r6r7rrr�__init__zszProxyException.__init__)�returncCs
t|j�S)N)rr8)r*rrrr5szProxyException.hostnamecCs|j�d|j��S)Nr)r5r6)r*rrr�address�szProxyException.addresscCs.|j}d|��}|jdk	r*|�d|j��}|S)NzProxy error at z: )r;r7)r*Zaddr�errrrr�__str__�s


zProxyException.__str__)NNN)
r-r.r/r2�strrrrr9�propertyr5r;r=rrrrr4usr4c@seZdZdS)�ConnectionSetupExceptionN)r-r.r/rrrrr@�sr@c@s eZdZdZdd�Zdd�ZdS)�BadCertificateExceptionz< Thrown when an error parsing a certificate is encountered. cCs||_||_dS)z, Pass the full path to the bad certificate. N)�	cert_path�ssl_exc)r*rBrCrrrr9�sz BadCertificateException.__init__cCs
d|jS)NzBad certificate at %s)rB)r*rrrr=�szBadCertificateException.__str__N)r-r.r/r2r9r=rrrrrA�srAc@s$eZdZdZeeeed�dd�ZdS)�ConnectionOSErrorExceptionz�
    Thrown in case of OSError during the connect() of HTTPSConnection,
    in case the OSError does not come from a syscall failure (and thus
    its 'errno' attribute is None.
    )rr6�handlerr7cCs||_||_||_||_dS)N)rr6rEr7)r*rr6rEr7rrrr9�sz#ConnectionOSErrorException.__init__N)r-r.r/r2r>r�OSErrorr9rrrrrD�srDc@seZdZddd�ZdS)�BaseConnectionNc KsN|pt}|ptjdd�|_|p(tjdd�|_|p>ttjdd��|_|pTttjdd��|_|pftjdd�}|rv|tj	d<t
j�tj
d|�t|j�r�d|_d|_d|_d|_n�t
j�}|dk	r�||_ntjdd�p�|d|_|dk	r�||_ntjdd	��p|d	|_|	dk	�r|	|_ntjdd
��p,|d|_|
dk	�rB|
|_ntjdd��pV|d|_||_||_||_|
|_||_|�p�tjd
d�|_ttjdd��|_||_|dk�r�d|_ttjdd��}|�r�d|_d}d}d}d}|�r�|
�r�d}n(|�r|�rd}n|�rd}n
|�rd}tdd�||||fD��dk�rBtd��d}|j�rn|j�rndt|j�t|j�f}||j|j|j|j|j|j|j|j|j|j|j|j|j|j||j|j||d�|_|�r�d|}n8|�r�d|}n(|�r�d|j|jf}n|�rd}nd}d|_ d|_!d}|�r$||7}|d|j|j|j|f7}tj
d |�dS)!NZserverr5�prefixr6Zserver_timeout�no_proxyz-Environment variable NO_PROXY=%s will be used�proxy_hostname�
proxy_port�
proxy_userZproxy_username�proxy_passwordr0Zca_cert_dir�ssl_verify_depthF�insecureTcSsg|]}|r|�qSrr)�.0rrrr�
<listcomp>
sz+BaseConnection.__init__.<locals>.<listcomp>rz"Cannot specify multiple auth typeszhttp_proxy=%s:%s )�username�password�token�	cert_file�key_filerJrKrLrM�ca_dirrO�cert_dirrN�timeout�correlation_id�
user_agentzauth=bearer %szauth=basic username=%sz(auth=identity_cert ca_dir=%s insecure=%szauth=entitlement_certsz	auth=none�zhost=%s port=%s handler=%s %szConnection built: %s)"�Restlib�config�getrrEr�ssl_portrY�os�environrZfix_no_proxyr%�debugrrJrKrLrMZget_env_proxy_inforUrVrRrSrTrWrNrO�lenrr�conn�	resources�capabilities) r*Z
restlib_classrr`rErWrOrJrKrLrMrIrRrSrUrVrXrTr[rZrY�kwargsZno_proxy_override�infoZconfig_insecureZusing_basic_authZusing_id_cert_authZusing_ent_cert_authZusing_keycloak_authZproxy_descriptionZauth_descriptionZconnection_descriptionrrrr9�s�








zBaseConnection.__init__)NNNNNNNNNNNNNNNNNNNN)r-r.r/r9rrrrrG�s(rGc@seZdZdS)�TokenAuthExceptionN)r-r.r/rrrrrj9srjcs(eZdZdZ�fdd�Zdd�Z�ZS)�KeycloakConnectionz)
      Keycloak Based Authentication
    csltjjjj|�jpd}tjjjj|�j}tjjjj|�jp<d}tt	|�j
f|||d�|��||_||_dS)Nr\i�)rr`rE)
�six�moves�urllibr!Zurlparser5�pathr6�superrkr9�realm�resource)r*rqZauth_urlrrrhrrEr`)�	__class__rrr9BszKeycloakConnection.__init__cCszd|jd}|jd|d�}ddi}y|jj|||�}|dStk
rt}z|jdkrbt|j���WYdd}~XnXdS)	Nz/realms/z/protocol/openid-connect/token�
refresh_token)Z	client_idZ
grant_typertzContent-typez!application/x-www-form-urlencodedZaccess_tokeni�)rqrrre�request_post�RestlibException�coderj�msg)r*Zrefreshtoken�method�params�headers�datar'rrr� get_access_token_through_refreshJs

z3KeycloakConnection.get_access_token_through_refresh)r-r.r/r2r9r}�
__classcell__rr)rsrrk=srkc@s.eZdZdZd	dd�Zedd��Zdd�ZdS)
rvz�
    Raised when a response with a valid json body is received along with a status code
    that is not in [200, 202, 204, 410, 429]
    See RestLib.validateResponse to see when this and other exceptions are raised.
    NcCs||_|pd|_|pi|_dS)Nr\)rwrxr{)r*rwrxr{rrrr9_s
zRestlibException.__init__cCstjj|jd�S)N�Unknown)r	�	responsesr_rw)r*rrr�titledszRestlibException.titlecCsd|j�d|j�d|j��S)NzHTTP error (z - z): )rwr�rx)r*rrrr=hszRestlibException.__str__)NN)r-r.r/r2r9r?r�r=rrrrrvXs
rvc@seZdZdZdd�ZdS)�
GoneExceptiona�
    GoneException is used to detect when a consumer has been deleted on the candlepin side.

    A client handling a GoneException should verify that GoneException.deleted_id
    matches the consumer uuid before taking any action (like deleting the consumer
    cert from disk).

    This is to prevent an errant 410 response from candlepin (or a reverse_proxy in
    front of it, or it's app server, or an injected response) from causing
    accidental consumer cert deletion.
    cCstj|||�||_dS)N)rvr9�
deleted_id)r*rwrxr�rrrr9xszGoneException.__init__N)r-r.r/r2r9rrrrr�lsr�c@sFeZdZdZdeeeeed�dd�Zeed�dd��Z	d	d
�Z
dS)�UnknownContentExceptionz�
    Thrown when the response of a request has no valid json content
    and the http status code is anything other than the following:
    [200, 202, 204, 401, 403, 410, 429, 500, 502, 503, 504]
    N)rw�content_type�contentcCs||_||_||_dS)N)rwr�r�)r*rwr�r�rrrr9�sz UnknownContentException.__init__)r:cCstjj|jd�S)Nr)r	r�r_rw)r*rrrr��szUnknownContentException.titlecCsXd|j�d|j��}|jdk	r.|d|j��7}|jdk	rL|dt|j���7}|d7}|S)NzUnknown content error (HTTP z - z, type z, len �))rwr�r�r�rd)r*�srrrr=�s

zUnknownContentException.__str__)NN)r-r.r/r2rrr>r9r?r�r=rrrrr�~s
r�c@s"eZdZdZddd�Zdd�ZdS)�RemoteServerExceptionz�
    Thrown when the response to a request has no valid json content and
    one of these http status codes: [404, 410, 500, 502, 503, 504]
    NcCs||_||_||_dS)N)rw�request_typerE)r*rwr�rErrrr9�szRemoteServerException.__init__cCs*|jr |jr d|j|j|jfSd|jS)Nz5Server error attempting a %s to %s returned status %szServer returned %s)r�rErw)r*rrrr=�s

zRemoteServerException.__str__)NN)r-r.r/r2r9r=rrrrr��s
r�cs eZdZdZ�fdd�Z�ZS)�AuthenticationExceptionzAuthentication errorcs(tt|�j�}|d7}|d|j7}|S)N�
z$%s: Invalid credentials for request.)rpr�r=rH)r*Zbuf)rsrrr=�szAuthenticationException.__str__)r-r.r/rHr=r~rr)rsrr��sr�cs"eZdZdZd�fdd�	Z�ZS)�RateLimitExceededExceptiona
    Thrown in response to a http code 429.
    This means that too many requests have been made in a given time period.
    The retry_after attribute is an int of seconds to retry the request after.
    The retry_after attribute may not be included in the response.
    NcsZtt|�j||�|pi|_t|jjd��|_|p4d|_|jdk	rV|jd|j7_dS)Nzretry-afterzAccess rate limit exceededz!, retry access after: %s seconds.)rpr�r9r{rr_Zretry_afterrx)r*rwrxr{)rsrrr9�s


z#RateLimitExceededException.__init__)NN)r-r.r/r2r9r~rr)rsrr��sr�c@seZdZdZdZdS)�UnauthorizedExceptionzO
    Thrown in response to http status code 401 with no valid json content
    ZUnauthorizedN)r-r.r/r2rHrrrrr��sr�c@seZdZdZdZdS)�ForbiddenExceptionzO
    Thrown in response to http status code 403 with no valid json content
    Z	ForbiddenN)r-r.r/r2rHrrrrr��sr�c@seZdZdS)�ExpiredIdentityCertExceptionN)r-r.r/rrrrr��sr�cCs(tjdj||f�jd��jd�}d|S)Nrzutf-8zBasic %s)�base64Z	b64encode�join�encode�decode)rRrSZencodedrrr�_encode_auth�s r�cs0eZdZd�fdd�	Zd	dd�Zdd�Z�ZS)
�ContentConnectionNcsXtjd�dtjtj�}d|kr.||d7}|p4d}tt|�jfd||d�|��dS)Nr�zRHSM-content/1.0 (cmd=%s)�client_versionz/etc/pki/entitlement�/)rErXr[)	r%rcr�cmd_name�sys�argvrpr�r9)r*rXrhr[)rsrrr9�s
zContentConnection.__init__cCs"d|j|f}|jj||d�}|S)aI
        Get list of available release versions from the given path
        :param path: path, where is simple text file containing supported release versions
        :param cert_key_pairs: optional argument including list of supported cert and keys
            to reduce number of failed http requests.
        :return:
        z%s/%s)�cert_key_pairs)rEre�request_get)r*ror�rE�resultrrr�get_versions�szContentConnection.get_versionscCsdS)Nr)r*Z
product_idrrr�_get_versions_for_product�sz+ContentConnection._get_versions_for_product)N)N)r-r.r/r9r�r�r~rr)rsrr��s	

r�cCszd}ytj�}WnPtjtfk
r`ytj�}Wn(tjk
rHYntk
rZYnXYnX|rv|dkrv|dSdS)Nr)NN)�localeZ	getlocale�Error�
ValueError�getdefaultlocale)�lrrr�_get_locale�sr�c@s�eZdZdZdZd(dd�Zdd	�Zd
d�Zd)dd
�Zdd�Z	e
dd��Zdd�Zd*dd�Z
dd�Zd+dd�Zdd�Zd,dd�Zd-dd�Zd.d d!�Zd/d"d#�Zd0d$d%�Ze
d&d'��ZdS)1�BaseRestLibzp
    A low-level wrapper around httplib
    to make rest calls easy and expose the details of
    responses
    g�������?NFrcCs�||_||_||_|pd|_ddtd�|_|r8||jd<|
|_||_||_|
|_	||_
||_||_||_
||_||_||_||_|	|_d|_||_d|_|r�|r�t||�|jd<n|r�d||jd<dS)Nzpython-rhsm-user-agentzapplication/json)zContent-type�Acceptzx-subscription-manager-versionzX-Correlation-ID�
AuthorizationzBearer )rr`�
apihandlerr[�subman_versionr{rUrVrXrWrOrRrSrYrNrJrKrLrM�smoothed_rtrT�is_consumer_cert_key_validr�)r*rr`r�rRrSrJrKrLrMrUrVrXrWrOrNrYrZrTr[rrrr9s:


zBaseRestLib.__init__cCs�g}|jdkr|j|jfgSxhtj|j�D]X}|jd�r*|jd�r*tjj|j|�}tjj|jd|jdd�d�}|j	||f�q*W|S)zN
        Create list of cert-key pairs to be used with the connection
        Nz.pemz-key.pemz
%s-key.pem�.rr)
rXrUrVra�listdir�endswithror��split�append)r*r�rUrBZkey_pathrrr�_get_cert_key_listCs
 zBaseRestLib._get_cert_key_listcCstjj|j�s"tjd|j�dSg}d}yHxBtj|j�D]2}|jd�r:tjj|j|�}|j	|�|j
|�q:WWnXtjk
r�}zt
||��WYdd}~Xn,tk
r�}zt|j��WYdd}~XnX|r�tjd|jdj|�f�ntjd|j�dS)zx
        Tries to load CA certificates to SSL context
        :param context: SSL context
        :return: None
        z.Directory "%s" with CA certificates is missingNr\z.pemz"Loaded CA certificates from %s: %sz, z*Unable to load any CA certificate from: %s)raro�isdirrWr%�warningr�r�r�Zload_verify_locationsr�r
�SSLErrorrArFr@�strerrorrc)r*�contextZloaded_ca_certsrBrUr7r'rrr�_load_ca_certificatesUs$

z!BaseRestLib._load_ca_certificatescCs8tjtj�}tjtjB|_|jr*tj|_ntj	|_|j
dk	rF|j|�|rdtj
j|�rd|j||d�|jon|j�rtjdt|j�t|j�f�|jdt|j�t|j�fd�}|jr�|jr�t|j|j�|d<tj|j|j||jd�}|j|jt|j�|�dt|j�t|j�f|j d<ntj|j|j||jd�}|S)N)ZkeyfilezUsing proxy: %s:%sz%s:%s)z
User-Agent�HostzProxy-Authorization)r�rYr�)!r
Z
SSLContextZPROTOCOL_SSLv23ZOP_NO_SSLv2ZOP_NO_SSLv3�optionsrOZ	CERT_NONEZverify_modeZ
CERT_REQUIREDrWr�raro�existsZload_cert_chainrJrKr%rcrrr[rr`rLrMr�r	ZHTTPSConnectionrYZ
set_tunnelr{)r*rUrVr�Z
proxy_headersrerrr�_create_connectionqs(



 zBaseRestLib._create_connectioncCs�dtjk�r�d}d}d}d}d}	|jdkr8|d|	}
n|d	|	}
|
|d
|j|j||f|	7}
|jr�|jr�|
|d||j�d|j��|	7}
d
tjkr�|
|d||	7}
dtjkr�|dk	r�|
|d||	7}
t�t|
�t�dtjk�r�td�}|j	dd�t
j
j�jd�}d}
x6t|�d|
�d��}||}|j
��sLP|
d7}
�q$W|jddd��}tj|d�WdQRXt|dt|��d�|	�t�dS)a�
        This method can print debug information about sent http request. We do not use
        httplib.HTTPConnection.debuglevel = 1, because it doesn't provide control about displayed information.
        The debug print is printed to stdout, when environment variable SUBMAN_DEBUG_PRINT_REQUEST is set.
        Output can be modified with following environment variables:
         * SUBMAN_DEBUG_PRINT_REQUEST_HEADER
         * SUBMAN_DEBUG_PRINT_REQUEST_BODY
        :param request_type: (GET, POST, PUT, ...)
        :param handler: e.g. /candlepin/status
        :param final_headers: HTTP header used by request
        :param body: request can contain body
        :return: None
        ZSUBMAN_DEBUG_PRINT_REQUESTzzzzzTzMaking insecure request:zMaking request:z %s:%s %s %sz
 using proxy rZ!SUBMAN_DEBUG_PRINT_REQUEST_HEADERz %sZSUBMAN_DEBUG_PRINT_REQUEST_BODYNZSUBMAN_DEBUG_SAVE_TRACEBACKSz
/tmp/rhsm/)�exist_okz%Y-%m-%d_%H-%M-%Sr�_z.logr�wzutf-8)�encoding)�filezTraceback saved to r�)rarbrOrr`rJrK�printr�mkdirr"ZnowZstrftimer��open�	traceback�print_stackr>)r*r�rE�
final_headers�bodyZ
yellow_colZblue_colZ	green_colZred_colZend_colrxZ	debug_dir�	timestamp�i�filenameZ	debug_logZhandlerrr�_print_debug_info_about_request�sD
 &

z+BaseRestLib._print_debug_info_about_requestcCs8dtjkr4td|d|df�t|d�t�dS)z�
        This method can print result of HTTP request to stdout, when environment variable SUBMAN_DEBUG_PRINT_RESPONSE
        is set.
        :param result: response from candlepin server
        :return: None
        ZSUBMAN_DEBUG_PRINT_RESPONSEz%s %s�statusr{r�N)rarbr�)r�rrr� _print_debug_info_about_response�s	
z,BaseRestLib._print_debug_info_about_responsecCs�y4ddl}y|jjj}Wntk
r0d}YnXWntk
rLd}YnX|dkr^t�}n|}|r�|j�jdd�j	dd�d|j
d<dS)z}
        Set accept language in http header according current settings or environment variable
        :return: None
        rNr��-r�rzAccept-Language)Zsubscription_manager.i18nZi18n�LOCALE�language�AttributeError�ImportErrorr��lowerr#r�r{)r*�subscription_managerr�Zlcrrr�_set_accept_language_in_header�s
z*BaseRestLib._set_accept_language_in_headercCs�|j|}|j�|dks&t|�dkr.|j�}|dk	rbd|krb|ddkrbtjjjj|�j	d�}n|dk	r|t
j|t
j	d�}nd}tj
d||f�|jr�|j|jd<|jj�}|dkr�d|d	<|r�|j|�|j||||�d}	d}
�x|D�]�\}}y�|j||d
�}
tj�}|
j||||d�tj�}|
j�}	|j||�|	j�jd�|	jt|	j��d�}
|	jd
k�rtd|_Pn|j�r�tj
d|
|jf�Wq�t j!k
�r�|j"�r�|j�r�t#j$|j"�}|j%��s�d|_t&��|j�s�Yq�t'j(k
�r0}z*|j)�r|j*�rt+|j)|j*|d���WYdd}~Xq�t'j,t-fk
�r�}z�t.|t/��rv|j)�rv|j*�rvt+|j)|j*|d��tj0�r�t1j2}nt1j2j3}t4|�t4|�k�r�t+|j)|j*|d��|j5dk�r�t6|j|j7|j|���WYdd}~Xq�Xq�W|j�rt8d|j|f��|j9|
�dt4|
d�}|	j:d��r<d||	j:d�f}d|||f}tj
|�t;|	j:d���rntj<d�|j=|
||�|
S)NrzContent-typez!application/x-www-form-urlencodedzutf-8)�defaultzMaking request: %s %sz
User-Agent�0zContent-Length)rUrV)r�r{)r�r�r{��Tz-Unable to get valid response: %s from CDN: %sF)r5r6r7zKCannot access CDN content on: %s using any of entitlement cert-key pair: %szResponse: status=r�zx-candlepin-request-uuidz%s, requestUuid=%sz%s, request="%s %s"Zdatez2Clock skew detected, please check your system time)>r�r�rdr�rlrmrnr!rr��json�dumpsr%rcr[r{�copy�updater�r��timeZrequestZgetresponse�_update_smoothed_response_time�readr�r��dictZ
getheadersr�rXrr
r�rUr�create_from_file�is_validr��socketZgaierrorrJrKr4r&rF�
isinstance�ConnectionErrorZPY2r	�PROXY_AUTHENTICATION_REQUIREDrr>�errnorDr`r1r�Z	getheaderr(r��validateResponse)r*r�ryrir{r�rEr�r��responser�rUrVreZts_startZts_end�id_certr<rwZresponse_logrrr�_request�s�






zBaseRestLib._requestcCsF|jdkr||_n|j|jd|j||_tjd||jf�dS)z�
        Method for computing smoothed time of response. It is based on computing SRTT (See RFC 793).
        :param response_time: response time of the latest http request
        :return: None
        Nrz-Response time: %s, Smoothed response time: %s)r��ALPHAr%rc)r*Z
response_timerrrr�js
z*BaseRestLib._update_smoothed_response_timecCs�t|d�dk�r�i}|jd�s&i}n�ytj|d�}Wn~tk
rz}z&tjd|d�tjd|�WYdd}~Xn>tk
r�}z"tjd|d�tj|�WYdd}~XnX|�r�t|d�d	kr�t	|d|d
|d��n(t|d�tt
j�k�rt|j
|jd��|j|�}t|d�dk�rDt|d||jd�d��t|d�dk�r�|j
�r�|j�r�tj|j�}|j��r�t|dd|jd���t|d||jd���n�t|d�dk�r�t|d||d��n�t|d�dk�r�t|d||d��n�t|d�dk�rt|d||d��nxt|d�d k�rFt|d|jd�d��nNt|d�tt
j�k�rpt|j
|jd��n$t|d|jdi�jd�|jd���dS)!Nr��200�202�204�304r�zResponse: %szJSON parsing error: %s�410�displayMessageZ	deletedId)r5r6�429r{)r{�401zmUnable to make a connection using SSL client certificate. Please review proxy configuration and connectivity.�404�500�502�503�504)r�rE�403zContent-Type)r�r�r�r�)r�)r�)r�r�r�r�r�r�)r�)r�)r�)r>r_r��loadsr�r%r&rZ	exceptionr�r	r�r4rJrK�#_parse_msg_from_error_response_bodyr�rUrr�r�rvr�r�r�r�)r*r�r�rEZparsedr'Z	error_msgr�rrrr�vsl





zBaseRestLib.validateResponsecCsDd|kr|dSd|kr0djdd�|dD��Sd|kr@|dSdS)Nr��errors� css|]}d|VqdS)z%sNr)rP�errmsgrrr�	<genexpr>�szBBaseRestLib._parse_msg_from_error_response_body.<locals>.<genexpr>Zerror_description)r�)r*r�rrrr��sz/BaseRestLib._parse_msg_from_error_response_bodycCs|jd|||d�S)NZGET)r{r�)r�)r*ryr{r�rrrr��szBaseRestLib.request_getcCs|jd|||d�S)NZPOST)r{)r�)r*ryrzr{rrrru�szBaseRestLib.request_postcCs|jd||d�S)NZHEAD)r{)r�)r*ryr{rrr�request_head�szBaseRestLib.request_headcCs|jd|||d�S)NZPUT)r{)r�)r*ryrzr{rrr�request_put�szBaseRestLib.request_putcCs|jd|||d�S)NZDELETE)r{)r�)r*ryrzr{rrr�request_delete�szBaseRestLib.request_deletecCst|dd�S)zJ
        Format a datetime to HTTP-date as described by RFC 7231.
        T)Zusegmt)r)Zdtrrr�_format_http_date�szBaseRestLib._format_http_date)NNNNNNNNNNFrNNNN)NN)NNN)NN)NN)NN)N)NN)NN)r-r.r/r2r�r9r�r�r�r��staticmethodr�r�r�r�r�r�r�rurrrrrrrrr�s0
(
(8
t
X




r�cs"eZdZdZd�fdd�	Z�ZS)r]z�
     A wrapper around httplib to make rest calls easier
     See validateResponse() to learn when exceptions are raised as a result
     of communication with the server.
    NcsXtt|�j|||||d�}t|d�s*dSytj|d�Stjk
rR|dSXdS)N)rir{r�r�)rpr]r�rdr�r�ZJSONDecodeError)r*r�ryrir{r�r�)rsrrr��szRestlib._request)NNN)r-r.r/r2r�r~rr)rsrr]�sr]cs�eZdZdZ�fdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
d�dd�Zdd�Zddiddddddddddddfdd�Z
d�dd�Zd�dd�Zifdd�Zd�dd �Zd!d"�Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+d,�Zd-d.�Zd/d0�Zd�d1d2�Zd�d3d4�Zd�d5d6�Zd�d7d8�Zd9d:�Zd�d;d<�Zd=d>�Z d?d@�Z!dAdB�Z"dCdD�Z#dEdF�Z$d�dGdH�Z%dIdJ�Z&gfdKdL�Z'dMdN�Z(d�dOdP�Z)d�dQdR�Z*dSdT�Z+d�dUdV�Z,dWdX�Z-dYdZ�Z.d[d\�Z/d]d^�Z0d�d_d`�Z1d�dcdd�Z2d�dedf�Z3dgdh�Z4didj�Z5dkdl�Z6d�dmdn�Z7dodp�Z8dqdr�Z9d�dsdt�Z:dudv�Z;dwdx�Z<d�dzd{�Z=d�d|d}�Z>d~d�Z?d�d��Z@d�d��ZAd�d�d��ZBd�d�d��ZCd�d��ZDd�d�d��ZEd�d��ZFd�d��ZGd�d��ZHd�d�d��ZI�ZJS)��
UEPConnectionzh
    Class for communicating with the REST interface of a Red Hat Unified
    Entitlement Platform.
    csVdtjtj�}d|kr$||d7}d|kr8||d7}tt|�jfd|i|��dS)aT
        Multiple ways to authenticate:
            - username/password for HTTP basic authentication. (owner admin role)
            - uuid/key_file/cert_file for identity cert authentication.
              (consumer role)
            - token (when supported by the server)

        Must specify only one method of authentication.
        zRHSM/1.0 (cmd=%s)r�Zdbus_senderr[N)rr�r�r�rprr9)r*rhr[)rsrrr9s
zUEPConnection.__init__cCsDi|_|jjd�}x|D]}|d|j|d<qWtjd|j�dS)a�
        Load the list of supported resources by doing a GET on the root
        of the web application we're configured to use.

        Need to handle exceptions here because sometimes UEPConnections are
        created in a state where they can't actually be used. (they get
        replaced later) If something goes wrong making this request, just
        leave the list of supported resources empty.
        r�ZhrefZrelz+Server supports the following resources: %sN)rfrer�r%rc)r*Zresources_list�rrrr�_load_supported_resources#s

z'UEPConnection._load_supported_resourcescCs|jdkr|j�|jS)z_
        Get list of supported resources.
        :return: list of supported resources
        N)rfr
)r*rrr�get_supported_resources4s
z%UEPConnection.get_supported_resourcescCs|jdkr|j�||jkS)z�
        Check if the server we're connecting too supports a particular
        resource. For our use cases this is generally the plural form
        of the resource.
        N)rfr
)r*Z
resource_namerrr�supports_resource>s
zUEPConnection.supports_resourcecCs^|j�}|jd�}|dkr.tjd|�g}n,t|t�rN|rNtjd|�ntjd|�|S)zo
        Loads manager capabilities by doing a GET on the status
        resource located at '/status'
        ZmanagerCapabilitiesNzaThe status retrieved did not                       include key 'managerCapabilities'.
Status:'%s'zHThe managerCapabilities list                       was empty
Status:'%s'z)Server has the following capabilities: %s)�	getStatusr_r%rcr��list)r*r�rgrrr�_load_manager_capabilitiesIs

z(UEPConnection._load_manager_capabilitiescCs|jdkr|j�|_||jkS)zU
        Check if the server we're connected to has a particular capability.
        N)rgr)r*Z
capabilityrrr�has_capability[s

zUEPConnection.has_capabilitycCs|jj�tjd�dS)Nzremote connection closed)re�closer%rc)r*rrr�shutDowncs
zUEPConnection.shutDownNcCs|jjd�S)Nz/status/)rer�)r*rRrSrrr�pinggszUEPConnection.pingcCs(|||d�}ddd�}|jjd||d�S)a

        When automatic registration is enabled in rhsm.conf and it was possible
        to gather cloud metadata, then it is possible to try to get JSON Web Token
        for automatic registration. When candlepin does not provide automatic
        registration, then raise exception.
        :param cloud_id: ID of cloud provider, e.g. "aws", "azure", "gcp"
        :param metadata: string with base64 encoded metadata
        :param signature: string with base64 encoded signature
        :return: string with JWT
        )�type�metadata�	signaturezapplication/jsonz
text/plain)zContent-typer�z/cloud/authorize)ryrzr{)reru)r*Zcloud_idrrrzr{rrr�
getJWTokenjszUEPConnection.getJWTokenr�systemcCsn|||d�}|r||d<|r$||d<|	dk	r8d|	i|d<|
dk	rH|
|d<|dk	rX||d<|dk	rh||d<|dk	rx||d	<|
dk	r�|
|d
<|dk	r�|jt�r�g}x |jd�D]}|jd|i�q�W||d
<i}|r�dj|d�|d<d}|o�|jt��rd|j|�}nV|�r\td|i�}d||f}d}|�r\|d}x$|D]}|||j|�}d}�q<W|jj|||d�S)z8
        Creates a consumer on candlepin server
        )r�name�facts�installedProducts�uuidN�hypervisorId�contentTags�role�addOns�usage�serviceLevel�,�id�environmentszBearer {jwt_token})�	jwt_tokenr�z
/consumersz/environments/%s/consumers�ownerz%s?%sr\z&activation_keys=)r{)	r�	MULTI_ENVr�r��format�sanitizerreru)r*rrrr'r%�keys�installed_productsr�
hypervisor_id�content_tagsr�addons�
service_levelr!r&rz�env_list�environmentr{�url�query_paramZprepend�keyrrr�registerConsumer�sP

zUEPConnection.registerConsumerc
Cs�|jd�r~|jjd}d|jjd<|dd�}|rN|jrNt|j�dkrN|j|d<t|�}d||f}|jj||�}	||jjd<n$t||d	��}d
|}|jj||�}	|	S)a&
        Sends a mapping of hostIds to list of guestIds to candlepin
        to be registered/updated.
        This method can raise the following exceptions:
            - RestLibException with http code 400: this means no mapping
            (or a bad one) was provided.
            - RestLibException with other http codes: Please see the
            definition of RestLibException above for info about this.
            - RateLimitExceededException: This means that too many requests
            have been made in the given time period.

        Zhypervisors_asynczContent-typez
text/plainF)�envZcloakedr�reporter_idz/hypervisors/%s?%s)r'r7z/hypervisors?%s)rrer{r8rdrru)
r*r'r7Zhost_guest_mappingr�ZpriorContentTyperz�query_paramsr3�resrrr�hypervisorCheckIn�s


zUEPConnection.hypervisorCheckIncCsX|jd�s&|o"|jo"t|j�dkr*dSi}|j|d<t|�}d||f}|jj|�S)a*
        Sends the reporter id to candlepin
        to update the hypervisors it has previously reported.
        This method can raise the following exception:
            - RateLimitExceededException: This means that too many requests
            have been made in the given time period.
        Zhypervisors_heartbeatrNr8z/hypervisors/%s/heartbeat?%s)rr8rdrrer)r*r'r�rzr9r3rrr�hypervisorHeartbeat�s	&
z!UEPConnection.hypervisorHeartbeatcCs|j||d�S)z>
        Update a consumers facts on candlepin server
        )r)�updateConsumer)r*�
consumer_uuidrrrr�updateConsumerFacts�sz!UEPConnection.updateConsumerFactscCs:i}|dk	r||d<|dk	r*|j|�|d<|dk	r:||d<|dk	rJ||d<|dk	rZ||d<|dk	rnd|i|d<|	dk	r~|	|d<|
dk	r�|
|d	<|dk	r�t|t�r�||d
<nt|tj�r�|g|d
<|dk	r�||d<|
dk	�rg}x |
jd�D]}|jd
|i�q�W||d<|dk	�r||d<d|j|�}|jj	||�}|S)a�
        Update a consumer on the server.

        Rather than requiring a full representation of the consumer, only some
        information is passed depending on what we wish to update.

        Note that installed_products and guest_uuids expects a certain format,
        example parsing is in subscription-manager's format_for_server() method.

        This can raise the following exceptions:
            - RestlibException - This will include an http error code and a
            translated message that provides some detail as to what happend.
            - GoneException - This indicates that the consumer has been deleted
        Nr�guestIdsrZ
releaseVer�autohealrrrr r!r#r$r%r"z
/consumers/%s)
�sanitizeGuestIdsr�rrlZ	text_typer�r�r*rer)r*rrr,Zguest_uuidsr0�releaserAr-r.rr/r!r%rzr1r2ry�retrrrr=�sD




zUEPConnection.updateConsumercCsDt|tj�r|}i}n|d}d|j|�|j|�f}|jj||�S)N�guestIdz/consumers/%s/guestids/%s)r�rl�string_typesr*rer)r*rrE�
guest_uuidryrrr�addOrUpdateGuestId1sz UEPConnection.addOrUpdateGuestIdcCsd|j|�}|jj|�S)Nz/consumers/%s/guestids)r*rer�)r*rryrrr�getGuestIds:szUEPConnection.getGuestIdscCs$d|j|�|j|�f}|jj|�S)Nz/consumers/%s/guestids/%s)r*rer�)r*rrGryrrr�
getGuestId>szUEPConnection.getGuestIdcCs$d|j|�|j|�f}|jj|�S)Nz/consumers/%s/guestids/%s)r*rer)r*rrGryrrr�
removeGuestIdBszUEPConnection.removeGuestIdcs�fdd�|pgD�S)Ncsg|]}�j|��qSr)�sanitizeGuestId)rPrE)r*rrrQGsz2UEPConnection.sanitizeGuestIds.<locals>.<listcomp>r)r*r@r)r*rrBFszUEPConnection.sanitizeGuestIdscCsDt|tj�r|St|t�r@dt|j��kr@|jd�r8|S|dSdS)NrEZguestids)r�rlrFr�rr+r)r*rErrrrLIs
zUEPConnection.sanitizeGuestIdcCsd|j|�}|jj||�S)z�
        Updates the consumer's package profile on the server.

        pkg_dicts expected to be a list of dicts, each containing the
        package headers we're interested in. See profile.py.
        z/consumers/%s/packages)r*rer)r*r>Z	pkg_dictsryrrr�updatePackageProfileSsz"UEPConnection.updatePackageProfilecCsd|j|�}|jj||�S)a
        Updates the costumers' combined profile containing package profile,
        enabled repositories and dnf/yum modules.
        :param consumer_uuid: UUID of consumer
        :param profile: Combined profile
        :return: Dict containing response from HTTP server
        z/consumers/%s/profiles)r*rer)r*r>Zprofileryrrr�updateCombinedProfile]sz#UEPConnection.updateCombinedProfilecCsd|j|�}|jj|�S)zO
        Returns a consumer object with pem/key for existing consumers
        z
/consumers/%s)r*rer�)r*rrRrSryrrr�getConsumeriszUEPConnection.getConsumercCs d}|rd||f}|jj|�S)z-
        Returns a list of consumers
        z/consumers/z%s?owner=%s)rer�)r*r'ryrrr�getConsumerspszUEPConnection.getConsumerscCs8d|j|�}|r,d||j|j�dd�f}|jj|�S)zP
        Returns a compliance object with compliance status information
        z/consumers/%s/compliancez
%s?on_date=%sT)�plus)r*�	isoformatrer�)r*r�on_dateryrrr�
getCompliancezs
zUEPConnection.getCompliancecCs8d|j|�}|r,d||j|j�dd�f}|jj|�S)z_
        Returns a system purpose compliance object with compliance status information
        z /consumers/%s/purpose_compliancez
%s?on_date=%sT)rQ)r*rRrer�)r*rrSryrrr�getSyspurposeCompliance�s
z%UEPConnection.getSyspurposeCompliancecCsd|j|�}|jj|�S)zM
        Retrieves the system purpose settings available to an owner
        z/owners/%s/system_purpose)r*rer�)r*�	owner_keyryrrr�getOwnerSyspurposeValidFields�sz+UEPConnection.getOwnerSyspurposeValidFieldscCs&d|i}|r||d<d}|jj||�S)Nr5ZdisplayNamez/owners/)reru)r*ZownerKeyZownerDisplayNamerzryrrr�createOwner�s
zUEPConnection.createOwnercCsd|j|�}|jj|�S)zM
        Returns an owner object with pem/key for existing consumers
        z/consumers/%s/owner)r*rer�)r*rryrrr�getOwner�szUEPConnection.getOwnercCsd|j|�}|jj|�S)z"
        deletes an owner
        z
/owners/%s)r*rer)r*r5ryrrr�deleteOwner�szUEPConnection.deleteOwnercCsd}|jj|�S)z.
        Returns a list of all owners
        z/owners)rer�)r*ryrrr�	getOwners�szUEPConnection.getOwnerscCsd|j|�}|jj|�S)z'
        Returns an owner info
        z/owners/%s/info)r*rer�)r*r'ryrrr�getOwnerInfo�szUEPConnection.getOwnerInfocCs0d|j|�}|jj|�}dd�|p&gD�}|S)zN
        Returns an owner objects with pem/key for existing consumers
        z/users/%s/ownerscSsg|]}|dk	r|�qS)Nr)rP�xrrrrQ�sz.UEPConnection.getOwnerList.<locals>.<listcomp>)r*rer�)r*rRryZownersrrr�getOwnerList�szUEPConnection.getOwnerListcCs8d|}x"|pgD]}|d|j|�7}qW|jj|�S)zb
        If hypervisor_ids is populated, only hypervisors with those ids will be returned
        z/owners/%s/hypervisors?z&hypervisor_id=%s)r*rer�)r*rVZhypervisor_idsryr-rrr�getOwnerHypervisors�sz!UEPConnection.getOwnerHypervisorscCsd|j|�}|jj|�S)z;
         Deletes a consumer from candlepin server
        z
/consumers/%s)r*rer)r*�
consumerIdryrrr�unregisterConsumer�sz UEPConnection.unregisterConsumercCs<d|j|�}t|�dkr0dj|�}d||f}|jj|�S)z�
        Fetch all entitlement certificates for this consumer.
        Specify a list of serial numbers to filter if desired.
        z/consumers/%s/certificatesrr#z
%s?serials=%s)r*rdr�rer�)r*r>ZserialsryZserials_strrrr�getCertificates�s

zUEPConnection.getCertificatescCsd|j|�}|jj|�S)zC
        Get serial numbers for certs for a given consumer
        z"/consumers/%s/certificates/serials)r*rer�)r*r`ryrrr�getCertificateSerials�sz#UEPConnection.getCertificateSerialscCs2d|}i}|r"tj|�}||d<|jj||d�S)a-
        Get the content of the accessible content cert for a given consumer.

        :param consumerId: consumer id
        :param if_modified_since: if present, only return the content if it was altered since the given date
        :return: json with the last modified date and the content
        z /consumers/%s/accessible_contentzIf-Modified-Since)r{)r�rrer�)r*r`Zif_modified_sinceryr{r�rrr�getAccessibleContent�s
z"UEPConnection.getAccessibleContentcCs4d|j|�|j|�f}|r(d||f}|jj|�S)zC
         Subscribe consumer to a subscription by pool ID.
        z"/consumers/%s/entitlements?pool=%sz%s&quantity=%s)r*reru)r*r`�poolIdZquantityryrrr�bindByEntitlementPool�sz#UEPConnection.bindByEntitlementPoolcCs0djdd�|D��}dt|�|f}|jj|�S)z�
        Subscribe consumer directly to one or more products by their ID.
        This will cause the UEP to look for one or more pools which provide
        access to the given product.
        �&cSsg|]}d|jdd��qS)zproduct=rz%20)r#)rP�productrrrrQsz/UEPConnection.bindByProduct.<locals>.<listcomp>z/consumers/%s/entitlements?%s)r�r>reru)r*r`Zproducts�argsryrrr�
bindByProduct�szUEPConnection.bindByProductcCs8d|j|�}|r,d||j|j�dd�f}|jj|�S)a:
        Same as bindByProduct, but assume the server has a list of the
        system's products. This is useful for autosubscribe. Note that this is
        done on a best-effort basis, and there are cases when the server will
        not be able to fulfill the client's product certs with entitlements.
        z/consumers/%s/entitlementsz%s?entitle_date=%sT)rQ)r*rRreru)r*r`Zentitle_dateryrrr�binds
zUEPConnection.bindcCs<|dkrd|j|�}nd|j|�|j|�f}|jj|�S)aW
        Performs a dry-run autobind on the server and returns the results of
        what we would get. Callers can use this information to determine if
        they wish to perform the autobind, and to explicitly grab entitlements
        from each pool returned.

        Return will be a dict containing a "quantity" and a "pool".
        Nz"/consumers/%s/entitlements/dry-runz3/consumers/%s/entitlements/dry-run?service_level=%s)r*rer�)r*r>r0ryrrr�
dryRunBinds
	zUEPConnection.dryRunBindcCs(d|j|�|jt|��f}|jj|�S)Nz/consumers/%s/certificates/%s)r*r>rer)r*r`�serialryrrr�unbindBySerial(szUEPConnection.unbindBySerialcCs$d|j|�|j|�f}|jj|�S)Nz"/consumers/%s/entitlements/pool/%s)r*rer)r*r>Zpool_idryrrr�unbindByPoolId,szUEPConnection.unbindByPoolIdcCsd|j|�}|jj|�S)Nz/consumers/%s/entitlements)r*rer)r*r`ryrrr�	unbindAll0szUEPConnection.unbindAllcCs8d|j|�}|r,d||j|j�dd�f}|jj|�S)Nz/consumers/%s/checkinz%s?checkin_date=%sT)rQ)r*rRrer)r*r`Zcheckin_dateryrrr�checkin4s
zUEPConnection.checkinFrc
Cs�|r$d|j|�}
|r:d|
|f}
n|r2d|}
ntd��|rFd|
}
|dkrZd|
|f}
|rxd	|
|j|j�d
d�f}
|r�|r�d|
|j|j�d
d�f}
|r�d
|
|j|d
d�f}
|dkr�d|
|j|�f}
|	dkr�d|
|j|	�f}
|jj|
�}|S)z�
        List pools for a given consumer or owner.

        Ideally, try to always pass the owner key argument. The old method is deprecated
        and may eventually be removed.
        z/owners/%s/pools?z
%sconsumer=%sz/pools?consumer=%sz2Must specify an owner or a consumer to list pools.z%s&listall=true�add�onlyz%s&%s_future=truez%s&after=%sT)rQz%s&activeon=%sz
%s&matches=%srz
%s&page=%sz%s&per_page=%s)rrrs)r*rrRrer�)r*ZconsumerZlistAllZ	active_onr'Z
filter_stringZfutureZ
after_dateZpageZitems_per_pagery�resultsrrr�getPoolsList=s.	

zUEPConnection.getPoolsListcCs0d|j|�}|r$d||j|�f}|jj|�S)Nz	/pools/%sz%s?consumer=%s)r*rer�)r*rer`ryrrr�getPooleszUEPConnection.getPoolcCsd|j|�}|jj|�S)Nz/products/%s)r*rer�)r*Zproduct_uuidryrrr�
getProductkszUEPConnection.getProductcCsd|j|�}|jj|�}|S)Nz/consumers/%s/release)r*rer�)r*r`ryrtrrr�
getReleaseoszUEPConnection.getReleasecCsd|j|�}|jj|�S)a3
        Gets the available content releases for a consumer.

        NOTE: Used for getting the available release versions
              from katello. In hosted candlepin scenario, the
              release versions will come from the CDN directly
              (API not implemented in candlepin).
        z /consumers/%s/available_releases)r*rer�)r*r`ryrrr�getAvailableReleasests	z"UEPConnection.getAvailableReleasescCs0d|j|�}|sd}nd}|jj||�}|S)Nz/consumers/%s/entitlementsz3?exclude=certificates.key&exclude=certificates.certr\)r*rer�)r*r`Z
request_certsry�filtersrtrrr�getEntitlementList�sz UEPConnection.getEntitlementListcCsd|j|�}|jj|�}|S)zA
        List the service levels available for an owner.
        z/owners/%s/servicelevels)r*rer�)r*rVryrtrrr�getServiceLevelList�sz!UEPConnection.getServiceLevelListcCsd|j|�}|jj|�}|S)z�
        List the environments for a particular owner.

        Some servers may not support this and will error out. The caller
        can always check with supports_resource("environments").
        z/owners/%s/environments)r*rer�)r*rVryrtrrr�getEnvironmentList�sz UEPConnection.getEnvironmentListcCsT|r|rtd��td|i�}d|j|�|f}|jj|�}t|�dkrLdS|dS)a
        Fetch an environment for an owner.

        If querying by name, owner is required as environment names are only
        unique within the context of an owner.

        TODO: Add support for querying by ID, this will likely hit an entirely
        different URL.
        z3Must specify owner key to query environment by namerz/owners/%s/environments?%srN)rrr*rer�rd)r*rVrr4r3rtrrr�getEnvironment�s

zUEPConnection.getEnvironmentcCsd|j|�}|jj|�S)Nz/entitlements/%s)r*rer�)r*ZentIdryrrr�getEntitlement�szUEPConnection.getEntitlementcCsd|j|�}|jj|�S)Nz
/consumers/%s)r*reru)r*r`ryrrr�regenIdCertificate�sz UEPConnection.regenIdCertificateTcCs�d|j|�}|r|d7}d}y|jj|�d}Wn^ttjtfk
r�}z:t|tj�sft|j	�dkr|t
jd�t
j|�n|�WYdd}~XnX|S)zE
        Regenerates all entitlements for the given consumer
        z/consumers/%s/certificatesz?lazy_regen=trueFTr�zJUnable to refresh entitlement certificates: Service currently unsupported.N)r*rerr�r	�
BadStatusLinervr�r>rwr%rc)r*�consumer_id�
lazy_regenryr�r'rrr�regenEntitlementCertificates�s
z*UEPConnection.regenEntitlementCertificatescCs�d|j|�|j|�f}|r$|d7}d}y|jj|�d}Wn^ttjtfk
r�}z:t|tj�spt|j	�dkr�t
jd�t
j|�n|�WYdd}~XnX|S)zN
        Regenerates the specified entitlement for the given consumer
        z)/consumers/%s/certificates?entitlement=%sz&lazy_regen=trueFTr�zJUnable to refresh entitlement certificates: Service currently unsupported.N)r*rerr�r	r�rvr�r>rwr%rc)r*r�Zentitlement_idr�ryr�r'rrr�regenEntitlementCertificate�s
z)UEPConnection.regenEntitlementCertificatecCsd}|jj|�S)Nz/status)rer�)r*ryrrrr
�szUEPConnection.getStatuscCsd|j|�}|jj|�S)zC
        Get all the overrides for the specified consumer.
        z/consumers/%s/content_overrides)r*rer�)r*r`ryrrr�getContentOverrides�sz!UEPConnection.getContentOverridescCsd|j|�}|jj||�S)z6
        Set an override on a content object.
        z/consumers/%s/content_overrides)r*rer)r*r`Z	overridesryrrr�setContentOverrides�sz!UEPConnection.setContentOverridescCs$d|j|�}|sg}|jj||�S)z9
        Delete an override on a content object.
        z/consumers/%s/content_overrides)r*rer)r*r`rzryrrr�deleteContentOverridessz$UEPConnection.deleteContentOverridescCsbd|}|rV|d|7}|rFtj�ddk	rFtj�dj�jdd�}|rV|d|7}|jj|�S)zj
        Activate a subscription by machine, information is located in the
        consumer facts
        z/subscriptions?consumer_uuid=%sz	&email=%srNr�r�z&email_locale=%s)r�r�r�r#reru)r*r`ZemailZlangryrrr�activateMachine	szUEPConnection.activateMachinecCsd|j|�}|jj|�}|S)z@
        List the subscriptions for a particular owner.
        z/owners/%s/subscriptions)r*rer�)r*rVryrtrrr�getSubscriptionListsz!UEPConnection.getSubscriptionListcCsVd|j|�}|dk	r*|dt|�j�7}|dk	rF|dt|�j�7}|jj|�}|S)z>
        Update subscriptions for a particular owner.
        z/owners/%s/subscriptions?Nz&auto_create_owner=%sz&lazy_regen=%s)r*�boolr�rer)r*rVZauto_create_ownerr�ryrtrrr�updateSubscriptionList sz$UEPConnection.updateSubscriptionListcCs(tddi�}d||f}|jj|�}|S)z8
        Returns the status of a candlepin job.
        Zresult_dataTz/jobs/%s?%s)rrer�)r*�job_idr9ryrtrrr�getJob.szUEPConnection.getJobcCs|d}|jj|�}|S)zU
        Given a dict representing a candlepin JobStatus, check it's status.
        Z
statusPath)rer�)r*Z
job_statusryrtrrr�updateJobStatus7szUEPConnection.updateJobStatuscCsd|}|jj|�}|S)zO
        Given a job id representing a candlepin JobStatus, cancel it.
        z/jobs/%s)rer)r*r�ryrtrrr�	cancelJob@szUEPConnection.cancelJobcCs"|rtt|��}ntt|��}|S)N)rr>r
)r*Z	url_paramrQZsane_stringrrrr*HszUEPConnection.sanitize)NN)N)N)NNNNNNNNNNNN)NN)N)N)N)N)N)N)N)N)N)	NFNNNNNrr)N)F)NN)T)T)N)NN)NN)F)Kr-r.r/r2r9r
rrrrrrrr6r;r<r?r=rHrIrJrKrBrLrMrNrOrPrTrUrWrXrYrZr[r\r^r_rarbrcrdrfrjrkrlrnrorprqrurvrwrxryr{r|r}r~rr�r�r�r
r�r�r�r�r�r�r�r�r�r*r~rr)rsrrs�


3
"

7	










	

	


	
'






	

		r)N)r)RZ
__future__rrrr�r0rr"Zdateutil.parserrr�Zloggingrarlr�r�r�r�ZtypingrZpathlibrZemail.utilsrZ
rhsm.httpsr	r
Zsix.moves.urllib.requestrZsix.moves.urllib.parserr
rZrhsm.configrrr�rZsubscription_manager.versionr��versionZrpm_versionr�r�r^r(rrr(ZHandlerr)�hZ	getLoggerZ
addHandlerr-r%rr1r3r4r@rArD�objectrGrjrkrvr�r�r�r�r�r�r�r�r�r�r�r�r]rrrrr�<module>s~





l

Youez - 2016 - github.com/yon3zu
LinuXploit