Ë
    GKÕi¡#  ã                   ó‚   — d dl Z d dlmZ d dlmZmZmZ d dlmZmZm	Z	m
Z
 d dlmZ d dlmZ da G d„ d«      Zdd	efd
„Zy)é    N)Údatetime)ÚAnyÚDictÚOptional)ÚdefaultsÚ
exceptionsÚsystemÚutil)ÚPublicMachineTokenData)ÚUAFilec                   ó²  — e Zd Zej                  dfdedee   fd„Zdefd„Z	d„ Z
dee   fd	„Zed
„ «       Zed„ «       Zedee   fd„«       Zd„ Zedeeef   fd„«       Zddee   fd„Ze	 ddeeef   dee   fd„«       Zedee   fd„«       Zed„ «       Zedee   fd„«       Zedd„«       Zedd„«       Zedd„«       Zed„ «       Zed„ «       Z ed„ «       Z!y)ÚMachineTokenFileNÚ	directoryÚmachine_token_overlay_pathc                 óÊ   — t         j                  }t        ||dz   t         j                  z   «      | _        t        ||d«      | _        || _        d | _        d | _        d | _	        y )Nú/F)
r   ÚMACHINE_TOKEN_FILEr   ÚPRIVATE_SUBDIRÚprivate_fileÚpublic_filer   Ú_machine_tokenÚ_entitlementsÚ_contract_expiry_datetime)Úselfr   r   Ú	file_names       ú>/usr/lib/python3/dist-packages/uaclient/files/machine_token.pyÚ__init__zMachineTokenFile.__init__   sc   € ô
 ×/Ñ/ˆ	Ü"Ø�y 3‘¬×)@Ñ)@Ñ@ó
ˆÔô " )¨Y¸Ó>ˆÔØ*DˆÔ'Ø"ˆÔØ!ˆÔØ)-ˆÕ&ó    Úprivate_contentc                 óÈ  — t        j                  «       r»t        j                  |t         j                  ¬«      }| j
                  j                  |«       t        j                  |«      j                  d¬«      }t        j                  |t         j                  ¬«      }| j                  j                  |«       d| _        d| _        d| _        yt        j                  «       ‚)z8Update the machine_token file for both pub/private files©ÚclsF)Ú	keep_noneN)r
   Úwe_are_currently_rootÚjsonÚdumpsÚDatetimeAwareJSONEncoderr   Úwriter   Ú	from_dictÚto_dictr   r   r   r   r   ÚNonRootUserError)r   r   Úprivate_content_strÚpublic_contentÚpublic_content_strs        r   r(   zMachineTokenFile.write   s½   € ä×%Ñ%Ô'Ü"&§*¡*Ø¤T×%BÑ%Bô#Ðð ×Ñ×#Ñ#Ð$7Ô8ô 4×=Ñ=Øóç‰g ˆgÓ&ð ô "&§¡Ø¤D×$AÑ$Aô"Ðð ×Ñ×"Ñ"Ð#5Ô6à"&ˆDÔØ!%ˆDÔØ-1ˆDÕ*ä×-Ñ-Ó/Ð/r   c                 óæ   — t        j                  «       rJ| j                  j                  «        | j                  j                  «        d| _        d| _        d| _        yt        j                  «       ‚)z!Delete both pub and private filesN)
r
   r$   r   Údeleter   r   r   r   r   r+   ©r   s    r   r0   zMachineTokenFile.delete4   sY   € ä×%Ñ%Ô'Ø×Ñ×#Ñ#Ô%Ø×Ñ×$Ñ$Ô&à"&ˆDÔØ!%ˆDÔØ-1ˆDÕ*ä×-Ñ-Ó/Ð/r   Úreturnc                 óò   — t        j                  «       r| j                  }n| j                  }|j	                  «       }|sy 	 t        j                  |t         j                  ¬«      }|S # t        $ r Y |S w xY w©Nr!   )	r
   r$   r   r   Úreadr%   ÚloadsÚDatetimeAwareJSONDecoderÚ	Exception)r   Úfile_handlerÚcontents      r   r5   zMachineTokenFile.read@   ss   € Ü×%Ñ%Ô'Ø×,Ñ,‰Là×+Ñ+ˆLØ×#Ñ#Ó%ˆÙØð	Ü—j‘j ¬d×.KÑ.KÔLˆGð ˆøô ò 	ØØˆð	ús   Á%A) Á)	A6Á5A6c                 ó²   — t        j                  «       r.| j                  j                  xr | j                  j                  S | j                  j                  S ©N)r
   r$   r   Ú
