U ϴfq@sddlZddlZddlZddlZddlmZddlmZmZddlm 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+m,Z,dd l-m.Z.ddl/m0Z0e1Z2e3e4e5Z6dZ7dZ8dZ9e'j:j;e0je'j?j;e0j@ejAe0j>e'jBj;e0jCejDe0j>e'jEj;e0jCejFe0j>e'jGj;e0jHejIe0j>e$jJj;e0je$jLj;e0jCejMe0j>e7e0je8e0je9e0ji ZQdZRdZSdjTejUejVejWejXdZYdZZdZ[dde\dddddge&j?j;ej]igdddge'jBj;ddddgdddZ^dd Z_e e`e fd!d"d#Zaee e`e fd$d%d&Zbee e`e fd$d'd(Zce e`e fd!d)d*ZddEeeee e`e fd+d,d-Zfe e e`e fe`e e`e fd.d/d0ZgdFe`eee e e`e fehfd1d2d3Zie`e`d4d5d6Zje e e`e`d7d8d9ZkdGe e e`e`fe e`e e`d:d;d<Zle ee`d=d>d?ZmdHe e`e feee`d@dAdBZndCdDZodS)IN) 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) machine_tokennotices state_filesuser_config_file)Notice)TxtColorZ essentialZstandardZadvancedz({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}zUContent provided in json response is currently considered Experimental and may changez0.1Fidr$ created_atproductstech_support_levelr$r*r+Zexternal_account_ids)Z_docZ_schema_versionr machine_idattached effectiveexpiresoriginservicesexecution_statusexecution_detailsfeaturesrcontractaccount simulatedcCsdd|DS)NcSs4g|],}|jjs|jjn|jj|jj|jjdqS))r$Z reason_codereason) entitlement is_variantr$ variant_nameZ named_msgmsg.0servicerC1/usr/lib/python3/dist-packages/uaclient/status.py s  z,_get_blocked_by_services..)Zblocking_incompatible_services)entrCrCrD_get_blocked_by_servicess rG)returnc sd}d}|}|}|jkr&dnd}i}|tjkr@tj} nz|jkr\tj} |j}n^|\} } | tj kr| j| j d}n | r| j }| tjkrd}|j rfdd|j D}t |} |j|j|j| j|||| |d } |js|| d<| S) Nr(noyes)codemessagecs$i|]\}}|t|dqS))cfg)_attached_service_status)rAr>Z variant_clsrMinapplicable_resourcesrCrD sz,_attached_service_status..) r$r'r%r&status_detailsdescription_override available blocked_bywarningvariants)status_description_overridecontract_statusr$r UNENTITLEDr UNAVAILABLE INAPPLICABLEZuser_facing_statusWARNINGr?rWitemsrGZpresentation_namer'valuer=) rFrPrMrVrRrSrYrTrWZ ent_statusZdetailsrUservice_statusrCrOrDrNsL         rN)rMrHc Csttjttjt|jr.ttjt t }t |}|j d}|d}t jj}||dd|dtpzg|d|d|dd |d g|d |jd|jd|jdd |jd gd d|dr|j|d<|dr|d|d<|j d}|st|}ddt|dddD}|D]T}zt||dd d} Wntjk rpYq6YnX|dt| ||q6|djddd|did} | r| did} | r| |d d!<|S)"z8Return configuration of attached status as a dictionary.machineTokenInfo contractInfoZ machineIdTr3r*r$ createdAtr(r,r)externalAccountIDsr.)r/r0r3rr8r9 effectiveTor2 effectiveFromr1ZavailableResourcescSs&i|]}|ds|d|dqS)rTr$r'getrAresourcerCrCrDrQs z$_attached_status..cSs |ddSNr$r(rgxrCrCrDz"_attached_status..keyrMr$r4cSs |ddSrkrgrlrCrCrDrnrosupportr< affordances supportLevelr8r-)rremover!ZAUTO_ATTACH_RETRY_FULL_NOTICEZAUTO_ATTACH_RETRY_TOTAL_FAILURErZis_attached_and_contract_validZCONTRACT_EXPIREDcopydeepcopyDEFAULT_STATUSrZget_machine_token_filerr\r_updaterhlistr9Zcontract_expiry_datetimersortedrr EntitlementNotFoundErrorappendrNsort entitlements) rMresponseZmachine_token_filerarbr- resourcesrPrjrFrsrurCrCrD_attached_statussp                   rc Cstt}t|}|D]}|dr.tjj}ntjj}zt ||ddd}Wn.t j k r|t d|ddYqYnX|jdkrttjjkr|}nd}|d |d |d|j||d q|d jd d d|S)z#Return unattached status as a dict.rTr$r(rrz@Ignoring availability of unknown service %s from contract serverzwithout a 'name' keyr Nr4 presentedAs)r$r'rSrTcSs |ddSrkrgrlrCrCrDrnFroz$_unattached_status..rp)rwrxryrrhr AVAILABLEr_r[rr r}LOGdebugr$r on_supported_kernelLivepatchSupport UNSUPPORTEDrXr~r'r)rMrrrjrTrFdescr_overriderCrCrD_unattached_statuss>      rc Cst}|jj}tj}t\}}tp(g}|dkrL|j j}tj j ||d}n"t j jrn|jj}d}tjj |d}||||j|j|jd}tjj} tD](} t|| r| | dkrt|| | | <q| |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)r5r6rZ config_pathconfigr7Nr ua_config)rINACTIVEr_rNO_ACTIVE_OPERATIONSr Zcheck_lock_inforr{ACTIVEZ LOCK_HELDformatrZreboot_cmd_marker_fileZ is_presentZREBOOTREQUIREDZENABLE_REBOOT_REQUIRED_TMPLZcfg_pathrMr7r Z user_configZ public_configZto_dictrhasattrgetattr) rMZ userStatusZ status_valZ status_descZlock_pidrZ notices_listrretrrqrCrCrD_get_config_statusKs<     r)rMshow_allrHcCsdt|jrt|}nt|}|t|tr>tj ||s`dd| 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. cSs g|]}|dddkr|qSrTrJrgr@rCrCrDrEszstatus..r4) r is_attachedrrrzrrZwe_are_currently_rootrZstatus_cache_filewriterh)rMrravailable_servicesrCrCrDr&vs    r&)rentitlement_namerHcCs`|D]N}|d|kr|dr$dnd|didr.cSs|dS)Nr$rCrlrCrCrDrnroz!simulate_status..rpZresourceEntitlementsrrr4rr%rrJrI)r$r'r%rrTcSs |ddSrkrgrlrCrCrDrn rorsrtrur-cSs g|]}|dddkr|qSrrgr@rCrCrDrEs)%rwrxryrr ZContractAPIErrorrrKZAttachInvalidTokenErrorrhrzrnowrZutcZ total_secondsrZE_ATTACH_FORBIDDEN_EXPIREDrstrftimereventerrorr?r$infoZSTATUS_TOKEN_NOT_VALIDZE_ATTACH_FORBIDDEN_NOT_YETrr|rr}rr~r'rr)rMrrrrZcontract_informationeZ contract_infoZ account_inforZexpiration_datetimeZdeltarLZeffective_datetimerrPrrjrrFZentitlement_informationrsrurrCrCrDsimulate_statuss                       r)stringrHcCstjrt||S|S)z=Return colorized string if using a tty, else original string.)sysstdoutisattySTATUS_HUMANIZE_COLORIZErh)rrCrCrDfor_human_colorized sr)commandsrHcCstd}|D]}|r|d7}|d|7}qdtj|tddd}d|krTd }d }nd }d }d jtj|||tjdS)Nr(z &&  z \ z )widthZsubsequent_indentrz{ z }z{ z }z%{color}{prefix}{content}{suffix}{end})Zcolorprefixcontentsuffixend)jointextwrapZwraprrr" DISABLEGREYENDC)rrcmdZwrapped_contentrrrCrCrDcolorize_commands)s0r) column_dataheaderrHcshg}|r||tdd|D}|dkrPd||fdd|Dn|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)lenrAZpairrCrCrDrEPsz.get_section_column_content..rz{{:>{}}}: {{}}csg|]}j|qSrC)rrtemplaterCrDrESscSsg|] }|dqS)rrCrrCrCrDrEVs)r~maxrextend)rrrZtemplate_lengthrCrrDget_section_column_contentEs  r)r2rHcCs:|dkrtjSz |}Wntk r.YnX|dS)Nz%c %Z)rZSTATUS_CONTRACT_EXPIRES_UNKNOWNZ astimezone Exceptionr)r2rCrCrDformat_expiresZs r)r&rrHc Cs@|ds|drv|dds(tjStjtjtjtjtjtj dg}|dgD]}| tjf|qTd |S|ddstjg}nt jtjtjtj dg}|dgD]Z}|d}|r|n |d d }|d d krtj ntj}| t j|d d ||dq|d}|r2| tj|||dr| dtjt|diD]\}} | d|| qb|s|d tjg|d tjjgttjjkr|d tjgd |Sg} d} |ddstjg}ndtg}|dgD]N} | dd } | d}|r.|n | d d }| d d t| t| dd |d}| dd}|dk r|dd}|dk r| || d}|r|sd} d|d |d <| tjf||r|rt|D]h\}\}}|t |dkrdnd}| t!j||d t|dd t|dd |d d dqq| rv| d | tj"|dst | dkr| d | tj|d}|r||t | dkr|| |dr&| dtjt|diD]\}} | d|| q| d |sV| rJ| tj#n | tj| tj$jdd g}|d!id d"}|r| tj%|f|d#id d"}|r| tj&|f|d$dd%kr| tj't(|d&f|d#id'd"}| tj)t|f|r6| d |t*|d(d |S))z&Format status dict for tabular output.r0r:r4N)r$rTr%rr'r)r$rTr'rSr'r(rTrJr$rr7z{}: {}Fr%r&r#rVrLrWTz{}*ru├u└)markerr$r%r&r'rzpro enable )Zcommandr9unknownr8r3Zfreer2r-)r)+rhrZSTATUS_NO_SERVICES_AVAILABLESTATUS_SIMULATED_TMPLrSTATUS_SERVICEZSTATUS_AVAILABLESTATUS_ENTITLEDZSTATUS_AUTO_ENABLEDSTATUS_DESCRIPTIONr~rSTATUS_UNATTACHED_TMPLZSTANDALONE_YESZ STANDALONE_NOZSTATUS_NOTICESrZSTATUS_FEATURESr|r^ZSTATUS_ALL_HINTZ E_UNATTACHEDr?r rrrZ)LIVEPATCH_KERNEL_NOT_SUPPORTED_UNATTACHED STATUS_HEADERr STATUS_TMPL enumeraterVARIANT_STATUS_TMPLZSTATUS_SERVICE_HAS_VARIANTSZSTATUS_ALL_HINT_WITH_VARIANTSZ"STATUS_FOOTER_ENABLE_SERVICES_WITHZSTATUS_FOOTER_ACCOUNTZSTATUS_FOOTER_SUBSCRIPTIONZSTATUS_FOOTER_VALID_UNTILrZSTATUS_FOOTER_SUPPORT_LEVELr)r&rrrBrr'rTrrqr_Zservice_warningsZ has_variantsr`r%Zfmt_argsrVZwarning_messagerWidx_ZvariantrZpairsZ account_nameZ contract_namer-rCrCrDformat_tabulards6                                               rc Cst|}d}t}||d<|D]V}|d|ks<|d|krzt||dd}Wntjk rjYqYnX|}qvq|dkrtj|dt|jrt |i|}|d}|d|d<||d<n"|drt j j } nt j j } | |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$rrr)r$r&r%rThelp)rrrhrr r}Z NoHelpContentrrrNrrr_r[Z help_info) rMr$rZ help_resourceZ response_dictrjZhelp_entr`Z status_msgrTrCrCrDr s2        r)F)F)N)F)prwZloggingrr collectionsrrrtypingrrrrr Zuaclientr r r r rrrZ(uaclient.api.u.pro.status.is_attached.v1rZuaclient.configrrZuaclient.contractrrZuaclient.defaultsrrZuaclient.entitlementsrZ(uaclient.entitlements.entitlement_statusrrrrZuaclient.filesrrrr Zuaclient.files.noticesr!Zuaclient.messagesr"Zget_event_loggerrZ getLoggerZreplace_top_level_logger_name__name__rZ ESSENTIALZSTANDARDZADVANCEDrr_ZOKGREENZSTATUS_STATUS_ENABLEDrrZFAILZSTATUS_STATUS_DISABLEDr\rZSTATUS_STATUS_INAPPLICABLEr[ZSTATUS_STATUS_UNAVAILABLEr]Z WARNINGYELLOWZSTATUS_STATUS_WARNINGZENTITLEDZSTATUS_ENTITLED_ENTITLEDrZZSTATUS_ENTITLED_UNENTITLEDZSTATUS_SUPPORT_ESSENTIALZSTATUS_SUPPORT_STANDARDZSTATUS_SUPPORT_ADVANCEDrrrrrrZ STATUS_STATUSrrrrZ get_versionrryrGstrrNrrrboolr&rintrrrrrrrrCrCrCrDs $    (   ;G.+  x   =