Ë
    GKÕi‡�  ã                   óº  — 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c mZ d dlmZmZmZmZmZmZmZmZ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"m#Z# d d
l$m%Z% d dl&m'Z' dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2dZ3dddddœZ4 ejj                  «       Z6 ejn                   ejp                  e9«      «      Z: edddg«      Z; G d„ dejx                  «      Z= G d„ d e%j|                  «      Z?d!e@fd"„ZA	 	 d?d#ed$eeBef   d%eeBef   d&eCd'eCd(eCd)dfd*„ZD	 	 	 d@d#ed+eeBef   d,eeBef   d&eCd'eCd(eCd)e
eeCf   fd-„ZEd.ejŒ                  d)ejŽ                  fd/„ZHdAd#efd0„ZId#ed)ee   fd1„ZJd#ed2eBd)eeBef   fd3„ZKd4eeBeBf   d5eeBeBf   d)eLfd6„ZM	 dBd7eeBef   d8eBd9eBde	eB   d)eeLeeBef   f   f
d:„ZN	 	 dCd+eeBef   d;e	eB   de	eB   d)dfd<„ZOd#ed=eeBef   d)ee;   fd>„ZPy)Dé    N)Ú
namedtuple)ÚAnyÚDictÚListÚOptionalÚTuple)	Ú
data_typesÚevent_loggerÚ
exceptionsÚhttpÚmessagesÚsecret_managerÚsystemÚutilÚversion)Ú_enabled_services)Ú_is_attached)ÚUAConfig)ÚATTACH_FAIL_DATE_FORMAT)Úattachment_data_fileÚmachine_id_file)Úserviceclient)Úget_user_or_root_log_file_pathz/v1/context/machines/tokenz3/v1/contracts/{contract}/context/machines/{machine}z/v1/resourcesz3/v1/resources/{resource}/context/machines/{machine}z/v1/clouds/{cloud_type}/tokenz3/v1/contracts/{contract}/machine-activity/{machine}z/v1/contractz/v1/magic-attachz?/v1/contracts/{contract}/context/machines/{machine}/guest-tokené   é   é   é   )Úseries_overridesÚseriesÚcloudÚvariantÚEnableByDefaultServiceÚnamer!   c                   ó
  — e Zd Z ej                  dej
                  d¬«       ej                  dej
                  d¬«       ej                  dej
                  d¬«       ej                  dej
                  d¬«       ej                  dej
                  d¬«       ej                  dej
                  d¬«       ej                  d	ej
                  d¬«       ej                  d
ej
                  d¬«       ej                  dej
                  d¬«       ej                  dej
                  d¬«       ej                  dej
                  d¬«       ej                  dej
                  d¬«       ej                  dej
                  d¬«       ej                  dej
                  d¬«      gZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddee   dee   dee   dee   dee   dee   d	ee   d
ee   dee   dee   dee   dee   dee   dee   fd„Z	y)ÚCPUTypeDataÚcpuinfo_cpuF)ÚrequiredÚcpuinfo_cpu_architectureÚcpuinfo_cpu_familyÚcpuinfo_cpu_implementerÚcpuinfo_cpu_partÚcpuinfo_cpu_revisionÚcpuinfo_cpu_variantÚcpuinfo_modelÚcpuinfo_model_nameÚcpuinfo_steppingÚcpuinfo_vendor_idÚ"sys_firmware_devicetree_base_modelÚsysinfo_modelÚsysinfo_typeNc                 óÈ   — || _         || _        || _        || _        || _        || _        || _        || _        |	| _        |
| _	        || _
        || _        || _        || _        y ©N©r&   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   )Úselfr&   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   s                  ú3/usr/lib/python3/dist-packages/uaclient/contract.pyÚ__init__zCPUTypeData.__init__z   sy   € ð" 'ˆÔØ(@ˆÔ%Ø"4ˆÔØ'>ˆÔ$Ø 0ˆÔØ$8ˆÔ!Ø#6ˆÔ Ø*ˆÔØ"4ˆÔØ 0ˆÔØ!2ˆÔà.ð 	Ô/ð +ˆÔØ(ˆÕó    )NNNNNNNNNNNNNN)
Ú__name__Ú
__module__Ú__qualname__r	   ÚFieldÚStringDataValueÚfieldsr   Ústrr:   © r;   r9   r%   r%   F   s´  „ àˆ
×ÑØ˜:×5Ñ5Àô	
ð 	ˆ
×ÑØ&Ø×&Ñ&Øô	
ð
 	ˆ
×ÑØ  *×"<Ñ"<Àuô	
ð 	ˆ
×ÑØ%Ø×&Ñ&Øô	
ð
 	ˆ
×ÑØ 
× :Ñ :ÀUô	
ð 	ˆ
×ÑØ" J×$>Ñ$>Èô	
ð 	ˆ
×ÑØ! :×#=Ñ#=Èô	
ð 	ˆ
×ÑØ˜Z×7Ñ7À%ô	
ð 	ˆ
×ÑØ  *×"<Ñ"<Àuô	
ð 	ˆ
×ÑØ 
× :Ñ :ÀUô	
ð 	ˆ
×ÑØ ×!;Ñ!;Àeô	
ð 	ˆ
×ÑØ0Ø×&Ñ&Øô	
ð
 	ˆ
×ÑØ˜Z×7Ñ7À%ô	
ð 	ˆ
×ÑØ˜J×6Ñ6Àô	
ð]1€Fðj &*Ø26Ø,0Ø15Ø*.Ø.2Ø-1Ø'+Ø,0Ø*.Ø+/Ø<@Ø'+Ø&*ñ )à˜c‘]ð )ð #+¨3¡-ð )ð % S™Mð	 )ð
 "*¨#¡ð )ð # 3™-ð )ð ' s™mð )ð & c™]ð )ð   ‘}ð )ð % S™Mð )ð # 3™-ð )ð $ C™=ð )ð -5°S©Mð )ð   ‘}ð )ð ˜s‘mô )r;   r%   c                   óð  ‡ — e Zd ZdZ	 ddee   ddfˆ fd„Z ej                  e	j                  g d¢¬«      	 dd„«       Zdeeef   fd	„Zd
