o
    ÙKÕië"  ã                   @   sz  d dl Z d dlZd dlmZ d dl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 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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+ eeeeeeeej,ej-ej.e e"e$e(e)gZ/				d=dede0de0de1de1deee0  defdd„Z2d>dede1dee0 fd d!„Z3ded"ee0 dee0 fd#d$„Z4e j5G d%d&„ d&e j6ƒƒZ7dedee0 fd'd(„Z8dedee0 fd)d*„Z9ded+ee d,e7d-ee0e1f d.ee0 f
d/d0„Z:ded,e7dee0 fd1d2„Z;d3ee0 defd4d5„Z<dede
j=fd6d7„Z>dede1fd8d9„Z?d?ded:e0fd;d<„Z@dS )@é    N)Údefaultdict)ÚDictÚListÚOptionalÚType)Ú
exceptions)ÚUAConfig)Úfips)ÚAnboxEntitlement)ÚUAEntitlement)ÚCommonCriteriaEntitlement)ÚCISEntitlement)ÚApplicabilityStatus)ÚESMAppsEntitlementÚESMInfraEntitlement)ÚESMAppsLegacyEntitlementÚESMInfraLegacyEntitlement)ÚLandscapeEntitlement)ÚLivepatchEntitlement)ÚRealtimeKernelEntitlement)ÚRepoEntitlement)ÚROSEntitlementÚROSUpdatesEntitlement)ÚEntitlementNotFoundErrorÚ FÚcfgÚnameÚvariantÚpurgeÚaccess_onlyÚ
extra_argsÚreturnc                 C   sj   t D ]-}|| ||||d�}||jv r/|s|  S ||jv r*|j| | |||d�  S t|d�‚qt|d�‚)a1  Returns a UAEntitlement object based on the provided name.

    :param cfg: UAConfig instance
    :param name: The name of the entitlement to return
    :param variant: The variant name to be used
    :param purge: If purge operation is enabled
    :param access_only: If entitlement should be set with access only
    :param extra_args: Extra parameters to create the entitlement

    :raise EntitlementNotFoundError: If no entitlement with the given name is
      found, or if the entitlement exists but no variant with the specified
      name is found.
    )r   r   Úcalled_namer   r    )r   r"   r   r    )Úentitlement_name)ÚENTITLEMENT_CLASSESÚvalid_namesÚvariantsr   )r   r   r   r   r   r    ÚentitlementÚent© r)   ú@/usr/lib/python3/dist-packages/uaclient/entitlements/__init__.pyÚentitlement_factory-   s*   û


ü
õ
r+   Ú	all_namesc                    sF   t }|rg }|D ]}| |ˆ d�j¡ qt|ƒS t‡ fdd„|D ƒƒS )z¼Return a list of valid services.

    :param cfg: UAConfig instance
    :param all_names: if we should return all the names for a service instead
        of just the presentation_name
    ©r   c                    s   g | ]}|ˆ d �j ‘qS )r-   )Úpresentation_name)Ú.0Úentitlement_clsr-   r)   r*   Ú
<listcomp>j   s    
ÿÿz"valid_services.<locals>.<listcomp>)r$   Úextendr%   Úsorted)r   r,   ÚentitlementsÚnamesr0   r)   r-   r*   Úvalid_servicesZ   s   
þÿr6   Úentsc                    s(   t | ƒ‰‡fdd„‰ t|‡ fdd„d�S )zR
    A function to sort entitlments for enabling that preserves invalid names
    c                    s(   zˆ   | ¡W S  ty   tˆ ƒ Y S w ©N)ÚindexÚ
ValueErrorÚlen©r(   )Úvalid_ents_orderedr)   r*   Ú sort_order_with_nonexistent_lasty   s
   ÿzIorder_entitlements_for_enabling.<locals>.sort_order_with_nonexistent_lastc                    s   ˆ | ƒS r8   r)   r<   )r>   r)   r*   Ú<lambda>   s    z1order_entitlements_for_enabling.<locals>.<lambda>)Úkey)Úentitlements_enable_orderr3   )r   r7   r)   )r>   r=   r*   Úorder_entitlements_for_enablingq   s   rB   c                   @   s   e Zd Zeƒ Zeƒ ZdS )Ú	SortOrderN)Ú__name__Ú
__module__Ú__qualname__ÚobjectÚREQUIRED_SERVICESÚDEPENDENT_SERVICESr)   r)   r)   r*   rC   ‚   s    
rC   c                 C   ó   t | tjd�S )zR
    Return the entitlements disable order based on dependent services logic.
    ©r   Ú
