Hcfc<ddlZddlZddlZddlZddlmZddlmZmZm Z m Z m Z m Z ddl mZmZmZmZmZmZmZmZmZddlmZddlmZmZmZddlmZej>Z ejBejDe#Z$dZ%Gd d ejLZ'y) N)exists)AnyDictListOptionalTupleUnion) apiaptcontract event_logger exceptionshttpmessagessystemutil)base)ApplicationStatusCanDisableFailureCanDisableFailureReason)status_cache_filez<^linux-image-([\d]+[.-][\d]+[.-][\d]+-[\d]+-[A-Za-z0-9_-]+)$c eZdZdZdZdZdZdZdZdZ e de e e dffdZe de fd Ze de fd Ze dee fd Ze dee fd Ze dee fd ZdefdZe ej2de fdZ d'dedeeeefffd Zde fdZdej@defdZ!de fdZ"dej@fdZ#dej@fdZ$dej@fdZ%dZ&dZ'dee(ee)jTffdZ+dZ, d'de-e e.fde-e e.fdedeffd Z/ d(dej@d!eee d"eddfd#Z0dej@ddfd$Z1 d)dej@d%efd&Z2xZ3S)*RepoEntitlementz1/etc/apt/sources.list.d/ubuntu-{name}.{extension}z$/etc/apt/preferences.d/ubuntu-{name}z {}/ubuntuNFTreturncyNselfs r"ctjt|j}tj ||S)z%Check if system needs to be rebooted.)installed_pkgs)r should_rebootsetr8event needs_reboot)rreboot_requireds r _check_for_rebootz!RepoEntitlement._check_for_rebootgs4 ..t}}-  ?+r"cyrrrs r repo_key_filezRepoEntitlement.repo_key_fileos r"ignore_dependent_servicesct||\}}|dur||fS|js[|jrOdt t j tjj|j|jfS||fS)N)rLFentitlement_nametitle) super can_disableoriginpurgerrNO_PURGE_WITHOUT_ORIGINrREPO_PURGE_FAIL_NO_ORIGINr,rP)rrLresultreason __class__s r rRzRepoEntitlement.can_disablets,&?-  U?6> !{{tzz!+CC66==)-4::> v~r"cr|jduxrt|jdkD}|js|syy)Nr)r8len access_only)r will_installs r enable_stepszRepoEntitlement.enable_stepss8}}D0KS5G!5K   <r"progressc|jtjj|j|j ||j rn|jrbt|jdkDrI|jdtjjdj|jy|j|y)zEnable specific entitlement. @return: True on success, False otherwise. @raises: UbuntuProError on failure to install suggested packages servicerinfo r8T)rarCONFIGURING_APT_ACCESSr,rPsetup_apt_configsupports_access_onlyr^r]r8emitSKIPPING_INSTALLING_PACKAGESjoininstall_packages)rras r _perform_enablezRepoEntitlement._perform_enables   + + 2 24:: 2 F  h'  $ $)9)94==!A% 99@@!$$--!8A  ! !( +r"c|jsyy)Nr[r\)rTrs r disable_stepszRepoEntitlement.disable_stepsszzr"c|jr|jr|jdtj|jddt j |j}|j||syg}g}|D]S}t j||j}|r|j|t|fC|j|U|j|||syt|dr|j|j||jrg|jr[|jtj j#|j$|j'|j)y)NreF)exclude_originremove_packagesrPT)rTrSrkrPURGE_EXPERIMENTALr get_installed_packages_by_originpurge_kernel_checkget_remote_versions_for_packageappendmaxprompt_for_purgehasattrruremove_apt_configraPURGING_PACKAGESr,rPexecute_reinstallexecute_removal)rrarepo_origin_packagespackages_to_reinstallpackages_to_removepackage alternativess r _perform_disablez RepoEntitlement._perform_disables` ::$++ MM&("="= > MM&" %#&#G#G $ **+?J$& !!# / 7"BBDKK   *00 #l"34'--g6 7(("$98 4* +  " x( ::$++   ))00tzz0B   " "#8 9  !3 4r"cHg}|D]I}tjt|j}|s*|j |j dK|rJ|j stj|jdtjj|j|jddj|tj j"}|jdtj$j|tj&}|Dcgc]}||vr| } }| s!|jdtj(y|jdt*j,dtj.ifgy cc}w) a* Checks if the purge operation involves a kernel. When package called 'linux-image-*' is in the package list, warn the user that a kernel is being removed. Then, show the user what the current kernel is. If the current kernel is to be removed, and there are no other valid Ubuntu Kernels installed in the system, return False to abort the operation. If there is another Ubuntu kernel - besides the one installed - then prompt the user for confirmation before proceeding. rercrf)kernel_versionFmessage_operationmsgT)research RE_KERNEL_PKGr&r{groupis_interactiver#NonInteractiveKernelPurgeDisallowedrkrPURGE_KERNEL_REMOVALr,rPrmrget_kernel_info uname_releasePURGE_CURRENT_KERNELget_installed_ubuntu_kernelsPURGE_NO_ALTERNATIVE_KERNELrprompt_for_confirmationPURGE_KERNEL_CONFIRMATION) r package_listralinux_image_versionsrmcurrent_kernelinstalled_kernelsversionalternative_kernelss r ryz"RepoEntitlement.purge_kernel_checks} "# 8G -6A$++AGGAJ7 8 **, DDFF MM--44TZZ4H  MM&#((+?"@ A#335CCN MM--44#15 !' C C E  1#"66# # ' fh&J&JK MM#44 B BC )#s9 Fc d}|r_|jdtj|jdtj|Dcgc]}|j c}d}|rd|jdtj |jdtj|Dcgc]\}}|j c}}d}|r3|jdtjdtjifgycc}wcc}}w)NFreTrr) rkrWARN_PACKAGES_REMOVALrcreate_package_list_strr&WARN_PACKAGES_REINSTALLrPROCEED_YES_NO)rrrrapromptr_s r r}z RepoEntitlement.prompt_for_purge!s   MM&("@"@ A MM,,1CDgW\\D  F MM&("B"B C MM,,6KLlwW\\L  F  MM#44 7 78 3EMs D&Dctj}|Dcgc]}|j|vr |j}}|r5tj|tj j |yycc}w)Nrg)r get_installed_packages_namesr&purge_packagesrUNINSTALLING_PACKAGES_FAILEDr,)rrinstalled_packagesr to_removes r rzRepoEntitlement.execute_removalHs !==?. ||11 LL     55<<&=    s!A4ctj}|Dcgc]9\}}|j|vr&dj|j|j;}}}|rtj |yycc}}w)Nz{}={})r rr&r,ver_strreinstall_packages)rrrrr to_reinstalls r rz!RepoEntitlement.execute_reinstall[ss!==?'< "'||11 NN7<< 9    " "< 0   s>A4ctjtjj |j f}|j }|jdijdi}|jd}|s:tjtjj |j fS|jd}|s:tjtjj |j fStjtj}|D]p}tj|jj |||}|s6tj tj"j |j f}n|j$rc|j&D]T} tj(| rtjtj*j |j,| fcS|S)Nrvr2r3r;r@) error_msg)rdr)rDISABLEDrSERVICE_NOT_CONFIGUREDr,rPr5r6NO_APT_URL_FOR_SERVICENO_SUITES_FOR_SERVICEr get_apt_cache_policyAPT_POLICY_FAILEDrrr0ENABLEDSERVICE_IS_ACTIVEcheck_packages_are_installedr8 is_installed SERVICE_DISABLED_MISSING_PACKAGEr&) rcurrent_statusr5r3repo_url repo_suitespolicysuite service_matchrs r application_statusz"RepoEntitlement.application_statushs  & &  + + 2 2 2 D  ..$((;?? " >>(+!**//66TZZ6H !nnX. !**..55DJJ5G  ))H4N4NO EII++228UCVM%--..55DJJ5G"   , ,== ''0)22 AAHH$(IIwI r"c|j}tdtj|j j dDry|syt |tj|vS)zCheck if apt url delta should be applied. :param apt_url: string containing the apt url to be used. :return: False if apt url is already found on the source file. True otherwise. c3>K|]}|jdyw)#N) startswith).0lines r z.s!  OOC  s FT)r-allr load_filestripsplitbool)rr=apt_files r _check_apt_url_is_appliedz)RepoEntitlement._check_apt_url_is_appliedsm>>  ((288:@@F  Gv//99::r" orig_accessdeltas allow_enablecht ||||ry|jdi}|jdi}|jd}|jd}tj}|r|r|j } n|j \} } | tjk(ry|j|stjd|j|tjtjj!|j|jdi} | jdijd} | r t#j$|j&| |j)t+j,|j/t+j,|r}tjd |tjtj0j!d j3| |j5t+j,| y) a1Process any contract access deltas for this entitlement. :param orig_access: Dictionary containing the original resourceEntitlement access details. :param deltas: Dictionary which contains only the changed access keys and values. :param allow_enable: Boolean set True if allowed to perform the enable operation. When False, a message will be logged to inform the user about the recommended enabled service. :return: True when delta operations are processed; False when noop. Tr2r3r;r4Fz.New aptURL, updating %s apt sources list to %srcz%New additionalPackages, installing %r, rg)r)rQprocess_contract_deltasr6rread"_check_application_status_on_cacherrrrLOGrer&rFrREPO_UPDATING_APT_SOURCESr,r remove_auth_apt_repor-rr ProgressWrapperri REPO_REFRESH_INSTALLING_PACKAGESrmrn)rrrrdelta_entitlementdelta_directives delta_apt_urldelta_packages status_cacherrorig_entitlementold_urlrYs r rz'RepoEntitlement.process_contract_deltass$ 7 *; M"JJ}b9,00rB(,,X6 )--.BC(--/  !%!H!H!J $($;$;$= !  !2!;!; ;--m< HH@   JJ2299$))9L  +}bA &**<<@@JG((A  " "3#6#6#8 9  ! !#"5"5"7 8  HH>+=+=m+LM   % %h /   0 0 7 7djj 7 I   " "!24D E K !% K   ' '%'"3 +(( !&&s':':'<=  4(( !DKK  &&s':':'<=  sB;"C8;:C58A(E c d}d}d}|jjs|jjrtjd|jjtj }tjd|jjtj }tjj}n|jjs|jjrtjd|jjtj }tjd|jjtj }tjj}tj||||j}|j}|dj!di}|dj!di}|j!d} | s|jj"d } |j!d sNt%j&|j} | j)| |j*} | r| j!d} | s"| } t,j/d |j0|j!d } | s t3j4|j* |j!d}|s t3j6|j* |j!d}|s t3j8|j* |j:r|j<s+t3j>|j*|j0|j@jC|j*}tjD|||j<|j:g}tGtjHs|jKdtGtjLs|jKd|rV|jOdtPjRjCdjU| tjV|tj`||jbjC|| ||jd|jgtPjhjC|j0 tjj|y#t2jX$r%|j[t]j^wxYw#t2jX$r'|j[t]j^dwxYw)zSetup apt config based on the resourceToken and directives. Also sets up apt proxy if necessary. :raise UbuntuProError: on failure to setup any aspect of this apt configuration Nrhttps) http_proxy https_proxy proxy_scoper2r3 obligations resourceToken machineTokenenableByDefaultzWNo resourceToken present in contract for service %s. Using machine token as credentialsaptKeyrOr;r@rNr&zapt-transport-httpszca-certificatesrerrgF)run_apt_update)6cfgglobal_apt_http_proxyglobal_apt_https_proxyrvalidate_proxyPROXY_VALIDATION_APT_HTTP_URLPROXY_VALIDATION_APT_HTTPS_URLr AptProxyScopeGLOBALua_apt_http_proxyua_apt_https_proxyUACLIENTsetup_apt_proxyr-r5r6 machine_tokenr UAContractClientget_resource_machine_accessr&rwarningrPr RepoNoAptKeyMissingAptURLDirective RepoNoSuitesr!rSRepoPinFailNoOriginrepo_pref_file_tmplr,add_ppa_pinningrAPT_METHOD_HTTPS_FILEr{CA_CERTIFICATES_FILErkrINSTALLING_PACKAGESrmrrrr radd_auth_apt_repor/rKraAPT_UPDATING_LISTupdate_sources_list)rrarrscope repo_filename resource_cfgr3rtokenrclientmachine_accessrrrrepo_pref_fileprerequisite_pkgss r riz RepoEntitlement.setup_apt_config1sQ   88 ) )TXX-L-L,,..22J --//33K %%,,E XX ' '488+F+F,,**22J --++33K %%..E !{  ++ !-044\2F "=155mRH   1 HH22>BM??#45"22488<!'!C!C!499""*..?E% :JJ )))499E E>>(+33TYYO O nnX. ))499E E  ! !;; 44%)YY**"55<<$))<LN    &&  c//0  $ $%: ;c../  $ $%6 7  MM,,33!YY'894   ++5FG      % %h /        (44;;;LM   # #M 2!,, &&s':':'<= "((   " "3#6#6#8 " O  sS)T$)8T!$:Urc6tjj}|j}|jj j |jjdi}|jdi}|jd}|s tj|j|jtjj|jt!j"|||j$t!j&|||j(r;|j*j|j}tj,||r4|jtj.t!j0yy)zRemove any repository apt configuration files. :param run_apt_update: If after removing the apt update command after removing the apt files. r2r3r;rrvrN)rr(r)r-rmachine_token_file entitlementsr&r6rrrarREMOVING_APT_CONFIGURATIONr,rPr rrKremove_apt_list_filesr!rensure_file_absentAPT_UPDATING_LISTSrun_apt_update_command) rrarr)r"r2access_directivesrr's r rz!RepoEntitlement.remove_apt_configs9((*11 hh11>>tyyIMM 2 (OOL"=$((233TYYO O  / / 6 6TZZ 6 H    $:L:LM !!(F3  ! !!55<<$))<LN  % %n 5    h99 :  & & ( r")F)NT)T)4__name__ __module__ __qualname__r+rr/rSrrsupports_purgepropertyr intstrr!r-r0rr8rr=rArrIabcabstractmethodrKrrrRr`r rrorqrryr}rrrr NamedMessagerrrrrrnrir __classcell__)rYs@r rr#sHN@MF$) N5c4#8O3OO***$s)  #   HSM  4 s  16)- tX/00 1,c(;(;.s*)<)<*X?9L9L?B%%% %N& 1/  (8+@+@"AA B/b;<# A#s(^AS#XA A  AL-1#' 9%%9tCy)9! 9  9vw)<)<wwx $ )%% ) )r"r)(r9r7loggingros.pathrtypingrrrrrr uaclientr r r r rrrrruaclient.entitlementsr(uaclient.entitlements.entitlement_statusrrruaclient.files.state_filesrget_event_loggerrF getLoggerreplace_top_level_logger_namer2rr UAEntitlementrrr"r rHs  ::   ' 9% %%'g:::8DEP g )d((g )r"