
Ked              
   @   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- dH Z. Gd d   d e  Z/ e d d  d d    Z0 e d e e j1 f d d d    Z2 e j1 e j3 e4 d d d    Z5 e4 e e4 e f e4 d d  d!    Z6 e e j1 e e4 e e e j7 e4 f f d" d# d$    Z8 e e e4 e f d% d& d'    Z9 e e e4 e f d d( d)    Z: e e4 e e e j7 e4 f f e e4 e f e e e4 e f d* d+ d,    Z; e e e4 e f d% d- d.    Z< d/ d0 e e4 e e j1 f e4 e= d d1 d2 d3   Z> d4 d5   Z? d6 d7   Z@ e4 e4 e$ e# eA eA e= d8 d9 d:    ZB d; d<   ZC e d= d> d?    ZD d@ dA   ZE dB dC   ZF dD dE   ZG dF dG   ZH d S)I    )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   sy   t    j }  d d j |   f d d d j |   f d d d j |   f d	 d d
 j |   f d d d j |   f d	 i S)NUbuntuz{}-securityzstandard-securityZUbuntuESMAppsz{}-apps-securityzesm-appsZ	UbuntuESMz{}-infra-securityz	esm-infraz{}-apps-updatesz{}-infra-updates)r   seriesformat)r0   r,   r,   r-   %get_origin_information_to_service_map0   s    r2   str)returnc              C   s   t  t  }  t t  a } d d   | j D } | |  d <t j |  } x( | D]  } |  t | |  j |  qQ WWd  QRX|  S)Nc             S   s   g  |  ] } | j  r |  q Sr,   )current_ver).0packager,   r,   r-   
<listcomp>C   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_cacher7   r,   r,   r-    get_installed_packages_by_origin<   s    
rD   )r7   rC   r4   c             C   s   |  j  s d S|  j  j } t |  d k r] | j |   } | sP |  j  | k rT d S| j } x[ | D]S \ } } t   j | j | j f d  } | t k r | S| j d k rd | j	 Sqd Wd 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/   zthird-party)
r5   	file_listlenZget_candidate_verr2   getoriginarchiveESM_SERVICESZ	component)r7   rC   Zavailable_origins	candidaterK   _servicer,   r,   r-   r>   Q   s     			r>   )service_nameua_infor4   c             C   sh   |  d k s& | d r0 |  | d k r0 t  j j S| d sD t  j j S|  | d k r^ t  j j St  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.
    standard-securitystandard-updatesattachedenabled_servicesentitled_services)rS   rT   )r#   r(   valuer)   r*   r+   )rQ   rR   r,   r,   r-   get_update_statusv   s    



rY   )r;   r4   c             C   s  t  t  } t t  } xx|  D]p} | j r" x | j D] } | | j k r; d } x\ | j D]Q \ } } t   j | j	 | j
 f  } | r` | | j | | j f  d } Pq` W| j d d }	 | r; d |	 j
 k r; | d j | |	 j f  q; W| j | k r" | | j }
 xy |
 j D]n } | | j k r xV | j D]K \ } } t   j | j	 | j
 f  } | r?| | j | | j f  Pq?Wq Wq" WWd QRX| 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	backportszstandard-updatesN)r   r:   r   r   r5   version_listrH   r2   rJ   rK   rL   r?   Zsitename)r;   r@   Z	esm_cacher7   versionZcounted_as_securityrK   rO   rP   Zexpected_originZesm_packager,   r,   r-   filter_updates   s>    		
	
r]   )cfgr4   c             C   s   t  |   j } d | d g  d g  i } | r t |   } t |   } | j   t j k rk | d j d  | j   d t	 j
 k r | d j d  | j   t j k r | d j d  | j   d t	 j
 k r | d j d  | S)z7Returns the Pro information based on the config object.rU   rV   rW   zesm-appsr   z	esm-infra)r   is_attachedr   r   Zcontract_statusr   ZENTITLEDr?   application_statusr   ENABLED)r^   r_   rR   Zinfra_entitlementZapps_entitlementr,   r,   r-   get_ua_info   s$    rb   c              C   s   t  j   }  t   j } |  d  k	 r | d  k	 r | |  j k r |  j  d  k	 r |  j  j d k r |  j  j d  k	 r t |  j  j  d k r d d   |  j  j D Sg  S)NZappliedr   c             S   s4   g  |  ]* } d  | j  p d d | j p* d i  q S)r[   rE   patchedF)r[   rc   )r6   Zfixr,   r,   r-   r8      s   	z,get_livepatch_fixed_cves.<locals>.<listcomp>)r   statusr   Zproc_version_signature_versionZkernelstatefixesrI   )Z	lp_statusZour_kernel_versionr,   r,   r-   get_livepatch_fixed_cves   s    	rg   )upgradable_versionsrR   r4   c             C   s   g  } x} |  j    D]o \ } } t | |  } xQ | D]I \ } } | j d | j j d | j d | d | d | d | j i  q5 Wq W| S)Nr7   r\   rQ   rd   rK   Zdownload_size)itemsrY   r?   
