U
    ϴfrE                     @   s
  d dl Z d dlZd dlZd dlmZmZ d dlmZmZm	Z	 d dl
mZmZmZmZmZmZmZmZ d dlmZmZmZmZmZmZmZmZ d dlmZ d dlmZ e e!e"Z#dd	d
Z$dZ%dZ&dZ'e( Z)G dd dZ*e+dddZ,dddZ-e+dddZ.dS )    N)	lru_cachewraps)AnyDictOptional)aptevent_logger
exceptions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)user_config_file)	safe_loadnametype)ZavailableResourcesZresourceEntitlementsZ_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_urlc                   @   s  e Zd ZdZdZdZdAeeee	f  ee
j ee ddddZeedd	d
ZeedddZeedddZeee dddZejedddZeee dddZejedddZeee dddZejedddZeee dddZejedddZeeddee dddZejedddZeeddee dd d!Zejedd"d!Zeedd#d$Zejedd%d$Zeedd&d'Zejedd(d'Zeedd)d*Zejedd+d*Zeedd,d-Zejedd.d-Zeedd/d0Zejedd1d0Zeedd2d3Z e jedd4d3Z ed5d6 Z!ed7d8 Z"eedd9d:Z#ed;d< Z$d=d> Z%d?d@ Z&dS )BUAConfig)r   r    )r!   r"   )r   r   N)cfguser_configseriesreturnc              
   C   s   |rd| _ || _d| _nt | _ t| j \| _| _|r>|| _nVztj | _W nD tk