edeeef   fd„Z ej                  e	j                  g d¢¬«      dedeeef   fd„«       Z	 ddededee   deeef   fd„Zd„ Zdedeeef   fd„Zdeeef   fd„Zdefd„Z	 ddededee   deeef   fd„Z	 ddededee   defd„Zdedededefd„Zd„ Zˆ xZS )ÚUAContractClientÚcontract_urlNÚcfgÚreturnc                 óX   •— t         ‰| �  |¬«       t        j                  «       | _        y )N©rG   )Úsuperr:   ÚmtfÚget_machine_token_fileÚmachine_token_file)r8   rG   Ú	__class__s     €r9   r:   zUAContractClient.__init__    s&   ø€ ô 	‰Ñ˜SÐÔ!Ü"%×"<Ñ"<Ó">ˆÕr;   )r   r   r   )Úretry_sleepsc                 ó<  — |st        j                  | j                  «      }| j                  «       }|j	                  ddj                  |«      i«       | j                  «       }|j                  «       |d<   ||dœ}t        |«      }| j                  t        ||¬«      }|j                  dk(  rt        j                  «       ‚|j                  dk(  rt        |«       |j                  dk7  r0t        j                  t        |j                  |j                   ¬	«      ‚|j"                  }	t$        j&                  j)                  |	j+                  d
d«      «       |	j+                  dg «      D ]1  }
t$        j&                  j)                  |
j+                  dd«      «       Œ3 |	S )a}  Requests machine attach to the provided machine_id.

        @param contract_token: Token string providing authentication to
            ContractBearer service endpoint.
        @param machine_id: Optional unique system machine id. When absent,
            contents of /etc/machine-id will be used.

        @return: Dict of the JSON response containing the machine-token.
        ÚAuthorizationú	Bearer {}ÚlastAttachment©Ú	machineIdÚactivityInfo)ÚdataÚheadersé‘  i“  éÈ   ©ÚurlÚcodeÚbodyÚmachineTokenÚ ÚresourceTokensÚtoken)r   Úget_machine_idrG   rY   ÚupdateÚformatÚ_get_activity_infoÚ	isoformatÚ_support_old_machine_infoÚrequest_urlÚAPI_V1_ADD_CONTRACT_MACHINEr^   r   ÚAttachInvalidTokenErrorÚ_raise_attach_forbidden_messageÚContractAPIErrorr_   Ú	json_dictr   ÚsecretsÚ
add_secretÚget)r8   Úcontract_tokenÚattachment_dtÚ
machine_idrY   Úactivity_inforX   Úbackcompat_dataÚresponseÚresponse_jsonrc   s              r9   Úadd_contract_machinez%UAContractClient.add_contract_machine§   sl  € ñ Ü×.Ñ.¨t¯x©xÓ8ˆJà—,‘,“.ˆØ�‰˜¨×);Ñ);¸NÓ)KÐLÔMØ×/Ñ/Ó1ˆØ*7×*AÑ*AÓ*CˆÐ&Ñ'Ø'¸ÑGˆÜ3°DÓ9ˆØ×#Ñ#Ü'¨oÀwð $ó 
ˆð �=‰=˜CÒÜ×4Ñ4Ó6Ð6Ø�]‰]˜cÒ!Ü+¨HÔ5Ø�=‰=˜CÒÜ×-Ñ-Ü/Ø—]‘]Ø—]‘]ôð ð
 !×*Ñ*ˆÜ×Ñ×)Ñ)Ø×Ñ˜n¨bÓ1ô	
ð #×&Ñ&Ð'7¸Ó<ò 	FˆEÜ×"Ñ"×-Ñ-¨e¯i©i¸ÀÓ.DÕEð	FàÐr;   c                 ó  — | j                  «       }| j                  t        |d   |d   |d   |d   dœ¬«      }|j                  dk7  r0t	        j
                  t        |j                  |j                  ¬«      ‚|j                  S )	z=Requests list of entitlements available to this machine type.Úarchitecturer   ÚkernelÚvirt©r|   r   r}   r~   )Úquery_paramsr[   r\   )rg   rj   ÚAPI_V1_AVAILABLE_RESOURCESr^   r   rn   r_   ro   )r8   rv   rx   s      r9   Úavailable_resourcesz$UAContractClient.available_resourcesÒ   s�   € à×/Ñ/Ó1ˆØ×#Ñ#Ü&à -¨nÑ =Ø'¨Ñ1Ø'¨Ñ1Ø% fÑ-ñ	ð $ó 
ˆð �=‰=˜CÒÜ×-Ñ-Ü.Ø—]‘]Ø—]‘]ôð ð
 ×!Ñ!Ð!r;   rs   c                 ó*  — | j                  «       }|j                  ddj                  |«      i«       | j                  t        |¬«      }|j
                  dk7  r0t        j                  t        |j
                  |j                  ¬«      ‚|j                  S )NrR   rS   ©rY   r[   r\   )
rY   re   rf   rj   ÚAPI_V1_GET_CONTRACT_USING_TOKENr^   r   rn   r_   ro   )r8   rs   rY   rx   s       r9   Úget_contract_using_tokenz)UAContractClient.get_contract_using_tokenæ   sƒ   € Ø—,‘,“.ˆØ�‰˜¨×);Ñ);¸NÓ)KÐLÔMØ×#Ñ#Ü+°Wð $ó 
ˆð �=‰=˜CÒÜ×-Ñ-Ü3Ø—]‘]Ø—]‘]ôð ð
 ×!Ñ!Ð!r;   Ú
cloud_typerX   c                óÚ  — | j                  t        j                  |¬«      |¬«      }|j                  dk7  ry|j                  j                  dd«      }|r+t        j                  |«       t        j                  |¬«      ‚t        j                  t        |j                  |j                  ¬«      ‚|j                  }t        j                  j                  |j                  dd«      «       |S )	zÓRequests contract token for auto-attach images for Pro clouds.

        @param instance: AutoAttachCloudInstance for the cloud.

        @return: Dict of the JSON response containing the contract-token.
        )r‡   )rX   r[   Úmessagera   )Ú	error_msgr\   ÚcontractToken)rj   Ú,API_V1_GET_CONTRACT_TOKEN_FOR_CLOUD_INSTANCErf   r^   ro   rr   ÚLOGÚdebugr   ÚInvalidProImagern   r_   r   rp   rq   )r8   r‡   rX   rx   Úmsgry   s         r9   Ú%get_contract_token_for_cloud_instancez6UAContractClient.get_contract_token_for_cloud_instanceô   s×   € ð ×#Ñ#Ü8×?Ñ?Ø%ð @ó ð ð	 $ó 
