o
    ϴfe                     @   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 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Z/dd Z0edddd Z1dedeej2 f fddZ3dej2dej4de5fddZ6d e5d!ee5ef de5fd"d#Z7d$eej2 dee5eeej8e5f  f fd%d&Z9d'e dee5ef fd(d)Z:deee5ef  fd*d+Z;d,ee5eeej8e5f  f d!ee5ef deee5ef  fd-d.Z<d'e dee5ef fd/d0Z=	1	2dQd3ee5eej2 f d4e5d5e>ddfd6d7Z?d8d9 Z@d:d; ZAd<e5d=e5d>e&d?e%d@eBdAeBdBe>fdCdDZCdEdF ZDd'e fdGdHZEdIdJ ZFdKdL ZGdMdN ZHdOdP ZIdS )R    )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)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S )UpdateStatusz2Represents the availability of a security package.upgrade_availablepending_attachpending_enableupgrade_unavailableN)__name__
__module____qualname____doc__	AVAILABLE
UNATTACHEDNOT_ENABLEDUNAVAILABLE r1   r1   :/usr/lib/python3/dist-packages/uaclient/security_status.pyr$   '   s    r$   c                 C   s   t t|  d S )N)printr   create_package_list_str)packagesr1   r1   r2   print_package_list/   s   r6   )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<   r1   r1   r2   %get_origin_information_to_service_map3   s   r>   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 r1   )current_ver.0packager1   r1   r2   
<listcomp>E   s
    z4get_installed_packages_by_origin.<locals>.<listcomp>all)	r   listr   r   r5   apt_pkgDepCache get_origin_for_installed_packageappend)resultcacheinstalled_packages	dep_cacherD   r1   r1   r2    get_installed_packages_by_origin?   s"   



rP   rD   rO   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.
        unknownr8   third-party)
rA   	file_listlenget_candidate_verr>   getoriginarchiveESM_SERVICES	component)rD   rO   available_origins	candidaterY   _servicer1   r1   r2   rJ   T   s$   


rJ   service_nameua_infoc                 C   sP   | dv s|d r| |d v rt jjS |d st jjS | |d v r$t jjS t jjS )zDefines 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.
    )r9   standard-updatesattachedenabled_servicesentitled_services)r$   r-   valuer.   r/   r0   )ra   rb   r1   r1   r2   get_update_statusy   s   rh   r5   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 sw   Y  |S )zFilters 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   	backportsrc   N)r   rG   r   r   rA   version_listrU   r>   rX   rY   rZ   rK   sitename)r5   rL   	esm_cacherD   versioncounted_as_securityrY   r_   r`   expected_originesm_packager1   r1   r2   filter_updates   sZ   










..rr   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.)rd   re   rf   rf   r#   r   re   r"   )r   is_attachedr   r   contract_statusr   ENTITLEDrK   application_statusr   ENABLED)rs   rt   rb   infra_entitlementapps_entitlementr1   r1   r2   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 )rQ   Frl   patchedr}   )rC   fixr1   r1   r2   rE      s    z,get_livepatch_fixed_cves.<locals>.<listcomp>)
r   statusr   ProcessExecutionErrorr   proc_version_signature_versionkernelstatefixesrV   )	lp_statusour_kernel_versionr1   r1   r2   get_livepatch_fixed_cves   s"   

r   upgradable_versionsc                 C   sR   g }|   D ] \}}t||}|D ]\}}||jj|j||||jd qq|S )N)rD   rn   ra   r   rY   download_size)itemsrh   rK   
parent_pkgrl   ver_strsize)r   rb   updatesr`   rj   r   rn   rY   r1   r1   r2   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.
    uarF   num_installed_packagesrc   mainnum_main_packages
restrictednum_restricted_packagesuniversenum_universe_packages
multiversenum_multiverse_packagesrT   num_third_party_packagesrS   num_unknown_packagesr"   num_esm_infra_packagesr#   num_esm_apps_packagesnum_esm_infra_updatesnum_esm_apps_updatesr9   num_standard_security_updatesreboot_requiredz0.1
fixed_cves)_schema_versionsummaryr5   r   )r{   rP   rV   rr   r   r   r   r   )rs   rb   r   packages_by_originrN   r   r   r1   r1   r2   security_status_dict  s:   

r   rF   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 rt | d }|ss|rttj|j||d |dv rt | d }|s|rttj	|j||d td d S )NrF   )count rR   )rF   r"   r   r   r"   Main/Restricted)offsetr   
repository)rF   r#   r   r   r#   Universe/Multiverse)rF   rT   rT   )r   r   )rF   rS   rS   rQ   )
rV   r3   r   SS_SUMMARY_TOTALr=   r@   SS_SUMMARY_ARCHIVE	pluralizeSS_SUMMARY_THIRD_PARTYSS_SUMMARY_UNAVAILABLE)	r   r   r   total_packagesr   packages_mrpackages_umpackages_thirdpartypackages_unknownr1   r1   r2   _print_package_summaryK  sn   





	r   c                  C   sH   t  j} t| j}dt|jt|j}tt	j
j|d td d S )Nz{}/{}daterQ   )r   r<   r   eolr=   r@   monthyearr3   r   SS_INTERIM_SUPPORT)r<   eol_dater   r1   r1   r2   _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   r3   r   SS_LTS_SUPPORTr=   r@   r   SS_NO_SECURITY_COVERAGE)r<   r   r1   r1   r2   _print_lts_support  s
   
