U
    lHJed                     @   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 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 dl,m-Z- dZ.G dd deZ/edddd Z0edeej1 f dddZ2ej1ej3e4dddZ5e4ee4ef e4ddd Z6eej1 ee4eeej7e4f  f d!d"d#Z8eee4ef d$d%d&Z9eee4ef  dd'd(Z:ee4eeej7e4f  f ee4ef eee4ef  d)d*d+Z;eee4ef d$d,d-Z<dGee4eej1 f e4e=dd0d1d2Z>d3d4 Z?d5d6 Z@e4e4e$e#eAeAe=d7d8d9ZBd:d; ZCed<d=d>ZDd?d@ ZEdAdB ZFdCdD ZGdEdF ZHdS )H    )defaultdict)datetimetimezone)Enum)	lru_cache)choice)AnyDefaultDictDictListTupleN)	livepatchmessages)_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)print_package_list)	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.Zupgrade_availableZpending_attachZpending_enableZupgrade_unavailableN)__name__
__module____qualname____doc__	AVAILABLE
UNATTACHEDNOT_ENABLEDUNAVAILABLE r,   r,   :/usr/lib/python3/dist-packages/uaclient/security_status.pyr#   (   s
   r#   )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-securityZUbuntuESMAppsz{}-apps-securityr"   Z	UbuntuESMz{}-infra-securityr!   z{}-apps-updatesz{}-infra-updates)r   seriesformat)r1   r,   r,   r-   %get_origin_information_to_service_map0   s         r3   str)returnc               	   C   s`   t t} ttF}dd |jD }|| d< t|}|D ]}| t|| | q8W 5 Q R X | S )Nc                 S   s   g | ]}|j r|qS r,   )current_ver.0packager,   r,   r-   
<listcomp>B   s     z4get_installed_packages_by_origin.<locals>.<listcomp>all)	r   listr   r   packagesapt_pkgDepCache get_origin_for_installed_packageappend)resultcacheinstalled_packages	dep_cacher9   r,   r,   r-    get_installed_packages_by_origin<   s    

rF   )r9   rE   r5   c                 C   s   | j s
dS | j j}t|dkr@|| }|r6| j |kr:dS |j}|D ]B\}}t |j|jfd}|tkrr|  S |jdkrD|j	  S qDd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)
r6   	file_listlenZget_candidate_verr3   getoriginarchiveESM_SERVICESZ	component)r9   rE   Zavailable_origins	candidaterN   _servicer,   r,   r-   r@   Q   s$    

 
r@   )service_nameua_infor5   c                 C   sP   | dks|d r$| |d kr$t jjS |d s4t jjS | |d krHt 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.
    )r0   standard-updatesattachedenabled_servicesentitled_services)r#   r(   valuer)   r*   r+   )rT   rU   r,   r,   r-   get_update_statusv   s    
r[   )r=   r5   c              	   C   s,  t t}tt}| D ]}|jr|jD ]}||jkr*d}|jD ]<\}}t |j	|j
f}|rB|| ||jf d} qqB|jd d }	|s*d|	j
kr*|d ||	jf q*|j|kr||j }
|
jD ]N}||jkr|jD ]8\}}t |j	|j
f}|r|| ||jf  qqqqW 5 Q R X |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   Z	backportsrV   )r   r<   r   r   r6   version_listrK   r3   rM   rN   rO   rA   Zsitename)r=   rB   Z	esm_cacher9   versionZcounted_as_securityrN   rR   rS   Zexpected_originZesm_packager,   r,   r-   filter_updates   sL    








r_   )cfgr5   c                 C   s   t | j}|g g d}|rt| }t| }| tjkrF|d d | d t	j
krf|d d | tjkr|d d | d t	j
kr|d d |S )z7Returns the Pro information based on the config object.)rW   rX   rY   rY   r"   r   rX   r!   )r   is_attachedr   r   Zcontract_statusr   ZENTITLEDrA   application_statusr   ENABLED)r`   ra   rU   Zinfra_entitlementZapps_entitlementr,   r,   r-   get_ua_info   s.    


rd   c                  C   sr   t  } t j}| d k	rn|d k	rn|| jkrn| j d k	rn| j jdkrn| j jd k	rnt| j jdkrndd | j jD S g S )NZappliedr   c                 S   s"   g | ]}|j pd |jpddqS )rG   Fr]   Zpatchedre   )r8   Zfixr,   r,   r-   r:      s   z,get_livepatch_fixed_cves.<locals>.<listcomp>)r   statusr   Zproc_version_signature_versionZkernelstatefixesrL   )Z	lp_statusZour_kernel_versionr,   r,   r-   get_livepatch_fixed_cves   s(    

	ri   )upgradable_versionsrU   r5   c                 C   sR   g }|   D ]@\}}t||}|D ](\}}||jj|j||||jd q"q|S )N)r9   r^   rT   rf   rN   Zdownload_size)itemsr[   rA   