ˆð �=‰=˜CÒØ×$Ñ$×(Ñ(¨°BÓ7ˆCÙÜ—	‘	˜#”Ü ×0Ñ0¸3Ô?Ð?Ü×-Ñ-Ü@Ø—]‘]Ø—]‘]ôð ð !×*Ñ*ˆÜ×Ñ×)Ñ)Ø×Ñ˜o¨rÓ2ô	
ð Ðr;   Úmachine_tokenÚresourceru   c                 ó�  — |st        j                  | j                  «      }| j                  «       }|j	                  ddj                  |«      i«       t        j                  ||¬«      }| j                  ||¬«      }|j                  dk7  r0t        j                  t        |j                  |j                  ¬«      ‚|j                  j                  d«      r|j                  d   |j                  d<   |j                  }|j                  dg «      D ]1  }t        j                  j!                  |j                  d	d
«      «       Œ3 |S )a®  Requests machine access context for a given resource

        @param machine_token: The authentication token needed to talk to
            this contract service endpoint.
        @param resource: Entitlement name.
        @param machine_id: Optional unique system machine id. When absent,
            contents of /etc/machine-id will be used.

        @return: Dict of the JSON response containing entitlement accessInfo.
        rR   rS   )r“   Úmachiner„   r[   r\   Úexpiresrb   rc   ra   )r   rd   rG   rY   re   rf   Ú"API_V1_GET_RESOURCE_MACHINE_ACCESSrj   r^   r   rn   r_   rr   ro   r   rp   rq   )	r8   r’   r“   ru   rY   r]   rx   ry   rc   s	            r9   Úget_resource_machine_accessz,UAContractClient.get_resource_machine_access  s#  € ñ  Ü×.Ñ.¨t¯x©xÓ8ˆJØ—,‘,“.ˆØ�‰˜¨×);Ñ);¸MÓ)JÐKÔLÜ0×7Ñ7Ø zð 8ó 
ˆð ×#Ñ# C°Ð#Ó9ˆØ�=‰=˜CÒÜ×-Ñ-Ü6Ø—]‘]Ø—]‘]ôð ð
 ×Ñ×Ñ 	Ô*Ø,4×,<Ñ,<¸YÑ,GˆH×Ñ˜yÑ)à ×*Ñ*ˆØ"×&Ñ&Ð'7¸Ó<ò 	FˆEÜ×"Ñ"×-Ñ-¨e¯i©i¸ÀÓ.DÕEð	FàÐr;   c                 ó¢  — | j                   j                  }| j                   j                  j                  d«      }t	        j
                  | j                  «      }| j                  «       }t        j                  ||¬«      }| j                  «       }|j                  ddj                  |«      i«       | j                  |||¬«      }|j                  dk7  r,t        j                  ||j                  |j                   ¬«      ‚|j"                  rA| j                   j                  }|j"                  |d<   | j                   j%                  |«       y	y	)
