
    g@"                        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 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jR                  ejT                  ejV                  eee!e%e&gZ,	 	 	 	 d/dede-de-de.de.deee-      defdZ/d0dede.dee-   fdZ0dedee-   dee-   fdZ1e jd                   G d d e jf                               Z4dedee-   fd!Z5dedee-   fd"Z6ded#ee   d$e4d%ee-e.f   d&ee-   f
d'Z7ded$e4dee-   fd(Z8d)ee-   defd*Z9dede
jt                  fd+Z;dede.fd,Z<d1ded-e-fd.Z=y)2    N)defaultdict)DictListOptionalType)
exceptions)UAConfig)fips)AnboxEntitlement)UAEntitlement)CommonCriteriaEntitlement)CISEntitlement)ApplicabilityStatus)ESMAppsEntitlementESMInfraEntitlement)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_servicesr4   T   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_lasts   s4    	+%++C00 	+)**	+s    ++c                      |       S r8    )r'   r=   s    r(   <lambda>z1order_entitlements_for_enabling.<locals>.<lambda>y   s    (H(M r*   )key)entitlements_enable_orderr/   )r   r5   r=   r<   s     @@r(   order_entitlements_for_enablingrC   k   s%     337+ $MNNr*   c                   (    e Zd Z e       Z e       Zy)	SortOrderN)__name__
__module____qualname__objectREQUIRED_SERVICESDEPENDENT_SERVICESr?   r*   r(   rE   rE   |   s    r*   rE   c                 8    t        | t        j                        S )zR
    Return the entitlements disable order based on dependent services logic.
    r   
sort_order)_sort_entitlementsrE   rK   r-   s    r(   entitlements_disable_orderrP      s     #)2N2NOOr*   c                 8    t        | t        j                        S )zP
    Return the entitlements enable order based on required services logic.
    rM   )rO   rE   rJ   r-   s    r(   rB   rB      s     #)2M2MNNr*   ent_clsrN   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   rR   rN   rS   rT   T)
r   rE   rJ   required_servicesr&   listdependent_services_sort_entitlements_visitappendstr)	r   rR   rN   rS   rT   r'   ecls_listcls_dependencys	            r(   rZ   rZ      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 )NrV   )r#   rZ   )r   rN   rT   rS   rR   s        r(   rO   rO      s9    EG& 
 !	

 Lr*   r2   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+   )r4   r[   r/   set)r2   r   entitlements_foundent_nameentitlements_not_founds        r(   get_valid_entitlement_namesrf      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)r4   jointextwrapwrapr   InvalidServiceOpError)re   r   valid_services_namesr$   rr   s        r(   *create_enable_entitlements_not_found_errorrx      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
)Nr?   )fromapt_urlsuite   r   r{   r|   rh   c              3   8   K   | ]  }t        |d            yw)rz   N)r\   ).0r'   s     r(   	<genexpr>z>check_entitlement_apt_directives_are_unique.<locals>.<genexpr>  s     ICs3v;/Is   )urlr2   r{   r|   T)r   rX   r4   r)   
isinstancer   applicability_statusr   
APPLICABLEr{   
apt_suitesrepo_policy_check_tmplformatr[   itemsr;   r   %EntitlementsAPTDirectivesAreNotUniquecontract_urlrs   r/   )r   entitlement_directivesrd   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*   rd   c                 j    	 t        | ||      j                  S # t        j                  $ r |cY S w xY w)N)r   )r)   titler   UbuntuProError)r   rd   r   s      r(   	get_titler     s6    "3'BHHH$$ s    22) FFN)F)r   )>enumrt   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.landscaper   uaclient.entitlements.livepatchr   uaclient.entitlements.realtimer   uaclient.entitlements.repor   uaclient.entitlements.rosr   r   uaclient.exceptionsr   FIPSEntitlementFIPSUpdatesEntitlementFIPSPreviewEntitlementr#   r\   boolr)   r4   rC   uniqueEnumrE   rP   rB   rZ   rO   rf   r   rx   r   r   r?   r*   r(   <module>r      s>     # - -  $ & 8 4 > 4 H M @ @ 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*   