parent_pkgr]   Zver_strsize)rj   rU   updatesrS   r\   rf   r^   rN   r,   r,   r-   create_updates_list   s    
ro   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.
    Zuar;   Znum_installed_packagesrV   mainZnum_main_packages
restrictedZnum_restricted_packagesuniverseZnum_universe_packages
multiverseZnum_multiverse_packagesrJ   Znum_third_party_packagesrI   Znum_unknown_packagesr!   Znum_esm_infra_packagesr"   Znum_esm_apps_packagesZnum_esm_infra_updatesZnum_esm_apps_updatesr0   Znum_standard_security_updatesreboot_requiredz0.1Z
fixed_cves)Z_schema_versionsummaryr=   r   )rd   rF   rL   r_   ro   r   rt   ri   )r`   rU   ru   packages_by_originrD   rj   rn   r,   r,   r-   security_status_dict  s:    

rw   r;   F)package_lists
show_itemsalways_showr5   c           	      C   sL  t | d }ttjj|d dt t|d  }|dkrzt | d t | d  t | d  }ttj|j||d	d
 |dkrt | d t | d  t | d  }|s|rttj|j||dd
 |dkrt | d }|s|rttj|j||d |dkr@t | d }|s&|r@ttj	|j||d td d S )Nr;   )count rH   )r;   r!   rp   rq   r!   Main/Restricted)offsetr{   
repository)r;   r"   rr   rs   r"   Universe/Multiverse)r;   rJ   rJ   )r~   r{   )r;   rI   rI   rG   )
rL   printr   ZSS_SUMMARY_TOTALr2   r4   ZSS_SUMMARY_ARCHIVE	pluralizeZSS_SUMMARY_THIRD_PARTYZSS_SUMMARY_UNAVAILABLE)	rx   ry   rz   Ztotal_packagesr~   Zpackages_mrZpackages_umZpackages_thirdpartyZpackages_unknownr,   r,   r-   _print_package_summaryD  sn    







 
	r   c                  C   sH   t  j} t| j}dt|jt|j}tt	j
j|d td d S )Nz{}/{}daterG   )r   r1   r   eolr2   r4   Zmonthyearr   r   ZSS_INTERIM_SUPPORT)r1   eol_dater   r,   r,   r-   _print_interim_release_support  s
    
r   c                  C   sB   t  j} t| r4t| j}ttjjt	|j
d n
ttj d S )Nr   )r   r1   r   r   r   r   r   ZSS_LTS_SUPPORTr2   r4   r   ZSS_NO_SECURITY_COVERAGE)r1   r   r,   r,   r-   _print_lts_support  s
    
r   rS   r   service_statusservice_applicabilityinstalled_updatesavailable_updatesra   c           
      C   s   t  j}t|j}|tjkr6tjj|| t	|j
d}	ntjj| |t	|j
d}	|rn|	dtj|j|d 7 }	|r|	dtj|j|d 7 }	t|	 |r|tjkr|tjkrtd ttjj| d td d S )N)r   rS   r   )rS   r   r   r|   )rn   rG   rS   )r   r1   r   Zeol_esmr   rc   r   ZSS_SERVICE_ENABLEDr2   r4   r   ZSS_SERVICE_ADVERTISEZSS_SERVICE_ENABLED_COUNTSr   ZSS_SERVICE_ADVERTISE_COUNTSr   DISABLEDr   Z
APPLICABLEZSS_SERVICE_COMMAND)
rS   r   r   r   r   r   ra   r1   Zeol_date_esmmessager,   r,   r-   _print_service_support  sF    	





r   c                  C   sb   t  } | d kr$ttj td d S ttj}||  }|jdkr^ttj	j
|jd td d S )NrG   r   )days)r   r   r   ZSS_UPDATE_UNKNOWNr   nowr   Zutcr   ZSS_UPDATE_DAYSr2   )Zlast_apt_updater   Ztime_since_updater,   r,   r-   _print_apt_update_call  s    

r   )r`   c              	   C   s  t |  d }t |  d }t|  d }t|  d }t j}t }t| d }t }t	|d |d  |d  d }	t	|d |d  |d  d }
t
| ttj td	 t  |st|rt  ttj d S |tjkrt  |rttj n
ttj td	 tdd
||t|d t|	|d |d sT|d sT|d rvtdd||t|d t|
|d |sttj d S )Nr   rW   rp   rq   r!   rr   rs   r"   rG   r}   r   r   )r   rb   applicability_statusr   r   r1   r   rd   rF   r_   r   r   r   ZSS_HELP_CALLr   r   r   SS_NO_INTERIM_PRO_SUPPORTr   r   r   ZSS_IS_ATTACHEDZSS_IS_NOT_ATTACHEDr   rL   ZSS_LEARN_MORE)r`   esm_infra_statusesm_infra_applicabilityesm_apps_statusesm_apps_applicabilityr1   is_ltsra   rv   Z"security_upgradable_versions_infraZ!security_upgradable_versions_appsr,   r,   r-   security_status  s    







