
    fUe                     f   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 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e      Z0 ed      d        Z1dedeejd                     f   fdZ3dejd                  dejh                  de5fdZ6de5dee5ef   de5fdZ7deejd                     dee5eeejp                  e5f      f   fd Z9d!edee5ef   fd"Z:deee5ef      fd#Z;d$ee5eeejp                  e5f      f   dee5ef   deee5ef      fd%Z<d!edee5ef   fd&Z=	 	 d;d'ee5eejd                     f   d(e5d)e>ddfd*Z?d+ Z@d, ZAd-e5d.e5d/e%d0e$d1eBd2eBd3e>fd4ZCd5 ZDd!efd6ZEd7 ZFd8 ZGd9 ZHd: ZIy)<    )defaultdict)datetimetimezone)Enum)	lru_cache)choice)AnyDefaultDictDictListTupleN)
exceptions	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                        e Zd ZdZdZdZdZdZy)UpdateStatusz2Represents the availability of a security package.upgrade_availablepending_attachpending_enableupgrade_unavailableN)__name__
__module____qualname____doc__	AVAILABLE
UNATTACHEDNOT_ENABLEDUNAVAILABLE     :/usr/lib/python3/dist-packages/uaclient/security_status.pyr&   r&   (   s    8#I!J"K'Kr4   r&   )maxsizec                      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{}-securitystandard-securityUbuntuESMAppsz{}-apps-securityr$   	UbuntuESMz{}-infra-securityr#   z{}-apps-updatesz{}-infra-updates)r   seriesformat)r<   s    r5   %get_origin_information_to_service_mapr>   0   s    &&F	=''/02E	,33F;<j	)0089;	+226:;Z	(//78+ r4   returnstrc                  D   t        t              } t        t              5 }|j                  D cg c]  }|j
                  s| }}|| d<   t        j                  |      }|D ]   }| t        ||         j                  |       " 	 d d d        | S c c}w # 1 sw Y   | S xY w)Nall)
r   listr   r   packagescurrent_verapt_pkgDepCache get_origin_for_installed_packageappend)resultcachepackageinstalled_packages	dep_caches        r5    get_installed_packages_by_originrO   <   s     F	)	* e#(>>
W5H5HG
 
 +u$$U+	) 	G0)DfWo	 M
 Ms#   BB BABBBrL   rN   c                    | j                   sy| j                   j                  }t        |      dk(  r/|j                  |       }|r| j                   |k(  ry|j                  }|D ]^  \  }}t	               j                  |j                  |j                  fd      }|t        v r|c S |j                  dk(  sR|j                  c S  y)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)
rE   	file_listlenget_candidate_verr>   getoriginarchiveESM_SERVICES	component)rL   rN   available_origins	candidaterY   _services          r5   rH   rH   Q   s     ++55 "//8	G//9<%//& $	79==]]FNN+R
 l"N==H$###$ r4   service_nameua_infoc                 
   | 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/   valuer0   r1   r2   )ra   rb   s     r5   get_update_statusri   v   s     @@
8J0K K%%+++:&&,,,w233''---##)))r4   rD   c                    t        t              }t        t              5 }| D ]  }|j                  s|j
                  D ]  }||j                  kD  sd}|j                  D ]Z  \  }}t               j                  |j                  |j                  f      }|s8||   j                  ||j                  f       d} n |j                  d   d   }	|rd|	j                  vs|d   j                  ||	j                  f        |j                  |v s||j                     }
|
j
                  D ]y  }||j                  kD  s|j                  D ]X  \  }}t               j                  |j                  |j                  f      }|s8||   j                  ||j                  f        y {  	 ddd       |S # 1 sw Y   |S xY w)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   	backportsrd   N)r   rC   r   r   rE   version_listrU   r>   rX   rY   rZ   rI   sitename)rD   rJ   	esm_cacherL   versioncounted_as_securityrY   r_   r`   expected_originesm_packages              r5   filter_updatesrt      s    F 
-	. ,*) +	*G""&33 G!4!44.3+)0):): 
&IFA E G K K%+]]FNN$C!" $
  ' &w 6 67M N6: 3 %
& +2*;*;A*>q*A 3 +?3J3J J"#56==!(/*>*> ?+8 <<9,"+GLL"9K#.#;#; 
*"W%8%88-4->-> *	*O*Q*U*U%+]]FNN$C+" $+$*7O$:$:)0&++(>%& %**
*C+	*,*\ M],*\ Ms<   F7F7AF79F7F7!0F7-F7 AF7(F77Gcfgc                     t        |       j                  }|g g d}|rt        |       }t        |       }|j	                         t
        j                  k(  r|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.)re   rf   rg   rg   r$   r   rf   r#   )r   is_attachedr   r   contract_statusr   ENTITLEDrI   application_statusr   ENABLED)ru   rw   rb   infra_entitlementapps_entitlements        r5   get_ua_infor~      s   s#//KG /4-c2++-1H1HH'(//