parent_pkgr[   Zver_strsize)rh   rR   updatesrP   rZ   rd   r\   rK   r,   r,   r-   create_updates_list   s    	rm   c          	   C   st  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 d | d | d d t   i i 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uar9   Znum_installed_packageszstandard-updatesmainZnum_main_packages
restrictedZnum_restricted_packagesuniverseZnum_universe_packages
multiverseZnum_multiverse_packageszthird-partyZnum_third_party_packagesrG   Znum_unknown_packagesz	esm-infraZnum_esm_infra_packageszesm-appsZnum_esm_apps_packagesZnum_esm_infra_updatesZnum_esm_apps_updateszstandard-securityZnum_standard_security_updatesreboot_requiredZ_schema_versionz0.1summaryr;   r   Z
fixed_cves)rb   rD   rI   r]   rm   r   rr   rg   )r^   rR   rs   packages_by_originrB   rh   rl   r,   r,   r-   security_status_dict  s4    
	

ru   r9   F)package_lists
show_itemsalways_showr4   c       	      C   s  t  |  d  } t t j j d |   d t  t |   d } | d k r t  |  d  t  |  d  t  |  d  } t t j j |  j d | d | d	 d
   | d k rt  |  d  t  |  d  t  |  d  } | s | rt t j j |  j d | d | d	 d   | d k rkt  |  d  } | sC| rkt t j j |  j d | d |   | d k rt  |  d  } | s| rt t j	 j |  j d | d |   t d  d  S)Nr9   count rF   	esm-infrarn   ro   offset
repositoryzMain/Restrictedesm-appsrp   rq   zUniverse/Multiversethird-partyrG   rE   )allr{   )r   r~   )r   r   )r   zunknown)
rI   printr   ZSS_SUMMARY_TOTALr1   r3   ZSS_SUMMARY_ARCHIVE	pluralizeZSS_SUMMARY_THIRD_PARTYZSS_SUMMARY_UNAVAILABLE)	rv   rw   rx   Ztotal_packagesr|   Zpackages_mrZpackages_umZpackages_thirdpartyZpackages_unknownr,   r,   r-   _print_package_summaryD  sD    ,
,
		
r   c              C   sf   t    j }  t |   j } d j t | j  t | j   } t t	 j
 j d |   t d  d  S)Nz{}/{}daterE   )r   r0   r   eolr1   r3   Zmonthyearr   r   ZSS_INTERIM_SUPPORT)r0   eol_dater   r,   r,   r-   _print_interim_release_support  s
    $r   c              C   s]   t    j }  t |   rL t |   j } t t j j d t	 | j
    n t t j  d  S)Nr   )r   r0   r   r   r   r   r   ZSS_LTS_SUPPORTr1   r3   r   ZSS_NO_SECURITY_COVERAGE)r0   r   r,   r,   r-   _print_lts_support  s
    %r   )rP   r}   service_statusservice_applicabilityinstalled_updatesavailable_updatesr_   c       
      C   s8  t    j } t |  j } | t j k rW t j j d | d |  d t	 | j
   }	 n* t j j d |  d | d t	 | j
   }	 | r |	 d t j j |  j d |  7}	 | r |	 d t j j |  j d |  7}	 t |	  | r*| t j k r*| t j k r*t d  t t j j d |    t d  d  S)Nr}   rP   r   rz   rl   rE   )r   r0   r   Zeol_esmr   ra   r   ZSS_SERVICE_ENABLEDr1   r3   r   ZSS_SERVICE_ADVERTISEZSS_SERVICE_ENABLED_COUNTSr   ZSS_SERVICE_ADVERTISE_COUNTSr   DISABLEDr   Z
APPLICABLEZSS_SERVICE_COMMAND)
rP   r}   r   r   r   r   r_   r0   Zeol_date_esmmessager,   r,   r-   _print_service_support  s4    	

r   c              C   s   t    }  |  d  k r0 t t j  t d  d  St j t j  } | |  } | j d k r t t j	 j
 d | j   t d  d  S)NrE   r   days)r   r   r   ZSS_UPDATE_UNKNOWNr   nowr   Zutcr   ZSS_UPDATE_DAYSr1   )Zlast_apt_updater   Ztime_since_updater,   r,   r-   _print_apt_update_call  s    	

