U (fr@sddlZddlZddlmZmZmZmZmZmZm Z ddl m Z m Z m Z mZmZddlmZmZddlmZddlmZmZddlmZmZddlmZmZmZmZdd l m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4dd l5m6Z6dd l5m7Z8dd l9m:Z:dd l9m7Z;dd lZ>ddl?m@Z@mAZAmBZBddlCmDZDddlEmFZFddlGmHZHmIZImJZJddlKmLZLddlMmNZNddlOmPZPddlQmRZRmSZSmTZTddlUmVZVddlWmXZXddlYmZZZddl[m\Z\GdddZ]e+dddZ^e-dd d!Z_e`eaeLd"d#d$Zbe`eaeaeLd%d&d'Zcdmee`e`ededee`e`d(d)d*ZeeLe`ead+d,d-Zfdd.d/d0ZgeLd1d2d3ZheLead4d5d6Ziee`e`d7d8d9ZjeLeaead:d;d<ZkeLead4d=d>ZleLe`ead?d@dAZme`eLeaeadBdCdDZndnee`e`dFdGdHZoe`dIdJdKZpe]e0dLdMdNZqe]e1dLdOdPZre]e/dLdQdRZse]e$dLdSdTZte]e%dLdUdVZue]e&dLdWdXZve]e*dLdYdZZwe]e(dLd[d\Zxe]e'dLd]d^Zye+eaeLeeeefd_d`daZzdbdcZ{eBdde j|e j}e{eFj~eAe@dee jdfe@dge jdhdie@dje jdhdigdkgdlZdS)oN)DictList NamedTupleOptionalSetTupleUnion)apt exceptionsmessagessystemutil)attach_with_tokenenable_entitlement_by_name) _initiate)MagicAttachRevokeOptions_revoke)MagicAttachWaitOptions_wait)CVE_OR_USN_REGEX FixStatusUnfixedPackagestatus_message)ESM_APPS_POCKETESM_INFRA_POCKETSTANDARD_UPDATES_POCKETFixPlanAptUpgradeStepFixPlanAttachStepFixPlanEnableStepFixPlanNoOpAlreadyFixedStepFixPlanNoOpLivepatchFixStepFixPlanNoOpStatusFixPlanNoOpStep FixPlanResult FixPlanStepFixPlanUSNResultFixPlanWarning"FixPlanWarningFailUpdatingESMCache&FixPlanWarningPackageCannotBeInstalled#FixPlanWarningSecurityIssueNotFixedNoOpAlreadyFixedDataNoOpLivepatchFixDataUSNAdditionalData)CVEFixPlanOptions)_plan)USNFixPlanOptions)ContractExpiryStatus _is_attached) ProArgumentProArgumentGroup ProCommand) action_detach) HelpCategory)CLOUD_TYPE_TO_TITLEPRO_CLOUD_URLSget_cloud_type)UAConfig)PRINT_WRAP_WIDTH)entitlement_factory)ApplicabilityStatusCanEnableFailureUserFacingStatus)notices)Notice) PRO_HOME_PAGE)colorize_commandsc@s\eZdZeeeeedddZddZd eeee eddd Z eeed d d Z dS) FixContexttitledry_run affected_pkgscfgcCsJd|_g|_t|_tj|_||_||_||_ ||_ d|_ d|_ d|_ dS)NrTF) pkg_index unfixed_pkgssetinstalled_pkgsrSYSTEM_NON_VULNERABLE fix_statusrFrHrGrIshould_print_pkg_header warn_package_cannot_be_installedfixed_by_livepatch)selfrFrGrHrIrT2/usr/lib/python3/dist-packages/uaclient/cli/fix.py__init__SszFixContext.__init__cCsN|jrJtjt|jjt|jdt|jd}tt j |t ddddS)N, )countpkgs F)widthsubsequent_indentZreplace_whitespace) rHr ZSECURITY_AFFECTED_PKGS pluralizelenformatjoinsortedprinttextwrapfillr;)rSmsgrTrTrUprint_fix_headerfszFixContext.print_fix_headerN source_pkgsstatuspocketcCs4|jr0tt|||jt|j|r&t|ndddS)N)pkg_listrirJnum_pkgs pocket_source)rPrb_format_packages_messagerJr^rHget_pocket_description)rSrhrirjrTrTrUprint_pkg_headerwszFixContext.print_pkg_headerrYunfixed_reasoncCs"|D]}|jt||dqdS)N)pkgrr)rKappendr)rSrYrrrsrTrTrUadd_unfixed_packagess zFixContext.add_unfixed_packages)N) __name__ __module__ __qualname__strboolrr:rVrfrrprurTrTrTrUrDRs  rDcvecCs8dj|j|jdd|jg}td|dS)N{issue}: {description}issue descriptionz! - https://ubuntu.com/security/{} )r_rFupperrrbr`)r|linesrTrTrUprint_cve_headersr)fix_plancCs|j}dj|j|jdg}|j}t|tr|jrj| t j |jD] }| dt j j j|dqFn,|jr| t j|jD]}| d|qtd|dS)Nr}r~z - {}r{z - r)target_usn_planr_rFrradditional_data isinstancer,Zassociated_cvesrtr ZSECURITY_FOUND_CVESZurlsZSECURITY_CVE_PAGEZassociated_launchpad_bugsZSECURITY_FOUND_LAUNCHPAD_BUGSrbr`)rZ target_usnrrr|Zlp_bugrTrTrUprint_usn_headers*     r)security_issuerGrIcCsztt|gd|d}|jjdj}|rH|jrHtjt |j pd|jdt |jjdt dt jj|dt|jjdj||\}}|tjtjfkr|S|jjdj}|r|r|St dt jjdd d |Dd t dt ji} |D],} t d | jt| ||| | j<t qt t jt||t jd d} |D]} | | j\} } t| | jt jd | tjkrt dt jjddd} | tjkrD| D]"}|j rt d|j!|j qd} qD| rt dt j"j|d|S)N)usnsrrrrr)issue_idz - css|] }|jVqdSN)rF).0ZusnrTrTrU szfix_usn..)Z related_usnsz- {})contextF- fix operationZ operationTz - {}: {})#usn_planr/Z usns_datarrrrer rr rrrrbZSECURITY_FIXING_REQUESTED_USNr_rrrNSYSTEM_NOT_AFFECTEDrelated_usns_planZSECURITY_RELATED_USNSr`ZSECURITY_FIXING_RELATED_USNSrFZSECURITY_USN_SUMMARY_handle_fix_status_messageZFIX_ISSUE_CONTEXT_REQUESTEDZFIX_ISSUE_CONTEXT_RELATEDSYSTEM_VULNERABLE_UNTIL_REBOOTENABLE_REBOOT_REQUIRED_TMPLSYSTEM_STILL_VULNERABLErrrsZSECURITY_RELATED_USN_ERROR)rrGrrIrrZtarget_usn_statusrrZrelated_usn_statusZrelated_usn_planZfailure_on_related_usnrirK unfixed_pkgrTrTrUfix_usns       r)rkrirJrlrmreturnc Cs|sdSg}g}|D](}|d7}|d||||qtjddd|ddt|tdd }d |t||S) z;Format the packages and status to an user friendly message.z{}/{}z{} {}:(rW)rZr[r\z{} {})rtr_rcrdr`rar;r) rkrirJrlrmZ msg_indexZsrc_pkgsZsrc_pkgZ msg_headerrTrTrUrn0s"  rn)rItokenrc Csbttdd|ggzt||ddWdStjk r\}zt|jWYdSd}~XYnXdS)ztAttach to an Ubuntu Pro subscription with a given token. :return: True if attach performed without errors. proZattachT)rZ allow_enableFN)rbrCrr ZUbuntuProErrorre)rIrerrrTrTrU_run_ua_attachLs r)rcCs:t\}}|tkr6ttjjt|t|ddS)z:Alert the user when running Pro on cloud with PRO support.)rFZcloud_specific_urlN) r9r8keysrbr ZSECURITY_USE_PRO_TMPLr_r7get)Z cloud_typerrTrTrU*_inform_ubuntu_pro_existence_if_applicableZs  rrIc Csttjt|d}tdtjj|jdt|jd}zt ||d}WnJt j k r}z*ttj t |jd}t||d|W5d}~XYnXtdtjt||jS)Nrr) user_code)Z magic_tokenr)rbr ZCLI_MAGIC_ATTACH_INITrZCLI_MAGIC_ATTACH_SIGN_INr_rrrrr ZMagicAttachTokenErrorZCLI_MAGIC_ATTACH_FAILEDrrZCLI_MAGIC_ATTACH_PROCESSINGrZcontract_token)rIZ initiate_respZ wait_optionsZ wait_respeZrevoke_optionsrTrTrU_perform_magic_attachfs*     r)rIrcCsjtttjtjtjdddgd}|dkr2dS|dkrBt|S|dkrfttjt d}t ||SdS)zZPrompt for attach to a subscription or token. :return: True if attach performed. sacZ valid_choicesF> T) rrbr Z*SECURITY_UPDATE_NOT_INSTALLED_SUBSCRIPTIONr prompt_choicesZSECURITY_FIX_ATTACH_PROMPTrZPROMPT_ENTER_TOKENinputr)rIchoicerrTrTrU_prompt_for_attachs   r)rKrcCs4t|}tjtj|j|dt|dt ddS)zFormat the list of unfixed packages into an message. :returns: A string containing the message output for the unfixed packages. rW)rlrYrZr) r^rcrdr ZSECURITY_PKG_STILL_AFFECTEDr]r_r`rar;)rKZnum_pkgs_unfixedrTrTrU_format_unfixed_packages_msgs r)rIrGrcCs4t|j}|r0|tjjkr0|r,ttjdSdSdS)zuCheck if the Ubuntu Pro subscription is expired. :returns: True if subscription is expired and not renewed. FT)r1Zcontract_statusr0ZEXPIREDvaluerbr (SECURITY_DRY_RUN_UA_EXPIRED_SUBSCRIPTION)rIrGZcontract_expiry_statusrTrTrU_check_subscription_is_expireds   rcCsddl}tttjtjtjjt dddgd}|dkr~ttj t d}tt dd ggt |jd d d |t||Sd S)zdPrompt for attach a new subscription token to the user. :return: True if attach performed. rN)ZurlrrrrrdetachTZcli)Z assume_yesr_F)argparserrbr Z%SECURITY_UPDATE_NOT_INSTALLED_EXPIREDr rZSECURITY_FIX_RENEW_PROMPTr_rBZPROMPT_EXPIRED_ENTER_TOKENrrCr5Z Namespacer)rIrrrrTrTrU_prompt_for_new_tokens    r)rIservicercCsttjj|dtjtjj|dddgd}|dkrttdd|ggt||d\}}|s|dk rt |t r|j dk rt|j j |Sd S) zMPrompt for enable a pro service. :return: True if enable performed. rrrrrenablerInameNF) rbr ZSECURITY_SERVICE_DISABLEDr_r rZSECURITY_FIX_ENABLE_PROMPTrCrrr>messagere)rIrrZretreasonrTrTrU_prompt_for_enables$   r)rrIrGrcCst||d}|r|\}}|tjkr*dS|\}}|tjkr|r`tdtj j |j ddSt ||j rpdSttj j |j dnttjj |j ddS)zQ Verify if the Ubuntu Pro subscription has the required service enabled. rTrrF)r<Zuser_facing_statusr?ZACTIVEapplicability_statusr=Z APPLICABLErbr Z'SECURITY_DRY_RUN_UA_SERVICE_NOT_ENABLEDr_rrZSECURITY_UA_SERVICE_NOT_ENABLEDZ SECURITY_UA_SERVICE_NOT_ENTITLED)rrIrGZentZ ent_statusrrrTrTrU)_handle_subscription_for_required_services:      rr)rirrcCs|tjkr>|r tjj||d}ntjj|d}tt|n|tj kr||r^tj j||d}ntj j|d}tt|np|tj kr|rtj j||d}ntjj|d}tt|n2|rtj j||d}ntjj|d}tt|dS)N)rrr)rrNr Z%SECURITY_ISSUE_RESOLVED_ISSUE_CONTEXTr_ZSECURITY_ISSUE_RESOLVEDrbr Zhandle_unicode_charactersrZ'SECURITY_ISSUE_UNAFFECTED_ISSUE_CONTEXTZSECURITY_ISSUE_UNAFFECTEDrZ)SECURITY_ISSUE_NOT_RESOLVED_ISSUE_CONTEXTZSECURITY_ISSUE_NOT_RESOLVED)rirrrerTrTrUrs>   rrjcCs2|tkrtjS|tkrtjS|tkr*tjS|SdSr)rr Z'SECURITY_UBUNTU_STANDARD_UPDATES_POCKETrZSECURITY_UA_INFRA_POCKETrZSECURITY_UA_APPS_POCKETrrTrTrUro@sro fix_contextstepcCsh|j|jjd|jjdd|_tjj|jj|jj d}t d||j |jj g|dd|_ tj|_dS)NreleasedrgF)packageversionrrqT)rpdataZrelated_source_packagesrjrPr ZFIX_CANNOT_INSTALL_PACKAGEr_Zbinary_packageZbinary_package_versionrbruZsource_packagerQrrrO)rrZwarn_msgrTrTrU)_execute_package_cannot_be_installed_stepKs" rcCsR|j|jj|jjd|jt|jj7_|j|jjt|jjdtj |_ dS)N)rhrirq) rprsource_packagesrirJr^rurrrrOrrTrTrU&_execute_security_issue_not_fixed_stepds rcCs*trttjntdtjddS)Nr)r we_are_currently_rootrbr ZCLI_FIX_FAIL_UPDATING_ESM_CACHEZ(CLI_FIX_FAIL_UPDATING_ESM_CACHE_NON_ROOTrrTrTrU%_execute_fail_updating_esm_cache_stepts rc Csv|j|jjd|jjd|jt|jj7_|jjsR|jsFtt j t j |_ dSts|jstt jt j|_ |j|jjt jddSttdddgdddd gt|jjg|jrt j |_ dSz.ttjd ddd g|jjd d id Wn\tk rR}z=z"execute_fix_plan..)keycSsg|] }|jqSrT)rs)rrrTrTrU asz$execute_fix_plan..)rMrr)0ZplanwarningsrDrFZaffected_packagesrfrarr(rr)rr'rrrrOrrNrrrrr"rr rrrrbrKrlistrLrr Z should_rebootrMrr rr_r@addrAZENABLE_REBOOT_REQUIREDrRr)rrGrIZ full_planrrZ reboot_msgrTrTrUr-s                        rcKsftt|jstj|jd|jr,ttj d|j krLt |j|j|}nt |j|j|j |}|jS)Nrr|)rematchrrr ZInvalidSecurityIssueIdFormatrGrbr ZSECURITY_DRY_RUN_WARNINGlowerrrrZ exit_code)argsrIkwargsrirTrTrU action_fixs rZfixr)helpz --dry-run store_true)ractionz --no-related)Z arguments)rrrZ help_categoryZargument_groups)N)r)rrctypingrrrrrrrZuaclientr r r r r Zuaclient.actionsrrZ+uaclient.api.u.pro.attach.magic.initiate.v1rZ)uaclient.api.u.pro.attach.magic.revoke.v1rrZ'uaclient.api.u.pro.attach.magic.wait.v1rrZ'uaclient.api.u.pro.security.fix._commonrrrrZ/uaclient.api.u.pro.security.fix._common.plan.v1rrrrrrrr r!r"r#r$r%r&r'r(r)r*r+r,Z+uaclient.api.u.pro.security.fix.cve.plan.v1r-r.rZ+uaclient.api.u.pro.security.fix.usn.plan.v1r/rZ(uaclient.api.u.pro.status.is_attached.v1r0r1Zuaclient.cli.commandsr2r3r4Zuaclient.cli.detachr5Zuaclient.cli.parserr6Zuaclient.clouds.identityr7r8r9Zuaclient.configr:Zuaclient.defaultsr;Zuaclient.entitlementsr<Z(uaclient.entitlements.entitlement_statusr=r>r?Zuaclient.filesr@Zuaclient.files.noticesrAZuaclient.messages.urlsrBZuaclient.statusrCrDrrryrzrrintrnrrrrrrrrrrrorrrrrrrrrrrZ CLI_ROOT_FIXZ CLI_FIX_DESCZSECURITYZ CLI_FIX_ISSUEZCLI_FIX_DRY_RUNZCLI_FIX_NO_RELATEDZ fix_commandrTrTrTrUs$  X             ?  l   , %     ? 0 "    R