;//1!4 (() &'..z:,,..2I2II'(//<00215 (() &'..{;Nr4   c                     	 t        j                         } t	               j
                  }| ||| j                  k(  r| j                   | j                   j                  dk(  r{| j                   j                  et        | j                   j                        dkD  rC| j                   j                  D cg c]#  }|j                  xs d|j                  xs dd% c}S g S # t        j                  $ r g cY S w xY wc c}w )Nappliedr   rQ   F)rn   patched)r   statusr   ProcessExecutionErrorr   proc_version_signature_versionkernelstatefixesrV   rn   r   )	lp_statusour_kernel_versionfixs      r5   get_livepatch_fixed_cvesr      s    $$&	 )*II*)"2"22+%%2%%1	##))*Q. !**00
 XX^0DuE
 	

 I% ++ 	
s   C 2(C:C76C7upgradable_versionsc                     g }| j                         D ][  \  }}t        ||      }|D ]E  \  }}|j                  |j                  j                  |j
                  ||||j                  d       G ] |S )N)rL   rp   ra   r   rY   download_size)itemsri   rI   
parent_pkgrn   ver_strsize)r   rb   updatesr`   rl   r   rp   rY   s           r5   create_updates_listr      s     G!4!:!:!< "7G4+ 
	OGVNN&1166&$+$$%,\\	
	 Nr4   c                 Z   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.
    uarB   num_installed_packagesrd   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summaryrD   r   )r~   rO   rV   rt   r   r   r   r   )ru   rb   r   packages_by_originrM   r   r   s          r5   security_status_dictr     s    #GWoG9;+E2(+,>(?G$%();<.0*+!"5w?G#&'9&'A#BG ),-?-M)NG%&'*+=j+I'JG#$),-?-M)NG%&*-=)+G&' '**<Y*G&HG"#(+,>{,K(LG$%'*+=j+I'JG#$'*+>{+K'LG#$&)*=j*I&JG"#/2/00G+, "2#!6!F!FG !"$<$>?	 r4   package_lists
show_itemsalways_showc                    t        | d         }t        t        j                  j	                  |             dt        t        |            dz   z  }|dv rft        | d         t        | d         z   t        | d         z   }t        t        j                  j                  |      j	                  ||d	
             |dv rjt        | d         t        | d         z   t        | d         z   }|s|r:t        t        j                  j                  |      j	                  ||d
             |dv rKt        | d         }|s|r9t        t        j                  j                  |      j	                  ||             |dv rKt        | d         }|s|r9t        t        j                  j                  |      j	                  ||             t        d       y )NrB   )count rR   )rB   r#   r   r   r#   Main/Restricted)offsetr   
repository)rB   r$   r   r   r$   Universe/Multiverse)rB   rT   rT   )r   r   )rB   rS   rS   rQ   )
rV   printr   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_unknowns	            r5   _print_package_summaryr   H  s   
 u-.N	(
#
#
*
*
*
@ACN+,q01F))f%&--./-,-. 	
 	''11+>EE!, F 	
 ((j)*--./-
+,- 	
 +++55kBII!%4 J  ++!-">?+//99'&.A&B ''}Y78{//99$&!*   
"Ir4   c                  .   t               j                  } t        |       j                  }dj	                  t        |j                        t        |j                              }t        t        j                  j	                  |             t        d       y )Nz{}/{}daterQ   )r   r<   r   eolr=   r@   monthyearr   r   SS_INTERIM_SUPPORT)r<   eol_dater   s      r5   _print_interim_release_supportr     se    &&Fv&**H>>#hnn-s8==/ABD	(
%
%
,
,$
,
78	"Ir4   c                     t               j                  } t        |       rRt        |       j                  }t        t        j                  j                  t        |j                                     y t        t        j                         y )Nr   )r   r<   r!   r   r   r   r   SS_LTS_SUPPORTr=   r@   r   SS_NO_SECURITY_COVERAGE)r<   r   s     r5   _print_lts_supportr     s[    &&FF"6*..h%%,,#hmm2D,EFh../r4   r`   r   service_statusservice_applicabilityinstalled_updatesavailable_updatesrw   c                    t               j                  }t        |      j                  }|t        j
                  k(  r6t        j                  j                  || t        |j                              }	n5t        j                  j                  | |t        |j                              }	|r5|	dt        j                  j                  |      j                  |      z   z  }	|r5|	dt        j                  j                  |      j                  |      z   z  }	t        |	       |rZ|t        j                   k(  rG|t"        j$                  k(  r4t        d       t        t        j&                  j                  |              t        d       y )N)r   r`   r   )r`   r   r   r   )r   rQ   r`   )r   r<   r   eol_esmr   r{   r   SS_SERVICE_ENABLEDr=   r@   r   SS_SERVICE_ADVERTISESS_SERVICE_ENABLED_COUNTSr   SS_SERVICE_ADVERTISE_COUNTSr   DISABLEDr   
APPLICABLESS_SERVICE_COMMAND)
r`   r   r   r   r   r   rw   r<   eol_date_esmmessages
             r5   _print_service_supportr     sc    &&F"6*22L*222--44!\&&' 5 
 //66!\&&' 7 
 3;;EE

&%  

 	
 3==GG

&%  

 	

 
'N 	/888!%8%C%CCb	h))000AB	"Ir4   c                  R   t               } | %t        t        j                         t        d       y t	        j
                  t        j                        }|| z
  }|j                  dkD  r?t        t        j                  j                  |j                               t        d       y y )NrQ   r   )days)r   r   r   SS_UPDATE_UNKNOWNr   nowr   utcr   SS_UPDATE_DAYSr=   )last_apt_updater   time_since_updates      r5   _print_apt_update_callr     s    ,.Oh(()b	
,,x||
$Co-!h%%,,2C2H2H,IJb	 "r4   c           
      D   t        |       j                         d   }t        |       j                         d   }t        |       j                         d   }t        |       j                         d   }t	               j
                  }t               }t        |       d   }t               }t        |d   |d   z   |d   z         d   }	t        |d   |d   z   |d   z         d   }
t        |       t        t        j                         t        d	       t                |s/t        |      r
t!                t        t        j"                         y |t$        j&                  k(  r
t)                |rt        t        j*                         nt        t        j,                         t        d	       t/        dd
||t1        |d         t1        |	      |       |d   s
|d   s|d   r't/        dd||t1        |d         t1        |
      |       |st        t        j2                         y y )Nr   re   r   r   r#   r   r   r$   rQ   r   r`   r   r   r   r   r   rw   r   )r   rz   applicability_statusr   r   r<   r    r~   rO   rt   r   r   r   SS_HELP_CALLr   r!   r   SS_NO_INTERIM_PRO_SUPPORTr   r   r   SS_IS_ATTACHEDSS_IS_NOT_ATTACHEDr   rV   SS_LEARN_MORE)ru   esm_infra_statusesm_infra_applicabilityesm_apps_statusesm_apps_applicabilityr<   is_ltsrw   r   "security_upgradable_versions_infra!security_upgradable_versions_appss              r5   security_statusr     s   *3/BBDQG1#6KKM	 )-@@B1EO/4IIKAN&&F"$Fc":.K9;)76"
