o Hcf,x@s@ddlZddlZddlZddlZddlmZddlmZmZddlm 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/e0Z1e2e3e4Z5dZ6dZ7dZ8e'j9j:e/j;ej<e/j=e'j>j:e/j?ej@e/j=e'jAj:e/jBejCe/j=e'jDj:e/jBejEe/j=e'jFj:e/jGejHe/j=e$jIj:e/j;ejJe/j=e$jKj:e/jBejLe/j=e6e/j;ejMe/j=e7e/j;ejNe/j=e8e/j;ejOe/j=i ZPdZQdZRdjSejTejUejVejWdZXdZYdZZiddddde[ddddd dd!dd"dd#gd$e&j>j:d%ej\d&id'gd(d)d)d)ge'jAj:d*d+d)d)d)gd,d-dZ]d.d/Z^d0e e_e ffd1d2Z`d3ed0e e_e ffd4d5Zad3ed0e e_e ffd6d7Zbd0e e_e ffd8d9Zcd0e e_e ffd:d;ZddVd3edZfd?e e e_e fd@e_d0e e_e ffdAdBZg dVdCe_de e_e fds  z,_get_blocked_by_services..)blocking_incompatible_services)entrJrJrK_get_blocked_by_servicess rOreturnc sd}d}|}|}|jvrdnd}i}|tjkr tj} n=|jvr.tj} |j}n/|\} } | tj krA| j| j d}n| rF| j }| tjkrMd}|j r]fdd|j D}t |} |j|j|j| j|||| |d } |jsx|| d<| S) Nr6noyes)codemessagecs$i|]\}}|t|dqS)cfg)_attached_service_status)rHrD variant_clsrVinapplicable_resourcesrJrK sz,_attached_service_status..) r&r)r'r(status_detailsdescription_override available blocked_bywarningvariants)status_description_overridecontract_statusr&r UNENTITLEDr UNAVAILABLE INAPPLICABLEuser_facing_statusWARNINGrFraitemsrOpresentation_namer)valuerC) rNrZrVr`r\r]rcr^ra ent_statusdetailsr_service_statusrJrYrKrWsL         rWrVc Csttjttjt|jrttjt t }|j d}|d}t j j}||dd|dtp8g|d|d|dd |d g|d |jjd|jjd|jjdd |jjd gd d|drt|jj|d<|dr|d|d<|j d}|st|}ddt|dddD}|D](}z t||dd d}Wn tjyYqw||} |dt| ||q|djddd|jjdid} | r| did} | r| |d d!<|S)"z8Return configuration of attached status as a dictionary.machineTokenInfo contractInfo machineIdTr0r8r& createdAtr6r:r7externalAccountIDsr=)r,r-r0rr5r< effectiveTor/ effectiveFromr.availableResourcescSs&i|]}|ds|d|dqS)r^r&r)getrHresourcerJrJrKr[s z$_attached_status..cS |ddSNr&r6rwxrJrJrK z"_attached_status..keyrVr&r1cSr{r|rwr}rJrJrKrrsupportrB affordances supportLevelr5r;)rremover AUTO_ATTACH_RETRY_FULL_NOTICEAUTO_ATTACH_RETRY_TOTAL_FAILUREris_attached_and_contract_validCONTRACT_EXPIREDcopydeepcopyDEFAULT_STATUS machine_tokenrrfrkupdaterxlistmachine_token_filer<contract_expiry_datetimersortedrr EntitlementNotFoundErrorappendrWsort entitlements) rVresponserorpr; resourcesrZrzent_clsrNrrrJrJrK_attached_statussz                    rc Cstt}t|}|D]\}|drtjj}ntjj}z t ||ddd}Wnt j y;t d|ddYq w|jdkrRttjjkrR||}|}nd}|d |d |d|j||d q |d jd d d|S)z#Return unattached status as a dict.r^r&r6rz@Ignoring availability of unknown service %s from contract serverzwithout a 'name' keyr Nr1 presentedAs)r&r)r]r^cSr{r|rwr}rJrJrKrGrz$_unattached_status..r)rrrrrxr AVAILABLErkrerr rLOGdebugr&r on_supported_kernelLivepatchSupport UNSUPPORTEDrbrr)r)rVrrrzr^rlpdescr_overriderJrJrK_unattached_statussB        rc Cstj|jdd}||O}|r|St|}g}|diD]3}|d}zt||d}Wntjy; | |Yqwt j j } |j rK|dd| krP| |q|rW||d<|S)z1Remove beta services from response dict if neededzfeatures.allow_beta)config path_to_valuer1r&rr(r6)ris_config_value_truerVrrrxrr rrrACTIVErkis_beta) rVshow_allrconfig_allow_beta new_responsereleased_resourcesrz resource_namerenabled_statusrJrJrK_handle_beta_resourcesLs0    rc Cst}|jj}tj}t\}}tpg}|dkr&|j j}tj j ||d}nt j jr7|jj}d}tjj |d}||||j|j|jd}tjj} tD]} t|| r_| | dur_t|| | | <qK| |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)r2r3r config_pathrr4Nr ua_config)rINACTIVErkrNO_ACTIVE_OPERATIONSr check_lock_inforrr LOCK_HELDformatrreboot_cmd_marker_file is_presentREBOOTREQUIREDENABLE_REBOOT_REQUIRED_TMPLcfg_pathrVr4r user_config public_configto_dictrhasattrgetattr) rV userStatus status_val status_desclock_pidr notices_listrretrrrJrJrK_get_config_statusps<     rrcCspt|jr t|}nt|}|t|trtj |t |||}|s6dd| dgD}||d<|S)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. cS g|] }|dddkr|qSr^rRrwrGrJrJrKrL zstatus..r1) r is_attachedrrrrrwe_are_currently_rootrstatus_cache_filewriterrx)rVrravailable_servicesrJrJrKr(s    r(rentitlement_namecCs`|D]'}|d|kr)|drdnd|didrdnd|didSqddidS) z0Extract information from the entitlements array.typer'rRrQ obligationsenableByDefaultr)r' auto_enabledrrw)rrrBrJrJrK_get_entitlement_informations    rtokenc Cs4d}tt}zt||}Wntjy+}zt|dr%|jdkr%t|d}~ww| di}| di}| | dd| d d| d d| d gd | d d| d| d d| d gdddt t j} | dr| d|d<|d} | | } | dkrtjj|dd| td} tj| j| jdttjd| jdd}| dr| d|d<|d} | | } | dkrtjj|dd| td} tj| j| jdttjd| jdd}t|}ddt|dddD}| dg}|D]G}| d d}zt||d }Wn tjy'Yq w||d!}t ||}|d"!| d#|j|j"|d$|d%|j|vrLd&nd'd(q |d"j#d)ddt |d*}|d$rw|d+ d,}|rw||dd-<| t$|t%|||}|sd.d| d"gD}||d"<||fS)/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 rrSiNrp accountInfor8r6r&rrr:)r8r&r9r:rsr=T)r5r<r?rtr/r5) contract_iddate) error_msg error_code rur.cSsg|] }|ds|dqS)r^r&rJryrJrJrKrLs z#simulate_status..cSs|dS)Nr&rJr}rJrJrKrsz!simulate_status..rresourceEntitlementsrrUr1rr'rrRrQ)r&r)r'rr^cSr{r|rwr}rJrJrKr3rrrrr;cSrrrwrGrJrJrKrL?r)&rrrrr ContractAPIErrorrrSAttachInvalidTokenErrorrxrrnowrutc total_secondsrE_ATTACH_FORBIDDEN_EXPIREDrstrftimereventerrorrFr&infoSTATUS_TOKEN_NOT_VALIDE_ATTACH_FORBIDDEN_NOT_YETrrrrrrr)rrr)rVrrrrcontract_informatione contract_info account_inforexpiration_datetimedeltarTeffective_datetimerrZrrzrrrNentitlement_informationrrrrJrJrKsimulate_statuss                         rstringcCstjr t||S|S)z=Return colorized string if using a tty, else original string.)sysstdoutisattySTATUS_HUMANIZE_COLORIZErx)rrJrJrKfor_human_colorizedIs  rcommandscCstd}|D]}|r |d7}|d|7}qdtj|tddd}d|vr*d }d }nd }d }d jtj|||tjdS)Nr6z &&  z \ z )widthsubsequent_indentrz{ z }z{ z }z%{color}{prefix}{content}{suffix}{end})colorprefixcontentsuffixend)jointextwrapwraprrr! DISABLEGREYENDC)rrcmdwrapped_contentrrrJrJrKcolorize_commandsRs, r column_dataheadercsjg}|r ||tdd|D}|dkr)d||fdd|D|S|dd|D|S)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. cSsg|]}t|dqS)r)lenrHpairrJrJrKrLysz.get_section_column_content..rz{{:>{}}}: {{}}csg|]}j|qSrJ)rrtemplaterJrKrL|scSsg|]}|dqS)rrJrrJrJrKrLs)rmaxrextend)rrrtemplate_lengthrJrrKget_section_column_contentns  rcCs8|durtjSz|}Wn tyYnw|dS)Nz%c %Z)rSTATUS_CONTRACT_EXPIRES_UNKNOWN astimezone Exceptionr)r/rJrJrKformat_expiress   r c Cs4|ds|dr<|ddstjStjtjtjtjtjtj dg}|dgD] }| tjd)i|q)d |S|ddsGtjg}n@t jtjtjtj dg}|dgD]-}|d}|rd|n|d d }|d d krttj ntj}| t j|d d ||dqY|d}|r| tj|||dr| dtjt|diD] \}} | d|| q|s|d tjg|d tjjgttjjkr|d tjgd |Sg} d} |ddstjg}ntg}|dgD]} | dd } | d}|r|n| d d }| d d t| t| dd |d}| dd}|durD|dd}|durD| || d}|rZ|sZd} d|d |d <| tjd)i||r|rt|D]4\}\}}|t |dkrdnd}| t!j||d t|dd t|dd |d d dqqq| r| d | tj"|dst | dkr| d | tj|d}|r||t | dkr|| |dr | dtjt|diD]\}} | d|| q| d |s%| r| tj#n| tj| tj$jdd g}|d!id d"}|rF| tj%|f|d#id d"}|r[| tj&|f|d$dd%kr| tj't(|d&f|d#id'd"}| tj)t|f|r| d |t*|d(d |S)*z&Format status dict for tabular output.r-r?r1N)r&r^r'rr)r)r&r^r)r]r)r6r^rRr&rr4z{}: {}Fr'r(r%r`rTraTz{}*ru├u└)markerr&r'r(r)rzpro enable )commandr<unknownr5r0freer/r;)rrJ)+rxrSTATUS_NO_SERVICES_AVAILABLESTATUS_SIMULATED_TMPLrSTATUS_SERVICESTATUS_AVAILABLESTATUS_ENTITLEDSTATUS_AUTO_ENABLEDSTATUS_DESCRIPTIONrr STATUS_UNATTACHED_TMPLSTANDALONE_YES STANDALONE_NOSTATUS_NOTICESrSTATUS_FEATURESrriSTATUS_ALL_HINT E_UNATTACHEDrFr 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(rrrIrr)r^rrrkservice_warnings has_variantsrnr'fmt_argsr`warning_messageraidx_variantr!pairs account_name contract_namer;rJrJrKformat_tabulars4                                               rIc Cst|}d}t}||d<|D],}|d|ks|d|kr;z t||dd}Wn tjy2Yqw|}||}nq|durFtj|dt|jrkt |i|}|d} |d|d<| |d<| dkrj|j rjd |d <n|d rtt j j } nt jj } | |d <|j|d <|S) 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'enabledTbetar^help)rrrxrr r NoHelpContentrrrWrrrrkre help_info) rVr&r help_resource response_dictrz help_ent_clshelp_entrn status_msgr^rJrJrKrLIsB       rL)F)N)prloggingrr  collectionsrrrtypingrrrrr uaclientr r r r rrr(uaclient.api.u.pro.status.is_attached.v1ruaclient.configrruaclient.contractrruaclient.defaultsrruaclient.entitlementsr(uaclient.entitlements.entitlement_statusrrrruaclient.filesrrruaclient.files.noticesr uaclient.messagesr!get_event_loggerr getLoggerreplace_top_level_logger_name__name__r ESSENTIALSTANDARDADVANCEDrrkOKGREENSTATUS_STATUS_ENABLEDrrFAILSTATUS_STATUS_DISABLEDrfr STATUS_STATUS_INAPPLICABLEreSTATUS_STATUS_UNAVAILABLErh WARNINGYELLOWSTATUS_STATUS_WARNINGENTITLEDSTATUS_ENTITLED_ENTITLEDrdSTATUS_ENTITLED_UNENTITLEDSTATUS_SUPPORT_ESSENTIALSTATUS_SUPPORT_STANDARDSTATUS_SUPPORT_ADVANCEDrr,r&rr'r) STATUS_STATUSr+r4r5r7 get_versionrrrOstrrWrrrrboolr(rintrrrrr rIrLrJrJrJrKs: $    (         ;J1$ +    z    =