Your IP : 216.73.216.14


Current Path : /usr/lib/python3/dist-packages/uaclient/__pycache__/
Upload File :
Current File : //usr/lib/python3/dist-packages/uaclient/__pycache__/config.cpython-38.pyc

U

8�-d�a�@sfddlZddlZddlZddlZddlmZddlmZmZddl	m
Z
mZmZm
Z
mZmZddlmZmZmZmZmZmZmZmZddlmZmZmZmZmZmZm Z m!Z!ddl"m#Z#m$Z$ddl%m&Z&dd	l'm(Z(e�)e*�Z+d
Z,ddd
�Z-dZ.dZ/dZ0edd�Z1e�2�Z3ede4d�Z5ede5fe5d�dd�Z6Gdd�d�Z7e4d�dd�Z8d#dd�Z9e4d �d!d"�Z:dS)$�N)�
namedtuple)�	lru_cache�wraps)�Any�Callable�Dict�Optional�Tuple�TypeVar)�apt�event_logger�
exceptions�files�messages�snap�system�util)�APT_NEWS_URL�BASE_CONTRACT_URL�BASE_LIVEPATCH_URL�BASE_SECURITY_URL�CONFIG_DEFAULTS�CONFIG_FIELD_ENVVAR_ALLOWLIST�DEFAULT_CONFIG_FILE�DEFAULT_DATA_DIR)�notices�state_files)�Notice)�	safe_load�private�name�type)ZavailableResourcesZresourceEntitlementsZ_unset)�
http_proxy�https_proxy�apt_http_proxy�apt_https_proxy�ua_apt_http_proxy�ua_apt_https_proxy�global_apt_http_proxy�global_apt_https_proxy�update_messaging_timer�metering_timer�apt_news�apt_news_url)�contract_url�data_dir�features�log_file�	log_level�security_url�settings_overrides�timer_log_file�daemon_log_file�	ua_config�
livepatch_url�DataPath)�filenamer�	permanent�S)Zbound.)�func�returncCs
t�|�S�N)r)r=�r@�1/usr/lib/python3/dist-packages/uaclient/config.py�	str_cacheUsrBc@s�eZdZeddd�eddd�eddd�eddd�eddd�d�Zd	Zd
ZdZdgee	e
efeej
ee
dd
�dd�Zedd��Zee
d�dd��Zee
d�dd��Zee
d�dd��Zeee
d�dd��Zeje
d�dd��Zeee
d�dd��Zeje
d�dd��Zeee
d�d d!��Zeje
d�d"d!��Zeee
d�d#d$��Zeje
d�d%d$��Zeeee
d�d&d'���Zeje
d�d(d'��Zeeee
d�d)d*���Zeje
d�d+d*��Zeed�d,d-��Zejed�d.d-��Zeed�d/d0��Zejed�d1d0��Zeed�d2d3��Z e jed�d4d3��Z eed�d5d6��Z!e!jed�d7d6��Z!eed�d8d9��Z"e"jed�d:d9��Z"ee
d�d;d<��Z#e#je
d�d=d<��Z#e$ee
fd�d>d?�Z%ed@dA��Z&edBdC��Z'ee
d�dDdE��Z(ee
d�dFdG��Z)edHdI��Z*edJdK��Z+edLdM��Z,edNdO��Z-dhee
e
dP�dQdR�Z.e
edP�dSdT�Z/e
ddU�dVdW�Z0e
ddP�dXdY�Z1diedZ�d[d\�Z2dje
eeed]�d^d_�Z3e
edd`�dadb�Z4dcdd�Z5dedf�Z6dS)k�UAConfig�instance-idTFzmachine-access-cis.json�lockzstatus.jsonzmarker-reboot-cmds-required)rDzmachine-access-cisrEzstatus-cachezmarker-reboot-cmds)r&r')r(r))r$r%N)�cfg�user_config�seriesr>cCs�|rd|_||_d|_nt�|_t|j�\|_|_|r>||_ntztj��pPt�	�|_WnZt
k
r�}z<t��� t
�d�|��t
�d�W5QRXt�	�|_W5d}~XYnXd|jkr�tj	j|j��|jd�dd�|_||_d|_dS)�NzError loading user config: {}zUsing default config valuesr7T)Z optional_type_errors_become_null)Zcfg_pathrF�invalid_keys�get_config_path�parse_configrGr�user_config_file�read�UserConfigData�	ExceptionrZdisable_log_to_console�logging�warning�formatZ	from_dictZto_dictrH�_machine_token_file)�selfrFrGrH�er@r@rA�__init__os2
�

��zUAConfig.__init__cCs$|jst�|j|j�d��|_|jS)NZmachine_token_overlay)rTrZMachineTokenFiler/r0�get�rUr@r@rA�machine_token_file�s
�zUAConfig.machine_token_file�r>cCs|j�dt�S)Nr.)rFrXrrYr@r@rAr.�szUAConfig.contract_urlcCs|j�dt�S)Nr3)rFrXrrYr@r@rAr3�szUAConfig.security_urlcCs|j�dt�S)Nr8)rFrXrrYr@r@rAr8�szUAConfig.livepatch_urlcCs|jjSr?)rGr"rYr@r@rAr"�szUAConfig.http_proxy)�valuecCs||j_tj�|j�dSr?)rGr"rrM�write�rUr\r@r@rAr"�scCs|jjSr?)rGr#rYr@r@rAr#�szUAConfig.https_proxycCs||j_tj�|j�dSr?)rGr#rrMr]r^r@r@rAr#�scCs|jjSr?)rGr'rYr@r@rAr'�szUAConfig.ua_apt_https_proxycCs||j_tj�|j�dSr?)rGr'rrMr]r^r@r@rAr'�scCs|jjSr?)rGr&rYr@r@rAr&�szUAConfig.ua_apt_http_proxycCs||j_tj�|j�dSr?)rGr&rrMr]r^r@r@rAr&�scCs0|jj}|r|S|jj}|r,t�tj�|SdSr?)rGr(r$�event�inforZWARNING_DEPRECATED_APT_HTTP�rUZ
global_valZold_apt_valr@r@rAr(�szUAConfig.global_apt_http_proxycCs.||j_d|j_tjj��tj�|j�dSr?)	rGr(r$rC�fget�cache_clearrrMr]r^r@r@rAr(�scCs0|jj}|r|S|jj}|r,t�tj�|SdSr?)rGr)r%r_r`rZWARNING_DEPRECATED_APT_HTTPSrar@r@rAr)�szUAConfig.global_apt_https_proxycCs.||j_d|j_tjj��tj�|j�dSr?)	rGr)r%rCrbrcrrMr]r^r@r@rAr)�scCs|jj}|dkrdS|S)Ni`T)rGr*�rU�valr@r@rAr*�szUAConfig.update_messaging_timercCs||j_tj�|j�dSr?)rGr*rrMr]r^r@r@rAr*scCs|jj}|dkrdS|S)Ni@8)rGr+rdr@r@rAr+szUAConfig.metering_timercCs||j_tj�|j�dSr?)rGr+rrMr]r^r@r@rAr+
scCs|jj}|dkrdS|S)NF)rG�poll_for_pro_licenserdr@r@rArfszUAConfig.poll_for_pro_licensecCs||j_tj�|j�dSr?)rGrfrrMr]r^r@r@rArfscCs|jj}|dkrdS|S)NiX)rG�polling_error_retry_delayrdr@r@rArg!sz"UAConfig.polling_error_retry_delaycCs||j_tj�|j�dSr?)rGrgrrMr]r^r@r@rArg*scCs|jj}|dkrdS|S)NT)rGr,rdr@r@rAr,/szUAConfig.apt_newscCs||j_tj�|j�dSr?)rGr,rrMr]r^r@r@rAr,6scCs|jj}|dkrtS|Sr?)rGr-rrdr@r@rAr-;szUAConfig.apt_news_urlcCs||j_tj�|j�dSr?)rGr-rrMr]r^r@r@rAr-Bsc	Cs�|�d�}d}tj�|�s|St�|�}z|�d�\}}Wn*tk
rdt�	tj�
|jd���YnXzt�d|g�t
|�|fWStjk
r�t��s�t�d||�t
|�|fYSt�d||�t�|�|YSXdS)a]Return lock info if config lock file is present the lock is active.

        If process claiming the lock is no longer present, remove the lock file
        and log a warning.

        :param lock_path: Full path to the lock file.

        :return: A tuple (pid, string describing lock holder)
            If no active lock, pid will be -1.
        rE)���rI�:Zpsz.Found stale lock file previously held by %s:%sz1Removing stale lock file previously held by %s:%sN)�	data_path�os�path�existsr�	load_file�split�
ValueErrorr
ZInvalidLockFile�joinr/Zsubp�intZProcessExecutionErrorrZwe_are_currently_rootrQ�debugrR�ensure_file_absent)rUZ	lock_pathZno_lockZlock_contentZlock_pidZlock_holderr@r@rA�check_lock_infoGs:

�
��
zUAConfig.check_lock_infocCs|j�dt�S)Nr/)rFrXrrYr@r@rAr/rszUAConfig.data_dircCs>|j�dd�}ztt|���WStk
r8tjYSXdS)Nr2�DEBUG)rFrX�getattrrQ�upper�AttributeErrorrv)rUr2r@r@rAr2vs
zUAConfig.log_levelcCs|j�dtd�S)Nr1�rFrXrrYr@r@rAr1~szUAConfig.log_filecCs|j�dtd�S)Nr5rzrYr@r@rAr5�s�zUAConfig.timer_log_filecCs|j�dtd�S)Nr6rzrYr@r@rAr6�s�zUAConfig.daemon_log_filecCs
t|j�S)z<Report whether this machine configuration is attached to UA.)�bool�
machine_tokenrYr@r@rA�is_attached�szUAConfig.is_attachedcCs.|j�d�}|r*t|t�r|St�d|�iS)z>Return a dictionary of any features provided in uaclient.conf.r0zDUnexpected uaclient.conf features value. Expected dict, but found %s)rFrX�
isinstance�dictrQrR)rUr0r@r@rAr0�s
�zUAConfig.featurescCs|jjS)zAReturn the machine-token if cached in the machine token response.)rZr|rYr@r@rAr|�szUAConfig.machine_token)�keyr>cCsd|j}|stj�|t�S||jkrT|j|}|jrDtj�|t|j�Stj�||j�Stj�|t|�S)zAReturn the file path in the data directory represented by the key)r/rkrlrq�PRIVATE_SUBDIR�
data_pathsrr:)rUr�r/rjr@r@rArj�s

�zUAConfig.data_pathcCs|�|�}tj�|�Sr?)rjrkrlrm�rUr��
cache_pathr@r@rA�cache_key_exists�s
zUAConfig.cache_key_exists)r�r>cCst�|�dS)z�Delete the given cache_path if it exists.

        (This is a separate method to allow easier disabling of deletion during
        tests.)
        N)rrt)rUr�r@r@rA�_perform_delete�szUAConfig._perform_deletecCsJ|std��|�d�rd|_n|dkr2t�tj�|�|�}|�|�dS)zRemove specific cache file.z1Invalid or empty key provided to delete_cache_key�machine-accessNrE)	�RuntimeError�
startswithrTr�remover�OPERATION_IN_PROGRESSrjr�r�r@r@rA�delete_cache_key�s�

zUAConfig.delete_cache_key)�delete_permanentcCs.|j��D]}|s|j|js
|�|�q
dS)z�
        Remove configuration cached response files class attributes.

        :param delete_permanent: even delete the "permanent" files
        N)r��keysr;r�)rUr�Zpath_keyr@r@rA�delete_cache�szUAConfig.delete_cache)r��silentr>cCs||�|�}zt�|�}Wn2tk
rJtj�|�sD|sDt�d|�YdSXzt	j
|tjd�WSt
k
rv|YSXdS)NzFile does not exist: %s��cls)rjrrnrPrkrlrmrQrs�json�loadsrZDatetimeAwareJSONDecoderrp)rUr�r�r��contentr@r@rA�
read_cache�s
zUAConfig.read_cache)r�r�r>cCs�|�|�}tj�|�}tj�|�sLtj|dd�tj�|�tkrLt�|d�|�	d�r^d|_
n*|dkr�d|kr�tjt
j|�d�dd�t|t�s�tj|tjd	�}d
}||jkr�|j|js�d}tj|||d�dS)
NT)�exist_oki�r�rEri�)Z	operationr�i�i�)�mode)rjrkrl�dirnamerm�makedirs�basenamer��chmodr�rTr�addrr�ror~�strr��dumpsrZDatetimeAwareJSONEncoderr�rrZ
write_file)rUr�r��filepathr/r�r@r@rA�write_cache�s*

�

zUAConfig.write_cachecCs4dD]H}t||�}|dkr&t�d�qt|t�r8|dkrd�|�}t�|��q|jsZ|j	rr|j
sf|jrrt�tj
��t�d|jtj�t�d|j	tj�t�d|j
tj�t�d|jtj�t�d|jtj�t�d|jtj�|js�|j	�rt�|j|j	tjj�n&|j
�s|j�r*t�|j
|jtjj�g}t���r~t�|j|j�|j�s^t�tj��st|j�s~t�tj ��r~|�!d�ddl"m#}dd	l$m%}dd
l&m'}|�}|�(�\}	}
|	|j)k�r|�*|j|j�|j�s�|�|j��s�|j�s|�|j ��r|�!d�t+|�dk�r0d�,|�}t-tj.j|d
��dS)N)r*r+z1No config set for {}, default value will be used.rzQValue for the {} interval must be a positive integer. Default value will be used.ZhttpZhttpsr)�	livepatch)�ApplicationStatus)�LivepatchEntitlementr�z, )�services)/rwrQrsr~rrrSr
�UserFacingErrorr(r)r&r'rZERROR_PROXY_CONFIGURATIONrZvalidate_proxyZPROXY_VALIDATION_APT_HTTP_URLZPROXY_VALIDATION_APT_HTTPS_URLr"ZPROXY_VALIDATION_SNAP_HTTP_URLr#ZPROXY_VALIDATION_SNAP_HTTPS_URLrZsetup_apt_proxyZ
AptProxyScopeZGLOBALZUACLIENTrZis_installedZconfigure_snap_proxyZget_config_option_valueZHTTP_PROXY_OPTIONZHTTPS_PROXY_OPTION�append�uaclientr�Z(uaclient.entitlements.entitlement_statusr�Zuaclient.entitlements.livepatchr�Zapplication_statusZENABLEDZconfigure_livepatch_proxy�lenrq�printZ!PROXY_DETECTED_BUT_NOT_CONFIGURED)rUZpropr\Z	error_msgZservices_with_proxiesr�r�r�Z
livepatch_entZlivepatch_status�_r�r@r@rA�process_config�s�
��������������
�
��
�
�������

��zUAConfig.process_configcCs\|jdk	r&t|j�D]}t�d|�qd|jkrXt�d�t�d�t�d�t�d�dS)Nz&Ignoring invalid uaclient.conf key: %sr7z)legacy "ua_config" found in uaclient.confzPlease do the following:z�  1. run `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)rJ�sortedrQrRrF)rU�invalid_keyr@r@rA�warn_about_invalid_keysgs
�


