
    fn[                        d dl Z d dlZd dlZd dlZd dlmZ d dlmZmZ d dl	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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& d d	l'm(Z(  ejR                   ejT                  e+            Z,d
ddZ-dZ.dZ/dZ0 edd      Z1 ejd                         Z3 G d d      Z4de5fdZ6ddZ7de5fdZ8y)    N)
namedtuple)	lru_cachewraps)AnyDictOptionalTuple)	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privatec            	       :   e Zd Z edd       edd       edd       edd      dZdZd	Zd
Z	 	 	 d@dee	e
ef      deej                     dee
   ddfdZe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 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#de$ee
f   fd/Z%ed0        Z&ed1        Z'ede
fd2       Z(ed3        Z)ed4        Z*dAd5ee
   de
fd6Z+d5e
defd7Z,d5e
ddfd8Z-d9 Z.dBd5e
d:edee   fd;Z/d5e
d<eddfd=Z0d> Z1d? Z2y)CUAConfiginstance-idTzmachine-access-cis.jsonlockFzstatus.json)r?   zmachine-access-cisr@   zstatus-cache)r)   r*   )r+   r,   )r'   r(   Ncfguser_configseriesreturnc                    |rd| _         || _        d| _        n1t               | _         t	        | j                         \  | _        | _        |r|| _        n:	 t        j                  j                         xs t        j                         | _        d| j                  v rOt        j                  j                  i | j
                  j                         | j                  d   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 valuesr8   T) optional_type_errors_become_null)cfg_pathrA   invalid_keysget_config_pathparse_configrB   r   user_config_filereadUserConfigData	ExceptionLOGwarning	from_dictto_dictrC   _machine_token_file)selfrA   rB   rC   es        1/usr/lib/python3/dist-packages/uaclient/config.py__init__zUAConfig.__init__a   s*     DMDH $D+-DM*6t}}*E'DHd'*D@00557 4"113   $(("*99CCG4##++-G+1FG15  D  D
  	   @7!D9:#.#=#=#?  @s   9C: :	EAEEc                     | j                   s>t        j                  | j                  | j                  j                  d            | _         | j                   S )Nmachine_token_overlay)rU   r   MachineTokenFiler2   r3   getrV   s    rX   machine_token_filezUAConfig.machine_token_file   sF    ''','='=!!"9:(D$ '''    c                 B    | j                   j                  dt              S )Nr1   )rA   r]   r   r^   s    rX   r1   zUAConfig.contract_url       xx||N,=>>r`   c                 B    | j                   j                  dt              S )Nr6   )rA   r]   r   r^   s    rX   r6   zUAConfig.security_url   rb   r`   c                 B    | j                   j                  dt              S )Nr9   )rA   r]   r   r^   s    rX   r9   zUAConfig.livepatch_url   s    xx||O-?@@r`   c                 .    | j                   j                  S N)rB   r%   r^   s    rX   r%   zUAConfig.http_proxy   s    ***r`   valuec                 x    || j                   _        t        j                  j	                  | j                          y rf   )rB   r%   r   rM   writerV   rg   s     rX   r%   zUAConfig.http_proxy   s*    &+#$$**4+;+;<r`   c                 .    | j                   j                  S rf   )rB   r&   r^   s    rX   r&   zUAConfig.https_proxy   s    +++r`   c                 x    || j                   _        t        j                  j	                  | j                          y rf   )rB   r&   r   rM   ri   rj   s     rX   r&   zUAConfig.https_proxy   s*    ',$$$**4+;+;<r`   c                 .    | j                   j                  S rf   )rB   r*   r^   s    rX   r*   zUAConfig.ua_apt_https_proxy   s    222r`   c                 x    || j                   _        t        j                  j	                  | j                          y rf   )rB   r*   r   rM   ri   rj   s     rX   r*   zUAConfig.ua_apt_https_proxy   s*    .3+$$**4+;+;<r`   c                 .    | j                   j                  S rf   )rB   r)   r^   s    rX   r)   zUAConfig.ua_apt_http_proxy   s    111r`   c                 x    || j                   _        t        j                  j	                  | j                          y rf   )rB   r)   r   rM   ri   rj   s     rX   r)   zUAConfig.ua_apt_http_proxy   s*    -2*$$**4+;+;<r`   )maxsizec                     | j                   j                  }|r|S | j                   j                  }|r6t        j	                  t
        j                  j                  dd             |S y )Nr'   r+   oldnew)rB   r+   r'   eventinfor   WARNING_DEPRECATED_FIELDformatrV   