z§Report current activity token and enabled services.

        This will report to the contracts backend all the current
        enabled services in the system.
        r`   ©Úcontractr•   rR   rS   )rY   rX   r[   r\   rW   N)rN   Úcontract_idr’   rr   r   rd   rG   rg   ÚAPI_V1_UPDATE_ACTIVITY_TOKENrf   rY   re   rj   r^   r   rn   r_   ro   Úwrite)r8   rœ   r’   ru   Úrequest_datar]   rY   rx   s           r9   Úupdate_activity_tokenz&UAContractClient.update_activity_token;  s'  € ð ×-Ñ-×9Ñ9ˆØ×/Ñ/×=Ñ=×AÑAØó
ˆô ×*Ñ*¨4¯8©8Ó4ˆ
à×.Ñ.Ó0ˆÜ*×1Ñ1Ø ¨*ð 2ó 
ˆð —,‘,“.ˆØ�‰˜¨×);Ñ);¸MÓ)JÐKÔLà×#Ñ# C°¸|Ð#ÓLˆØ�=‰=˜CÒÜ×-Ñ-Ø˜hŸm™m°(·-±-ôð ð ×ÒØ ×3Ñ3×AÑAˆMð -5×,>Ñ,>ˆM˜.Ñ)Ø×#Ñ#×)Ñ)¨-Õ8ð r;   Úmagic_tokenc                 ó.  — | j                  «       }|j                  ddj                  |«      i«       | j                  t        |¬«      }|j
                  dk(  rt        j                  «       ‚|j
                  dk(  rt        j                  «       ‚|j
                  dk7  r0t        j                  t        |j
                  |j                  ¬«      ‚|j                  }g d¢}|D ]1  }t        j                  j                  |j                  |d	«      «       Œ3 |S )
z¸Request magic attach token info.

        When the magic token is registered, it will contain new fields
        that will allow us to know that the attach process can proceed
        rR   rS   r„   rZ   é÷  r[   r\   ©rc   ÚuserCoder‹   ra   )rY   re   rf   rj   Ú"API_V1_GET_MAGIC_ATTACH_TOKEN_INFOr^   r   ÚMagicAttachTokenErrorÚMagicAttachUnavailablern   r_   ro   r   rp   rq   rr   )r8   r¡   rY   rx   ry   Úsecret_fieldsÚfields          r9   Úget_magic_attach_token_infoz,UAContractClient.get_magic_attach_token_infoc  s÷   € ð —,‘,“.ˆØ�‰˜¨×);Ñ);¸KÓ)HÐIÔJØ×#Ñ#Ü.¸ð $ó 
ˆð �=‰=˜CÒÜ×2Ñ2Ó4Ð4Ø�=‰=˜CÒÜ×3Ñ3Ó5Ð5Ø�=‰=˜CÒÜ×-Ñ-Ü6Ø—]‘]Ø—]‘]ôð ð
 !×*Ñ*ˆÚ>ˆØ"ò 	LˆEÜ×"Ñ"×-Ñ-¨m×.?Ñ.?ÀÀrÓ.JÕKð	LàÐr;   c                 ó¦  — | j                  «       }| j                  t        |d¬«      }|j                  dk(  rt	        j
                  «       ‚|j                  dk7  r0t	        j                  t        |j                  |j                  ¬«      ‚|j                  }g d¢}|D ]1  }t        j                  j                  |j                  |d«      «       Œ3 |S )z)Create a magic attach token for the user.ÚPOST©rY   Úmethodr£   r[   r\   r¤   ra   )rY   rj   ÚAPI_V1_NEW_MAGIC_ATTACHr^   r   r¨   rn   r_   ro   r   rp   rq   rr   )r8   rY   rx   ry   r©   rª   s         r9   Únew_magic_attach_tokenz'UAContractClient.new_magic_attach_token  sÂ   € à—,‘,“.ˆØ×#Ñ#Ü#ØØð $ó 
ˆð �=‰=˜CÒÜ×3Ñ3Ó5Ð5Ø�=‰=˜CÒÜ×-Ñ-Ü+Ø—]‘]Ø—]‘]ôð ð
 !×*Ñ*ˆÚ>ˆØ"ò 	LˆEÜ×"Ñ"×-Ñ-¨m×.?Ñ.?ÀÀrÓ.JÕKð	LàÐr;   c                 óè  — | j                  «       }|j                  ddj                  |«      i«       | j                  t        |d¬«      }|j
                  dk(  rt        j                  «       ‚|j
                  dk(  rt        j                  «       ‚|j
                  dk(  rt        j                  «       ‚|j
                  dk7  r0t        j                  t        |j
                  |j                  ¬	«      ‚y
)z)Revoke a magic attach token for the user.rR   rS   ÚDELETEr®   é�  rZ   r£   r[   r\   N)rY   re   rf   rj   ÚAPI_V1_REVOKE_MAGIC_ATTACHr^   r   Ú MagicAttachTokenAlreadyActivatedr§   r¨   rn   r_   )r8   r¡   rY   rx   s       r9   Úrevoke_magic_attach_tokenz*UAContractClient.revoke_magic_attach_token–  sÏ   € à—,‘,“.ˆØ�‰˜¨×);Ñ);¸KÓ)HÐIÔJØ×#Ñ#Ü&ØØð $ó 
ˆð �=‰=˜CÒÜ×=Ñ=Ó?Ð?Ø�=‰=˜CÒÜ×2Ñ2Ó4Ð4Ø�=‰=˜CÒÜ×3Ñ3Ó5Ð5Ø�=‰=˜CÒÜ×-Ñ-Ü.Ø—]‘]Ø—]‘]ôð ð  r;   rœ   c           
      ó>  — |st        j                  | j                  «      }| j                  «       }|j	                  ddj                  |«      i«       t        j                  ||¬«      }| j                  «       }| j                  |d||d   |d   |d   |d   d	œ¬
«      }|j                  dk7  r,t        j                  ||j                  |j                  ¬«      ‚|j                  j                  d«      r|j                  d   |j                  d<   |j                  S )a|  Get the updated machine token from the contract server.

        @param machine_token: The machine token needed to talk to
            this contract service endpoint.
        @param contract_id: Unique contract id provided by contract service
        @param machine_id: Optional unique system machine id. When absent,
            contents of /etc/machine-id will be used.
        rR   rS   rš   ÚGETr|   r   r}   r~   r   )r¯   rY   r€   r[   r\   r–   )r   rd   rG   rY   re   rf   ÚAPI_V1_GET_CONTRACT_MACHINErg   rj   r^   r   rn   r_   rr   ro   )r8   r’   rœ   ru   rY   r]   rv   rx   s           r9   Úget_contract_machinez%UAContractClient.get_contract_machine­  s  € ñ Ü×.Ñ.¨t¯x©xÓ8ˆJà—,‘,“.ˆØ�‰˜¨×);Ñ);¸MÓ)JÐKÔLÜ)×0Ñ0Ø Øð 1ó 
ˆð ×/Ñ/Ó1ˆØ×#Ñ#ØØØà -¨nÑ =Ø'¨Ñ1Ø'¨Ñ1Ø% fÑ-ñ	ð	 $ó 

ˆð �=‰=˜CÒÜ×-Ñ-Ø˜hŸm™m°(·-±-ôð ð ×Ñ×Ñ 	Ô*Ø,4×,<Ñ,<¸YÑ,GˆH×Ñ˜yÑ)Ø×!Ñ!Ð!r;   c                 ó8  — |st        j                  | j                  «      }| j                  «       }|j	                  ddj                  |«      i«       || j                  «       dœ}t        |«      }t        j                  ||¬«      }| j                  ||d|¬«      }|j                  dk7  r,t        j                  ||j                  |j                  ¬«      ‚|j                  j                  d	«      r|j                  d	   |j                  d	<   |j                  S )
aÈ  Request machine token refresh from contract server.

        @param machine_token: The machine token needed to talk to
            this contract service endpoint.
        @param contract_id: Unique contract id provided by contract service.
        @param machine_id: Optional unique system machine id. When absent,
            contents of /etc/machine-id will be used.

        @return: Dict of the JSON response containing refreshed machine-token
        rR   rS   rU   rš   r­   )rY   r¯   rX   r[   r\   r–   )r   rd   rG   rY   re   rf   rg   ri   ÚAPI_V1_UPDATE_CONTRACT_MACHINErj   r^   r   rn   r_   rr   ro   )	r8   r’   rœ   ru   rY   rX   rw   r]   rx   s	            r9   Úupdate_contract_machinez(UAContractClient.update_contract_machineØ  s  € ñ  Ü×.Ñ.¨t¯x©xÓ8ˆJà—,‘,“.ˆØ�‰˜¨×);Ñ);¸MÓ)JÐKÔLà#Ø ×3Ñ3Ó5ñ
ˆô 4°DÓ9ˆÜ,×3Ñ3Ø ¨*ð 4ó 
ˆð ×#Ñ#Ø˜¨°oð $ó 
ˆð �=‰=˜CÒÜ×-Ñ-Ø˜hŸm™m°(·-±-ôð ð ×Ñ×Ñ 	Ô*Ø,4×,<Ñ,<¸YÑ,GˆH×Ñ˜yÑ)Ø×!Ñ!Ð!r;   c                 ó”  — | j                  «       }|j                  ddj                  |«      i«       t        j                  ||¬«      }| j	                  ||d¬«      }|j
                  dk(  rt        j                  d¬«      ‚|j
                  d	k7  r,t        j                  ||j
                  |j                  ¬
«      ‚|j                  S )a±  Request guest token associated with this machine's contract
        @param machine_token: The machine token needed to talk to
            this contract service endpoint.
        @param contract_id: Unique contract id provided by contract service
        @param machine_id: Unique machine id that was registered with the pro
            backend on attach.
        @return: Dict of the JSON response containing the guest token
        rR   rS   rš   r¹   r®   r´   Úget_guest_token)Úfeature_namer[   r\   )rY   re   rf   ÚAPI_V1_GET_GUEST_TOKENrj   r^   r   Ú FeatureNotSupportedOldTokenErrorrn   r_   ro   )r8   r’   rœ   ru   rY   r]   rx   s          r9   rÀ   z UAContractClient.get_guest_token   sÃ   € ð —,‘,“.ˆØ�‰˜¨×);Ñ);¸MÓ)JÐKÔLÜ$×+Ñ+Ø Øð ,ó 
ˆð ×#Ñ# C°ÀÐ#ÓGˆØ�=‰=˜CÒô ×=Ñ=Ø.ôð ð �]‰]˜cÒ!Ü×-Ñ-ØØ—]‘]Ø—]‘]ôð ð
 ×!Ñ!Ð!r;   c                 ó  — t        j                  «       }t        j                  «       j                  t        j                  «       j
                  t        j                  «       j                  t        j                  «       t        j                  «       t        j                  «       t        j                  «       t        |j                  |j                  |j                  |j                   |j"                  |j$                  |j&                  |j(                  |j*                  |j,                  |j.                  |j0                  |j2                  |j4                  ¬«      j7                  d¬«      dœ}t9        | j:                  «      j<                  rèt?        | j:                  «      j@                  }tC        jD                  «       }| jF                  jH                  xs t        jJ                  | j:                  «      | jF                  jL                  |D �cg c]  }|jN                  ‘Œ c}|D �ci c]%  }|jP                  r|jN                  |jR                  “Œ' c}|r|jT                  jW                  «       nddœ}ni }i |¥|¥S c c}w c c}w )z9Return a dict of activity info data for contract requestsr7   F)Ú	keep_none)Údistributionr}   r   r|   Údesktopr~   ÚclientVersionÚcpu_typeN)Ú
activityIDÚactivityTokenÚ	resourcesÚresourceVariantsrT   ),r   Úget_cpu_infoÚget_release_inforÆ   Úget_kernel_infoÚuname_releaser   Úget_dpkg_archÚ
is_desktopÚget_virt_typer   Úget_versionr%   r&   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   Úto_dictr   rG   Úis_attachedr   Úenabled_servicesr   ÚreadrN   Úactivity_idrd   Úactivity_tokenr#   Úvariant_enabledÚvariant_nameÚattached_atrh   )r8   ÚcpuinfoÚmachine_inforØ   Úattachment_dataÚservicerv   s          r9   rg   z#UAContractClient._get_activity_info#  s  € ô ×%Ñ%Ó'ˆä"×3Ñ3Ó5×BÑBÜ×,Ñ,Ó.×<Ñ<Ü×-Ñ-Ó/×6Ñ6Ü"×0Ñ0Ó2Ü×(Ñ(Ó*Ü×(Ñ(Ó*Ü$×0Ñ0Ó2Ü#Ø#×/Ñ/Ø)0×)IÑ)IØ#*×#=Ñ#=Ø(/×(GÑ(GØ!(×!9Ñ!9Ø%,×%AÑ%AØ$+×$?Ñ$?Ø%×3Ñ3Ø#*×#=Ñ#=Ø!(×!9Ñ!9Ø")×";Ñ";Ø3:×3]Ñ3]Ø%×3Ñ3Ø$×1Ñ1ô÷ ‰g ˆgÓ&ñ/
ˆô4 ˜Ÿ™Ó!×-Ò-Ü0°·±Ó:×KÑKÐÜ2×7Ñ7Ó9ˆOà"×5Ñ5×AÑAò 3Ü×(Ñ(¨¯©Ó2Ø!%×!8Ñ!8×!GÑ!GØ:JÖK¨w˜gŸl›lÒKð $4ö%àØ×.Ò.ð —L‘L '×"6Ñ"6Ñ6ò%ñ 'ð $×/Ñ/×9Ñ9Ô;àñ‰Mð" ˆMð
Øð
àð
ð 	
ùò Lùò%s   ÈI>È)*J
r6   )r<   r=   r>   Úcfg_url_base_attrr   r   r:   r   ÚretryÚsocketÚtimeoutrz   r   rB   r   r‚   r†   r‘   r˜   r    r«   r±   r·   r»   r¾   rÀ   rg   Ú__classcell__)rO   s   @r9   rE   rE   �   sá  ø„ Ø&Ðð #'ñ?à�hÑð?ð 
õ?ð €T‡Z�Z�—‘ªYÔ7à8<ò(ó 8ð(ðT" T¨#¨s¨(¡^ó "ð("°sð "¸tÀCÈÀH¹~ó "ð €T‡Z�Z�—‘ªYÔ7ðØ ðØ(,¨S°#¨X©òó 8ððH %)ñ	$àð$ð ð$ð ˜S‘Mð	$ð
 
ˆc�3ˆh‰ó$òL&9ðP°sð ¸tÀCÈÀH¹~ó ð8¨¨S°#¨X©ó ð.°Só ð6 %)ñ	)"àð)"ð ð)"ð ˜S‘Mð	)"ð
 
ˆc�3ˆh‰ó)"ð^ %)ñ	&"àð&"ð ð&"ð ˜S‘Mð	&"ð
 
ó&"ðP!"àð!"ð ð!"ð ð	!"ð
 
ó!"öF7
r;   rE   Úrequest_bodyc           	      ó  — | j                  di «      }| j                  d«      ||j                  d«      |j                  d«      |j                  d«      |j                  d«      dt        j                  «       j                  dœd	œS )
a?  
    Transforms a request_body that has the new activity_info into a body that
    includes both old and new forms of machineInfo/activityInfo

    This is necessary because there may be old ua-airgapped contract
    servers deployed that we need to support.
    This function is used for attach and refresh calls.
    rW   rV   r|   rÆ   r}   r   ÚLinux)rÆ   r}   r   ÚtypeÚrelease)rV   rW   r|   Úos)rr   r   rÏ   rì   )rè   rv   s     r9   ri   ri   ]  s‡   € ð !×$Ñ$ ^°RÓ8€Mð "×%Ñ% kÓ2Ø%Ø%×)Ñ)¨.Ó9à)×-Ñ-¨nÓ=Ø#×'Ñ'¨Ó1Ø#×'Ñ'¨Ó1ð Ü×.Ñ.Ó0×8Ñ8ñ
ñ	ð r;   rG   Úpast_entitlementsÚnew_entitlementsÚallow_enabler   ÚverboserH   c                 óø  — ddl m} d}g }g }	 || «      D ]J  }
	 ||
   }g }		 t        | |j	                  |
i «      ||||¬«      \  }}|sŒ3|sŒ6t
        j                  |
«       ŒL t
        j                  |	«       t        |«      dkD  ret        j                   t#        |	|«      D �
�cg c]9  \  }
}|
t$        j&                  j)                  t+        |«      t-        «       ¬	«      f‘Œ; c}}
¬
«      ‚|r4t        j.                  |	D �
cg c]  }
|
t$        j0                  f‘Œ c}
¬
«      ‚y# t        $ r Y �Œw xY w# t        j                  $ rJ}t        j                  |«       d}|	j                  |
«       t        j                  d|
|«       Y d}~�Œtd}~wt        $ rY}t        j                  |«       |j                  |«       |	j                  |
«       t        j                  d|
|«       Y d}~�ŒÔd}~ww xY wc c}}
w c c}
w )aã  Iterate over all entitlements in new_entitlement and apply any delta
    found according to past_entitlements.

    :param cfg: UAConfig instance
    :param past_entitlements: dict containing the last valid information
        regarding service entitlements.
    :param new_entitlements: dict containing the current information regarding
        service entitlements.
    :param allow_enable: Boolean set True if allowed to perform the enable
        operation. When False, a message will be logged to inform the user
        about the recommended enabled service.
    :param series_overrides: Boolean set True if series overrides should be
        applied to the new_access dict.
    :param verbose: If True, display output to stdout
    r   )Úentitlements_enable_orderF)rG   Úorig_accessÚ
new_accessrð   r   rñ   Tz+Failed to process contract delta for %s: %rNz5Unexpected error processing contract delta for %s: %r)rŠ   Úlog_path)Úfailed_services)Úuaclient.entitlementsró   ÚKeyErrorÚprocess_entitlement_deltarr   ÚeventÚservice_processedr   ÚUbuntuProErrorr�   Ú	exceptionÚappendÚerrorÚ	ExceptionÚservices_failedÚlenÚAttachFailureUnknownErrorÚzipr   ÚUNEXPECTED_ERRORrf   rB   r   ÚAttachFailureDefaultServicesÚ!E_ATTACH_FAILURE_DEFAULT_SERVICES)rG   rî   rï   rð   r   rñ   ró   Údelta_errorÚunexpected_errorsr÷   r#   Únew_entitlementÚdeltasÚservice_enabledÚerþ   s                   r9   Úprocess_entitlements_deltar  x  s  € õ. @à€KØÐð €OÙ)¨#Ó.ò &.ˆð	Ø.¨tÑ4ˆOð ˆð	.Ü&?ØØ-×1Ñ1°$¸Ó;Ø*Ø)Ø!1Øô'Ñ#ˆF�Oò: ¢6Ü×'Ñ'¨Õ-ðM&.ôN 
×Ñ˜/Ô*Ü
ÐÓ Ò!Ü×2Ñ2ô (+¨?Ð<MÓ'N÷	ñ $�D˜)ð Ü×-Ñ-×4Ñ4Ü"% i£.Ü!?Ó!Að 5ó òó	ô
ð 	
ñ 
Ü×5Ñ5ð ,öàð ”x×AÑAÒBòô
ð 	
ð 
øôe ò 	Úð	ûô ×(Ñ(ò 	Ü�M‰M˜!ÔØˆKØ×"Ñ" 4Ô(Ü�I‰IØ=ØØ÷ò ûô
 ò 	Ü�M‰M˜!ÔØ×$Ñ$ QÔ'Ø×"Ñ" 4Ô(Ü�M‰MØGØØ÷ò ûð		üó"	ùòsA   ™D!¡$D1Â#>G1
Ã?G7Ä!	D.Ä-D.Ä1G.Å?F	Æ	G.ÆAG)Ç)G.rô   rõ   c                 ó*  — ddl m} |rt        |«       t        j                  ||«      }d}|r°|j                  di «      j                  d«      }	|	s!|j                  di «      j                  d«      }	|	st        j                  ||¬«      ‚|j                  di «      j                  di «      j                  d	d
«      }
	  || |	|
¬«      }|j                  ||||¬«      }||fS # t        j                  $ r}t        j                  d|	«       |‚d}~ww xY w)ab  Process a entitlement access dictionary deltas if they exist.

    :param cfg: UAConfig instance
    :param orig_access: Dict with original entitlement access details before
        contract refresh deltas
    :param new_access: Dict with updated entitlement access details after
        contract refresh
    :param allow_enable: Boolean set True if allowed to perform the enable
        operation. When False, a message will be logged to inform the user
        about the recommended enabled service.
    :param series_overrides: Boolean set True if series overrides should be
        applied to the new_access dict.
    :param verbose: If True, display output to stdout

    :raise UbuntuProError: on failure to process deltas.
    :return: A tuple containing a dict of processed deltas and a
             boolean indicating if the service was fully processed
    r   ©Úentitlement_factoryFÚentitlementrë   )ÚorigÚnewÚentitlementsÚobligationsÚuse_selectorra   ©rG   r#   r!   z3Skipping entitlement deltas for "%s". No such classN©rð   rñ   )rø   r  Úapply_contract_overridesr   Úget_dict_deltasrr   r   Ú InvalidContractDeltasServiceTypeÚEntitlementNotFoundErrorr�   rŽ   Úprocess_contract_deltas)rG   rô   rõ   rð   r   rñ   r  r  Úretr#   r!   r  Úexcs                r9   rú   rú   Õ  s!  € õ4 :áÜ  Ô,ä×!Ñ! +¨zÓ:€FØ
€CÙØ�‰˜}¨bÓ1×5Ñ5°fÓ=ˆÙØ—:‘:˜m¨RÓ0×4Ñ4°VÓ<ˆDÙÜ×=Ñ=Ø  jôð ð
 �N‰N˜>¨2Ó.ß‰S� Ó#ß‰S� Ó$ð 	ð

	Ù-ØØØôˆKð ×1Ñ1Ø˜¨lÀGð 2ó 
ˆð �3ˆ;Ðøô ×2Ñ2ò 	Ü�I‰IØEÀtôð ˆIûð		ús   Â>C" Ã"DÃ5DÄDrx   c                 óÊ  — | j                   j                  d«      }|r³|d   }|d   }|dk(  rB|d   j                  t        «      }t	        j
                  |||d   j                  d«      ¬«      ‚|dk(  rB|d   j                  t        «      }t	        j                  |||d   j                  d«      ¬	«      ‚|d
k(  rt	        j                  |¬«      ‚t	        j                  «       ‚)NÚinfoÚ
contractIdÚreasonzno-longer-effectiveÚtimez%m-%d-%Y)rœ   ÚdateÚcontract_expiry_dateznot-effective-yet)rœ   r'  Úcontract_effective_dateznever-effective)rœ   )	ro   rr   Ústrftimer   r   ÚAttachForbiddenExpiredÚAttachForbiddenNotYetÚAttachForbiddenNeverÚAttachExpiredToken)rx   r#  rœ   r%  r'  s        r9   rm   rm     sï   € ð ×Ñ×!Ñ! &Ó)€DÙØ˜<Ñ(ˆØ�h‘ˆØÐ*Ò*Ø˜‘<×(Ñ(Ô)@ÓAˆDÜ×3Ñ3Ø'Øà%)¨&¡\×%:Ñ%:¸:Ó%Fô	ð ð Ð*Ò*Ø˜‘<×(Ñ(Ô)@ÓAˆDÜ×2Ñ2Ø'Øà(,¨V©×(=Ñ(=¸jÓ(Iô	ð ð Ð(Ò(Ü×1Ñ1¸kÔJÐJä
×
'Ñ
'Ó
)Ð)r;   c                 óò  — t        j                  | «      }|j                  «       }|j                  }|d   }|d   d   d   }t	        | ¬«      }|j                  ||¬«      }|j                  |«       t        j                  j                  «        |j                  di «      j                  dt        j                  | «      «      }	t        j                  |	«       t        | ||j                  «       d|¬	«       y
)a  Request contract refresh from ua-contracts service.

    :param verbose: If True, display output to stdout

    :raise UbuntuProError: on failure to update contract or error processing
        contract deltas
    :raise ConnectivityError: On failure during a connection
    r`   ÚmachineTokenInfoÚcontractInfoÚidrJ   )r’   rœ   rV   Fr  N)rL   rM   r  r’   rE   r¾   rž   r   rd   Úcache_clearrr   r   r  )
