HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux spn-python 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64
User: arjun (1000)
PHP: 8.1.2-1ubuntu2.20
Disabled: NONE
Upload Files
File: //usr/lib/python3/dist-packages/uaclient/__pycache__/config.cpython-310.pyc
o

nHJek\�@srddlZddlZddlZddlZddlmZddlmZmZddl	m
Z
mZmZm
Z
mZmZddlmZmZmZmZmZmZmZmZmZddlmZmZmZmZmZm Z m!Z!m"Z"m#Z#ddl$m%Z%m&Z&ddl'm(Z(dd	l)m*Z*e�+e�,e-��Z.d
dd�Z/d
Z0dZ1dZ2edd�Z3e�4�Z5ede6d�Z7dede7fde7fdd�Z8Gdd�d�Z9de6fdd�Z:d"dd�Z;de6fd d!�Z<dS)#�N)�
namedtuple)�	lru_cache�wraps)�Any�Callable�Dict�Optional�Tuple�TypeVar)	�apt�event_logger�
exceptions�files�http�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�PRIVATE_SUBDIR)�notices�state_files)�Notice)�	safe_load�name�type)�availableResources�resourceEntitlements�_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�	ua_config�
livepatch_url�DataPath)�filename�private�S)�bound�func.�returncCs
t�|�S�N)r)r@�rC�1/usr/lib/python3/dist-packages/uaclient/config.py�	str_cacheSs
rEc	@s~eZdZedd�edd�edd�edd�d�ZdZd	Zd
Z			d^dee	e
efd
eej
dee
ddfdd�Zedd��Zede
fdd��Zede
fdd��Zede
fdd��Zedee
fdd��Zejde
fdd��Zedee
fdd��Zejde
fd d��Zedee
fd!d"��Zejde
fd#d"��Zedee
fd$d%��Zejde
fd&d%��Zeedee
fd'd(���Zejde
fd)d(��Zeedee
fd*d+���Zejde
fd,d+��Zedefd-d.��Zejdefd/d.��Zedefd0d1��Zejdefd2d1��Zedefd3d4��Z e jdefd5d4��Z edefd6d7��Z!e!jdefd8d7��Z!edefd9d:��Z"e"jdefd;d:��Z"ede
fd<d=��Z#e#jde
fd>d=��Z#de$ee
ffd?d@�Z%edAdB��Z&edCdD��Z'ede
fdEdF��Z(edGdH��Z)edIdJ��Z*d_dKee
de
fdLdM�Z+dKe
defdNdO�Z,dKe
ddfdPdQ�Z-dRdS�Z.d`dKe
dTedeefdUdV�Z/dKe
dWeddfdXdY�Z0dZd[�Z1d\d]�Z2dS)a�UAConfig�instance-idTzmachine-access-cis.json�lockFzstatus.json)rGzmachine-access-cisrHzstatus-cache)r*r+)r,r-)r(r)N�cfg�user_config�seriesrAc
Cs�|rd|_||_d|_n
t�|_t|j�\|_|_|r||_n0ztj��p(t�	�|_Wn#t
yN}ztjd|d�t�d�t�	�|_WYd}~nd}~wwd|jvrgtj	j
i|j���|jd�dd�|_||_d|_dS)�NzError loading user config)�exc_infozUsing default config valuesr9T)� optional_type_errors_become_null)�cfg_pathrI�invalid_keys�get_config_path�parse_configrJr�user_config_file�read�UserConfigData�	Exception�LOG�warning�	from_dict�to_dictrK�_machine_token_file)�selfrIrJrK�erCrCrD�__init__is4
�
��
��zUAConfig.__init__cCs$|jst�|j|j�d��|_|jS)N�machine_token_overlay)r[r�MachineTokenFiler3r4�get�r\rCrCrD�machine_token_file�s
�zUAConfig.machine_token_filecC�|j�dt�S)Nr2)rIrarrbrCrCrDr2��zUAConfig.contract_urlcCrd)Nr7)rIrarrbrCrCrDr7�rezUAConfig.security_urlcCrd)Nr:)rIrarrbrCrCrDr:�rezUAConfig.livepatch_urlcC�|jjSrB)rJr&rbrCrCrDr&��zUAConfig.http_proxy�valuecC�||j_tj�|j�dSrB)rJr&rrS�write�r\rhrCrCrDr&��cCrfrB)rJr'rbrCrCrDr'�rgzUAConfig.https_proxycCrirB)rJr'rrSrjrkrCrCrDr'�rlcCrfrB)rJr+rbrCrCrDr+�rgzUAConfig.ua_apt_https_proxycCrirB)rJr+rrSrjrkrCrCrDr+�rlcCrfrB)rJr*rbrCrCrDr*�rgzUAConfig.ua_apt_http_proxycCrirB)rJr*rrSrjrkrCrCrDr*�rlcC�:|jj}|r|S|jj}|rt�tjjddd��|SdS)Nr(r,��old�new)rJr,r(�event�infor�WARNING_DEPRECATED_FIELD�format�r\�
global_val�old_apt_valrCrCrDr,����zUAConfig.global_apt_http_proxycC�.||j_d|j_tjj��tj�|j�dSrB)	rJr,r(rF�fget�cache_clearrrSrjrkrCrCrDr,��cCrm)Nr)r-rn)rJr-r)rqrrrrsrtrurCrCrDr-�rxzUAConfig.global_apt_https_proxycCryrB)	rJr-r)rFrzr{rrSrjrkrCrCrDr-�r|cC�|jj}|dur
dS|S)Ni`T)rJr.�r\�valrCrCrDr.��zUAConfig.update_messaging_timercCrirB)rJr.rrSrjrkrCrCrDr.rlcCr})Ni@8)rJr/r~rCrCrDr/r�zUAConfig.metering_timercCrirB)rJr/rrSrjrkrCrCrDr/rlcCr})NF)rJ�poll_for_pro_licenser~rCrCrDr�szUAConfig.poll_for_pro_licensecCrirB)rJr�rrSrjrkrCrCrDr�rlcCr})NiX)rJ�polling_error_retry_delayr~rCrCrDr�"sz"UAConfig.polling_error_retry_delaycCrirB)rJr�rrSrjrkrCrCrDr�+rlcCr})NT)rJr0r~rCrCrDr00r�zUAConfig.apt_newscCrirB)rJr0rrSrjrkrCrCrDr07rlcCs|jj}|dur
tS|SrB)rJr1rr~rCrCrDr1<r�zUAConfig.apt_news_urlcCrirB)rJr1rrSrjrkrCrCrDr1CrlcCs�|�d�}d}tj�|�s|St�|�}z	|�d�\}}Wnty0tj	tj�
|jd�d��wzt�d|g�t
|�|fWStjyjt��sZt�d||�t
|�|fYSt�d||�t�|�|YSw)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.
        rH)���rL�:)�lock_file_path�psz.Found stale lock file previously held by %s:%sz1Removing stale lock file previously held by %s:%s)�	data_path�os�path�existsr�	load_file�split�
