
    h"                        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jX                  ejZ                  ej\                  e e"e$e(e)gZ/	 	 	 	 d0dede0de0de1de1deee0      defdZ2d1dede1dee0   fdZ3dedee0   dee0   fdZ4e jj                   G d  d!e jl                               Z7dedee0   fd"Z8dedee0   fd#Z9ded$ee   d%e7d&ee0e1f   d'ee0   f
d(Z:ded%e7dee0   fd)Z;d*ee0   defd+Z<dede
jz                  fd,Z>dede1fd-Z?d2ded.e0fd/Z@y)3    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cfgnamevariantpurgeaccess_only
extra_argsreturnc                     t         D ]X  } || ||||      }||j                  v s|s|c S ||j                  v r |j                  |   | |||      c S t        |       t        |      )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ents           @/usr/lib/python3/dist-packages/uaclient/entitlements/__init__.pyentitlement_factoryr+   -   s    , + I#!
 3??"
CLL(,s||G, $)	  /HH'I( #D
99    	all_namesc                     t         }|r6g }|D ]$  }|j                   ||       j                         & t        |      S t        |D cg c]  } ||       j                   c}      S c c}w )zReturn 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   )r%   extendr&   sortedpresentation_name)r   r-   entitlementsnamesentitlement_clss        r*   valid_servicesr6   Z   sx     'L+ 	?OLLS1==>	? e} $0	
 $66	
 	
s   A)entsc                 F    t        |       fdt        |fd      S )zR
    A function to sort entitlments for enabling that preserves invalid names
    c                 \    	 j                  |       S # t        $ r t              cY S w xY wN)index
ValueErrorlen)r)   valid_ents_ordereds    r*    sort_order_with_nonexistent_lastzIorder_entitlements_for_enabling.<locals>.sort_order_with_nonexistent_lasty   s4    	+%++C00 	+)**	+s    ++c                      |       S r:    )r)   r?   s    r*   <lambda>z1order_entitlements_for_enabling.<locals>.<lambda>   s    (H(M r,   )key)entitlements_enable_orderr1   )r   r7   r?   r>   s     @@r*   order_entitlements_for_enablingrE   q   s%     337+ $MNNr,   c                   (    e Zd Z e       Z e       Zy)	SortOrderN)__name__
__module____qualname__objectREQUIRED_SERVICESDEPENDENT_SERVICESrA   r,   r*   rG   rG      s    r,   rG   c                 8    t        | t        j                        S )zR
    Return the entitlements disable order based on dependent services logic.
    r   
sort_order)_sort_entitlementsrG   rM   r/   s    r*   entitlements_disable_orderrR      s     #)2N2NOOr,   c                 8    t        | t        j                        S )zP
    Return the entitlements enable order based on required services logic.
    rO   )rQ   rG   rL   r/   s    r*   rD   rD      s     #)2M2MNNr,   ent_clsrP   visitedorderc                    |j                   |v ry  ||       }|t        j                  k(  r$|j                  D cg c]  }|j                   }}nt        |j                        }|D ]!  }|j                   |vst        | ||||       # |j                  t        |j                                d|t        |j                         <   y c c}w )Nr   rT   rP   rU   rV   T)
r   rG   rL   required_servicesr(   listdependent_services_sort_entitlements_visitappendstr)	r   rT   rP   rU   rV   r)   ecls_listcls_dependencys	            r*   r\   r\      s     ||w
#,CY000+.+@+@AaAMMAA../" <<w&$&% 
LLW\\"#!%GC Bs   Cc                 D    g }i }t         D ]  }t        | ||||        |S )NrX   )r%   r\   )r   rP   rV   rU   rT   s        r*   rQ   rQ      s9    EG& 
 !	

 Lr,   r4   c                     g }| D ]#  }|t        |d      v s|j                  |       % t        t        |       t        |      z
        }||fS )zReturn 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   r]   r1   set)r4   r   entitlements_foundent_nameentitlements_not_founds        r*   get_valid_entitlement_namesrh      s^      0~#>>%%h/0 $CJ5G1H$HI555r,   c                     t        |      }dj                  |      }dj                  t        j                  d|z   dz   ddd            }t	        j
                  d	dj                  |       |
      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)rg   r   valid_services_namesr&   rt   s        r*   *create_enable_entitlements_not_found_errorrz      sv     *c2))01K))[ 3&""		
K ++		"89 r,   c                 j   t        t              }t        |       D ]  }t        | |      }t	        |t
              s!|j                         \  }}|t        j                  k(  rW|j                  }|j                  xs d}|D ]6  }|j                  j                  ||      }	||	   j                  |||d       8 |j                         D ]e  \  }
}t        |      dkD  s|d   d   }|d   d   }t!        j"                  | j$                  dj'                  t)        d |D                    ||	        y
)NrA   )fromapt_urlsuite   r   r}   r~   rj   c              3   8   K   | ]  }t        |d            yw)r|   N)r^   ).0r)   s     r*   	<genexpr>z>check_entitlement_apt_directives_are_unique.<locals>.<genexpr>  s     ICs3v;/Is   )urlr4   r}   r~   T)r   rZ   r6   r+   
isinstancer   applicability_statusr   
APPLICABLEr}   
apt_suitesrepo_policy_check_tmplformatr]   itemsr=   r   %EntitlementsAPTDirectivesAreNotUniquecontract_urlru   r1   )r   entitlement_directivesrf   r)   r   _r}   r   r~   entitlement_directivedef_pathent_directiveent_apt_url	ent_suites                 r*   +check_entitlement_apt_directives_are_uniquer      sS    )."3' $!#x0#/"%":":"<a#6#A#AAkkG-2J# 
(+(B(B(I(IU)% ''<=DD (#*!&	
 (>'C'C'E 	#Hm=!A%+A.y9)!,W5	 FF(())I=II (# 	1$L r,   rf   c                 j    	 t        | ||      j                  S # t        j                  $ r |cY S w xY w)N)r   )r+   titler   UbuntuProError)r   rf   r   s      r*   	get_titler     s6    "3'BHHH$$ s    22) FFN)F)r   )Aenumrv   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%   r^   boolr+   r6   rE   uniqueEnumrG   rR   rD   r\   rQ   rh   r   rz   r   r   rA   r,   r*   <module>r      sL     # - -  $ & 8 4 > 4 H M A @ D 6 K 8  , &**:	*:
*: *: 	*:
 *: c#*: *:Z T d3i .O	OcO	#YO" "		 " "
PH Pc PO8 OS	 O&	&- & & #t)_	&
 9&>H ) S	  6tCy 6x 6"!)0+	+	+\8 s r,   