sort_order)Ú_sort_entitlementsrC   rI   r-   r)   r)   r*   Úentitlements_disable_orderˆ   ó   rN   c                 C   rJ   )zP
    Return the entitlements enable order based on required services logic.
    rK   )rM   rC   rH   r-   r)   r)   r*   rA   �   rO   rA   Úent_clsrL   ÚvisitedÚorderc                 C   s„   |j |v rd S || ƒ}|tjkrdd„ |jD ƒ}nt|jƒ}|D ]}|j |vr0t| ||||d� q | t|j ƒ¡ d|t|j ƒ< d S )Nc                 S   s   g | ]}|j ‘qS r)   )r'   )r/   Úer)   r)   r*   r1   £   s    z,_sort_entitlements_visit.<locals>.<listcomp>©r   rP   rL   rQ   rR   T)	r   rC   rH   Úrequired_servicesÚlistÚdependent_servicesÚ_sort_entitlements_visitÚappendÚstr)r   rP   rL   rQ   rR   r(   Úcls_listÚcls_dependencyr)   r)   r*   rX   –   s$   



û€rX   c                 C   s(   g }i }t D ]}t| ||||d� q|S )NrT   )r$   rX   )r   rL   rR   rQ   rP   r)   r)   r*   rM   µ   s   ûrM   r5   c                 C   sD   g }| D ]}|t |dd�v r| |¡ qtt| ƒt|ƒ ƒ}||fS )z­Return a list of valid entitlement names.

    :param names: List of entitlements to validate
    :return: a tuple of List containing the valid and invalid entitlements
    T)r   r,   )r6   rY   r3   Úset)r5   r   Úentitlements_foundÚent_nameÚentitlements_not_foundr)   r)   r*   Úget_valid_entitlement_namesÅ   s   
€ra   c                 C   sJ   t |d�}d |¡}d tjd| d dddd�¡}tjd	d | ¡|d
�S )z{
    Constructs the MESSAGE_INVALID_SERVICE_OP_FAILURE message
    based on the attempted services and valid services.
    r-   ú, Ú
zTry Ú.éP   F)ÚwidthÚbreak_long_wordsÚbreak_on_hyphensÚenable)Ú	operationÚinvalid_serviceÚservice_msg)r6   ÚjoinÚtextwrapÚwrapr   ÚInvalidServiceOpError)r`   r   Úvalid_services_namesr%   rl   r)   r)   r*   Ú*create_enable_entitlements_not_found_errorÖ   s   


üÿýrr   c              	   C   sâ   t tƒ}t| ƒD ]f}t| |ƒ}t|tƒsq| ¡ \}}|tjkr?|j	}|j
p'd}|D ]}|j ||¡}	||	  |||dœ¡ q*| ¡ D ]*\}
}t|ƒdkrm|d d }|d d }tj| jd tdd	„ |D ƒƒ¡||d
�‚qCqdS )Nr)   )ÚfromÚapt_urlÚsuiteé   r   rt   ru   rb   c                 s   s   � | ]	}t |d  ƒV  qdS )rs   N)rZ   )r/   r(   r)   r)   r*   Ú	<genexpr>  s   € z>check_entitlement_apt_directives_are_unique.<locals>.<genexpr>)Úurlr5   rt   ru   T)r   rV   r6   r+   Ú
isinstancer   Úapplicability_statusr   Ú
APPLICABLErt   Ú
apt_suitesÚrepo_policy_check_tmplÚformatrY   Úitemsr;   r   Ú%EntitlementsAPTDirectivesAreNotUniqueÚcontract_urlrm   r3   )r   Úentitlement_directivesr_   r(   rz   Ú_rt   r|   ru   Úentitlement_directiveÚdef_pathÚent_directiveÚent_apt_urlÚ	ent_suiter)   r)   r*   Ú+check_entitlement_apt_directives_are_uniqueî   sD   



ÿýÿÿúüÿr‰   r_   c                 C   s,   z	t | ||d�jW S  tjy   | Y S w )N)r   )r+   Útitler   ÚUbuntuProError)r   r_   r   r)   r)   r*   Ú	get_title  s
   ÿrŒ   )r   FFN)F)r   )AÚenumrn   Úcollectionsr   Útypingr   r   r   r   Úuaclientr   Úuaclient.configr   Úuaclient.entitlementsr	   Úuaclient.entitlements.anboxr
   Úuaclient.entitlements.baser   Úuaclient.entitlements.ccr   Úuaclient.entitlements.cisr   Ú(uaclient.entitlements.entitlement_statusr   Úuaclient.entitlements.esmr   r   Ú uaclient.entitlements.esm_legacyr   r   Úuaclient.entitlements.landscaper   Úuaclient.entitlements.livepatchr   Úuaclient.entitlements.realtimer   Úuaclient.entitlements.repor   Úuaclient.entitlements.rosr   r   Úuaclient.exceptionsr   ÚFIPSEntitlementÚFIPSUpdatesEntitlementÚFIPSPreviewEntitlementr$   rZ   Úboolr+   r6   rB   ÚuniqueÚEnumrC   rN   rA   rX   rM   ra   r‹   rr   r‰   rŒ   r)   r)   r)   r*   Ú<module>   s¶    ñúÿþýüû
ú
ù-ÿÿ
þÿþý
ü
ûÿ
þÿ
þ.