\
*	+
[
)	** 	*& )7:&
\
*	+
Z
(	)) 	)% -.	(

 	"I*,h001,555h%%&h))*	"I$'50=>@A 	:&l+j),*"8!"4Z"@A!"CD#	
 h$$% r4   c                     t               } | d   }|D cg c]  }|j                   }}t        | dd       |r{t        t        j
                         t        d       t        t        j                         t        |       t        t        j                  j                  t        |                   y t        t        j                         y c c}w )NrT   Tr   r   rQ   rL   )rO   rn   r   r   r   SS_THIRD_PARTYSS_PACKAGES_HEADERr"   SS_SHOW_HINTr=   r   SS_NO_THIRD_PARTY)r   third_party_packagesrL   package_namess       r5   list_third_party_packagesr  $  s    9;-m<1EFgW\\FMF}$ h%%&b	h))*=)h##**6-3H*IJh(() G   Cc                     t               } | d   }|D cg c]  }|j                   }}t        | dd       |r{t        t        j
                         t        d       t        t        j                         t        |       t        t        j                  j                  t        |                   y t        t        j                         y c c}w )NrS   Tr   rQ   r   )rO   rn   r   r   r   SS_UNAVAILABLEr   r"   r   r=   r   SS_NO_UNAVAILABLE)r   unknown_packagesrL   r  s       r5   list_unavailable_packagesr	  8  s    9;))41ABgW\\BMByd h%%&b	h))*=)h##**6-3H*IJ 	h(() Cr  c           
      ,   t               }|d   }|d   |d   z   }||z   }t               }t        |      d   }|D ]   \  }}|j                  |j                         " t               j                  }	t               }
