
    gK                     `   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mZ d dlmZmZ d dl m!Z!  ejD                   ejF                  e$            Z%dd	d
Z&dZ'dZ(dZ) ejT                         Z+ G d d      Z,de-fdZ.ddZ/de-fdZ0y)    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BASE_VULNERABILITY_DATA_URLCONFIG_DEFAULTSCONFIG_FIELD_ENVVAR_ALLOWLISTDEFAULT_CONFIG_FILEDEFAULT_DATA_DIR)state_filesuser_config_file)	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vulnerability_data_url_prefixlxd_guest_attach)
contract_urldata_dirfeatureslog_file	log_levelsecurity_urlr-   settings_overrides	ua_configlivepatch_urlc            	          e Zd ZdZdZdZ	 	 	 d1deeee	f      dee
j                     dee   ddfd	Zedefd
       Zedefd       Zedefd       Zedee   fd       Zej$                  defd       Zedee   fd       Zej$                  defd       Zedee   fd       Zej$                  defd       Zedee   fd       Zej$                  defd       Zedefd       Zej$                  defd       Ze ed      dee   fd              Zej$                  defd       Ze ed      dee   fd              Zej$                  defd       Zedefd       Zej$                  defd       Zedefd       Zej$                  defd        Zedefd!       Zej$                  defd"       Zedefd#       Zej$                  defd$       Zedefd%       Z e j$                  defd&       Z edefd'       Z!e!j$                  defd(       Z!ede
jD                  fd)       Z#e#j$                  de
jD                  fd*       Z#ed+        Z$ed,        Z%edefd-       Z&ed.        Z'd/ Z(d0 Z)y)2UAConfig)r%   r&   )r'   r(   )r#   r$   Ncfguser_configseriesreturnc                 p   |rd| _         || _        d| _        n1t               | _         t	        | j                         \  | _        | _        |r|| _        n$	 t        j
                  j                         | _        d| j                  v rOt        j                  j                  i | j
                  j                         | j                  d   d      | _        || _        y# t        $ rO}t        j                  d|       t        j                  d       t        j                         | _        Y d}~d}~ww xY w) NzError loading user config)exc_infozUsing default config valuesr6   T) optional_type_errors_become_null)cfg_pathr:   invalid_keysget_config_pathparse_configr;   r   read	ExceptionLOGwarningUserConfigData	from_dictto_dictr<   )selfr:   r;   r<   es        1/usr/lib/python3/dist-packages/uaclient/config.py__init__zUAConfig.__init__V   s     DMDH $D+-DM*6t}}*E'DHd'*DE#3#?#?#D#D#F  $(("/>>HHG4##++-G+1FG15  I  D
   E7!D9:#3#B#B#D  Es   #C 	D5&AD00D5c                 B    | j                   j                  dt              S )Nr/   )r:   getr   rM   s    rO   r/   zUAConfig.contract_urly       xx||N,=>>    c                 B    | j                   j                  dt              S )Nr4   )r:   rR   r   rS   s    rO   r4   zUAConfig.security_url}   rT   rU   c                 B    | j                   j                  dt              S )Nr7   )r:   rR   r   rS   s    rO   r7   zUAConfig.livepatch_url   s    xx||O-?@@rU   c                 .    | j                   j                  S N)r;   r!   rS   s    rO   r!   zUAConfig.http_proxy   s    ***rU   valuec                 x    || j                   _        t        j                   j                  | j                          y rY   )r;   r!   r   writerM   rZ   s     rO   r!   zUAConfig.http_proxy   s*    &+#$$**4+;+;<rU   c                 .    | j                   j                  S rY   )r;   r"   rS   s    rO   r"   zUAConfig.https_proxy   s    +++rU   c                 x    || j                   _        t        j                   j                  | j                          y rY   )r;   r"   r   r\   r]   s     rO   r"   zUAConfig.https_proxy   s*    ',$$$**4+;+;<rU   c                 .    | j                   j                  S rY   )r;   r&   rS   s    rO   r&   zUAConfig.ua_apt_https_proxy   s    222rU   c                 x    || j                   _        t        j                   j                  | j                          y rY   )r;   r&   r   r\   r]   s     rO   r&   zUAConfig.ua_apt_https_proxy   s*    .3+$$**4+;+;<rU   c                 .    | j                   j                  S rY   )r;   r%   rS   s    rO   r%   zUAConfig.ua_apt_http_proxy   s    111rU   c                 x    || j                   _        t        j                   j                  | j                          y rY   )r;   r%   r   r\   r]   s     rO   r%   zUAConfig.ua_apt_http_proxy   s*    -2*$$**4+;+;<rU   c                 B    | j                   j                  }|t        S |S rY   )r;   r-   r   rM   vals     rO   r-   z&UAConfig.vulnerability_data_url_prefix   s#    <<;..
rU   c                 x    || j                   _        t        j                   j                  | j                          y rY   )r;   r-   r   r\   r]   s     rO   r-   z&UAConfig.vulnerability_data_url_prefix   s*    9>6$$**4+;+;<rU   )maxsizec                     | j                   j                  }|r|S | j                   j                  }|r6t        j	                  t
        j                  j                  dd             |S y )Nr#   r'   oldnew)r;   r'   r#   eventinfor   WARNING_DEPRECATED_FIELDformatrM   
global_valold_apt_vals      rO   r'   zUAConfig.global_apt_http_proxy   sh     %%;;
&&55JJ1188(.E 9 
 rU   c                     || j                   _        d | j                   _        t        j                  j                  j                          t        j                   j                  | j                          y rY   )r;   r'   r#   r9   fgetcache_clearr   r\   r]   s     rO   r'   zUAConfig.global_apt_http_proxy   sP    16.*.'&&++779$$**4+;+;<rU   c                     | j                   j                  }|r|S | j                   j                  }|r6t        j	                  t
        j                  j                  dd             |S y )Nr$   r(   rj   )r;   r(   r$   rm   rn   r   ro   rp   rq   s      rO   r(   zUAConfig.global_apt_https_proxy   sh     %%<<
&&66JJ1188)/G 9 
 rU   c                     || j                   _        d | j                   _        t        j                  j                  j                          t        j                   j                  | j                          y rY   )r;   r(   r$   r9   ru   rv   r   r\   r]   s     rO   r(   zUAConfig.global_apt_https_proxy   sP    27/+/('',,88:$$**4+;+;<rU   c                 8    | j                   j                  }|y|S )Ni`T  )r;   r)   re   s     rO   r)   zUAConfig.update_messaging_timer   s     55;
