
    gh                        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e      Z0d Z1 ed      d        Z2dedeejf                     f   fdZ4dejf                  dejj                  de6fdZ7 ed      de6de6de8fd       Z9de6d ee6ef   dejt                  de6fd!Z;d"eejf                     dee6eeejt                  e6f      f   fd#Z<d$e!dee6ef   fd%Z=deee6ef      fd&Z>d'ee6eeejt                  e6f      f   d ee6ef   deee6ef      fd(Z?d$e!dee6ef   fd)Z@	 	 d>d*ee6eejf                     f   d+e6d,e8ddfd-ZAd. ZBd/ ZCd0e6d1e6d2e'd3e&d4eDd5eDd6e8fd7ZEd8 ZFd$e!fd9ZGd: ZHd; ZId< ZJd= ZKy)?    )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                   $    e Zd ZdZdZdZdZdZdZy)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     :/usr/lib/python3/dist-packages/uaclient/security_status.pyr'   r'   (   s    8#I?!J"K'Kr7   r'   c                 @    t        t        j                  |              y )N)printr   create_package_list_str)packagess    r8   print_package_listr=   1   s    	$
&
&x
01r7   )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)rD   s    r8   %get_origin_information_to_service_maprF   5   s    &&F	=''/02E	,33F;<j	)0089;	+226:;Z	(//78+ r7   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   r<   current_verapt_pkgDepCache get_origin_for_installed_packageappend)resultcachepackageinstalled_packages	dep_caches        r8    get_installed_packages_by_originrV   A   s     F	)	* e#(>>
W5H5HG
 
 +u$$U+	) 	G0)DfWo	 M
 Ms#   BB BABBBrS   rU   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.
        unknownr@   third-party)
rL   	file_listlenget_candidate_verrF   getoriginarchiveESM_SERVICES	component)rS   rU   available_origins	candidater`   _services          r8   rO   rO   V   s     ++55 "//8	G//9<%//& $	79==]]FNN+R
 l"N==H$###$ r7   pkgversionc                 ,    t        | d      }|r||k(  S y)z;Returns True if the package version is a candidate version.F)check_esm_cache)r   )rh   ri   candidate_versions      r8   _is_candidate_versionrm   {   s#     2#uM+++r7   service_nameua_infoc                    | dv s|d   rg| |d   v r`t        |j                  j                  |j                        }|rt        j
                  j                  S 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.
    )rA   standard-updatesattachedenabled_servicesentitled_services)rm   
parent_pkgnamever_strr'   r1   valuer2   r3   r4   r5   )rn   ro   ri   is_candidates       r8   get_update_statusrz      s     @@
8J0K K,##W__

  ""((	
 55;;	

 :&&,,,w233''---##)))r7   r<   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   	backportsrq   N)r   rK   r   r   rL   version_listr\   rF   r_   r`   ra   rP   siterv   )r<   rQ   	esm_cacherS   ri   counted_as_securityr`   rf   rg   expected_originesm_packages              r8   filter_updatesr      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.)rr   rs   rt   rt   r%   r   rs   r$   )r   is_attachedr   r   contract_statusr   ENTITLEDrP   application_statusr   ENABLED)r   r   ro   infra_entitlementapps_entitlements        r8   get_ua_infor      s   s#//KG /4-c2++-1H1HH'(//
;//1!4 (() &'..z:,,..2I2II'(//<00215 (() &'..{;Nr7   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   rX   F)rv   patched)r   statusr   ProcessExecutionErrorr    proc_version_signature_versionkernelstatefixesr]   rv   r   )	lp_statusour_kernel_versionfixs      r8   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 ]\  \  }}|D ]R  \  }}t        |||      }|j                  |j                  j                  |j
                  ||||j                  d       T ^ |S )N)rS   ri   rn   r   r`   download_size)itemsrz   rP   ru   rv   rw   size)r   ro   updatesrg   r}   ri   r`   r   s           r8   create_updates_listr     s     G!4!:!:!< + 	OGV&wAFNN&1166&$+$$%,\\		 Nr7   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.
    uarJ   num_installed_packagesrq   mainnum_main_packages
restrictednum_restricted_packagesuniversenum_universe_packages
multiversenum_multiverse_packagesr[   num_third_party_packagesrZ   num_unknown_packagesr$   num_esm_infra_packagesr%   num_esm_apps_packagesnum_esm_infra_updatesnum_esm_apps_updatesrA   num_standard_security_updatesreboot_requiredz0.1
fixed_cves)_schema_versionsummaryr<   r   )r   rV   r]   r   r   r   r   r   )r   ro   r   packages_by_originrT   r   r   s          r8   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 !"$<$>?	 r7   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 )NrJ   )count rY   )rJ   r$   r   r   r$   Main/Restricted)offsetr   
repository)rJ   r%   r   r   r%   Universe/Multiverse)rJ   r[   r[   )r   r   )rJ   rZ   rZ   rX   )
r]   r:   r   SS_SUMMARY_TOTALrE   rH   SS_SUMMARY_ARCHIVE	pluralizeSS_SUMMARY_THIRD_PARTYSS_SUMMARY_UNAVAILABLE)	r   r   r   total_packagesr   packages_mrpackages_umpackages_thirdpartypackages_unknowns	            r8   _print_package_summaryr   a  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$&!*   
"Ir7   c                  .   t               j                  } t        |       j                  }dj	                  t        |j                        t        |j                              }t        t        j                  j	                  |             t        d       y )Nz{}/{}daterX   )r!   rD   r   eolrE   rH   monthyearr:   r   SS_INTERIM_SUPPORT)rD   eol_dater   s      r8   _print_interim_release_supportr     se    &&Fv&**H>>#hnn-s8==/ABD	(
%
%
,
,$
,
78	"Ir7   c                     t               j                  } t        |       rRt        |       j                  }t        t        j                  j                  t        |j                                     y t        t        j                         y )Nr   )r!   rD   r#   r   r   r:   r   SS_LTS_SUPPORTrE   rH   r   SS_NO_SECURITY_COVERAGE)rD   r   s     r8   _print_lts_supportr     s[    &&FF"6*..h%%,,#hmm2D,EFh../r7   rg   r   service_statusservice_applicabilityinstalled_updatesavailable_updatesr   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   rg   r   )rg   r   r   r   )r   rX   rg   )r!   rD   r   eol_esmr   r   r   SS_SERVICE_ENABLEDrE   rH   r   SS_SERVICE_ADVERTISESS_SERVICE_ENABLED_COUNTSr   SS_SERVICE_ADVERTISE_COUNTSr:   DISABLEDr   
APPLICABLESS_SERVICE_COMMAND)
rg   r   r   r   r   r   r   rD   eol_date_esmmessages
             r8   _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	"Ir7   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 )NrX   r   )days)r   r:   r   SS_UPDATE_UNKNOWNr   nowr   utcr   SS_UPDATE_DAYSrE   )last_apt_updater   time_since_updates      r8   _print_apt_update_callr     s    ,.Oh(()b	