ValueErrorr
�InvalidLockFile�joinr3�subp�int�ProcessExecutionErrorr�we_are_currently_rootrW�debugrX�ensure_file_absent)r\�	lock_path�no_lock�lock_content�lock_pid�lock_holderrCrCrD�check_lock_infoHs>

����
�zUAConfig.check_lock_infocCrd)Nr3)rIrarrbrCrCrDr3srezUAConfig.data_dircCs8|j�dd�}ztt|���WStytjYSw)Nr6�DEBUG)rIra�getattr�logging�upper�AttributeErrorr�)r\r6rCrCrDr6ws
�zUAConfig.log_levelcCs|j�dtd�S)Nr5)rIrarrbrCrCrDr5szUAConfig.log_filecCs.|j�d�}|rt|t�r|St�d|�iS)z>Return a dictionary of any features provided in uaclient.conf.r4zDUnexpected uaclient.conf features value. Expected dict, but found %s)rIra�
isinstance�dictrWrX)r\r4rCrCrDr4�s
�zUAConfig.featurescCrf)zAReturn the machine-token if cached in the machine token response.)rc�
machine_tokenrbrCrCrDr��szUAConfig.machine_token�keycCsd|j}|stj�|t�S||jvr*|j|}|jr"tj�|t|j�Stj�||j�Stj�|t|�S)zAReturn the file path in the data directory represented by the key)r3r�r�r�r�
data_pathsr=r<)r\r�r3r�rCrCrDr��s

�zUAConfig.data_pathcCs|�|�}tj�|�SrB)r�r�r�r��r\r��
cache_pathrCrCrD�cache_key_exists�s
zUAConfig.cache_key_existscCsJ|std��|�d�rd|_n
|dkrt�tj�|�|�}t�	|�dS)zRemove specific cache file.z1Invalid or empty key provided to delete_cache_key�machine-accessNrH)
�RuntimeError�
startswithr[r�remover�OPERATION_IN_PROGRESSr�rr�r�rCrCrD�delete_cache_key�s�

zUAConfig.delete_cache_keycCs|j��D]}|�|�qdS)zN
        Remove configuration cached response files class attributes.
        N)r��keysr�)r\�path_keyrCrCrD�delete_cache�s�zUAConfig.delete_cache�silentcCst|�|�}zt�|�}Wnty$tj�|�s!|s!t�d|�YdSwz	t	j
|tjd�WSt
y9|YSw)NzFile does not exist: %s��cls)r�rr�rVr�r�r�rWr��json�loadsr�DatetimeAwareJSONDecoderr�)r\r�r�r��contentrCrCrD�
read_cache�s
��zUAConfig.read_cacher�cCs�|�|�}tj�|�}tj�|�s&tj|dd�tj�|�tkr&t�|d�|�	d�r/d|_
n|dkrDd|vrDtjt
j|�d�dd�t|t�sQtj|tjd	�}d
}||jvr`|j|js`d}tj|||d�dS)
NT)�exist_oki�r�rHr��)�	operationr�i�i�)�mode)r�r�r��dirnamer��makedirs�basenamer�chmodr�r[r�addrr�r�r��strr��dumpsr�DatetimeAwareJSONEncoderr�r=r�
write_file)r\r�r��filepathr3r�rCrCrD�write_cache�s*

