Hcf,xddlZddlZddlZddlZddlmZddlmZmZddlm Z m Z m Z m Z m Z ddlmZmZmZmZmZmZmZddlmZddlmZmZddlmZmZdd lmZm Z dd l!m"Z"dd l#m$Z$m%Z%m&Z&m'Z'dd l(m)Z)m*Z*m+Z+dd l,m-Z-ddl.m/Z/ej`Z1ejdejfe4Z5dZ6dZ7dZ8e'jrjte/jvejxze/jzze'j|jte/j~ejze/jzze'jjte/jejze/jzze'jjte/jejze/jzze'jjte/jejze/jzze$jjte/jvejze/jzze$jjte/jejze/jzze6e/jvejze/jzze7e/jvejze/jzze8e/jvejze/jzzi ZPdZQdZRdjejejejejZXdZYdZZidddddejddddd dd!dd"dd#gd$e&j|jtd%ejd&id'gd(d)d)d)ge'jjtd*d+d)d)d)gd,d-dZ]d.Z^d/e e_e ffd0Z`d1ed/e e_e ffd2Zad1ed/e e_e ffd3Zbd/e e_e ffd4Zcd/e e_e ffd5ZddHd1ed6eed/e e_e ffd7Zfd8e e e_e fd9e_d/e e_e ffd:Zg dHd;e_d6eed/e e e_e fehffd<Zid=e_d/e_fd>Zjd?e e e_d/e_fd@Zk dIdAe e e_e_fdBe e_d/e e_fdCZld!e ed/e_fdDZmdHdEe e_e fd6eed/e_fdFZndGZoy)JN) OrderedDict)datetimetimezone)AnyDictListOptionalTuple) event_logger exceptions livepatchlockmessagesutilversion) _is_attached)UA_CONFIGURABLE_KEYSUAConfig)get_available_resourcesget_contract_information)ATTACH_FAIL_DATE_FORMATPRINT_WRAP_WIDTH)entitlement_factory)ContractStatusUserFacingAvailabilityUserFacingConfigStatusUserFacingStatus)notices state_filesuser_config_file)Notice)TxtColor essentialstandardadvancedz({name: <17}{available: <11}{description}zJ{name: <17}{available: <11}{entitled: <11}{auto_enabled: <16}{description}z4{name: <17}{entitled: <10}{status: <13}{description}nameentitledstatus descriptionz4{name: <17}{entitled: <19}{status: <22}{description}z={marker} {name: <15}{entitled: <19}{status: <22}{description}_doczUContent provided in json response is currently considered Experimental and may change_schema_versionz0.1r machine_idattachedF effectiveexpiresoriginservicesexecution_statusexecution_detailsfeaturesrcontractidr' created_atproductstech_support_levelaccountr'r9r:external_account_ids simulatedc |jDcgc]p}|jjs|jjn|jj|j j|j j drc}Scc}w)N)r' reason_codereason)blocking_incompatible_services entitlement is_variantr' variant_name named_msgmsg)entservices 1/usr/lib/python3/dist-packages/uaclient/status.py_get_blocked_by_servicesrMs~99;   **55##((((55",,11''++    sA5B returnc "d}d}|j}|j}|j|vrdnd}i}|tjk(rt j } n|j|vr t j} ||j}n|j\} } | t jk(r| j| jd}n| r | j}| t jk(rd}|jr?|jjD cic]\} } | t| |||}} } t|} |j|j |j"| j"|||| |d }|j$s||d<|Scc} } w)Nr7noyes)codemessagecfg) r'r*r(r)status_detailsdescription_override available blocked_bywarningvariants)status_description_overridecontract_statusr'r UNENTITLEDr UNAVAILABLE INAPPLICABLEuser_facing_statusWARNINGrIr[items_attached_service_statusrMpresentation_namer*valuerF)rJinapplicable_resourcesrUrZrVrWr]rXr[ ent_statusdetailsrG variant_clsrYservice_statuss rLrdrdsGN::<))+O$::IH.333%11 88- -)66J#9#((#C "%"8"8": J-555#LL&{{!(-::: ||69\\5G5G5I  2 k !":#,.#*#.J%%#))""( 4  N >>%-z" 5sF rUcvtjtjtjtjt |j r#tjtjtjt}|jd}|d}tjj}|j|dd|j!dtj"xsg|d|d|j!dd |j!d g|d |j$j&d|j$j&d|j$j&j!dd |j$j&j!d gd d|j!dr|j$j(|d<|j!dr|d|d<|jj!d}|s t+|}t-|dDcic](}|j!ds|d|j!d*}}|D]G} t/||j!dd }||} |dj5t7| ||I|dj9d|j$j:j!dij!d} | r+| j!dij!d} | r| |dd <|Scc}w#t0j2$rYwxYw)!z8Return configuration of attached status as a dictionary.machineTokenInfo contractInfo machineIdTr1r9r' createdAtr7r;r8externalAccountIDsr>)r-r.r1rr6r= effectiveTor0 effectiveFromr/availableResourcesc&|jddSNr'r7getxs rLz"_attached_status..sfb8IkeyrXr*rUr'r2c&|jddSrvrwrys rLr{z"_attached_status..AEE&",=r|supportrE affordances supportLevelr6r<)rremover!AUTO_ATTACH_RETRY_FULL_NOTICEAUTO_ATTACH_RETRY_TOTAL_FAILUREris_attached_and_contract_validCONTRACT_EXPIREDcopydeepcopyDEFAULT_STATUS machine_tokenrr`rfupdaterxlistmachine_token_filer=contract_expiry_datetimersortedrr EntitlementNotFoundErrorappendrdsort entitlements) rUresponsermrnr< resourcesresourcergent_clsrJrrs rL_attached_statusrs NN6778 NN699:C77v../}}^,H(();<#N3L)66<< OO*;7"&&x0||~+"4($V,*..{B?(,,Z<&8 ..66v>,,44T:!44<<@@),(>(>(F(F(J(J(")  2 &!44MM( ,_ =!!%%&:;I +C0 y.IJ ||K( (,,}55    )hll626G cl## $S*@# F    Z"=>$$1155iDHHG{{="599.I 9EHZ !5 6 O522   s(-LL""L87L8c tjt}t|}|D]}|j drt j j}nt jj} t||j dd}|jdk(rHtj tj"j$k(r||}|j'}nd}|d j)|j d |d|j*||d |d j-d |S#tj$r*tjd|j ddYLwxYw)z#Return unattached status as a dict.rXr'r7rz@Ignoring availability of unknown service %s from contract serverzwithout a 'name' keyr Nr2 presentedAs)r'r*rWrXc&|jddSrvrwrys rLr{z$_unattached_status..Grr|r})rrrrrxr AVAILABLErfr_rr rLOGdebugr'r on_supported_kernelLivepatchSupport UNSUPPORTEDr\rr*r)rUrrrrXrlpdescr_overrides rL_unattached_statusrsY}}^,H',I%  << $.88>>I.::@@I )hll626G LLK '--/))556B;;=N!N## ]HV4DE&22(6&   =% L Z"=> O=22  II V%;<    s1D779E43E4ctj|jd}||z}|r|Stj|}g}|j diD]b}|d} t ||}tjj} |jr|j dd| k(sR|j|d|r||d<|S#tj$r |j|YwxYw)z1Remove beta services from response dict if neededzfeatures.allow_beta)config path_to_valuer2r'rr)r7)ris_config_value_truerUrrrxrr rrrACTIVErfis_beta) rUshow_allrconfig_allow_beta new_responsereleased_resourcesr resource_namerenabled_statuss rL_handle_beta_resourcesrLs11ww&; !!H==*L $$Z40 (  )c FG*0066(,,x"<"N  % %h /!0$#5 Z #22    % %h /  s C%C*)C*ct}|jj}tj}t j \}}tjxsg}|dkDr8|jj}tjj||}nRtjjr8|jj}d}tj j|}||||j"|j$|j&d}t(j*j,j/} t0D]$} t3|| s| | t5|| | | <&| |dd<|S)aGReturn a dict with execution_status, execution_details and notices. Values for execution_status will be one of UserFacingConfigStatus enum: inactive, active, reboot-required execution_details will provide more details about that state. notices is a list of tuples with label and description items. r)pid lock_holderzconfiguration changes) operation)r3r4r config_pathrr5r ua_config)rINACTIVErfrNO_ACTIVE_OPERATIONSrcheck_lock_inforrr LOCK_HELDformatrreboot_cmd_marker_file is_presentREBOOTREQUIREDENABLE_REBOOT_REQUIRED_TMPLcfg_pathrUr5r user_config public_configto_dictrhasattrgetattr) rU userStatus status_val status_desclock_pidr notices_listrretrr~s rL_get_config_statusrpsP(J$$**J//K"224X{<<>'RL!|&&,, ((//k0   + + 6 6..44 + ::AAB '(||''LL  C!,,::BBDI#/ 3 3!7$S#.IcN/"+CM+ Jr|rct|jr t|}n t|}|j t |t jrtjj|t|||}|s9|jdgDcgc]}|jdddk(r|}}||d<|Scc}w)aReturn status as a dict, using a cache for non-root users When unattached, get available resources from the contract service to report detailed availability of different resources for this machine. Write the status-cache when called by root. r2rXrQ) r is_attachedrrrrrwe_are_currently_rootrstatus_cache_filewriterrx)rUrrrKavailable_servicess rLr)r)sC$$#C(%c* OO&s+, !!#%%++H5%c8X>H $<< B7 {{;.%7   2 O sCrentitlement_namec|D]d}|jd|k(s|jdrdnd|jdijdrdnd|jdidcSddidS) z0Extract information from the entitlements array.typer(rQrP obligationsenableByDefaultr)r( auto_enabledrrw)rrrEs rL_get_entitlement_informationrs$  ??6 "&6 6%0__Z%@Ed#}b9==)*}bA   d2 FFr|tokenc n d}tjt} t||}|jdi}|jdi}|j|jdd|jd d|jd d|jd gd |jd d|jd|jd d|jd gdddtjtj} |jdr|jd|d<|d} | | z } | jdkrt j"j%|dd| j't(} t*j-| j.| j0t*j3t j4dz| j.zdzd}|jdr|jd|d<|d} | | z } | jdkrt j6j%|dd| j't(} t*j-| j.| j0t*j3t j4dz| j.zdzd}t9|}t;|dDcgc] }|ds|d }}|jdg}|D]}|jd d} t=||}||}tA||}|d jC|jd!|j0|jD|d"|d#|j0|vrd$nd%d&|d jGd'tA|d(}|d"r|d)jd*}|r||dd+<|jtI|tK|||}|s9|jd gDcgc]}|jdd$d$k(r|}}||d <||fS#tj $r6}t |dr#|jdk(rt j|d}~wwxYwcc}w#tj>$rYwxYwcc}w),zGet a status dictionary based on a token. Returns a tuple with the status dictionary and an integer value - 0 for success, 1 for failure rrRiNrn accountInfor9r7r'rpr;)r9r'r:r;rqr>T)r6r=r@rrr0r6) contract_iddate) error_msg error_code rsr/c |dS)Nr'rys rLr{z!simulate_status..s & r|r}rXresourceEntitlementsrrTr2rr(rrQrP)r'r*r(rrXc&|jddSrvrwrys rLr{z!simulate_status..3rr|rrrr<)&rrrrr ContractAPIErrorrrRAttachInvalidTokenErrorrxrrnowrutc total_secondsrE_ATTACH_FORBIDDEN_EXPIREDrstrftimereventerrorrIr'infoSTATUS_TOKEN_NOT_VALIDE_ATTACH_FORBIDDEN_NOT_YETrrrrrrr*rrr)rUrrrrcontract_informatione contract_info account_inforexpiration_datetimedeltarSeffective_datetimerrrgrrrrJentitlement_informationrrrKrs rLsimulate_statusrs C}}^,H7UC ),,^R@M'++M2>L OO$''b1%))&"5+// R@)--j"= %((4"&&t,*..{B?(4(8(8(")  ( ,,x|| $C'+// >&y1#c)    A %99@@$Z06(112IJAG KK'++',,K G JJ//$6DtK C) - 1 1/ B%k2((    A %99@@$Z06'001HIAG KK'++',,K G JJ//$6DtK C',Iy.AB  $  !$$%;R@L #<<3 )c8HIG#"> *#  ## ]CHH="3J? 7 G XX-CCE    * Z"=>*<CGz}-11.A 9EHZ !5 6 OO&s+,%c8X>H $<< B7 {{;.%7   2 S=U  & & 1f !&&C-446 6v22   : s5 Q'R$ RR2R1R  RR/.R/stringcntjjrtj ||S|S)z=Return colorized string if using a tty, else original string.)sysstdoutisattySTATUS_HUMANIZE_COLORIZErx)rs rLfor_human_colorizedrIs5 ::    !$$VV4r|commandsc$d}|D]}|r|dz }|dj|z }djtj|tdz d}d|vrd }d }nd }d }d j t j |||t jS)Nr7z &&  z \ z )widthsubsequent_indentrz{ z }z{ z }z%{color}{prefix}{content}{suffix}{end})colorprefixcontentsuffixend)jointextwrapwraprrr" DISABLEGREYENDC)rrcmdwrapped_contentrrs rLcolorize_commandsrRsG!  v G388C= ! ll ,q0T O   2 9 9"" MM : r| column_dataheaderc dg}|r|j|t|Dcgc]}t|dc}}|dkDr?dj|}|j |Dcgc]}|j|c}|S|j |Dcgc]}|d c}|Scc}wcc}wcc}w)zReturn a list of content lines to print to console for a section Content lines will be center-aligned based on max value length of first column. rz{{:>{}}}: {{}}r)rmaxlenrextend)rrrpairtemplate_lengthtemplates rLget_section_column_contentr#nsG vK@D3tAw<@AO#**?;;G4.GH N K8DQ89 NAH9sB# B( B-c|tjS |j}|j dS#t$rYwxYw)Nz%c %Z)rSTATUS_CONTRACT_EXPIRES_UNKNOWN astimezone Exceptionr)r0s rLformat_expiresr(sM777 $$&   G $$    s5 AAr)cX|jdsg|jdr|jddstjStj tj tj tjtjtjg}|jdgD]&}|jtjd)i|(dj|S|jddstjg}ntj tj tj tjg}|jdgD]}|jd}|r|n|jd d }|jd d k(rtjntj}|jtj |jd d |||jd}|r0|jtj|j!||jdrt|jdtj"zt%|jdij'D]&\}} |jdj || (|s!|j!d tj(g|j!d tj*j,gt/j0t.j2j4k(r!|j!d tj6gdj|Sg} d} |jddstjg}nt8g}|jdgD]} | jdd } | jd}|r|n| jd d }| jd d t;| t;| jdd |d}| jdd}|%|jdd}|| j|| jd}|r|sd} dj |d |d <|jt=jd)i||s|s t?|j'D]\}\}}|tA|dz k7rdnd}|jtBj ||jd t;|jdd t;|jdd |jd d | r0|jd |jtjD|jdstA| dkDrs|jd |jtj|jd}|r|j!|tA| dkDr|j!| |jdrt|jdtj"zt%|jdij'D]&\}} |jdj || (|jd |sA| r |jtjFn|jtj(|jtjHj d g}|jd!ijd d"}|r!|jtjJ|f|jd#ijd d"}|r!|jtjL|f|jd$dd%k7r|jtjNtQ|jd&f|jd#ijd'd"}|jtjRt;|f|r,|jd |j!tU|(dj|S)*z&Format status dict for tabular output.r.r@r2N)r'rXr(rr*r)r'rXr*rWr*r7rXrQr'rr5z{}: {}Fr(r)r&rZrSr[Tz{}*ru├u└)markerr'r(r)r*rzpro enable )commandr=unknownr6r1freer0r<)rr)+rxrSTATUS_NO_SERVICES_AVAILABLESTATUS_SIMULATED_TMPLrSTATUS_SERVICESTATUS_AVAILABLESTATUS_ENTITLEDSTATUS_AUTO_ENABLEDSTATUS_DESCRIPTIONrrSTATUS_UNATTACHED_TMPLSTANDALONE_YES STANDALONE_NOSTATUS_NOTICESrSTATUS_FEATURESrrcSTATUS_ALL_HINT E_UNATTACHEDrIr rrr)LIVEPATCH_KERNEL_NOT_SUPPORTED_UNATTACHED STATUS_HEADERr STATUS_TMPL enumeraterVARIANT_STATUS_TMPLSTATUS_SERVICE_HAS_VARIANTSSTATUS_ALL_HINT_WITH_VARIANTS"STATUS_FOOTER_ENABLE_SERVICES_WITHSTATUS_FOOTER_ACCOUNTSTATUS_FOOTER_SUBSCRIPTIONSTATUS_FOOTER_VALID_UNTILr(STATUS_FOOTER_SUPPORT_LEVELr#)r)rrrKrr*rXrr~rfservice_warnings has_variantsrkr(fmt_argsrZwarning_messager[idx_variantr*pairs account_name contract_namer<s rLformat_tabularrRsb ::j ! ::k "::j$/<<<&,,!00&77%55!)!=!= ( ; ; -G"::j"5 H4;;FgFG H99W% %zz*d+<<=G'--!00&77 ( ; ;.G"::j"5 !(-C!D&# ]B7{{;/58++!// *11$[[4"+$/2 (**Y'  NN822 3 NN7 # ::j ! NN4(":":: ;$VZZ B%?%E%E%GH < UxsE:; < NNB 8 89 :H115567  ) ) +))55 6 NNXGGH yy!!L ::j$ '889 /$jjR8* N%))*b9H+//0FGN"#'' r:  '**626/9-"&&x4 + H%((D9G"")++i">".$++O<%))*5H# #(<<0@#A NN;--99 :H)28>>3C)D%C!W&)S]Q->&>UEFNN+22#)!(V!4%8 ' J ;&$7 ' Hb 9$)0 M2(F3  9* Xrx;;< zz)$4 5 9rx../**Y'  NN7 #  1 $ NN+ , zz*th6667 J!;!A!A!CD 8JC NN8??36 7 8 NN2   NN8AA B NN833 4 NN33::* ;  E::i,00CL h44lCDJJz2.2269EM h99=IJ zz(D!V+ 22vzz)45  $ZZ B7;; )   44#$67   r1eDE 99W r|cTt|}d}t}||d<|D];}|d|k(s|jd|k(s t||d}|}||}n|t j |t|jr6ti|}|d} |d|d<| |d<| dk(rQjrEd |d <n?|d rtjj} ntjj} | |d <j|d <|S#tj $rYwxYw) zReturn help information from an uaclient service as a dict :param name: Name of the service for which to return help data. :raises: UbuntuProError when no help is available. Nr'rr)r'r)r(enabledTbetarXhelp)rrrxrr r NoHelpContentrrrdrrrrfr_ help_info) rUr'r help_resource response_dictr help_ent_clshelp_entrk status_msgrXs rLrVrVIsW(,IM  MM M&  F t #x||M'Bd'J 2(6"2  %M#C(H  &&D11C$$1(BD#H- $2:$> j!", h  "|';';$(M& !  %.88>>I.::@@I%. k"$..M& 966  sDD'&D')F)N)prloggingrr collectionsrrrtypingrrrr r uaclientr r r rrrr(uaclient.api.u.pro.status.is_attached.v1ruaclient.configrruaclient.contractrruaclient.defaultsrruaclient.entitlementsr(uaclient.entitlements.entitlement_statusrrrruaclient.filesrrr uaclient.files.noticesr!uaclient.messagesr"get_event_loggerr getLoggerreplace_top_level_logger_name__name__r ESSENTIALSTANDARDADVANCEDrrfOKGREENSTATUS_STATUS_ENABLEDrrFAILSTATUS_STATUS_DISABLEDr`rSTATUS_STATUS_INAPPLICABLEr_STATUS_STATUS_UNAVAILABLErb WARNINGYELLOWSTATUS_STATUS_WARNINGENTITLEDSTATUS_ENTITLED_ENTITLEDr^STATUS_ENTITLED_UNENTITLEDSTATUS_SUPPORT_ESSENTIALSTATUS_SUPPORT_STANDARDSTATUS_SUPPORT_ADVANCEDrr5r/rr0r2 STATUS_STATUSr4r=r>r@ get_versionrrrMstrrdrrrrboolr)rintrrrr#r(rRrVrr|rLrs  #'33B:OG5 BA)&% %%'g:::8DE    !!8999HMMI## 777(--G!!''  - - . --   &&  , , - -- ""!?!??(--O!!8<<3 wtT#YC:AEeCHo&08  #Y*%HX.%3%y4S>yTycyx2r|