t        |       j                         d   }t        |       j                         d   }t        |D cg c]  }|j                   c}      }t        |D cg c]  }|j                   c}      }t        |D cg c]*  }|j                  |vr|j                  |vr|j                  , c}      }t        |dd       |
s/t        |	      r
t                t!        t"        j$                         y |t&        j(                  k(  rt+                t!        d       t-        dd||t/        |      t/        |      d	
       t!        t"        j0                  j3                  d             t!        d       t        |	      s|r4t!        t"        j4                  j3                  d             t7        |       |r4t!        t"        j8                  j3                  d             t7        |       |xs |}|rY|r!t"        j:                  j3                  d      }n t"        j<                  j3                  d      }t!        |       t7        |       |r3t!        t"        j>                  j3                  tA        |                   y y y c c}w c c}w c c}w )Nr#   r   r   r   Tr   rQ   r   Fr   r   r   )!rO   setrt   addr   r   r<   r    r   rz   r   sortedrn   r   r!   r   r   r   r   r   r   r   r   rV   SS_SERVICE_HELPr=   SS_UPDATES_AVAILABLEr"   SS_UPDATES_INSTALLEDSS_FURTHER_OTHER_PACKAGESSS_OTHER_PACKAGESr   r   )ru   r   infra_packagesmr_packagesall_infra_packagesinfra_updatessecurity_upgradable_versionsupdater_   r<   r   r   r   rL   installed_package_namesavailable_package_namesremaining_package_names	hint_listmsgs                      r5   list_esm_infra_packagesr  M  s   9;'4N$V,/A,/OOK'+5EM#12D#E$  2 -	&++,- &&F"$F*3/BBDQG1#6KKM	 %%34'4 %%23'3 % .	
||#::$;; LL	
 { *,h001,555b	$'5n-m, 
(
"
"
)
)+
)
>?	"I"(//66{6KL67"(//66{6KL67+F/F	"88??' @  00777L#J67(''..vi7H.IJ +  Q 	5 	4	
s   <LL/Lc           
      x   t               }|d   }|d   |d   z   }||z   }t               }t        |      d   }|D ]   \  }}|j                  |j                         " t               }	t        |       j                         d   }
t        |       j                         d   }t        |D cg c]  }|j                   c}      }t        |D cg c]  }|j                   c}      }t        |D cg c]*  }|j                  |vr|j                  |vr|j                  , c}      }t        |dd       |	st        t        j                         y t        dd|
|t!        |      t!        |      d	       t        t        j"                  j%                  d
             t        d       |r|r4t        t        j&                  j%                  d
             t)        |       |r4t        t        j*                  j%                  d
             t)        |       |xs |}|rY|r!t        j,                  j%                  d
      }n t        j.                  j%                  d
      }t        |       t)        |       |r3t        t        j0                  j%                  t3        |                   y y y c c}w c c}w c c}w )Nr$   r   r   r   Tr   r   Fr   r   rQ   r   )rO   r  rt   r  r   r    r   rz   r   r  rn   r   r   r   r   r   rV   r  r=   r  r"   r  r  r  r   r   )ru   r   apps_packagesum_packagesall_apps_packagesapps_updatesr  r  r_   r   r   r   rL   r  r  r  r  r  s                     r5   list_esm_apps_packagesr$    s   9;&z2M:&);L)II  &35L#12C#D$  2 ,	**+, #$F(-@@B1EO/4IIKAN$%23'3 %%12'2 % -	
||#::$;; LL	
 zt h001(&4m,l+ 
(
"
"
)
)*
)
=>	"I"(//66z6JK67"(//66z6JK67+F/F	 #88??& @  0077
7K#J67(''..vi7H.IJ - E 	4 	3	
s   (J-J2./J7)rB   F)Jcollectionsr   r   r   enumr   	functoolsr   randomr   typingr	   r
   r   r   r   rF   uaclientr   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!   uaclient.utilr"   r[   r&   r>   PackagerO   rG   r@   rH   ri   Versionrt   r~   r   r   r   boolr   r   r   intr   r   r   r  r	  r  r$  r3   r4   r5   <module>r7     s   # '    6 6  4 4 B  % I 
  -((4 ( 4 +	4  + *"__")0)9)9""J*C *$sCx. *S *"=7??#=d5#!56778=@X $sCx. B$tCH~"6 0$S$uW__c5I/J*K%KL#s(^ 
$sCx.,/h /4S> /h <sD$99:<< < 
	<~0/// &/ /	/
 / / /dI& I&X*(**UKpOKr4   