o HcfG@sddlZddlZddlZddlmZmZddlmZmZm Z ddl m Z m Z m Z mZmZmZmZmZmZddlmZmZmZmZmZmZmZmZddlmZddlm Z e!e"e#Z$dd d Z%d Z&d Z'd Z(e )Z*GdddZ+de,fddZ-dddZ.de,fddZ/dS)N) lru_cachewraps)AnyDictOptional) apt event_logger exceptionsfileshttpmessagessnapsystemutil) APT_NEWS_URLBASE_CONTRACT_URLBASE_LIVEPATCH_URLBASE_SECURITY_URLCONFIG_DEFAULTSCONFIG_FIELD_ENVVAR_ALLOWLISTDEFAULT_CONFIG_FILEDEFAULT_DATA_DIR)user_config_file) safe_loadnametype)availableResourcesresourceEntitlements_unset) http_proxy https_proxyapt_http_proxyapt_https_proxyua_apt_http_proxyua_apt_https_proxyglobal_apt_http_proxyglobal_apt_https_proxyupdate_messaging_timermetering_timerapt_news apt_news_url) contract_urldata_dirfeatureslog_file log_level security_urlsettings_overrides ua_config livepatch_urlc @seZdZdZdZdZ   dGdeeee fdee j deeddfd d Z e d d Ze defd dZe defddZe defddZe deefddZejdefddZe deefddZejdefddZe deefddZejdefddZe deefddZejdefddZe edd deefd!d"Zejdefd#d"Ze edd deefd$d%Zejdefd&d%Ze defd'd(Zejdefd)d(Ze defd*d+Zejdefd,d+Ze defd-d.Zejdefd/d.Ze defd0d1Zejdefd2d1Ze defd3d4Z e jdefd5d4Z e defd6d7Z!e!jdefd8d7Z!e d9d:Z"e d;d<Z#e defd=d>Z$e d?d@Z%e dAdBZ&dCdDZ'dEdFZ(dS)HUAConfig)r#r$)r%r&)r!r"Ncfg user_configseriesreturnc Cs|r d|_||_d|_n t|_t|j\|_|_|r||_n,ztj|_Wn#tyJ}zt j d|dt dt |_WYd}~nd}~wwd|jvrctj j i|j |jddd|_||_d|_dS)NzError loading user config)exc_infozUsing default config valuesr2T) optional_type_errors_become_null)cfg_pathr5 invalid_keysget_config_path parse_configr6rread ExceptionLOGwarningUserConfigData from_dictto_dictr7_machine_token_file)selfr5r6r7erJ1/usr/lib/python3/dist-packages/uaclient/config.py__init__Ss0  zUAConfig.__init__cCs$|jst|j|jd|_|jS)Nmachine_token_overlay)rGr MachineTokenFiler,r-getrHrJrJrKmachine_token_fileys  zUAConfig.machine_token_filecC|jdtS)Nr+)r5rOrrPrJrJrKr+zUAConfig.contract_urlcCrR)Nr0)r5rOrrPrJrJrKr0rSzUAConfig.security_urlcCrR)Nr3)r5rOrrPrJrJrKr3rSzUAConfig.livepatch_urlcC|jjSN)r6rrPrJrJrKrzUAConfig.http_proxyvaluecC||j_tj|jdSrU)r6rrwriterHrWrJrJrKrcCrTrU)r6r rPrJrJrKr rVzUAConfig.https_proxycCrXrU)r6r rrYrZrJrJrKr r[cCrTrU)r6r$rPrJrJrKr$rVzUAConfig.ua_apt_https_proxycCrXrU)r6r$rrYrZrJrJrKr$r[cCrTrU)r6r#rPrJrJrKr#rVzUAConfig.ua_apt_http_proxycCrXrU)r6r#rrYrZrJrJrKr#r[)maxsizecC:|jj}|r|S|jj}|rttjjddd|SdS)Nr!r%oldnew)r6r%r!eventinfor WARNING_DEPRECATED_FIELDformatrH global_val old_apt_valrJrJrKr%zUAConfig.global_apt_http_proxycC.||j_d|j_tjjtj|jdSrU)r6r%r!r4fget cache_clearrrYrZrJrJrKr% cCr])Nr"r&r^)r6r&r"rarbr rcrdrerJrJrKr&rhzUAConfig.global_apt_https_proxycCrirU)r6r&r"r4rjrkrrYrZrJrJrKr&rlcC|jj}|dur dS|S)Ni`T)r6r'rHvalrJrJrKr'zUAConfig.update_messaging_timercCrXrU)r6r'rrYrZrJrJrKr'r[cCrm)Ni@8)r6r(rnrJrJrKr(rpzUAConfig.metering_timercCrXrU)r6r(rrYrZrJrJrKr(r[cCrm)NF)r6poll_for_pro_licensernrJrJrKrqszUAConfig.poll_for_pro_licensecCrXrU)r6rqrrYrZrJrJrKrqr[cCrm)NiX)r6polling_error_retry_delayrnrJrJrKrr sz"UAConfig.polling_error_retry_delaycCrXrU)r6rrrrYrZrJrJrKrrr[cCrm)NT)r6r)rnrJrJrKr)rpzUAConfig.apt_newscCrXrU)r6r)rrYrZrJrJrKr)r[cCs|jj}|dur tS|SrU)r6r*rrnrJrJrKr*#rpzUAConfig.apt_news_urlcCrXrU)r6r*rrYrZrJrJrKr**r[cCrR)Nr,)r5rOrrPrJrJrKr,/rSzUAConfig.data_dircCs8|jdd}ztt|WStytjYSw)Nr/DEBUG)r5rOgetattrloggingupperAttributeErrorrs)rHr/rJrJrKr/3s   zUAConfig.log_levelcCs|jdtdS)Nr.)r5rOrrPrJrJrKr.;szUAConfig.log_filecCs.|jd}|rt|tr|Std|iS)z>Return a dictionary of any features provided in uaclient.conf.r-zDUnexpected uaclient.conf features value. Expected dict, but found %s)r5rO isinstancedictrBrC)rHr-rJrJrKr-?s  zUAConfig.featurescCrT)zAReturn the machine-token if cached in the machine token response.)rQ machine_tokenrPrJrJrKrzNszUAConfig.machine_tokenc CsdD]"}t||}|durtd|qt|tr|dkr$tj||dq|js+|jr5|j s1|j r5t t d|jt jt d|jt jt d|j t jt d|j t jt d|jt jt d|jt j|jsq|jr}t|j|jtjjn|j s|j rt|j |j tjjg}trt|j|j|jsttjs|jsttjr|dddl m!}dd l"m#}dd l$m%}||}|&\}} ||j'kr|(|j|j|js||js|js||jr|d t)|dkr d *|} t+t,j-j.| d dSdS)N)r'r(z1No config set for %s, default value will be used.rkeyrWr httpsr ) livepatch)ApplicationStatus)LivepatchEntitlementr~z, )services)/rtrBdebugrxintr InvalidPosIntConfigValuer%r&r#r$InvalidProxyCombinationConfigr validate_proxyPROXY_VALIDATION_APT_HTTP_URLPROXY_VALIDATION_APT_HTTPS_URLrPROXY_VALIDATION_SNAP_HTTP_URLr PROXY_VALIDATION_SNAP_HTTPS_URLrsetup_apt_proxy AptProxyScopeGLOBALUACLIENTr is_snapd_installedconfigure_snap_proxyget_config_option_valueHTTP_PROXY_OPTIONHTTPS_PROXY_OPTIONappenduaclientr~(uaclient.entitlements.entitlement_statusruaclient.entitlements.livepatchrapplication_statusENABLEDconfigure_livepatch_proxylenjoinprintr !PROXY_DETECTED_BUT_NOT_CONFIGUREDrd) rHproprWservices_with_proxiesr~rr livepatch_entlivepatch_status_rrJrJrKprocess_configSs                 zUAConfig.process_configcCs`|jdurt|jD]}td|q d|jvr.tdtdtdtddSdS)Nz&Ignoring invalid uaclient.conf key: %sr2z)legacy "ua_config" found in uaclient.confzPlease do the following:z 1. run `sudo pro config set field=value` for each field/value pair present under "ua_config" in /etc/ubuntu-advantage/uaclient.confzQ 2. Delete "ua_config" and all sub-fields in /etc/ubuntu-advantage/uaclient.conf)r=sortedrBrCr5)rH invalid_keyrJrJrKwarn_about_invalid_keyss    z UAConfig.warn_about_invalid_keys)NNN))__name__ __module__ __qualname__ua_scoped_proxy_optionsglobal_scoped_proxy_options&deprecated_global_scoped_proxy_optionsrrstrrrrDrLpropertyrQr+r0r3rsetterr r$r#rr%r&rr'r(boolrqrrr)r*r,r/r.r-rzrrrJrJrJrKr4Hs &       gr4r8cCstjd}|r |StS)z4Get config path to be used when loading config dict.UA_CONFIG_FILE)osenvironrOr) config_filerJrJrKr>s r>c Csptt}|s t}td|tj|r |t t |i}tj D]Q\}}|}|drx|dd}|drp|dd}|dr^tj|rXt t |}ntj|dd |vri||i|d <q'||d |<q'|tvrx|||<q'||d |vrtj|d |d <d D]}t||stj|||d qt|t}|D]}||q||fS) aParse known Pro config file Attempt to find configuration in cwd and fallback to DEFAULT_CONFIG_FILE. Any missing configuration keys will be set to CONFIG_DEFAULTS. Values are overridden by any environment variable with prefix 'UA_'. @param config_path: Fullpath to pro configfile. If unspecified, use DEFAULT_CONFIG_FILE. @return: Dict of configuration values. z%Using client configuration file at %sua_N features_ yaml)filepathr-r,)r+r0r{)copyrr>rBrrpathexistsupdaterr load_fileritemslower startswithendswithr InvalidFeatureYamlConfigValuer expanduserr is_service_urlInvalidURLConfigValuesetkeys differenceVALID_UA_CONFIG_KEYSpop) config_pathr5env_keysr|rW field_namefeature_field_namer=rrJrJrKr?sH           r? override_keycsfdd}|S)aDecorator used to override function return by config settings. To identify if we should override the function return, we check if the config object has the expected override key, we use it has, we will use the key value as the function return. Otherwise we will call the function normally. @param override_key: key to be looked for in the settings_override entry in the config dict. If that key is present, we will return its value as the function return. cstfdd}|S)Ncs@t\}}|dit}|tkrdkr|dfS|SS)Nr1 cloud_type)r?rOUNSET_SETTINGS_OVERRIDE_KEY)r5rvalue_override)frrJrKnew_f&s  z>apply_config_settings_override..wrapper..new_f)r)rrr)rrKwrapper%s z/apply_config_settings_override..wrapperrJ)rrrJrrKapply_config_settings_overrides rrU)0rrur functoolsrrtypingrrrrrrr r r r r rruaclient.defaultsrrrrrrrruaclient.filesr uaclient.yamlr getLoggerreplace_top_level_logger_namerrBMERGE_ID_KEY_MAPrUA_CONFIGURABLE_KEYSrget_event_loggerrar4rr>r?rrJrJrJrKs0,(   ?