,,x||
$Co-!h%%,,2C2H2H,IJb	 "r7   c           
      (   t        |       }t        |       }|j                         d   }|j                         d   }|j                         d   }|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   rr   r   r   r$   r   r   r%   rX   r   rg   r   r   r   r   r   r   r   )r   r   r   applicability_statusr!   rD   r"   r   rV   r   r   r:   r   SS_HELP_CALLr   r#   r   SS_NO_INTERIM_PRO_SUPPORTr   r   r   SS_IS_ATTACHEDSS_IS_NOT_ATTACHEDr   r]   SS_LEARN_MORE)r   esm_infra_entesm_apps_entesm_infra_statusesm_infra_applicabilityesm_apps_statusesm_apps_applicabilityrD   is_ltsr   r   "security_upgradable_versions_infra!security_upgradable_versions_appss                r8   security_statusr    s   ',M%c*L$779!<+@@B1E"557:O)>>@C&&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$$% r7   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 )Nr[   Tr   r   rX   rS   )rV   rv   r   r:   r   SS_THIRD_PARTYSS_PACKAGES_HEADERr=   SS_SHOW_HINTrE   r   SS_NO_THIRD_PARTY)r   third_party_packagesrS   package_namess       r8   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 )NrZ   Tr	  rX   r
  )rV   rv   r   r:   r   SS_UNAVAILABLEr  r=   r  rE   r   SS_NO_UNAVAILABLE)r   unknown_packagesrS   r  s       r8   list_unavailable_packagesr  R  s    9;))41ABgW\\BMByd h%%&b	h))*=)h##**6-3H*IJ 	h(() Cr  c           
      4   t               }|d   }|d   |d   z   }||z   }t               }t        |      d   }|D ]   \  }}|j                  |j                         " t               j                  }	t               }
t        |       }t        |       }|j                         d   }|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||t1        |      t1        |      d	
       t#        t$        j2                  j5                  d             t#        d       t        |	      s|r4t#        t$        j6                  j5                  d             t9        |       |r4t#        t$        j:                  j5                  d             t9        |       |xs |}|rY|r!t$        j<                  j5                  d      }n t$        j>                  j5                  d      }t#        |       t9        |       |r3t#        t$        j@                  j5                  tC        |                   y y y c c}w c c}w c c}w )Nr$   r   r   r   Tr	  rX   r   Fr   r   r
  )"rV   setr   addru   r!   rD   r"   r   r   r   r   sortedrv   r   r#   r   r:   r   r   r   r   r   r   r]   SS_SERVICE_HELPrE   SS_UPDATES_AVAILABLEr=   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updaterf   rD   r  r   r   r   r  rS   installed_package_namesavailable_package_namesremaining_package_names	hint_listmsgs                        r8   list_esm_infra_packagesr,  g  s   9;'4N$V,/A,/OOK'+5EM#12D#E$  2 -	&++,- &&F"$F',M%c*L$779!<*??A!D$%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           
      j   t               }|d   }|d   |d   z   }||z   }t               }t        |      d   }|D ]   \  }}|j                  |j                         " t               }	t        |       }
|
j                         d   }|
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   rX   r
  )rV   r  r   r  ru   r"   r   r   r   r  rv   r   r:   r   r   r   r]   r  rE   r  r=   r  r  r   r  r   )r   r   apps_packagesum_packagesall_apps_packagesapps_updatesr%  r&  rf   r  r   r  r  rS   r'  r(  r)  r*  r+  s                      r8   list_esm_apps_packagesr2    s   9;&z2M:&);L)II  &35L#12C#D$  2 ,	**+, #$F%c*L"557:O)>>@C$%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&J+'/J0)rJ   F)Lcollectionsr   r   r   enumr   	functoolsr   randomr   typingr	   r
   r   r   r   rM   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#   rb   r'   r=   rF   PackagerV   rN   rH   rO   boolrm   Versionrz   r   r   r   r   r   r   r   r   intr   r   r  r  r  r,  r2  r6   r7   r8   <module>rD     s   # '    6 6  : : B  % I 
  )(4 (2 4 tGOO,,-*"__")0)9)9""J 4s S T  **#s(^* __* 		*8=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J& J&Z*(**VKrPKr7   