�

zUAConfig.write_cachecCsdD]"}t||�}|durt�d|�qt|t�r|dkr$tj||d��q|js+|jr5|j	s1|j
r5t���t�
d|jtj�t�
d|jtj�t�
d|j	tj�t�
d|j
tj�t�
d|jtj�t�
d|jtj�|jsq|jr}t�|j|jtjj�n|j	s�|j
r�t�|j	|j
tjj�g}t��r�t�|j|j�|js�t�tj�s�|js�t�tj�r�|�d�ddl m!}dd	l"m#}dd
l$m%}||�}|�&�\}}	||j'kr�|�(|j|j�|js�|�|j�s�|js�|�|j�r�|�d�t)|�dk�r
d�*|�}
t+t,j-j.|
d
��dSdS)N)r.r/z1No config set for %s, default value will be used.r�r�rhr�httpsr)�	livepatch)�ApplicationStatus)�LivepatchEntitlementr�z, )�services)/r�rWr�r�r�r
�InvalidPosIntConfigValuer,r-r*r+�InvalidProxyCombinationConfigr�validate_proxy�PROXY_VALIDATION_APT_HTTP_URL�PROXY_VALIDATION_APT_HTTPS_URLr&�PROXY_VALIDATION_SNAP_HTTP_URLr'�PROXY_VALIDATION_SNAP_HTTPS_URLr�setup_apt_proxy�
AptProxyScope�GLOBAL�UACLIENTr�is_snapd_installed�configure_snap_proxy�get_config_option_value�HTTP_PROXY_OPTION�HTTPS_PROXY_OPTION�append�uaclientr��(uaclient.entitlements.entitlement_statusr��uaclient.entitlements.livepatchr��application_status�ENABLED�configure_livepatch_proxy�lenr��printr�!PROXY_DETECTED_BUT_NOT_CONFIGUREDrt)r\�proprh�services_with_proxiesr�r�r��
livepatch_ent�livepatch_status�_r�rCrCrD�process_config�s�
�������
��
�
����
��
�

�������

���zUAConfig.process_configcCs`|jdurt|j�D]}t�d|�q
d|jvr.t�d�t�d�t�d�t�d�dSdS)Nz&Ignoring invalid uaclient.conf key: %sr9z)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)rP�sortedrWrXrI)r\�invalid_keyrCrCrD�warn_about_invalid_keysHs
�


���z UAConfig.warn_about_invalid_keys)NNNrB)F)3�__name__�
__module__�__qualname__r;r��ua_scoped_proxy_options�global_scoped_proxy_options�&deprecated_global_scoped_proxy_optionsrrr�rrrUr^�propertyrcr2r7r:r&�setterr'r+r*rEr,r-r�r.r/�boolr�r�r0r1r	r�r3r6r5r4r�r�r�r�r�r�r�r�r�rCrCrCrDrFWs������
�)
	+





grFcCstj�d�}|r
|StS)z4Get config path to be used when loading config dict.�UA_CONFIG_FILE)r��environrar)�config_filerCrCrDrQ^srQc	Cspt�t�}|s
t�}t�d|�tj�|�r |�t	t
�|���i}tj�
�D]Q\}}|��}|�d�rx|dd�}|�d�rp|dd�}|�d�r^tj�|�rXt	t
�|��}ntj|d��d	|vri||i|d	<q'||d	|<q'|tvrx|||<q'|�|�d
|vr�tj�|d
�|d
<dD]}t�||�s�tj|||d��q�t|����t�}|D]}|�|�q�||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 %s�ua_�N�	features_�	�yaml)r�r4r3)r2r7r�)�copyrrQrWr�r�r�r��updater rr�r��items�lowerr��endswithr
�InvalidFeatureYamlConfigValuer�
expanduserr�is_service_url�InvalidURLConfigValue�setr��
difference�VALID_UA_CONFIG_KEYS�pop)	�config_pathrI�env_keysr�rh�
field_name�feature_field_namerPr�rCrCrDrRgsH




��
�rR�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�dkr|dfS|S��S)Nr8�
cloud_type)rRra�UNSET_SETTINGS_OVERRIDE_KEY)rIr��value_override)�frrCrD�new_f�s
�z>apply_config_settings_override.<locals>.wrapper.<locals>.new_f)r)rr�r)rrD�wrapper�s
z/apply_config_settings_override.<locals>.wrapperrC)rrrCrrD�apply_config_settings_override�s
rrB)=rr�r�r��collectionsr�	functoolsrr�typingrrrrr	r
r�rrr
rrrrrr�uaclient.defaultsrrrrrrrrr�uaclient.filesrr�uaclient.files.noticesr�
uaclient.yamlr �	getLogger�replace_top_level_logger_namer�rW�MERGE_ID_KEY_MAPr�UA_CONFIGURABLE_KEYSrr;�get_event_loggerrqr�r>rErFrQrRrrCrCrCrD�<module>s> ,,�

	?