rG   rñ   rN   Úorig_entitlementsÚ
orig_tokenr’   rœ   Úcontract_clientÚrespru   s
             r9   Úrefreshr8  3  sð   € ô ×3Ñ3°CÓ8ÐØ*×7Ñ7Ó9ÐØ#×1Ñ1€JØ˜~Ñ.€MØÐ/Ñ0°Ñ@ÀÑF€Kä&¨3Ô/€OØ×2Ñ2Ø#°ð 3ó €Dð ×Ñ˜TÔ"Ü
×Ñ×%Ñ%Ô'Ø—‘Ð,¨bÓ1×5Ñ5Ø”V×*Ñ*¨3Ó/ó€Jô ×Ñ˜*Ô%äØØØ×'Ñ'Ó)ØØör;   c                 ó\   — t        | «      }|j                  «       }|j                  dg «      S )zDQuery available resources from the contract server for this machine.rÌ   )rE   r‚   rr   )rG   ÚclientrÌ   s      r9   Úget_available_resourcesr;  W  s+   € ä˜cÓ"€FØ×*Ñ*Ó,€IØ�=‰=˜ bÓ)Ð)r;   rc   c                 ó:   — t        | «      }|j                  |«      S )z/Query contract information for a specific token)rE   r†   )rG   rc   r:  s      r9   Úget_contract_informationr=  ^  s   € ä˜cÓ"€FØ×*Ñ*¨5Ó1Ð1r;   Úoverride_selectorÚselector_valuesc                 ó~   — d}| j                  «       D ]'  \  }}||f|j                  «       vr y|t        |   z  }Œ) |S )Nr   )ÚitemsÚOVERRIDE_SELECTOR_WEIGHTS)r>  r?  Úoverride_weightÚselectorÚvalues        r9   Ú_get_override_weightrF  d  sV   € ð €OØ,×2Ñ2Ó4ò ?‰ˆ�%Ø�eÐ O×$9Ñ$9Ó$;Ñ;ÙØÔ4°XÑ>Ñ>‰ð?ð
 Ðr;   r  Úseries_namer‡   c                 ó   — i }||dœ}|r||d<   | j                  di «      j                  |i «      }|r||t        d   <   t        j                  | j	                  dg «      «      }|D ]%  }t        |j                  d«      |«      }	|	sŒ!|||	<   Œ' |S )N)r   r    r!   r   r   Ú	overridesrD  )ÚpoprB  ÚcopyÚdeepcopyrr   rF  )
