U ϴfe@sddlmZddlmZmZddlmZddlmZddlm Z ddl m Z m Z m Z mZmZddlZddlmZmZmZmZdd lmZdd lmZdd lmZmZmZmZdd lm Z dd l!m"Z"m#Z#ddl$m%Z%m&Z&m'Z'ddl(m)Z)m*Z*m+Z+m,Z,m-Z-dZ.GdddeZ/ddZ0eddddZ1e deej2fdddZ3ej2ej4e5dddZ6e5e e5e fe5dd d!Z7eej2e e5eeej8e5ffd"d#d$Z9e e e5e fd%d&d'Z:ee e5e fdd(d)Z;e e5eeej8e5ffe e5e fee e5e fd*d+d,Zdd1d2d3Z?d4d5Z@d6d7ZAe5e5e&e%eBeBe>d8d9d:ZCd;d<ZDe d=d>d?ZEd@dAZFdBdCZGdDdEZHdFdGZIdS)I) defaultdict)datetimetimezone)Enum) lru_cache)choice)Any DefaultDictDictListTupleN) exceptions livepatchmessagesutil)_reboot_required) _is_attached)PreserveAptCfgget_apt_cache_datetimeget_apt_pkg_cacheget_esm_apt_pkg_cache)UAConfig)ESMAppsEntitlementESMInfraEntitlement)ApplicabilityStatusApplicationStatusContractStatus)get_distro_infoget_kernel_infoget_release_infois_current_series_lts is_supported) esm-infraesm-appsc@s eZdZdZdZdZdZdZdS) UpdateStatusz2Represents the availability of a security package.Zupgrade_availableZpending_attachZpending_enableZupgrade_unavailableN)__name__ __module__ __qualname____doc__ AVAILABLE UNATTACHED NOT_ENABLED UNAVAILABLEr-r-:/usr/lib/python3/dist-packages/uaclient/security_status.pyr$'s r$cCstt|dS)N)printrZcreate_package_list_str)packagesr-r-r.print_package_list/sr1)maxsizec CsRtj}dd|fddd|fddd|fd dd |fddd |fd iS) NUbuntuz {}-securitystandard-securityZ UbuntuESMAppsz{}-apps-securityr#Z UbuntuESMz{}-infra-securityr"z{}-apps-updatesz{}-infra-updates)rseriesformat)r5r-r-r.%get_origin_information_to_service_map3s     r7str)returnc Cs`tt}ttF}dd|jD}||d<t|}|D]}|t|||q8W5QRX|S)NcSsg|]}|jr|qSr-) current_ver.0packager-r-r. Esz4get_installed_packages_by_origin..all) rlistrrr0apt_pkgDepCache get_origin_for_installed_packageappend)resultcacheinstalled_packages dep_cacher=r-r-r. get_installed_packages_by_origin?s  rI)r=rHr9cCs|js dS|jj}t|dkr@||}|r6|j|kr:dS|j}|D]B\}}t|j|jfd}|tkrr|S|jdkrD|j SqDdS)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. unknownr3 third-party) r: file_listlenZget_candidate_verr7getoriginarchive ESM_SERVICESZ component)r=rHZavailable_origins candidaterQ_servicer-r-r.rCTs$       rC) service_nameua_infor9cCsP|dks|dr$||dkr$tjjS|ds4tjjS||dkrHtjjStjjS)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. )r4standard-updatesattachedenabled_servicesentitled_services)r$r)valuer*r+r,)rWrXr-r-r.get_update_statusys  r^)r0r9c Cs,tt}tt}|D]}|jr|jD]}||jkr*d}|jD]<\}}t|j |j f}|rB|| ||j fd}qqB|jdd} |s*d| j kr*|d || j fq*|j |kr||j } | jD]N}||jkr|jD]8\}}t|j |j f}|r|| ||j fqqqqW5QRX|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. FTrZ backportsrY)rr@rrr: version_listrNr7rPrQrRrDZsitename) r0rEZ esm_cacher=versionZcounted_as_securityrQrUrVZexpected_originZ esm_packager-r-r.filter_updatessL          rb)cfgr9cCst|j}|ggd}|rt|}t|}|tjkrF|dd|dt j krf|dd|tjkr|dd|dt j kr|dd|S)z7Returns the Pro information based on the config object.)rZr[r\r\r#rr[r") r is_attachedrrZcontract_statusrZENTITLEDrDapplication_statusrENABLED)rcrdrXZinfra_entitlementZapps_entitlementr-r-r. get_ua_infos.   rgcCsz t}Wntjk r&gYSXtj}|dk r|dk r||jkr|jdk r|jjdkr|jjdk rt |jjdkrdd|jjDSgS)NZappliedrcSs"g|]}|jpd|jpddqS)rJFr`Zpatchedrh)r<Zfixr-r-r.r>sz,get_livepatch_fixed_cves..) rstatusr ZProcessExecutionErrorrZproc_version_signature_versionZkernelstatefixesrO)Z lp_statusZour_kernel_versionr-r-r.get_livepatch_fixed_cvess.     rl)upgradable_versionsrXr9c CsRg}|D]@\}}t||}|D](\}}||jj|j||||jdq"q |S)N)r=rarWrirQZ download_size)itemsr^rD parent_pkgr`Zver_strsize)rmrXupdatesrVr_rirarQr-r-r.create_updates_lists   rrcCst|}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||dtidS)agReturns 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. Zuar?Znum_installed_packagesrYmainZnum_main_packages restrictedZnum_restricted_packagesuniverseZnum_universe_packages multiverseZnum_multiverse_packagesrMZnum_third_party_packagesrLZnum_unknown_packagesr"Znum_esm_infra_packagesr#Znum_esm_apps_packagesZnum_esm_infra_updatesZnum_esm_apps_updatesr4Znum_standard_security_updatesreboot_requiredz0.1Z fixed_cves)Z_schema_versionsummaryr0r)rgrIrOrbrrrrwrl)rcrXrxpackages_by_originrGrmrqr-r-r.security_status_dicts:   rzr?F) package_lists show_items always_showr9c CsLt|d}ttjj|ddtt|d}|dkrzt|dt|dt|d}ttj|j||d d |d krt|d t|d t|d}|s|rttj|j||dd |dkrt|d}|s|rttj|j||d|dkr@t|d}|s&|r@ttj |j||dtddS)Nr?)count rK)r?r"rsrtr"Main/Restricted)offsetr~ repository)r?r#rurvr#Universe/Multiverse)r?rMrM)rr~)r?rLrLrJ) rOr/rZSS_SUMMARY_TOTALr6r8ZSS_SUMMARY_ARCHIVE pluralizeZSS_SUMMARY_THIRD_PARTYZSS_SUMMARY_UNAVAILABLE) r{r|r}Ztotal_packagesrZ packages_mrZ packages_umZpackages_thirdpartyZpackages_unknownr-r-r._print_package_summaryKsn                rcCsHtj}t|j}dt|jt|j}tt j j|dtddS)Nz{}/{}daterJ) rr5reolr6r8Zmonthyearr/rZSS_INTERIM_SUPPORT)r5eol_daterr-r-r._print_interim_release_supports  rcCsBtj}t|r4t|j}ttjjt |j dn ttj dS)Nr) rr5r!rrr/rZSS_LTS_SUPPORTr6r8rZSS_NO_SECURITY_COVERAGE)r5rr-r-r._print_lts_supports  rrVrservice_statusservice_applicabilityinstalled_updatesavailable_updatesrdc Cstj}t|j}|tjkr6tjj||t |j d} ntj j||t |j d} |rn| dtj |j|d7} |r| dtj |j|d7} t| |r|tjkr|tjkrtdttjj|dtddS)N)rrVr)rVrrr)rqrJrV)rr5rZeol_esmrrfrZSS_SERVICE_ENABLEDr6r8rZSS_SERVICE_ADVERTISEZSS_SERVICE_ENABLED_COUNTSrZSS_SERVICE_ADVERTISE_COUNTSr/DISABLEDrZ APPLICABLEZSS_SERVICE_COMMAND) rVrrrrrrdr5Z eol_date_esmmessager-r-r._print_service_supportsF       rcCsbt}|dkr$ttjtddSttj}||}|jdkr^ttj j |jdtddS)NrJr)days) rr/rZSS_UPDATE_UNKNOWNrnowrZutcrZSS_UPDATE_DAYSr6)Zlast_apt_updaterZtime_since_updater-r-r._print_apt_update_calls   r)rcc Cst|}t|}|d}|d}|d}|d}tj}t}t|d} t} t | d| d| dd} t | d| d| dd} t | t t j t d t|st|rtt t jdS|tjkrt| rt t jn t t jt d tdd ||t| dt| | d | dsT| dsT| drvtdd ||t| dt| | d | st t jdS) NrrZrsrtr"rurvr#rJrrr)rrreapplicability_statusrr5r rgrIrbrr/rZ SS_HELP_CALLrr!rSS_NO_INTERIM_PRO_SUPPORTrrrZSS_IS_ATTACHEDZSS_IS_NOT_ATTACHEDrrOZ SS_LEARN_MORE) rc esm_infra_ent esm_apps_entesm_infra_statusesm_infra_applicabilityesm_apps_statusesm_apps_applicabilityr5is_ltsrdryZ"security_upgradable_versions_infraZ!security_upgradable_versions_appsr-r-r.security_statuss              rcCsxt}|d}dd|D}t|ddd|rjttjtdttjt|ttjjt |dn ttj dS)NrMcSsg|] }|jqSr-r`r;r-r-r.r>+sz-list_third_party_packages..Tr|r}rJr=) rIrr/rZSS_THIRD_PARTYSS_PACKAGES_HEADERr1 SS_SHOW_HINTr6rZSS_NO_THIRD_PARTY)ryZthird_party_packages package_namesr-r-r.list_third_party_packages(s  rcCsxt}|d}dd|D}t|ddd|rjttjtdttjt|ttjjt |dn ttj dS)NrLcSsg|] }|jqSr-rr;r-r-r.r>?sz-list_unavailable_packages..TrrJr) rIrr/rZSS_UNAVAILABLErr1rr6rZSS_NO_UNAVAILABLE)ryZunknown_packagesrr-r-r.list_unavailable_packages<s  rc st}|d}|d|d}||}t}t|d}|D]\}}||jqisz+list_esm_infra_packages..cSsg|] }|jqSr-rr;r-r-r.r>lscs&g|]}|jkr|jkr|jqSr-rr;Zavailable_package_namesZinstalled_package_namesr-r.r>os  TrrJrFrrr)!rIsetrbaddrorr5r rrrersortedrr!rr/rrrrrrrOSS_SERVICE_HELPr6SS_UPDATES_AVAILABLEr1SS_UPDATES_INSTALLEDSS_FURTHER_OTHER_PACKAGESSS_OTHER_PACKAGESrr)rcryZinfra_packagesZ mr_packagesZall_infra_packagesZ infra_updatessecurity_upgradable_versionsupdaterUr5rrrrrremaining_package_names hint_listmsgr-rr.list_esm_infra_packagesQs            rc st}|d}|d|d}||}t}t|d}|D]\}}||jqsz*list_esm_apps_packages..cSsg|] }|jqSr-rr;r-r-r.r>scs&g|]}|jkr|jkr|jqSr-rr;rr-r.r>s  TrrFrrrJr)rIrrbrror rrerrrr/rrrrOrr6rr1rrrrr)rcryZ apps_packagesZ um_packagesZall_apps_packagesZ apps_updatesrrrUrrrrrrrr-rr.list_esm_apps_packagess~          r)r?F)J collectionsrrrenumr functoolsrZrandomrtypingrr r r r rAZuaclientr rrrZ5uaclient.api.u.pro.security.status.reboot_required.v1rZ(uaclient.api.u.pro.status.is_attached.v1rZ uaclient.aptrrrrZuaclient.configrZuaclient.entitlementsrrZ(uaclient.entitlements.entitlement_statusrrrZuaclient.systemrrrr r!rSr$r1r7ZPackagerIrBr8rCr^ZVersionrbrgrlrrrzboolrrrintrrrrrrrr-r-r-r.sx          % @!  4 ?  2MY