o
    ÙKÕi¡h  ã                   @   sþ  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mZmZmZmZ d dl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mZmZmZmZ d dl m!Z! d dl"m#Z#m$Z$ d dl%m&Z&m'Z'm(Z( d dl)m*Z*m+Z+m,Z,m-Z-m.Z. dZ/G dd„ deƒZ0dd„ Z1edd�dd„ ƒZ2dedeej3 f fdd„Z4dej3dej5de6fdd„Z7edd�d e6d!e6de8fd"d#„ƒZ9d$e6d%ee6ef d!ej:de6fd&d'„Z;d(eej3 dee6eeej:e6f  f fd)d*„Z<d+e!dee6ef fd,d-„Z=deee6ef  fd.d/„Z>d0ee6eeej:e6f  f d%ee6ef deee6ef  fd1d2„Z?d+e!dee6ef fd3d4„Z@	5	6dUd7ee6eej3 f d8e6d9e8ddfd:d;„ZAd<d=„ ZBd>d?„ ZCd@e6dAe6dBe'dCe&dDeDdEeDdFe8fdGdH„ZEdIdJ„ ZFd+e!fdKdL„ZGdMdN„ ZHdOdP„ ZIdQdR„ ZJdSdT„ ZKdS )Vé    )Údefaultdict)ÚdatetimeÚtimezone)ÚEnum)Ú	lru_cache)Úchoice)ÚAnyÚDefaultDictÚDictÚListÚTupleN)Ú
exceptionsÚ	livepatchÚmessagesÚutil)Ú_reboot_required)Ú_is_attached)ÚPreserveAptCfgÚget_apt_cache_datetimeÚget_apt_pkg_cacheÚget_esm_apt_pkg_cacheÚget_pkg_candidate_version)ÚUAConfig)ÚESMAppsEntitlementÚESMInfraEntitlement)ÚApplicabilityStatusÚApplicationStatusÚContractStatus)Úget_distro_infoÚget_kernel_infoÚget_release_infoÚis_current_series_ltsÚis_supported)ú	esm-infraúesm-appsc                   @   s$   e Zd ZdZdZdZdZdZdZdS )ÚUpdateStatusz2Represents the availability of a security package.Úupgrade_availableÚupgrade_available_not_preferredÚpending_attachÚpending_enableÚupgrade_unavailableN)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	AVAILABLEÚAVAILABLE_NOT_PREFERREDÚ
UNATTACHEDÚNOT_ENABLEDÚUNAVAILABLE© r4   r4   ú:/usr/lib/python3/dist-packages/uaclient/security_status.pyr%   (   s    r%   c                 C   s   t t | ¡ƒ d S )N)Úprintr   Úcreate_package_list_str)Úpackagesr4   r4   r5   Úprint_package_list1   s   r9   )Úmaxsizec                  C   sR   t ƒ j} dd | ¡fddd | ¡fddd | ¡fd	dd
 | ¡fddd | ¡fd	iS )NÚUbuntuz{}-securityústandard-securityÚUbuntuESMAppsz{}-apps-securityr$   Ú	UbuntuESMz{}-infra-securityr#   z{}-apps-updatesz{}-infra-updates)r    ÚseriesÚformat)r?   r4   r4   r5   Ú%get_origin_information_to_service_map5   s   ûrA   ÚreturnÚstrc                  C   sv   t tƒ} ttƒ�)}dd„ |jD ƒ}|| d< t |¡}|D ]}| t||ƒ  |¡ qW d   ƒ | S 1 s4w   Y  | S )Nc                 S   s   g | ]}|j r|‘qS r4   )Úcurrent_ver©Ú.0Úpackager4   r4   r5   Ú
<listcomp>G   s
    ÿÿz4get_installed_packages_by_origin.<locals>.<listcomp>Úall)	r   Úlistr   r   r8   Úapt_pkgÚDepCacheÚ get_origin_for_installed_packageÚappend)ÚresultÚcacheÚinstalled_packagesÚ	dep_cacherG   r4   r4   r5   Ú get_installed_packages_by_originA   s"   
ÿ
ÿ
ý
øórS   rG   rR   c                 C   sŒ   | j sdS | j j}t|ƒdkr | | ¡}|r| j |krdS |j}|D ]!\}}tƒ  |j|jfd¡}|tv r9|  S |jdkrC|j	  S q"dS )a  
    Returns the origin for a package installed in the system.

    Technically speaking, packages don't have origins - their versions do.
    We check the available versions (installed, candidate) to determine the
    most reasonable origin for the package.
    Ú é   Úunknownr;   úthird-party)