��z UAConfig.warn_about_invalid_keys)NNN)N)F)F)7�__name__�
__module__�__qualname__r9r�Zua_scoped_proxy_optionsZglobal_scoped_proxy_optionsZ&deprecated_global_scoped_proxy_optionsrrr�rrrOrW�propertyrZr.r3r8r"�setterr#r'r&rBr(r)rrr*r+r{rfrgr,r-r	rur/r2r1r5r6r}r0r|rjr�r�r�r�r�r�r�r�r@r@r@rArCYs�



��
��*
	+








krCr[cCsBtj�d�}|r|Stj�t��tj�t��}tj�|�r>|StS)z4Get config path to be used when loading config dict.ZUA_CONFIG_FILE)	rk�environrXrlrq�getcwdr�rrm)Zconfig_fileZ	local_cfgr@r@rArK}s
�rKc	Cs�t�t�}|st�}t�d|�tj�|�r@|�t	t
�|���i}tj�
�D]�\}}|��}|�d�rN|dd�}|�d�r�|dd�}|�d�r�tj�|�r�t	t
�|��}nt�d�|���d	|kr�||i|d	<q�||d	|<qN|tkrN|||<qN|�|�d
|k�rtj�|d
�|d
<dD],}t�||��s"t�d�|||����q"t|����t�}|D]}|�|��qf||fS)
a�Parse 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_�	ZyamlzCould not find yaml file: {}r0r/)r.r3zInvalid url in config. {}: {})�copyrrK�LOGrsrkrlrm�updaterrrnr��items�lowerr��endswithr
r�rSr�
expanduserrZis_service_url�setr��
difference�VALID_UA_CONFIG_KEYS�pop)	Zconfig_pathrFZenv_keysr�r\Z
field_nameZfeature_field_namerJr�r@r@rArL�sH



�


�rL��override_keycs�fdd�}|S)a�Decorator 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.
    cst����fdd��}|S)Ncs@t�\}}|�di���t�}|tkr:�dkr6|dfS|S��S)Nr4Z
cloud_type)rLrX�UNSET_SETTINGS_OVERRIDE_KEY)rFr�Zvalue_override)�fr�r@rA�new_f�s
�z>apply_config_settings_override.<locals>.wrapper.<locals>.new_f)r)r�r�r�)r�rA�wrapper�s
z/apply_config_settings_override.<locals>.wrapperr@)r�r�r@r�rA�apply_config_settings_override�s
r�)N);r�r�rQrk�collectionsr�	functoolsrr�typingrrrrr	r
r�rrr
rrrrrZuaclient.defaultsrrrrrrrrZuaclient.filesrrZuaclient.files.noticesrZ
uaclient.yamlrZ	getLoggerr�r�r�ZMERGE_ID_KEY_MAPr�ZUA_CONFIGURABLE_KEYSr�r9Zget_event_loggerr_r�r<rBrCrKrLr�r@r@r@rA�<module>s> (
(

�
(
A