r } z&t	j
d|d t	
d t | _W 5 d}~X Y nX d| jkrtjj| j | jd dd| _|| _dS ) NzError loading user config)exc_infozUsing default config valuesr.   T)Z optional_type_errors_become_null)Zcfg_pathr1   invalid_keysget_config_pathparse_configr2   r   read	ExceptionLOGwarningUserConfigDataZ	from_dictZto_dictr3   )selfr1   r2   r3   e rA   1/usr/lib/python3/dist-packages/uaclient/config.py__init__R   s(    

zUAConfig.__init__r4   c                 C   s   | j dtS )Nr'   )r1   getr   r?   rA   rA   rB   r'   u   s    zUAConfig.contract_urlc                 C   s   | j dtS )Nr,   )r1   rE   r   rF   rA   rA   rB   r,   y   s    zUAConfig.security_urlc                 C   s   | j dtS )Nr/   )r1   rE   r   rF   rA   rA   rB   r/   }   s    zUAConfig.livepatch_urlc                 C   s   | j jS N)r2   r   rF   rA   rA   rB   r      s    zUAConfig.http_proxy)valuec                 C   s   || j _tj | j  d S rG   )r2   r   r   writer?   rH   rA   rA   rB   r      s    c                 C   s   | j jS rG   )r2   r   rF   rA   rA   rB   r      s    zUAConfig.https_proxyc                 C   s   || j _tj | j  d S rG   )r2   r   r   rI   rJ   rA   rA   rB   r      s    c                 C   s   | j jS rG   )r2   r    rF   rA   rA   rB   r       s    zUAConfig.ua_apt_https_proxyc                 C   s   || j _tj | j  d S rG   )r2   r    r   rI   rJ   rA   rA   rB   r       s    c                 C   s   | j jS rG   )r2   r   rF   rA   rA   rB   r      s    zUAConfig.ua_apt_http_proxyc                 C   s   || j _tj | j  d S rG   )r2   r   r   rI   rJ   rA   rA   rB   r      s    )maxsizec                 C   s:   | j j}|r|S | j j}|r6ttjjddd |S d S )Nr   r!   oldnew)r2   r!   r   eventinfor   WARNING_DEPRECATED_FIELDformatr?   Z
global_valZold_apt_valrA   rA   rB   r!      s     zUAConfig.global_apt_http_proxyc                 C   s.   || j _d | j _tjj  tj | j  d S rG   )r2   r!   r   r0   fgetcache_clearr   rI   rJ   rA   rA   rB   r!      s    c                 C   s:   | j j}|r|S | j j}|r6ttjjddd |S d S )Nr   r"   rL   )r2   r"   r   rO   rP   r   rQ   rR   rS   rA   rA   rB   r"      s     zUAConfig.global_apt_https_proxyc                 C   s.   || j _d | j _tjj  tj | j  d S rG   )r2   r"   r   r0   rT   rU   r   rI   rJ   rA   rA   rB   r"      s    c                 C   s   | j j}|d krdS |S )Ni`T  )r2   r#   r?   valrA   rA   rB   r#      s    zUAConfig.update_messaging_timerc                 C   s   || j _tj | j  d S rG   )r2   r#   r   rI   rJ   rA   rA   rB   r#      s    c                 C   s   | j j}|d krdS |S )Ni@8  )r2   r$   rV   rA   rA   rB   r$      s    zUAConfig.metering_timerc                 C   s   || j _tj | j  d S rG   )r2   r$   r   rI   rJ   rA   rA   rB   r$      s    c                 C   s   | j j}|d krdS |S )NF)r2   poll_for_pro_licenserV   rA   rA   rB   rX      s    zUAConfig.poll_for_pro_licensec                 C   s   || j _tj | j  d S rG   )r2   rX   r   rI   rJ   rA   rA   rB   rX      s    c                 C   s   | j j}|d krdS |S )NiX  )r2   polling_error_retry_delayrV   rA   rA   rB   rY      s    z"UAConfig.polling_error_retry_delayc                 C   s   || j _tj | j  d S rG   )r2   rY   r   rI   rJ   rA   rA   rB   rY     s    c                 C   s   | j j}|d krdS |S )NT)r2   r%   rV   rA   rA   rB   r%   
  s    zUAConfig.apt_newsc                 C   s   || j _tj | j  d S rG   )r2   r%   r   rI   rJ   rA   rA   rB   r%     s    c                 C   s   | j j}|d krtS |S rG   )r2   r&   r   rV   rA   rA   rB   r&     s    zUAConfig.apt_news_urlc                 C   s   || j _tj | j  d S rG   )r2   r&   r   rI   rJ   rA   rA   rB   r&     s    c                 C   s   | j dtS )Nr(   )r1   rE   r   rF   rA   rA   rB   r(   "  s    zUAConfig.data_dirc                 C   s>   | j dd}ztt| W S  tk
r8   tj Y S X d S )Nr+   DEBUG)r1   rE   getattrloggingupperAttributeErrorrZ   )r?   r+   rA   rA   rB   r+   &  s
    zUAConfig.log_levelc                 C   s   | j dtd S )Nr*   )r1   rE   r   rF   rA   rA   rB   r*   .  s    zUAConfig.log_filec                 C   s.   | j d}|r*t|tr|S td| i S )z>Return a dictionary of any features provided in uaclient.conf.r)   zDUnexpected uaclient.conf features value. Expected dict, but found %s)r1   rE   
isinstancedictr<   r=   )r?   r)   rA   rA   rB   r)   2  s    
zUAConfig.featuresc           	      C   s"  dD ]D}t | |}|d kr(td| qt|tr:|dk rtj||dq| jsV| jrj| j	sb| j
rjt td| jtj td| jtj td| j	tj td| j
tj td| jtj td| jtj | js| jrt| j| jtjj n&| j	s
| j
r t| j	| j
tjj g }t rtt| j| j | jsTttjsj| jstttjrt|d ddl m!} dd	l"m#} || j$}t%d
d |D }|r|&| j| j | js||js| js||jr|d t'|dkrd(|}t)t*j+j,|d d S )N)r#   r$   z1No config set for %s, default value will be used.r   keyrH   r
   Zhttpsr   )	livepatch)_enabled_servicesc                 s   s   | ]}|j d kr|V  qdS )rc   N)r   ).0ZentrA   rA   rB   	<genexpr>  s    
 z*UAConfig.process_config.<locals>.<genexpr>rc   z, )services)-r[   r<   debugr_   intr	   ZInvalidPosIntConfigValuer!   r"   r   r    ZInvalidProxyCombinationConfigr
   Zvalidate_proxyZPROXY_VALIDATION_APT_HTTP_URLZPROXY_VALIDATION_APT_HTTPS_URLr   ZPROXY_VALIDATION_SNAP_HTTP_URLr   ZPROXY_VALIDATION_SNAP_HTTPS_URLr   Zsetup_apt_proxyZAptProxyScopeZGLOBALZUACLIENTr   Zis_snapd_installedZconfigure_snap_proxyZget_config_option_valueZHTTP_PROXY_OPTIONZHTTPS_PROXY_OPTIONappenduaclientrc   Z-uaclient.api.u.pro.status.enabled_services.v1rd   enabled_servicesanyZconfigure_livepatch_proxylenjoinprintr   Z!PROXY_DETECTED_BUT_NOT_CONFIGUREDrR   )	r?   ZproprH   Zservices_with_proxiesrc   rd   rl   Zlivepatch_enabledrg   rA   rA   rB   process_configA  s    
        




 