rD   Ú	file_listÚlenÚget_candidate_verrA   ÚgetÚoriginÚarchiveÚESM_SERVICESÚ	component)rG   rR   Úavailable_originsÚ	candidater\   Ú_Úservicer4   r4   r5   rM   V   s$   
ÿ

ÿrM   ÚpkgÚversionc                 C   s   t | dd�}|r||kS dS )z;Returns True if the package version is a candidate version.F)Úcheck_esm_cache)r   )rd   re   Úcandidate_versionr4   r4   r5   Ú_is_candidate_version{   s   rh   Úservice_nameÚua_infoc                 C   sl   | dv s|d r | |d v r t |jj|jƒ}|rtjjS tjjS |d s(tjjS | |d v r2tj	jS tj
jS )zÑDefines the update status for a package based on the service name.

    For ESM-[Infra|Apps] packages, first checks if Pro is attached. If this is
    the case, also check for availability of the service.
    )r<   ústandard-updatesÚattachedÚenabled_servicesÚentitled_services)rh   Ú
parent_pkgÚnameÚver_strr%   r/   Úvaluer0   r1   r2   r3   )ri   rj   re   Úis_candidater4   r4   r5   Úget_update_status„   s"   
ÿ
ÿÿÿýrt   r8   c                 C   s>  t tƒ}ttƒ��}| D ]�}|jrŒ|jD ]C}||jkrVd}|jD ]\}}tƒ  |j	|j
f¡}|r=||  ||jf¡ d} nq|jd d }	|sVd|	j
vrV|d  ||	jf¡ q|j|v rŒ||j }
|
jD ]'}||jkr‹|jD ]\}}tƒ  |j	|j
f¡}|rŠ||  ||jf¡  nqnqdqW d  ƒ |S 1 s˜w   Y  |S )zÌFilters a list of packages looking for available updates.

    All versions greater than the installed one are reported, based on where
    it is provided, including ESM pockets, excluding backports.
    FTr   Ú	backportsrk   N)r   rJ   r   r   rD   Úversion_listrX   rA   r[   r\   r]   rN   Úsiterp   )r8   rO   Ú	esm_cacherG   re   Úcounted_as_securityr\   rb   rc   Úexpected_originÚesm_packager4   r4   r5   Úfilter_updates    sZ   



ÿÿüÿ
ÿ€




ÿÿü€Ù
ÿ.Ò.r|   Úcfgc                 C   s¦   t | ƒj}|g g dœ}|rQt| ƒ}t| ƒ}| ¡ tjkr#|d  d¡ | ¡ d t	j
kr3|d  d¡ | ¡ tjkrA|d  d¡ | ¡ d t	j
krQ|d  d¡ |S )z7Returns the Pro information based on the config object.)rl   rm   rn   rn   r$   r   rm   r#   )r   Úis_attachedr   r   Úcontract_statusr   ÚENTITLEDrN   Úapplication_statusr   ÚENABLED)r}   r~   rj   Úinfra_entitlementÚapps_entitlementr4   r4   r5   Úget_ua_infoà   s*   
ý
ÿ
ÿr…   c                  C   s�   zt  ¡ } W n tjy   g  Y S w tƒ j}| d urF|d urF|| jkrF| j d urF| j jdkrF| j jd urFt	| j jƒdkrFdd„ | j jD ƒS g S )NÚappliedr   c                 S   s"   g | ]}|j pd |jpddœ‘qS )rT   F©rp   Úpatchedr‡   )rF   Úfixr4   r4   r5   rH     s    ÿÿz,get_livepatch_fixed_cves.<locals>.<listcomp>)
r   Ústatusr   ÚProcessExecutionErrorr   Úproc_version_signature_versionÚkernelÚstateÚfixesrY   )Ú	lp_statusÚour_kernel_versionr4   r4   r5   Úget_livepatch_fixed_cves  s"   ÿ