r  rG  r‡   r!   rI  r?  r   Úgeneral_overridesÚoverrideÚweights
             r9   Ú_select_overridesrP  p  s¯   € ð €Ià!,°zÑB€OÙØ%,ˆ˜	Ñ"à"—‘ x°Ó4×8Ñ8¸ÀbÓIÐÙàð 	Ô+Ð,>Ñ?Ñ@ô Ÿ™ k§o¡o°kÀ2Ó&FÓGÐØ%ò )ˆÜ%Ø�L‰L˜Ó$ oó
ˆò Ø (ˆI�fÒð)ð Ðr;   r   c                 ó  — ddl m} t        t        | t        «      d| v g«      st        dj                  | «      «      ‚|€t        j                  «       j                  n|} |«       \  }}| j                  di «      }t        ||||«      }t        |j                  «       «      D ][  \  }	}
|
j                  «       D ]C  \  }}| d   j                  |«      }t        |t        «      r|j                  |«       Œ<|| d   |<   ŒE Œ] y)a—  Apply series-specific overrides to an entitlement dict.

    This function mutates orig_access dict by applying any series-overrides to
    the top-level keys under 'entitlement'. The series-overrides are sparse
    and intended to supplement existing top-level dict values. So, sub-keys
    under the top-level directives, obligations and affordance sub-key values
    will be preserved if unspecified in series-overrides.

    To more clearly indicate that orig_access in memory has already had
    the overrides applied, the 'series' key is also removed from the
    orig_access dict.

    :param orig_access: Dict with original entitlement access details
    r   )Úget_cloud_typer  z?Expected entitlement access dict. Missing "entitlement" key: {}N)Úuaclient.clouds.identityrR  ÚallÚ