global_valold_apt_vals      rX   r+   zUAConfig.global_apt_http_proxy   sh     %%;;
&&55JJ1188(.E 9 
 r`   c                     || j                   _        d | j                   _        t        j                  j                  j                          t        j                  j                  | j                          y rf   )	rB   r+   r'   r>   fgetcache_clearr   rM   ri   rj   s     rX   r+   zUAConfig.global_apt_http_proxy   sP    16.*.'&&++779$$**4+;+;<r`   c                     | j                   j                  }|r|S | j                   j                  }|r6t        j	                  t
        j                  j                  dd             |S y )Nr(   r,   rs   )rB   r,   r(   rv   rw   r   rx   ry   rz   s      rX   r,   zUAConfig.global_apt_https_proxy   sh     %%<<
&&66JJ1188)/G 9 
 r`   c                     || j                   _        d | j                   _        t        j                  j                  j                          t        j                  j                  | j                          y rf   )	rB   r,   r(   r>   r~   r   r   rM   ri   rj   s     rX   r,   zUAConfig.global_apt_https_proxy   sP    27/+/('',,88:$$**4+;+;<r`   c                 8    | j                   j                  }|y|S )Ni`T  )rB   r-   rV   vals     rX   r-   zUAConfig.update_messaging_timer   s     55;
r`   c                 x    || j                   _        t        j                  j	                  | j                          y rf   )rB   r-   r   rM   ri   rj   s     rX   r-   zUAConfig.update_messaging_timer   s*    27/$$**4+;+;<r`   c                 8    | j                   j                  }|y|S )Ni@8  )rB   r.   r   s     rX   r.   zUAConfig.metering_timer   s     --;
r`   c                 x    || j                   _        t        j                  j	                  | j                          y rf   )rB   r.   r   rM   ri   rj   s     rX   r.   zUAConfig.metering_timer  s*    */'$$**4+;+;<r`   c                 8    | j                   j                  }|y|S )NF)rB   poll_for_pro_licenser   s     rX   r   zUAConfig.poll_for_pro_license  s"    
 33;
r`   c                 x    || j                   _        t        j                  j	                  | j                          y rf   )rB   r   r   rM   ri   rj   s     rX   r   zUAConfig.poll_for_pro_license  s*    05-$$**4+;+;<r`   c                 8    | j                   j                  }|y|S )NiX  )rB   polling_error_retry_delayr   s     rX   r   z"UAConfig.polling_error_retry_delay  s"     88;
r`   c                 x    || j                   _        t        j                  j	                  | j                          y rf   )rB   r   r   rM   ri   rj   s     rX   r   z"UAConfig.polling_error_retry_delay#  s*    5:2$$**4+;+;<r`   c                 8    | j                   j                  }|y|S )NT)rB   r/   r   s     rX   r/   zUAConfig.apt_news(  s     '';
r`   c                 x    || j                   _        t        j                  j	                  | j                          y rf   )rB   r/   r   rM   ri   rj   s     rX   r/   zUAConfig.apt_news/  s*    $)!$$**4+;+;<r`   c                 B    | j                   j                  }|t        S |S rf   )rB   r0   r   r   s     rX   r0   zUAConfig.apt_news_url4  s#    ++;
r`   c                 x    || j                   _        t        j                  j	                  | j                          y rf   )rB   r0   r   rM   ri   rj   s     rX   r0   zUAConfig.apt_news_url;  s*    (-%$$**4+;+;<r`   c                    | j                  d      }d}t        j                  j                  |      s|S t	        j
                  |      }	 |j                  d      \  }}	 t	        j                  d|g       t        |      |fS # t        $ r? t        j                  t        j                  j                  | j                  d            w xY w# t        j                  $ rk t        j                          s&t"        j%                  d||       t        |      |fcY S t"        j'                  d||       t	        j(                  |       |cY S w xY w)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.
        r@   )rF   :)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joinr2   subpintProcessExecutionErrorr   we_are_currently_rootrQ   debugrR   ensure_file_absent)rV   	lock_pathno_locklock_contentlock_pidlock_holders         rX   check_lock_infozUAConfig.check_lock_info@  s'    NN6*	ww~~i(N''	2	&2&8&8&=#X{	KKx()M;//  	,,!ww||DMM6B 	 // 	--/		D
 H{33KKC
 %%i0N	s&   B  #C ACAE.EEc                 B    | j                   j                  dt              S )Nr2   )rA   r]   r   r^   s    rX   r2   zUAConfig.data_dirk  s    xx||J(899r`   c                     | j                   j                  dd      }	 t        t        |j	                               S # t
        $ r t        j                  cY S w xY w)Nr5   DEBUG)rA   r]   getattrloggingupperAttributeErrorr   )rV   r5   s     rX   r5   zUAConfig.log_levelo  sH    HHLLg6		!7IOO$566 	!== 	!s   < AAc                 H    | j                   j                  dt        d         S )Nr4   )rA   r]   r   r^   s    rX   r4   zUAConfig.log_filew  s    xx||J