þr’   Úupgradable_versionsc                 C   sT   g }|   ¡ D ]!\}}|D ]\}}t|||ƒ}| |jj|j||||jdœ¡ qq|S )N)rG   re   ri   rŠ   r\   Údownload_size)Úitemsrt   rN   ro   rp   rq   Úsize)r“   rj   Úupdatesrc   rv   re   r\   rŠ   r4   r4   r5   Úcreate_updates_list  s   úÿþr˜   c                 C   s  t | ƒ}d|i}tƒ }|d }t|ƒ|d< t|ƒ}g |d< t||ƒ}t|d ƒ|d< t|d ƒ|d< t|d	 ƒ|d
< t|d ƒ|d< t|d ƒ|d< t|d ƒ|d< t|d ƒ|d< t|d ƒ|d< t|d ƒ|d< t|d ƒ|d< t|d ƒ|d< t| ƒj|d< d||dtƒ idœS )ag  Returns the status of security updates on a system.

    The returned dict has a 'packages' key with a list of all installed
    packages which can receive security updates, with or without ESM,
    reflecting the availability of the update based on the Pro status.

    There is also a summary with the Ubuntu Pro information and the package
    counts.
    ÚuarI   Únum_installed_packagesrk   ÚmainÚnum_main_packagesÚ
restrictedÚnum_restricted_packagesÚuniverseÚnum_universe_packagesÚ
multiverseÚnum_multiverse_packagesrW   Únum_third_party_packagesrV   Únum_unknown_packagesr#   Únum_esm_infra_packagesr$   Únum_esm_apps_packagesÚnum_esm_infra_updatesÚnum_esm_apps_updatesr<   Únum_standard_security_updatesÚreboot_requiredz0.1Ú
fixed_cves)Ú_schema_versionÚsummaryr8   r   )r…   rS   rY   r|   r˜   r   rª   r’   )r}   rj   r­   Úpackages_by_originrQ   r“   r—   r4   r4   r5   Úsecurity_status_dict/  s:   

ÿÿür¯   rI   FÚpackage_listsÚ
show_itemsÚalways_showc           	      C   sB  t | d ƒ}ttjj|d�ƒ dt t|ƒƒd  }|dv r=t | d ƒt | d ƒ t | d ƒ }ttj |¡j||d	d
�ƒ |dv ret | d ƒt | d ƒ t | d ƒ }|sW|rettj |¡j||dd
�ƒ |dv r€t | d ƒ}|ss|r€ttj |¡j||d�ƒ |dv r›t | d ƒ}|sŽ|r›ttj	 |¡j||d�ƒ tdƒ d S )NrI   )Úcountú rU   )rI   r#   r›   r�   r#   úMain/Restricted)Úoffsetr³   Ú
repository)rI   r$   rŸ   r¡   r$   úUniverse/Multiverse)rI   rW   rW   )r¶   r³   )rI   rV   rV   rT   )
rY   r6   r   ÚSS_SUMMARY_TOTALr@   rC   ÚSS_SUMMARY_ARCHIVEÚ	pluralizeÚSS_SUMMARY_THIRD_PARTYÚSS_SUMMARY_UNAVAILABLE)	r°   r±   r²   Útotal_packagesr¶   Úpackages_mrÚpackages_umÚpackages_thirdpartyÚpackages_unknownr4   r4   r5   Ú_print_package_summarya  sn   

ÿ
þÿýÿ

ÿ
þÿýÿÿþÿÿüÿ	rÃ   c                  C   sH   t ƒ j} t| ƒj}d t|jƒt|jƒ¡}tt	j
j|d�ƒ tdƒ d S )Nz{}/{}©ÚdaterT   )r    r?   r   Úeolr@   rC   ÚmonthÚyearr6   r   ÚSS_INTERIM_SUPPORT)r?   Úeol_daterÅ   r4   r4   r5   Ú_print_interim_release_support   s
   
rË   c                  C   sD   t ƒ j} t| ƒrt| ƒj}ttjjt	|j
ƒd�ƒ d S ttjƒ d S )NrÄ   )r    r?   r"   r   rÆ   r6   r   ÚSS_LTS_SUPPORTr@   rC   rÈ   ÚSS_NO_SECURITY_COVERAGE)r?   rÊ   r4   r4   r5   Ú_print_lts_support¨  s
   
rÎ   rc   r·   Úservice_statusÚservice_applicabilityÚinstalled_updatesÚavailable_updatesr~   c           
      C   sÔ   t ƒ j}t|ƒj}|tjkrtjj|| t	|j
ƒd�}	ntjj| |t	|j
ƒd�}	|r7|	dtj |¡j|d� 7 }	|rG|	dtj |¡j|d� 7 }	t|	ƒ |rd|tjkrd|tjkrdtdƒ ttjj| d�ƒ tdƒ d S )N)r·   rc   rÈ   )rc   r·   rÈ   r´   )r—   rT   ©rc   )r    r?   r   Úeol_esmr   r‚   r   ÚSS_SERVICE_ENABLEDr@   rC   rÈ   ÚSS_SERVICE_ADVERTISEÚSS_SERVICE_ENABLED_COUNTSr»   ÚSS_SERVICE_ADVERTISE_COUNTSr6   ÚDISABLEDr   Ú
APPLICABLEÚSS_SERVICE_COMMAND)
rc   r·   rÏ   rÐ   rÑ   rÒ   r~   r?   Úeol_date_esmÚmessager4   r4   r5   Ú_print_service_support±  sF   	