isinstanceÚdictÚRuntimeErrorrf   r   rÏ   r   rr   rP  ÚsortedrA  re   )rô   r   r!   rR  rG  r‡   Ú_Úorig_entitlementrI  Ú_weightÚoverrides_to_applyÚkeyrE  Úcurrents                 r9   r  r  �  s
  € õ& 8ä”
˜;¬Ó-¨}ÀÐ/KÐLÔMÜðß‘&˜Ó%ó
ð 	
ð -3¨NŒ×ÑÓ!×(Ò(Àð ñ #Ó$�M€J�Ø"—‘ }°bÓ9Ðä!Ø˜+ z°7ó€Iô (.¨i¯o©oÓ.?Ó'@ò 	8Ñ#ˆÐ#Ø,×2Ñ2Ó4ò 	8‰JˆC�Ø! -Ñ0×4Ñ4°SÓ9ˆGÜ˜'¤4Ô(ð —‘˜uÕ%ð 38�˜MÑ*¨3Ò/ñ	8ñ	8r;   r  c                 óÄ  — ddl m} g }|j                  «       D ]«  \  }}|j                  di «      j                  dd«      }	  || ||¬«      }|j                  di «      j                  di «      }|j                  d«      }	|j                  ||	«      sŒz|j                  «       \  }
}|
sŒ�|j                  t        ||¬	«      «       Œ­ |S # t        j
                  $ r Y ŒÅw xY w)