rU   c                 x    || j                   _        t        j                   j                  | j                          y rY   )r;   r)   r   r\   r]   s     rO   r)   zUAConfig.update_messaging_timer   s*    27/$$**4+;+;<rU   c                 8    | j                   j                  }|y|S )Ni@8  )r;   r*   re   s     rO   r*   zUAConfig.metering_timer   s     --;
rU   c                 x    || j                   _        t        j                   j                  | j                          y rY   )r;   r*   r   r\   r]   s     rO   r*   zUAConfig.metering_timer   s*    */'$$**4+;+;<rU   c                 8    | j                   j                  }|y|S )NF)r;   poll_for_pro_licensere   s     rO   r~   zUAConfig.poll_for_pro_license   s"    
 33;
rU   c                 x    || j                   _        t        j                   j                  | j                          y rY   )r;   r~   r   r\   r]   s     rO   r~   zUAConfig.poll_for_pro_license  s*    05-$$**4+;+;<rU   c                 8    | j                   j                  }|y|S )NiX  )r;   polling_error_retry_delayre   s     rO   r   z"UAConfig.polling_error_retry_delay  s"     88;
rU   c                 x    || j                   _        t        j                   j                  | j                          y rY   )r;   r   r   r\   r]   s     rO   r   z"UAConfig.polling_error_retry_delay  s*    5:2$$**4+;+;<rU   c                 8    | j                   j                  }|y|S )NT)r;   r+   re   s     rO   r+   zUAConfig.apt_news  s     '';
rU   c                 x    || j                   _        t        j                   j                  | j                          y rY   )r;   r+   r   r\   r]   s     rO   r+   zUAConfig.apt_news!  s*    $)!$$**4+;+;<rU   c                 B    | j                   j                  }|t        S |S rY   )r;   r,   r   re   s     rO   r,   zUAConfig.apt_news_url&  s#    ++;
rU   c                 x    || j                   _        t        j                   j                  | j                          y rY   )r;   r,   r   r\   r]   s     rO   r,   zUAConfig.apt_news_url-  s*    (-%$$**4+;+;<rU   c                 j    | j                   j                  }|t        j                  j                  S |S rY   )r;   r.   r   LXDGuestAttachEnumOFFre   s     rO   r.   zUAConfig.lxd_guest_attach2  s/    //;#66:::
rU   c                     |t         j                  j                  }|| j                  _        t         j                  j                  | j                         y rY   )r   r   r   r;   r.   r\   r]   s     rO   r.   zUAConfig.lxd_guest_attach9  s@    =$77;;E,1)$$**4+;+;<rU   c                 B    | j                   j                  dt              S )Nr0   )r:   rR   r   rS   s    rO   r0   zUAConfig.data_dir@  s    xx||J(899rU   c                     | j                   j                  dd      }	 t        t        |j	                               S # t
        $ r t        j                  cY S w xY w)Nr3   DEBUG)r:   rR   getattrloggingupperAttributeErrorr   )rM   r3   s     rO   r3   zUAConfig.log_levelD  sH    HHLLg6		!7IOO$566 	!== 	!s   < AAc                 H    | j                   j                  dt        d         S )Nr2   )r:   rR   r   rS   s    rO   r2   zUAConfig.log_fileL  s    xx||J