ýý
ÿ
ý
ÿ
ýÿ

rÞ   c                  C   sf   t ƒ } | d u rttjƒ tdƒ d S t tj¡}||  }|jdkr1ttj	j
|jd�ƒ tdƒ d S d S )NrT   r   )Údays)r   r6   r   ÚSS_UPDATE_UNKNOWNr   Únowr   Úutcrß   ÚSS_UPDATE_DAYSr@   )Úlast_apt_updaterá   Útime_since_updater4   r4   r5   Ú_print_apt_update_callã  s   

þræ   c              	   C   s„  t | ƒ}t| ƒ}| ¡ d }| ¡ d }| ¡ d }| ¡ d }tƒ j}tƒ }t| ƒd }	tƒ }
t	|
d |
d  |
d  ƒd }t	|
d |
d  |
d  ƒd }t
|
ƒ ttjƒ td	ƒ tƒ  |spt|ƒritƒ  ttjƒ d S |tjkrxtƒ  |	r€ttjƒ nttjƒ td	ƒ tdd
||t|
d ƒt|ƒ|	d� |
d s¦|
d s¦|
d r·tdd||t|
d ƒt|ƒ|	d� |	sÀttjƒ d S d S )Nr   rl   r›   r�   r#   rŸ   r¡   r$   rT   rµ   ©rc   r·   rÏ   rÐ   rÑ   rÒ   r~   r¸   )r   r   r�   Úapplicability_statusr    r?   r!   r…   rS   r|   rÃ   r6   r   ÚSS_HELP_CALLræ   r"   rË   ÚSS_NO_INTERIM_PRO_SUPPORTr   rÙ   rÎ   ÚSS_IS_ATTACHEDÚSS_IS_NOT_ATTACHEDrÞ   rY   ÚSS_LEARN_MORE)r}   Úesm_infra_entÚesm_apps_entÚesm_infra_statusÚesm_infra_applicabilityÚesm_apps_statusÚesm_apps_applicabilityr?   Úis_ltsr~   r®   Ú"security_upgradable_versions_infraÚ!security_upgradable_versions_appsr4   r4   r5   Úsecurity_statusñ  sŒ   ÿþÿüÿþÿü




ùÿþý
ù
ÿr÷   c                  C   óz   t ƒ } | d }dd„ |D ƒ}t| ddd� |r6ttjƒ tdƒ ttjƒ t|ƒ ttjjt	|ƒd�ƒ d S ttj
ƒ d S )NrW   c                 S   ó   g | ]}|j ‘qS r4   ©rp   rE   r4   r4   r5   rH   A  ó    z-list_third_party_packages.<locals>.<listcomp>T©r±   r²   rT   ©rG   )rS   rÃ   r6   r   ÚSS_THIRD_PARTYÚSS_PACKAGES_HEADERr9   ÚSS_SHOW_HINTr@   r   ÚSS_NO_THIRD_PARTY)r®   Úthird_party_packagesÚpackage_namesr4   r4   r5   Úlist_third_party_packages>  s   ÿ

r  c                  C   rø   )NrV   c                 S   rù   r4   rú   rE   r4   r4   r5   rH   U  rû   z-list_unavailable_packages.<locals>.<listcomp>Trü   rT   rý   )rS   rÃ   r6   r   ÚSS_UNAVAILABLErÿ   r9   r   r@   r   ÚSS_NO_UNAVAILABLE)r®   Úunknown_packagesr  r4   r4   r5   Úlist_unavailable_packagesR  s   ÿ