Nr   r  r  r  ra   r  r  ÚresourceToken)r#   r!   )
rø   r  rA  rr   r   r  Ú_should_enable_by_defaultÚ
can_enablerÿ   r"   )rG   r  r  Úenable_by_default_servicesÚent_nameÚ	ent_valuer!   Úentr  r`  rb  rY  s               r9   Úget_enabled_by_default_servicesrg  ¾  sè   € õ :à!#Ðà+×1Ñ1Ó3ò Ñˆ�)Ø—-‘- ¨rÓ2×6Ñ6°~ÀrÓJˆð	Ù%¨#°HÀgÔNˆCð  —m‘m M°2Ó6×:Ñ:¸=È"ÓMˆØ!Ÿ™ oÓ6ˆà×(Ñ(¨°mÕDØŸN™NÓ,‰MˆJ˜ÚØ*×1Ñ1Ü*Ø%Ø 'ôõðð* &Ð%øô! ×2Ñ2ò 	Ùð	ús   ÁC	Ã	CÃC)TT)FTT)Tr6   )NN)QrK  Úloggingrå   Úcollectionsr   Útypingr   r   r   r   r   Úuaclient.files.machine_tokenÚfilesr’   rL   Úuaclientr	   r
   r   r   r   r   r   r   r   Ú-uaclient.api.u.pro.status.enabled_services.v1r   Ú(uaclient.api.u.pro.status.is_attached.v1r   Úuaclient.configr   Úuaclient.defaultsr   Úuaclient.files.state_filesr   r   Úuaclient.httpr   Úuaclient.logr   rk   rº   r½   r�   r—   rŒ   r�   r…   r¦   r°   rµ   rÂ   rB  Úget_event_loggerrû   Ú	getLoggerÚreplace_top_level_logger_namer<   r�   r"   Ú
DataObjectr%   ÚUAServiceClientrE   rV  ri   rB   Úboolr  rú   ÚHTTPResponseÚNamedMessagerm   r8  r;  r=  ÚintrF  rP  r  rg  rC   r;   r9   ú<module>r~     se  ðÛ Û Û Ý "ß 3Õ 3ç *Ð *÷
÷ 
õ 
õ LÝ AÝ $Ý 5ß LÝ 'Ý 7ð ;Ð à9ð ð :ð ð -Ð à9ð #ð 0OÐ ,à9ð ð #1Ð à%7Ð "Ø,Ð Ø/Ð ð Fð ð
 ØØØñ	Ð ð 	&ˆ×%Ñ%Ó'€Ø€g×ÑÐ:˜×:Ñ:¸8ÓDÓE€ñ $Ø˜v yÐ1óÐ ô
T)�*×'Ñ'ô T)ôn}
�}×4Ñ4ô }
ð@¨Dó ð@ "ØñZ
Ø	ðZ
à˜C ˜H‘~ðZ
ð ˜3 ˜8‘nðZ
ð ð	Z
ð
 ðZ
ð ðZ
ð 
óZ
ðB Ø!Øñ>Ø	ð>à�c˜3�h‘ð>ð �S˜#�X‘ð>ð ð	>ð
 ð>ð ð>ð ˆ4�ˆ:Ñó>ðB*Ø×Ñð*à×Ñó*ñ:!�ó !ðH* ð *¨d°4©jó *ð2 (ð 2°3ð 2¸4ÀÀSÀ¹>ó 2ð	Ø˜C ˜H‘~ð	Ø8<¸SÀ#¸X¹ð	àó	ð  "ñ	Ø�c˜3�h‘ðàðð ðð �c‰]ð	ð
 
ˆ#ˆt�C˜�H‰~Ð
Ñóð> !Ø!ñ.8Ø�c˜3�h‘ð.8à�S‰Mð.8ð �c‰]ð.8ð 
ó	.8ðb&Ø	ð&Ø!% c¨3 h¡ð&à	Ð
 Ñ!ô&r;   