U ϴfrE@s ddlZddlZddlZddlmZmZddlmZmZm Z ddl m Z m Z m Z mZmZmZmZmZddlmZmZmZmZmZmZmZmZddlmZddlmZe e!e"Z#dd d Z$d Z%d Z&d Z'e (Z)GdddZ*e+dddZ,dddZ-e+dddZ.dS)N) lru_cachewraps)AnyDictOptional)apt event_logger exceptionshttpmessagessnapsystemutil) APT_NEWS_URLBASE_CONTRACT_URLBASE_LIVEPATCH_URLBASE_SECURITY_URLCONFIG_DEFAULTSCONFIG_FIELD_ENVVAR_ALLOWLISTDEFAULT_CONFIG_FILEDEFAULT_DATA_DIR)user_config_file) safe_loadnametype)ZavailableResourcesZresourceEntitlementsZ_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@seZdZdZdZdZdAeeee fee j eeddddZ e edd d Ze edd d Ze edd dZe eedddZejedddZe eedddZejedddZe eedddZejedddZe eedddZejedddZe eddeedddZejedddZe eddeedd d!Zejedd"d!Ze edd#d$Zejedd%d$Ze edd&d'Zejedd(d'Ze edd)d*Zejedd+d*Ze edd,d-Zejedd.d-Ze edd/d0Zejedd1d0Ze edd2d3Z e jedd4d3Z e d5d6Z!e d7d8Z"e edd9d:Z#e d;d<Z$d=d>Z%d?d@Z&dS)BUAConfig)rr )r!r")rrN)cfg user_configseriesreturnc Cs|rd|_||_d|_nt|_t|j\|_|_|r>||_nVztj|_WnDtk r}z&t j d|dt dt |_W5d}~XYnXd|jkrtj j |j |jddd|_||_dS)NzError loading user config)exc_infozUsing default config valuesr.T)Z optional_type_errors_become_null)Zcfg_pathr1 invalid_keysget_config_path parse_configr2rread ExceptionLOGwarningUserConfigDataZ from_dictZto_dictr3)selfr1r2r3erA1/usr/lib/python3/dist-packages/uaclient/config.py__init__Rs(  zUAConfig.__init__r4cCs|jdtS)Nr')r1getrr?rArArBr'uszUAConfig.contract_urlcCs|jdtS)Nr,)r1rErrFrArArBr,yszUAConfig.security_urlcCs|jdtS)Nr/)r1rErrFrArArBr/}szUAConfig.livepatch_urlcCs|jjSN)r2rrFrArArBrszUAConfig.http_proxy)valuecCs||j_tj|jdSrG)r2rrwriter?rHrArArBrscCs|jjSrG)r2rrFrArArBrszUAConfig.https_proxycCs||j_tj|jdSrG)r2rrrIrJrArArBrscCs|jjSrG)r2r rFrArArBr szUAConfig.ua_apt_https_proxycCs||j_tj|jdSrG)r2r rrIrJrArArBr scCs|jjSrG)r2rrFrArArBrszUAConfig.ua_apt_http_proxycCs||j_tj|jdSrG)r2rrrIrJrArArBrs)maxsizecCs:|jj}|r|S|jj}|r6ttjjddd|SdS)Nrr!oldnew)r2r!reventinfor WARNING_DEPRECATED_FIELDformatr?Z global_valZ old_apt_valrArArBr!szUAConfig.global_apt_http_proxycCs.||j_d|j_tjjtj|jdSrG)r2r!rr0fget cache_clearrrIrJrArArBr!s cCs:|jj}|r|S|jj}|r6ttjjddd|SdS)Nrr"rL)r2r"rrOrPr rQrRrSrArArBr"szUAConfig.global_apt_https_proxycCs.||j_d|j_tjjtj|jdSrG)r2r"rr0rTrUrrIrJrArArBr"s cCs|jj}|dkrdS|S)Ni`T)r2r#r?valrArArBr#szUAConfig.update_messaging_timercCs||j_tj|jdSrG)r2r#rrIrJrArArBr#scCs|jj}|dkrdS|S)Ni@8)r2r$rVrArArBr$szUAConfig.metering_timercCs||j_tj|jdSrG)r2r$rrIrJrArArBr$scCs|jj}|dkrdS|S)NF)r2poll_for_pro_licenserVrArArBrXszUAConfig.poll_for_pro_licensecCs||j_tj|jdSrG)r2rXrrIrJrArArBrXscCs|jj}|dkrdS|S)NiX)r2polling_error_retry_delayrVrArArBrYsz"UAConfig.polling_error_retry_delaycCs||j_tj|jdSrG)r2rYrrIrJrArArBrYscCs|jj}|dkrdS|S)NT)r2r%rVrArArBr% szUAConfig.apt_newscCs||j_tj|jdSrG)r2r%rrIrJrArArBr%scCs|jj}|dkrtS|SrG)r2r&rrVrArArBr&szUAConfig.apt_news_urlcCs||j_tj|jdSrG)r2r&rrIrJrArArBr&scCs|jdtS)Nr()r1rErrFrArArBr("szUAConfig.data_dircCs>|jdd}ztt|WStk r8tjYSXdS)Nr+DEBUG)r1rEgetattrloggingupperAttributeErrorrZ)r?r+rArArBr+&s zUAConfig.log_levelcCs|jdtdS)Nr*)r1rErrFrArArBr*.szUAConfig.log_filecCs.|jd}|r*t|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)r1rE isinstancedictr<r=)r?r)rArArBr)2s  zUAConfig.featuresc Cs"dD]D}t||}|dkr(td|qt|tr:|dkrtj||dq|jsV|jrj|j sb|j rjt t d|jt jt d|jt jt d|j t jt d|j t jt d|jt jt d|jt j|js|jrt|j|jtjjn&|j s |j r t|j |j tjjg}trtt|j|j|jsTttjsj|jstttjrt|dddl m!}dd l"m#}||j$}t%d d |D}|r|&|j|j|js||js|js||jr|d t'|dkrd (|}t)t*j+j,|ddS)N)r#r$z1No config set for %s, default value will be used.rkeyrHr Zhttpsr ) livepatch)_enabled_servicescss|]}|jdkr|VqdS)rcN)r).0ZentrArArB s z*UAConfig.process_config..rcz, )services)-r[r<debugr_intr ZInvalidPosIntConfigValuer!r"rr ZInvalidProxyCombinationConfigr Zvalidate_proxyZPROXY_VALIDATION_APT_HTTP_URLZPROXY_VALIDATION_APT_HTTPS_URLrZPROXY_VALIDATION_SNAP_HTTP_URLrZPROXY_VALIDATION_SNAP_HTTPS_URLrZsetup_apt_proxyZ AptProxyScopeZGLOBALZUACLIENTr Zis_snapd_installedZconfigure_snap_proxyZget_config_option_valueZHTTP_PROXY_OPTIONZHTTPS_PROXY_OPTIONappenduaclientrcZ-uaclient.api.u.pro.status.enabled_services.v1rdenabled_servicesanyZconfigure_livepatch_proxylenjoinprintr Z!PROXY_DETECTED_BUT_NOT_CONFIGUREDrR) r?ZproprHZservices_with_proxiesrcrdrlZlivepatch_enabledrgrArArBprocess_configAs            zUAConfig.process_configcCs\|jdk r&t|jD]}td|qd|jkrXtdtdtdtddS)Nz&Ignoring invalid uaclient.conf key: %sr.z)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)r7sortedr<r=r1)r? invalid_keyrArArBwarn_about_invalid_keyss    z UAConfig.warn_about_invalid_keys)NNN)'__name__ __module__ __qualname__Zua_scoped_proxy_optionsZglobal_scoped_proxy_optionsZ&deprecated_global_scoped_proxy_optionsrrstrrrr>rCpropertyr'r,r/rsetterrr rrr!r"rir#r$boolrXrYr%r&r(r+r*r)rqrtrArArArBr0Gs #    jr0rDcCstjd}|r|StS)z4Get config path to be used when loading config dict.ZUA_CONFIG_FILE)osenvironrEr)Z config_filerArArBr8s r8c Csxtt}|st}td|tj|r@|t t |i}tj D]\}}|}|drN|dd}|dr|dd}|drtj|rt t |}n tj|dd |kr||i|d <q||d |<qN|tkrN|||<qN||d |krtj|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 %sZua_NZ features_ Zyaml)filepathr)r()r'r,ra)copyrr8r<rhr|pathexistsupdaterr Z load_filer}itemslower startswithendswithr ZInvalidFeatureYamlConfigValuer expanduserr Zis_service_urlZInvalidURLConfigValuesetkeys differenceVALID_UA_CONFIG_KEYSpop) Z config_pathr1Zenv_keysrbrHZ field_nameZfeature_field_namer7rsrArArBr9sD            r9 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}|tkr:dkr6|dfS|SS)Nr-Z cloud_type)r9rEUNSET_SETTINGS_OVERRIDE_KEY)r1_Zvalue_override)frrArBnew_fs  z>apply_config_settings_override..wrapper..new_f)r)rrr)rrBwrappers z/apply_config_settings_override..wrapperrA)rrrArrBapply_config_settings_override s r)N)/rr\r| functoolsrrtypingrrrrkrrr r r r r rZuaclient.defaultsrrrrrrrrZuaclient.filesrZ uaclient.yamlrZ getLoggerZreplace_top_level_logger_namerur<ZMERGE_ID_KEY_MAPrZUA_CONFIGURABLE_KEYSrZget_event_loggerrOr0rxr8r9rrArArArBs,( (   | ?