zUAConfig.process_configc                 C   s\   | j d k	r&t| j D ]}td| qd| jkrXtd td td td d S )Nz&Ignoring invalid uaclient.conf key: %sr.   z)legacy "ua_config" found in uaclient.confzPlease 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)r7   sortedr<   r=   r1   )r?   invalid_keyrA   rA   rB   warn_about_invalid_keys  s    
 


z UAConfig.warn_about_invalid_keys)NNN)'__name__
__module____qualname__Zua_scoped_proxy_optionsZglobal_scoped_proxy_optionsZ&deprecated_global_scoped_proxy_optionsr   r   strr   r   r>   rC   propertyr'   r,   r/   r   setterr   r    r   r   r!   r"   ri   r#   r$   boolrX   rY   r%   r&   r(   r+   r*   r)   rq   rt   rA   rA   rA   rB   r0   G   s      #	


jr0   rD   c                  C   s   t jd} | r| S tS )z4Get config path to be used when loading config dict.ZUA_CONFIG_FILE)osenvironrE   r   )Zconfig_filerA   rA   rB   r8     s    r8   c           	      C   sx  t  t}| st } td|  tj| r@|t	t
|  i }tj D ]\}}| }|drN|dd }|dr|dd }|drtj|rt	t
|}ntj|dd	|kr||i|d	< q||d	 |< qN|tkrN|||< qN|| d
|krtj|d
 |d
< dD ](}t|| stj||| dqt| t}|D ]}|| q^||fS )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 %sZua_   NZ	features_	   Zyaml)filepathr)   r(   )r'   r,   ra   )copyr   r8   r<   rh   r|   pathexistsupdater   r   Z	load_filer}   itemslower
startswithendswithr	   ZInvalidFeatureYamlConfigValuer   
expanduserr
   Zis_service_urlZInvalidURLConfigValuesetkeys
differenceVALID_UA_CONFIG_KEYSpop)	Zconfig_pathr1   Zenv_keysrb   rH   Z
field_nameZfeature_field_namer7   rs   rA   rA   rB   r9     sD    






r9   override_keyc                    s    fdd}|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.
    c                    s   t   fdd}|S )Nc                     s@   t  \} }| di t}|tkr:dkr6|d fS |S   S )Nr-   Z
cloud_type)r9   rE   UNSET_SETTINGS_OVERRIDE_KEY)r1   _Zvalue_override)fr   rA   rB   new_f  s    
 z>apply_config_settings_override.<locals>.wrapper.<locals>.new_f)r   )r   r   r   )r   rB   wrapper  s    z/apply_config_settings_override.<locals>.wrapperrA   )r   r   rA   r   rB   apply_config_settings_override	  s    r   )N)/r   r\   r|   	functoolsr   r   typingr   r   r   rk   r   r   r	   r
   r   r   r   r   Zuaclient.defaultsr   r   r   r   r   r   r   r   Zuaclient.filesr   Zuaclient.yamlr   Z	getLoggerZreplace_top_level_logger_nameru   r<   ZMERGE_ID_KEY_MAPr   ZUA_CONFIGURABLE_KEYSr   Zget_event_loggerrO   r0   rx   r8   r9   r   rA   rA   rA   rB   <module>   s,   (
(
  |	
?