r   r`   r   service_statusservice_applicabilityinstalled_updatesavailable_updatesrt   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   r`   r   )r`   r   r   r   )r   rQ   r`   )r   r<   r   eol_esmr   rx   r   SS_SERVICE_ENABLEDr=   r@   r   SS_SERVICE_ADVERTISESS_SERVICE_ENABLED_COUNTSr   SS_SERVICE_ADVERTISE_COUNTSr3   DISABLEDr   
APPLICABLESS_SERVICE_COMMAND)
r`   r   r   r   r   r   rt   r<   eol_date_esmmessager1   r1   r2   _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 )NrQ   r   )days)r   r3   r   SS_UPDATE_UNKNOWNr   nowr   utcr   SS_UPDATE_DAYSr=   )last_apt_updater   time_since_updater1   r1   r2   _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  |	rttj nttj td	 tdd
||t|
d t||	d |
d s|
d s|
d rtdd||t|
d t||	d |	sttj d S d S )Nr   rd   r   r   r"   r   r   r#   rQ   r   r`   r   r   r   r   r   rt   r   )r   r   rw   applicability_statusr   r<   r    r{   rP   rr   r   r3   r   SS_HELP_CALLr   r!   r   SS_NO_INTERIM_PRO_SUPPORTr   r   r   SS_IS_ATTACHEDSS_IS_NOT_ATTACHEDr   rV   SS_LEARN_MORE)rs   esm_infra_entesm_apps_entesm_infra_statusesm_infra_applicabilityesm_apps_statusesm_apps_applicabilityr<   is_ltsrt   r   "security_upgradable_versions_infra!security_upgradable_versions_appsr1   r1   r2   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 )NrT   c                 S      g | ]}|j qS r1   rl   rB   r1   r1   r2   rE   +      z-list_third_party_packages.<locals>.<listcomp>Tr   r   rQ   rD   )rP   r   r3   r   SS_THIRD_PARTYSS_PACKAGES_HEADERr6   SS_SHOW_HINTr=   r   SS_NO_THIRD_PARTY)r   third_party_packagespackage_namesr1   r1   r2   list_third_party_packages(  s   

r   c                  C   r   )NrS   c                 S   r   r1   r   rB   r1   r1   r2   rE   ?  r   z-list_unavailable_packages.<locals>.<listcomp>Tr   rQ   r   )rP   r   r3   r   SS_UNAVAILABLEr   r6   r   r=   r   SS_NO_UNAVAILABLE)r   unknown_packagesr   r1   r1   r2   list_unavailable_packages<  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rt  td tdd||t|t|dd ttjjdd td t|	s rttjjdd t  rttjjdd t  pƈ}|r|rtjjdd}ntjjdd}t| t| |rttjjt |d d S d S d S )Nr"   r   r   r   c                 S   r   r1   r   rB   r1   r1   r2   rE   i  r   z+list_esm_infra_packages.<locals>.<listcomp>c                 S   r   r1   r   rB   r1   r1   r2   rE   l  r   c                    &   g | ]}|j vr|j  vr|j qS r1   r   rB   available_package_namesinstalled_package_namesr1   r2   rE   o      

Tr   rQ   r   Fr   r   r   )!rP   setrr   addr   r   r<   r    r   r   rw   r   sortedr   r!   r   r3   r   r   r   r   r   r   rV   SS_SERVICE_HELPr=   SS_UPDATES_AVAILABLEr6   SS_UPDATES_INSTALLEDSS_FURTHER_OTHER_PACKAGESSS_OTHER_PACKAGESr   r   )rs   r   infra_packagesmr_packagesall_infra_packagesinfra_updatessecurity_upgradable_versionsupdater_   r<   r   r   r   r   r   remaining_package_names	hint_listmsgr1   r  r2   list_esm_infra_packagesQ  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Ԉ rttjjdd t  rttjjdd t  p}|r|rtjjdd}ntjjdd}t| t| |rttjjt|d d S d S d S )Nr#   r   r   r   c                 S   r   r1   r   rB   r1   r1   r2   rE     r   z*list_esm_apps_packages.<locals>.<listcomp>c                 S   r   r1   r   rB   r1   r1   r2   rE     r   c                    r  r1   r   rB   r  r1   r2   rE     r  Tr   r   Fr   r   rQ   r   )rP   r  rr   r  r   r    r   rw   r   r  r   r3   r   r   r   rV   r	  r=   r
  r6   r  r  r  r   r   )rs   r   apps_packagesum_packagesall_apps_packagesapps_updatesr  r  r_   r   r   r   r   r  r  r  r1   r  r2   list_esm_apps_packages  s~   	
	r  )rF   F)Jcollectionsr   r   r   enumr   	functoolsr   randomr   typingr   r	   r
   r   r   rH   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   uaclient.configr   uaclient.entitlementsr   r   (uaclient.entitlements.entitlement_statusr   r   r   uaclient.systemr   r   r   r    r!   r[   r$   r6   r>   PackagerP   rI   r@   rJ   rh   Versionrr   r{   r   r   r   boolr   r   r   intr   r   r   r   r   r  r  r1   r1   r1   r2   <module>   s    


%
@!

4
?	
2MY