r   c                  C   sx   t  } | d }dd |D }t| ddd |rjttj td ttj t| ttjjt	|d n
ttj
 d S )NrJ   c                 S   s   g | ]
}|j qS r,   r]   r7   r,   r,   r-   r:   #  s     z-list_third_party_packages.<locals>.<listcomp>Try   rz   rG   r9   )rF   r   r   r   ZSS_THIRD_PARTYSS_PACKAGES_HEADERr    SS_SHOW_HINTr2   r   ZSS_NO_THIRD_PARTY)rv   Zthird_party_packagespackage_namesr,   r,   r-   list_third_party_packages   s      

r   c                  C   sx   t  } | d }dd |D }t| ddd |rjttj td ttj t| ttjjt	|d n
ttj
 d S )NrI   c                 S   s   g | ]
}|j qS r,   r   r7   r,   r,   r-   r:   7  s     z-list_unavailable_packages.<locals>.<listcomp>Tr   rG   r   )rF   r   r   r   ZSS_UNAVAILABLEr   r    r   r2   r   ZSS_NO_UNAVAILABLE)rv   Zunknown_packagesr   r,   r,   r-   list_unavailable_packages4  s      

r   c              	      s  t  }|d }|d |d  }|| }t }t|d }|D ]\}}||j q<t j}	t }
t| 	 d }t| 
 d }tdd |D tdd |D  t fdd|D }t|dd	d
 |
st|	rt  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 rft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 )Nr!   rp   rq   r   c                 S   s   g | ]
}|j qS r,   r   r7   r,   r,   r-   r:   `  s     z+list_esm_infra_packages.<locals>.<listcomp>c                 S   s   g | ]
}|j qS r,   r   r7   r,   r,   r-   r:   c  s     c                    s&   g | ]}|j kr|j  kr|j qS r,   r   r7   Zavailable_package_namesZinstalled_package_namesr,   r-   r:   f  s   

Tr   rG   r}   Fr   r   r   ) rF   setr_   addrl   r   r1   r   r   rb   r   sortedr   r   r   r   r   r   r   r   r   r   rL   SS_SERVICE_HELPr2   SS_UPDATES_AVAILABLEr    SS_UPDATES_INSTALLEDSS_FURTHER_OTHER_PACKAGESSS_OTHER_PACKAGESr   r   )r`   rv   Zinfra_packagesZmr_packagesZall_infra_packagesZinfra_updatessecurity_upgradable_versionsupdaterR   r1   r   r   r   remaining_package_names	hint_listmsgr,   r   r-   list_esm_infra_packagesI  s    
	  
	

r   c              	      s  t  }|d }|d |d  }|| }t }t|d }|D ]\}}||j q<t }	t|  d }
t|  d }t	dd |D t	dd |D  t	 fdd|D }t
|dd	d
 |	sttj d S tdd|
|t|t|dd ttjjdd td |r r2ttjjdd t  rRttjjdd t  pZ}|r|rxtjjdd}ntjjdd}t| t| |rttjjt|d d S )Nr"   rr   rs   r   c                 S   s   g | ]
}|j qS r,   r   r7   r,   r,   r-   r:     s     z*list_esm_apps_packages.<locals>.<listcomp>c                 S   s   g | ]
}|j qS r,   r   r7   r,   r,   r-   r:     s     c                    s&   g | ]}|j kr|j  kr|j qS r,   r   r7   r   r,   r-   r:     s   

Tr   r   Fr   r   rG   r   )rF   r   r_   r   rl   r   r   rb   r   r   r   r   r   r   r   rL   r   r2   r   r    r   r   r   r   r   )r`   rv   Zapps_packagesZum_packagesZall_apps_packagesZapps_updatesr   r   rR   r   r   r   r   r   r   r,   r   r-   list_esm_apps_packages  s|    	  
	
r   )r;   F)Icollectionsr   r   r   enumr   	functoolsr   Zrandomr   typingr   r	   r
   r   r   r>   Zuaclientr   r   Z5uaclient.api.u.pro.security.status.reboot_required.v1r   Z(uaclient.api.u.pro.status.is_attached.v1r   Zuaclient.aptr   r   r   r   Zuaclient.configr   Zuaclient.entitlementsr   r   Z(uaclient.entitlements.entitlement_statusr   r   r   Zuaclient.systemr   r   r   r   r   Zuaclient.utilr    rP   r#   r3   ZPackagerF   r?   r4   r@   r[   ZVersionr_   rd   ri   ro   rw   boolr   r   r   intr   r   r   r   r   r   r   r,   r,   r,   r-   <module>   sz   
 %@!
4  ?
2LX