r   )r^   c             C   s  t  |   j   d } t  |   j   d } t |   j   d } t |   j   d } t   j } t   } t |   d } t   } t	 | d | d | d  d }	 t	 | d | d | d  d }
 t
 |  t t j  t d	  t   | s t |  rt   t t j  d  S| t j k r6t   | rLt t j  n t t j  t d	  t d
 d d d d | d | d t | d  d t |	  d |  | d s| d s| d rt d
 d d d d | d | d t | d  d t |
  d |  | st t j  d  S)Nr   rU   rn   ro   z	esm-infrarp   rq   zesm-appsrE   rP   r}   zMain/Restrictedr   r   r   r   r_   zUniverse/Multiverse)r   r`   applicability_statusr   r   r0   r   rb   rD   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   rI   ZSS_LEARN_MORE)r^   esm_infra_statusesm_infra_applicabilityesm_apps_statusesm_apps_applicabilityr0   is_ltsr_   rt   Z"security_upgradable_versions_infraZ!security_upgradable_versions_appsr,   r,   r-   security_status  sf    		





r   c              C   s   t    }  |  d } d d   | D } t |  d d d d | r t t j  t d  t t j  t |  t t j j d t	 |    n t t j
  d  S)	Nzthird-partyc             S   s   g  |  ] } | j   q Sr,   )r[   )r6   r7   r,   r,   r-   r8   #  s   	 z-list_third_party_packages.<locals>.<listcomp>rw   rx   TrE   r7   )rD   r   r   r   ZSS_THIRD_PARTYSS_PACKAGES_HEADERr    SS_SHOW_HINTr1   r   ZSS_NO_THIRD_PARTY)rt   Zthird_party_packagespackage_namesr,   r,   r-   list_third_party_packages   s    	


"r   c              C   s   t    }  |  d } d d   | D } t |  d d d d | r t t j  t d  t t j  t |  t t j j d t	 |    n t t j
  d  S)	NrG   c             S   s   g  |  ] } | j   q Sr,   )r[   )r6   r7   r,   r,   r-   r8   7  s   	 z-list_unavailable_packages.<locals>.<listcomp>rw   rx   TrE   r7   )rD   r   r   r   ZSS_UNAVAILABLEr   r    r   r1   r   ZSS_NO_UNAVAILABLE)rt   Zunknown_packagesr   r,   r,   r-   list_unavailable_packages4  s    	


"r   c                s  t    } | d } | d | d } | | } t   } t |  d } x$ | D] \ } } | j | j  qO Wt   j }	 t   }
 t |   j	   d } t |   j
   d } t d d   | D   t d d   | D    t    f d d   | D  } t | d	 d d
 d |
 sDt |	  r3t   t t j  d  S| t j k rdt   t d  t d d d d d | d | d t |  d 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{| rRt j j d d  } n t j j d d  } t |  t |  | rt t j j d t |    d  S)Nz	esm-infrarn   ro   r   c             S   s   g  |  ] } | j   q Sr,   )r[   )r6   r7   r,   r,   r-   r8   `  s   	 z+list_esm_infra_packages.<locals>.<listcomp>c             S   s   g  |  ] } | j   q Sr,   )r[   )r6   r7   r,   r,   r-   r8   c  s   	 c                s7   g  |  ]- } | j   k r | j    k r | j   q Sr,   )r[   )r6   r7   )available_package_namesinstalled_package_namesr,   r-   r8   g  s   	rw   rx   TrE   rP   r}   zMain/Restrictedr   r   r   r   r_   Fr7   ) rD   setr]   addrj   r   r0   r   r   r`   r   sortedr   r   r   r   r   r   r   r   r   r   rI   SS_SERVICE_HELPr1   SS_UPDATES_AVAILABLEr    SS_UPDATES_INSTALLEDSS_FURTHER_OTHER_PACKAGESSS_OTHER_PACKAGESr   r   )r^   rt   Zinfra_packagesZmr_packagesZall_infra_packagesZinfra_updatessecurity_upgradable_versionsupdaterO   r0   r   r   r   remaining_package_names	hint_listmsgr,   )r   r   r-   list_esm_infra_packagesI  st    	

			





r   c                s_  t    } | d } | d | d } | | } t   } t |  d } x$ | D] \ } } | j | j  qO Wt   }	 t |   j   d }
 t |   j   d } t	 d d   | D   t	 d d   | D    t	    f d d   | D  } t
 | d	 d d
 d |	 s%t t j  d  St d d d d d |
 d | d t |  d 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 } | r6| rt j j d d  } n t j j d d  } t |  t |  | r[t t j j d t |    d  S)Nzesm-appsrp   rq   r   c             S   s   g  |  ] } | j   q Sr,   )r[   )r6   r7   r,   r,   r-   r8     s   	 z*list_esm_apps_packages.<locals>.<listcomp>c             S   s   g  |  ] } | j   q Sr,   )r[   )r6   r7   r,   r,   r-   r8     s   	 c                s7   g  |  ]- } | j   k r | j    k r | j   q Sr,   )r[   )r6   r7   )r   r   r,   r-   r8     s   	rw   rx   TrP   r}   zUniverse/Multiverser   r   r   r   r_   FrE   r7   )rD   r   r]   r   rj   r   r   r`   r   r   r   r   r   r   r   rI   r   r1   r   r    r   r   r   r   r   )r^   rt   Zapps_packagesZum_packagesZall_apps_packagesZapps_updatesr   r   rO   r   r   r   r   r   r   r,   )r   r   r-   list_esm_apps_packages  sf    	

			




r   )r!   r"   )Icollectionsr   r   r   Zenumr   	functoolsr   Zrandomr   Z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    rM   r#   r2   ZPackagerD   r=   r3   r>   rY   ZVersionr]   rb   rg   rm   ru   boolr   r   r   intr   r   r   r   r   r   r   r,   r,   r,   r-   <module>   sb   ("(##%
0>"!##"4;
+LX