(CDDr`   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.r3   zDUnexpected uaclient.conf features value. Expected dict, but found %s)rA   r]   
isinstancedictrQ   rR   )rV   r3   s     rX   r3   zUAConfig.features{  sC     88<<
+(D)3
 	r`   c                 .    | j                   j                  S )zAReturn the machine-token if cached in the machine token response.)r_   machine_tokenr^   s    rX   r   zUAConfig.machine_token  s     &&444r`   keyc                    | j                   }|s$t        j                  j                  |t              S || j
                  v rt| j
                  |   }|j                  r/t        j                  j                  |t        |j                        S t        j                  j                  ||j                        S t        j                  j                  |t        |      S )zAReturn the file path in the data directory represented by the key)r2   r   r   r   r   
data_pathsr<   r;   )rV   r   r2   r   s       rX   r   zUAConfig.data_path  s    ==77<<.99$//!,I  ww||ni.@.@  77<<)*<*<==ww||Hnc::r`   c                 b    | j                  |      }t        j                  j                  |      S rf   )r   r   r   r   rV   r   
cache_paths      rX   cache_key_existszUAConfig.cache_key_exists  s#    ^^C(
ww~~j))r`   c                     |st        d      |j                  d      rd| _        n(|dk(  r#t        j                  t
        j                         | j                  |      }t        j                  |       y)zRemove specific cache file.z1Invalid or empty key provided to delete_cache_keymachine-accessNr@   )
RuntimeError
startswithrU   r   remover   OPERATION_IN_PROGRESSr   r   r   r   s      rX   delete_cache_keyzUAConfig.delete_cache_key  sa    C  >>*+'+D$F]NN6778^^C(
!!*-r`   c                 d    | j                   j                         D ]  }| j                  |        y)zN
        Remove configuration cached response files class attributes.
        N)r   keysr   )rV   path_keys     rX   delete_cachezUAConfig.delete_cache  s.     ,,. 	,H!!(+	,r`   silentc                 J   | j                  |      }	 t        j                  |      }	 t        j                  |t        j                        S # t        $ r: t        j
                  j                  |      s|st        j                  d|       Y y w xY w# t        $ r |cY S w xY w)NzFile does not exist: %scls)r   r   r   rP   r   r   r   rQ   r   jsonloadsr   DatetimeAwareJSONDecoderr   )rV   r   r   r   contents        rX   
read_cachezUAConfig.read_cache  s    ^^C(
	&&z2G
	::g4+H+HII  	77>>*-f		3Z@	  	N	s#   A $B A BBB"!B"r   c                    | j                  |      }t        j                  j                  |      }t        j                  j	                  |      sSt        j
                  |d       t        j                  j                  |      t        k(  rt        j                  |d       |j                  d      rd | _
        n@|dk(  r;d|v r7t        j                  t        j                  |j                  d      d          t!        |t"              s%t%        j&                  |t(        j*                  	      }d
}|| j,                  v r| j,                  |   j.                  sd}t1        j2                  |||       y )NT)exist_oki  r   r@   r      )	operationr   i  i  )mode)r   r   r   dirnamer   makedirsbasenamer   chmodr   rU   r   addr   r   r   r   strr   dumpsr   DatetimeAwareJSONEncoderr   r<   r   
write_file)rV   r   r   filepathr2   r   s         rX   write_cachezUAConfig.write_cache  s
   >>#&77??8,ww~~h'KK40ww)^;5)>>*+'+D$F]g~00%mmC03 '3'jjd.K.KLG$//!??3'//(G$7r`   c                 P   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#} dd
l$m%}  ||       }|jM                         \  }}	||jN                  k(  r|jQ                  | j                   | j$                         | j                   s|j9                  |j:                        s'| j$                  s,|j9                  |j<                        r|j?                  d       tS        |      dkD  r;djU                  |      }
tW        tX        jZ                  j]                  |
             y y )N)r-   r.   z1No config set for %s, default value will be used.r   r   rg   r   httpsr   )	livepatch)ApplicationStatus)LivepatchEntitlementr   z, )services)/r   rQ   r   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_CONFIGUREDry   )rV   proprg   services_with_proxiesr   r   r   livepatch_entlivepatch_status_r   s              rX   process_configzUAConfig.process_config  sN   
 	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&NH,T2+>>@!0888//!1!1 OO55// $$5500 &,,[9$%)yy!67H::AA% B  *r`   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: %sr8   z)legacy "ua_config" found in uaclient.confzPlease 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   sortedrQ   rR   rA   )rV   invalid_keys     rX   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 #r`   )NNNrf   )F)3__name__