r  c              	      sê  t ƒ }|d }|d |d  }|| }tƒ }t|ƒd }|D ]
\}}| |j¡ qtƒ j}	tƒ }
t| ƒ}t	| ƒ}| 
¡ d }| ¡ d }tdd„ |D ƒƒ‰tdd„ |D ƒƒ‰ t‡ ‡fdd„|D ƒƒ}t|dd	d
� |
syt|	ƒrrtƒ  ttjƒ d S |tjkr…tƒ  tdƒ tdd||t|ƒt|ƒdd� ttjjdd�ƒ tdƒ t|	ƒsñˆ r´ttjjdd�ƒ tˆ ƒ ˆrÃttjjdd�ƒ tˆƒ ˆ pÆˆ}|râ|rÓtjjdd�}ntjjdd�}t|ƒ t|ƒ |róttjjt |ƒd�ƒ d S d S d S )Nr#   r›   r�   r   c                 S   rù   r4   rú   rE   r4   r4   r5   rH     rû   z+list_esm_infra_packages.<locals>.<listcomp>c                 S   rù   r4   rú   rE   r4   r4   r5   rH   ‚  rû   c                    ó&   g | ]}|j ˆvr|j ˆ vr|j ‘qS r4   rú   rE   ©Úavailable_package_namesÚinstalled_package_namesr4   r5   rH   …  ó    

ýTrü   rT   rµ   Frç   rÓ   rý   )!rS   Úsetr|   Úaddro   r    r?   r!   r   r   r�   rè   ÚsortedrÃ   r"   rË   r6   r   rê   r   rÙ   rÎ   rÞ   rY   ÚSS_SERVICE_HELPr@   ÚSS_UPDATES_AVAILABLEr9   ÚSS_UPDATES_INSTALLEDÚSS_FURTHER_OTHER_PACKAGESÚSS_OTHER_PACKAGESr   r   )r}   r®   Úinfra_packagesÚmr_packagesÚall_infra_packagesÚinfra_updatesÚsecurity_upgradable_versionsÚupdaterb   r?   rô   rî   rï   rð   rñ   Úremaining_package_namesÚ	hint_listÚmsgr4   r
  r5   Úlist_esm_infra_packagesg  sŠ   ÿÿÿþÿ	ÿ

ù	ÿêr  c              	      s°  t ƒ }|d }|d |d  }|| }tƒ }t|ƒd }|D ]
\}}| |j¡ qtƒ }	t| ƒ}
|
 ¡ d }|
 ¡ d }t	dd„ |D ƒƒ‰t	dd„ |D ƒƒ‰ t	‡ ‡fdd„|D ƒƒ}t
|dd	d
� |	sjttjƒ d S tdd||t|ƒt|ƒdd� ttjjdd�ƒ tdƒ |rÔˆ r—ttjjdd�ƒ tˆ ƒ ˆr¦ttjjdd�ƒ tˆƒ ˆ p©ˆ}|rÅ|r¶tjjdd�}ntjjdd�}t|ƒ t|ƒ |rÖttjjt|ƒd�ƒ d S d S d S )Nr$   rŸ   r¡   r   c                 S   rù   r4   rú   rE   r4   r4   r5   rH   ×  rû   z*list_esm_apps_packages.<locals>.<listcomp>c                 S   rù   r4   rú   rE   r4   r4   r5   rH   Ú  rû   c                    r	  r4   rú   rE   r
  r4   r5   rH   Ý  r  Trü   r¸   Frç   rÓ   rT   rý   )rS   r  r|   r  ro   r!   r   r�   rè   r  rÃ   r6   r   rê   rÞ   rY   r  r@   r  r9   r  r  r  r   r   )r}   r®   Úapps_packagesÚum_packagesÚall_apps_packagesÚapps_updatesr  r  rb   rô   rï   rò   ró   r  r  r  r4   r
  r5   Úlist_esm_apps_packagesÀ  s~   ÿÿÿÿþÿ	ÿ
ù	ÿér$  )rI   F)LÚcollectionsr   r   r   Úenumr   Ú	functoolsr   Úrandomr   Útypingr   r	   r
   r   r   rK   Úuaclientr   r   r   r   Ú5uaclient.api.u.pro.security.status.reboot_required.v1r   Ú(uaclient.api.u.pro.status.is_attached.v1r   Úuaclient.aptr   r   r   r   r   Úuaclient.configr   Úuaclient.entitlementsr   r   Ú(uaclient.entitlements.entitlement_statusr   r   r   Úuaclient.systemr   r   r    r!   r"   r^   r%   r9   rA   ÚPackagerS   rL   rC   rM   Úboolrh   ÚVersionrt   r|   r…   r’   r˜   r¯   rÃ   rË   rÎ   ÚintrÞ   ræ   r÷   r  r  r  r$  r4   r4   r4   r5   Ú<module>   s´    	

ÿÿÿ
þ%ÿ
þý
üÿ
þ@!ÿ
þ
ý4ýÿþý
ü?	ÿþýüûú
ù2MY