is_presentr   r1   s    r   r=   zMachineTokenFile.is_presentN   sC   € ä×%Ñ%Ô'Ø×#Ñ#×.Ñ.ÒO°4×3DÑ3D×3OÑ3OÐOà×#Ñ#×.Ñ.Ð.r   c                 óä   — | j                   sY| j                  «       }|r@| j                  r4| j                  | j                  «      }|rt	        j
                  ||¬«       || _         | j                   S )zAReturn the machine-token if cached in the machine token response.)Ú	base_dictÚoverlay_dict)r   r5   r   Úparse_machine_token_overlayr
   Údepth_first_merge_overlay_dict)r   r:   Úmachine_token_overlays      r   Úmachine_tokenzMachineTokenFile.machine_tokenU   sl   € ð ×"Ò"Ø—i‘i“kˆGÙ˜4×:Ò:Ø(,×(HÑ(HØ×3Ñ3ó)Ð%ñ )Ü×7Ñ7Ø")Ø%:õð #*ˆDÔØ×"Ñ"Ð"r   c                 ó’   — | j                   r;| j                   j                  di «      j                  di «      j                  d«      S y )NÚmachineTokenInfoÚcontractInfoÚname©rD   Úgetr1   s    r   Úcontract_namezMachineTokenFile.contract_nameg   sA   € à×Òà×"Ñ"×&Ñ&Ð'9¸2Ó>ß‘�^ RÓ(ß‘�V“ðð r   c                 óv   — t        j                  |«      }t        j                  |t        j
                  ¬«      S r4   )r	   Ú	load_filer%   r6   r
   r7   )r   r   Úmachine_token_overlay_contents      r   rA   z,MachineTokenFile.parse_machine_token_overlayr   s5   € Ü(.×(8Ñ(8Ø&ó)
Ð%ô �z‰zØ)Ü×-Ñ-ô
ð 	
r   c                 óT   — t        | j                  «      r| j                  d   d   S i S )NrF   ÚaccountInfo©ÚboolrD   r1   s    r   ÚaccountzMachineTokenFile.account{   s,   € ä�×"Ñ"Ô#Ø×%Ñ%Ð&8Ñ9¸-ÑHÐHØˆ	r   Úseriesc                 ó¨   — | j                   r| j                   S | j                  si S | j                  | j                  |«      | _         | j                   S )z9Return configured entitlements keyed by entitlement named)r   rD   Úget_entitlements_from_token)r   rT   s     r   ÚentitlementszMachineTokenFile.entitlements�   sQ   € à×ÒØ×%Ñ%Ð%Ø×!Ò!ØˆIØ!×=Ñ=Ø×Ñ ó
ˆÔð ×!Ñ!Ð!r   rD   c                 ó^  — ddl m} | si S i }| j                  di «      j                  d«      }|si S t        d„ | j                  dg «      D «       «      }t        d„ |j                  dg «      D «       «      }|j	                  «       D ]$  \  }}d	|i}	||v r||   |	d
<    ||	|¬«       |	||<   Œ& |S )z…Return a dictionary of entitlements keyed by entitlement name.

        Return an empty dict if no entitlements are present.
        r   )Úapply_contract_overridesrF   rG   c              3   ó`   K  — | ]&  }|j                  d «      |j                  d«      f–— Œ( y­w)ÚtypeÚtokenN©rJ   ©Ú.0Úes     r   ú	<genexpr>z?MachineTokenFile.get_entitlements_from_token.<locals>.<genexpr>    s-   è ø€ ò 
àð �U‰U�6‹]˜AŸE™E '›NÔ+ñ
ùs   ‚,.ÚresourceTokensc              3   óB   K  — | ]  }|j                  d «      |f–— Œ y­w)r[   Nr]   r^   s     r   ra   z?MachineTokenFile.get_entitlements_from_token.<locals>.<genexpr>¤   s%   è ø€ ò 
àð �U‰U�6‹]˜AÔñ
ùs   ‚ÚresourceEntitlementsÚentitlementÚresourceToken)rT   )Úuaclient.contractrY   rJ   ÚdictÚitems)
rD   rT   rY   rW   rG   Útokens_by_nameÚent_by_nameÚentitlement_nameÚ	ent_valueÚentitlement_cfgs
             r   rV   z,MachineTokenFile.get_entitlements_from_tokenŒ   sî   € õ 	?áØˆIàˆØ$×(Ñ(Ð);¸RÓ@×DÑDØó
ˆñ ØˆIäñ 
à"×&Ñ&Ð'7¸Ó<ô
ó 
ˆô ñ 
à!×%Ñ%Ð&<¸bÓAô
ó 
ˆð ,7×+<Ñ+<Ó+>ò 	=Ñ'Ð˜iØ,¨iÐ8ˆOØ >Ñ1Ø3AØ$ñ4� Ñ0ñ % _¸VÕDØ-<ˆLÐ)Ò*ð	=ð Ðr   c                 óÌ   — | j                   sM| j                  rA| j                  j                  di «      j                  di «      j                  dd«      | _         | j                   S )z6Return a datetime of the attached contract expiration.rF   rG   ÚeffectiveToN)r   Úis_attachedrD   rJ   r1   s    r   Úcontract_expiry_datetimez)MachineTokenFile.contract_expiry_datetime²   sZ   € ð ×-Ò-°$×2BÒ2Bà×"Ñ"×&Ñ&Ð'9¸2Ó>ß‘�^ RÓ(ß‘�] DÓ)ð Ô*ð ×-Ñ-Ð-r   c                 ó,   — t        | j                  «      S )z<Report whether this machine configuration is attached to UA.rQ   r1   s    r   rq   zMachineTokenFile.is_attached¾   s   € ô �D×&Ñ&Ó'Ð'r   c                 ó®   — | j                   €y| j                   j                  «       t        j                  «       j                  «       z
  }|j                  S )a  Report num days until contract expiration based on effectiveTo

        :return: A positive int representing the number of days the attached
            contract remains in effect. Return a negative int for the number
            of days beyond contract's effectiveTo date.
        N)rr   Údater   ÚutcnowÚdays)r   Údeltas     r   Úcontract_remaining_daysz(MachineTokenFile.contract_remaining_daysÃ   sF   € ð ×(Ñ(Ð0ØØ×-Ñ-×2Ñ2Ó4´x·±Ó7H×7MÑ7MÓ7OÑOˆØ�z‰zÐr   c                 ór   — | j                   r+| j                   j                  di «      j                  d«      S y )NÚactivityInfoÚactivityTokenrI   r1   s    r   Úactivity_tokenzMachineTokenFile.activity_tokenÐ   s9   € à×ÒØ×%Ñ%×)Ñ)¨.¸"Ó=×AÑAØóð ð r   c                 ór   — | j                   r+| j                   j                  di «      j                  d«      S y )Nr{   Ú
activityIDrI   r1   s    r   Úactivity_idzMachineTokenFile.activity_idØ   s2   € à×ÒØ×%Ñ%×)Ñ)¨.¸"Ó=×AÑAÀ,ÓOÐOØr   c                 ór   — | j                   r+| j                   j                  di «      j                  d«      S y )Nr{   ÚactivityPingIntervalrI   r1   s    r   Úactivity_ping_intervalz'MachineTokenFile.activity_ping_intervalÞ   s9   € à×ÒØ×%Ñ%×)Ñ)¨.¸"Ó=×AÑAØ&óð ð r   c                 ó’   — | j                   r;| j                   j                  di «      j                  di «      j                  d«      S y )NrF   rG   ÚidrI   r1   s    r   Úcontract_idzMachineTokenFile.contract_idæ   sA   € à×Òà×"Ñ"×&Ñ&Ð'9¸2Ó>ß‘�^ RÓ(ß‘�T“ðð
 r   c                 óT   — | j                   r| j                   j                  dg «      S y )Nrb   rI   r1   s    r   Úresource_tokensz MachineTokenFile.resource_tokensð   s(   € à×ÒØ×%Ñ%×)Ñ)Ð*:¸BÓ?Ð?àr   c                 ó¦   — | j                  «       j                  di «      j                  di «      j                  di «      j                  dd «      }|S )NÚsupportre   ÚaffordancesÚ
onlySeries)rW   rJ   )r   Úonly_seriess     r   r�   zMachineTokenFile.only_series÷   sM   € ð ×ÑÓß‰S�˜BÓß‰S� Ó#ß‰S� Ó#ß‰S�˜tÓ$ð 	ð Ðr   r<   )r2   zOptional[str])r2   zOptional[int])"Ú__name__Ú
__module__Ú__qualname__r   ÚDEFAULT_DATA_DIRÚstrr   r   rh   r(   r0   r5   Úpropertyr=   rD   rK   rA   r   r   rS   rW   ÚstaticmethodrV   r   rr   rq   Úintry   r}   r€   rƒ   r†   rˆ   r�   © r   r   r   r      sÊ  „ ð "×2Ñ2Ø48ñ.àð.ð %-¨S¡Mó.ð0 Tó 0ò0
0ð�h˜t‘nó ð ñ/ó ð/ð ñ#ó ð#ð" ð˜x¨™}ò ó ðò
ð ð˜˜c 3˜h™ò ó ðñ
	" 8¨C¡=ó 	"ð à?Cñ#Ø˜C ˜H‘~ð#Ø/7¸©}ò#ó ð#ðJ ð	.¨(°8Ñ*<ò 	.ó ð	.ð ñ(ó ð(ð ð
¨°#©ò 
ó ð
ð òó ðð òó ðð
 òó ðð ñó ðð ñó ðð ñó ñr   r   r2   c                 ó˜   — ddl m} t        s9| s |«       } t        | j                  | j
                  j                  d«      ¬«      at        S )Nr   )ÚUAConfigrC   )r   r   )Úuaclient.configr˜   Ú_machine_token_filer   Údata_dirÚfeaturesrJ   )Úcfgr˜   s     r   Úget_machine_token_filerž     sC   € Ý(õ ÙÙ“*ˆCä.Ø—l‘lØ'*§|¡|×'7Ñ'7Ø'ó(ô
Ðô Ðr   r<   )r%   r   Útypingr   r   r   Úuaclientr   r   r	   r
   Úuaclient.contract_data_typesr   Úuaclient.files.filesr   rš   r   rž   r–   r   r   ú<module>r£      s=   ðÛ Ý ß &Ñ &ç 7Ó 7Ý ?Ý 'àÐ ÷tñ tñnÐ(8ô r   