(CDDrU   c                     | j                   j                  d      }|r(t        |t              r|S t        j                  d|       i S )z>Return a dictionary of any features provided in uaclient.conf.r1   zDUnexpected uaclient.conf features value. Expected dict, but found %s)r:   rR   
isinstancedictrH   rI   )rM   r1   s     rO   r1   zUAConfig.featuresP  sC     88<<
+(D)3
 	rU   c                 f	   dD ]S  }t        | |      }|t        j                  d|       (t        |t              r|dk  s>t        j                  ||       | j                  s| j                  r,| j                  s| j                  rt        j                         t        j                  d| j                  t        j                         t        j                  d| j                  t        j                         t        j                  d| j                  t        j                         t        j                  d| j                  t        j                         t        j                  d| j                   t        j"                         t        j                  d| j$                  t        j&                         | j                  s| j                  rDt)        j*                  | j                  | j                  t(        j,                  j.                         n[| j                  s| j                  rCt)        j*                  | j                  | j                  t(        j,                  j0                         g }t3        j4                         rt3        j6                  | j                   | j$                         | j                   s#t3        j8                  t2        j:                        s/| j$                  s4t3        j8                  t2        j<                        r|j?                  d       ddl m!} dd	l"m#}  ||       jH                  }tK        d
 |D              }|r|jM                  | j                   | j$                         | j                   s|j9                  |j:                        s'| j$                  s,|j9                  |j<                        r|j?                  d       tO        |      dkD  r:djQ                  |      }tS        tT        jV                  jY                  |             ddl-m.}	 | j^                  t`        jb                  jd                  k7  r, |	|       jf                  stS        tT        jh                         y tj        jl                  jo                  tk        jp                  | j^                               y )N)r)   r*   z1No config set for %s, default value will be used.r   keyrZ   r   httpsr   )	livepatch)_enabled_servicesc              3   @   K   | ]  }|j                   d k(  s|  yw)r   N)r   ).0ents     rO   	<genexpr>z*UAConfig.process_config.<locals>.<genexpr>  s        
sxx;/FC 
s   r   z, )services)_is_attached)guest_attach)9r   rH   debugr   intr
   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.api.u.pro.status.enabled_services.v1r   enabled_servicesanyconfigure_livepatch_proxylenjoinprintr   !PROXY_DETECTED_BUT_NOT_CONFIGUREDrp   (uaclient.api.u.pro.status.is_attached.v1r   r.   r   r   r   is_attached-WARNING_LXD_GUEST_ATTACH_SET_BUT_NOT_ATTACHEDr   lxd_pro_config_filer\   LXDProConfig)