__module____qualname__r:   r   ua_scoped_proxy_optionsglobal_scoped_proxy_options&deprecated_global_scoped_proxy_optionsr   r   r   r   r   rO   rY   propertyr_   r1   r6   r9   r%   setterr&   r*   r)   r   r+   r,   r   r-   r.   boolr   r   r/   r0   r	   r   r2   r5   r4   r3   r   r   r   r   r   r   r   r
  r   r`   rX   r>   r>   O   s   t4&'@$G' 6	J J#.* )-<@ $	'
d38n%'
 k889'
 	'

 
'
R ( ( ?c ? ? ?c ? ? As A A +HSM + + = = = ,Xc] , , = = = 3HSM 3 3 = = = 28C= 2 2 =s = = tx}    !!=3 = "= t    ""=C = #=    ""=C = #=    =C = = d     =$ = != 3   %%=s = &= $   __=d = = c   =# = =)sCx )V : : ! ! E# E E   5 5;Xc] ;c ;*C *D *.C .D .,c 4 HSM 8s 8S 8T 8.eNr`   r>   rD   c                  T    t         j                  j                  d      } | r| S t        S )z4Get config path to be used when loading config dict.UA_CONFIG_FILE)r   environr]   r   )config_files    rX   rK   rK   V  s$    **..!12Kr`   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)r   r3   r2   )r1   r6   r   )copyr   rK   rQ   r   r   r   r   updater   r   r   r  itemslowerr   endswithr   InvalidFeatureYamlConfigValuer   
expanduserr   is_service_urlInvalidURLConfigValuesetr   
differenceVALID_UA_CONFIG_KEYSpop)	config_pathrA   env_keysr   rg   
field_namefeature_field_namerJ   r  s	            rX   rL   rL   _  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#  r`   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 )Nr7   
cloud_type)rL   r]   UNSET_SETTINGS_OVERRIDE_KEY)rA   r	  value_overridefr4  s      rX   new_fz>apply_config_settings_override.<locals>.wrapper.<locals>.new_f  s[    !^FC WW%92>BB9N !<<</*D11%%3Jr`   )r   )r;  r<  r4  s   ` rX   wrapperz/apply_config_settings_override.<locals>.wrapper  s     	q	 
	 r`   r  )r4  r=  s   ` rX   apply_config_settings_overrider>    s    " Nr`   rf   )9r#  r   r   r   collectionsr   	functoolsr   r   typingr   r   r   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.files.noticesr   uaclient.yamlr   	getLoggerreplace_top_level_logger_namer  rQ   MERGE_ID_KEY_MAPr9  UA_CONFIGURABLE_KEYSr.  r:   get_event_loggerrv   r>   r   rK   rL   r>  r  r`   rX   <module>rK     s       	 " & - -
 
 

 
 
 0 ) #g:::8DE !"  '   
  j"9:%%%'D DN <~ r`   