rM   proprZ   services_with_proxiesr   r   r   livepatch_enabledr   r   s
             rO   process_configzUAConfig.process_config_  s   
 	D D$'E}		G  s+uqy 99E 	 &&$*E*E""d&=&= ::<<&&..	

 	''//	

 	D**D,N,N	
 	##//	

 	DOOT%H%H	
 	T%%t'K'K	
 %%)D)D**++!!((
 ##t'>'>&&''!!** !#""$%%doot7G7GHOO001G1GH$$001H1HI%,,V4&	
 -T2CC  
+ 
 
 //!1!1 OO55// $$5500 &,,[9$%)yy!67H::AA% B  	J !!%5%H%H%L%LL &22(HHI++11((d6K6KLrU   c                 B   | j                   0t        | j                         D ]  }t        j                  d|        d| j                  v rUt        j                  d       t        j                  d       t        j                  d       t        j                  d       y y )Nz&Ignoring invalid uaclient.conf key: %sr6   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)rC   sortedrH   rI   r:   )rM   invalid_keys     rO   warn_about_invalid_keysz UAConfig.warn_about_invalid_keys  s    (%d&7&78 <k $((" KKCDKK23KK7
 KK7 #rU   )NNN)*__name__
__module____qualname__ua_scoped_proxy_optionsglobal_scoped_proxy_options&deprecated_global_scoped_proxy_optionsr   r   strr   r   rJ   rP   propertyr/   r4   r7   r!   setterr"   r&   r%   r-   r   r'   r(   r   r)   r*   boolr~   r   r+   r,   r   r.   r0   r3   r2   r1   r   r    rU   rO   r9   r9   K   s   I#.* )-AE $	!d38n%! .==>! 	!
 
!F ?c ? ? ?c ? ? As A A +HSM + + = = = ,Xc] , , = = = 3HSM 3 3 = = = 28C= 2 2 =s = = s   #))=3 = *= tx}    !!=3 = "= t    ""=C = #=    ""=C = #=    =C = = d     =$ = != 3   %%=s = &= $   __=d = = c   =# = = "2"E"E   =&6&I&I = = : : ! ! E# E E  tlrU   r9   r=   c                  T    t         j                  j                  d      } | r| S t        S )z4Get config path to be used when loading config dict.UA_CONFIG_FILE)osenvironrR   r   )config_files    rO   rD   rD     s$    **..!12KrU   c                 `   t        j                   t              }| s
t               } t        j	                  d|        t
        j                  j                  |       r-|j                  t        t        j                  |                    i }t
        j                  j                         D ]  \  }}|j                         }|j                  d      s(|dd }|j                  d      r|dd }|j!                  d      rTt
        j                  j                  |      rt        t        j                  |            }nt#        j$                  |      d	|vr||i|d	<   ||d	   |<   |t&        v s|||<    |j                  |       d
|v r%t
        j                  j)                  |d
         |d
<   dD ]4  }t+        j,                  ||         rt#        j.                  |||          t1        |j3                               j5                  t6              }|D ]  }|j9                  |        ||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 %sua_   N	features_	   yaml)filepathr1   r0   )r/   r4   r   )copyr   rD   rH   r   r   pathexistsupdater   r   	load_filer   itemslower
startswithendswithr
   InvalidFeatureYamlConfigValuer   
expanduserr   is_service_urlInvalidURLConfigValuesetkeys
differenceVALID_UA_CONFIG_KEYSpop)	config_pathr:   env_keysr   rZ   
field_namefeature_field_namerC   r   s	            rO   rE   rE     s    ))O
$C%'II5{C	ww~~k"

9V--k:;<Hjj&&( -
Uiik>>% QRJ$$[1%/^" >>&)ww~~e, )&*:*:5*A B(FF%*  S('95&AC
O:?C
O$6755',$5-6 JJxS'',,S_=J/ L""3s8,22s#c(KKL sxxz?--.BCL#  rU   override_keyc                       f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                 2     t                fd       }|S )Nc                      t               \  } }| j                  di       j                  t              }|t        k7  rdk(  r|d fS |S         S )Nr5   
cloud_type)rE   rR   UNSET_SETTINGS_OVERRIDE_KEY)r:   _value_overridefr   s      rO   new_fz>apply_config_settings_override.<locals>.wrapper.<locals>.new_fA  s[    !^FC WW%92>BB9N !<<</*D11%%3JrU   )r   )r  r  r   s   ` rO   wrapperz/apply_config_settings_override.<locals>.wrapper@  s     	q	 
	 rU   r   )r   r  s   ` rO   apply_config_settings_overrider  3  s    " NrU   rY   )1r   r   r   	functoolsr   r   typingr   r   r   r   r   r	   r
   r   r   r   r   r   uaclient.defaultsr   r   r   r   r   r   r   r   r   uaclient.filesr   r   uaclient.yamlr   	getLoggerreplace_top_level_logger_namer   rH   MERGE_ID_KEY_MAPr   UA_CONFIGURABLE_KEYSr   get_event_loggerrm   r9   r   rD   rE   r  r   rU   rO   <module>r     s      	 & & &	 	 	
 
 
 9 #g:::8DE !"  '  $  	&%%'] ]@ <~ rU   