
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
;j&              5   @   s  d dl Z d dlZd dlZddlmZmZmZmZmZ ddl	m
Z
 dZdddd	d
dddgZe Zdd Zdd ZejdZdd Zdd deddd eeeedeeeeeeeeedd eeeeeeeedd ejdd dd ejdejdd dd eeeeejddejeeeddeed4Zdd  Zd!d" ZG d#d$ d$eZd%d& Zd'd( Zd)d* Zd+d, Z ej!ej"d-d.d/ Z#ej!ej"d-d0d1 Z$dS )2    N   )config	constants
http_utils	log_utilsutils)ConfigParserz/etc/sysconfig/kcare/kcare.confUSE_CONTENT_FILE_V3FORCE_JSON_SIG_V3ENABLE_CRASHREPORTERKCORE_OUTPUTKMSG_OUTPUTSEND_PERF_METRICSKERNEL_ANOMALY_REPORT_ENABLEFORCE_DOCTOR_FALLBACKc             C   s   | j  dkS )N1TRUEYESY)r   r   r   r   )upper)value r   5/usr/libexec/kcare/python/kcarectl/config_handlers.pybool_converter#   s    r   c             C   s   dd | j dD S )Nc             S   s    g | ]}|j  r|j  j qS r   )striplower).0itemr   r   r   
<listcomp>(   s    zcomma_list.<locals>.<listcomp>,)split)r   r   r   r   
comma_list'   s    r!   z^[a-z][a-z0-9_.+\-]*$c             C   sR   g g  }}x(t | D ]}tj|r&|n|j| qW |rNtjdjdj| |S )Nz3LIBCARE_LIBS: ignoring invalid library name(s): {0}z, )r!   _LIBCARE_LIB_NAME_REmatchappendr   logwarnformatjoin)r   Zvalidinvalidtokenr   r   r   libcare_libs_list0   s    
r*   c             C   s   | j  S )N)r   )vr   r   r   <lambda>@   s    r,   c             C   s   | j  S )N)r   )r+   r   r   r   r,   D   s    c             C   s
   | j dS )N/)rstrip)r+   r   r   r   r,   S   s    c             C   s   | pd S )Nr   )r+   r   r   r   r,   \   s    c             C   s
   | j dS )Nr-   )r.   )r+   r   r   r   r,   ^   s    c             C   s
   | j dS )Nr-   )r.   )r+   r   r   r   r,   _   s    c             C   s
   | j dS )Nr-   )r.   )r+   r   r   r   r,   c   s    c             C   s
   | j dS )Nr-   )r.   )r+   r   r   r   r,   d   s    )4AFTER_UPDATE_COMMANDAUTO_STICKY_PATCHSETAUTO_UPDATEAUTO_UPDATE_DELAYBEFORE_UPDATE_COMMANDCHECK_SSL_CERTSDOCTOR_REPORT_MAX_SIZE_BYTESr   r   	FORCE_GID
FORCE_IPV4
FORCE_IPV6r
   HTTP_TIMEOUTHTTP_UPLOAD_TIMEOUTIGNORE_FEATURE_FLAGSIGNORE_UNKNOWN_KERNELr   KCORE_OUTPUT_SIZE
KDUMPS_DIRr   $KERNEL_ANOMALY_REPORT_MAX_SIZE_BYTESr   LIBCARE_DISABLEDLIBCARE_LIBS!LIBCARE_PIDLOGS_MAX_TOTAL_SIZE_MBLIBCARE_SOCKET_TIMEOUTLIB_AUTO_UPDATEPATCH_LEVELPATCH_METHODPATCH_SERVERPATCH_SERVER_IPV6
PATCH_TYPEPREFIXPREV_PATCH_TYPEREGISTRATION_URLREGISTRATION_URL_IPV6PRINT_LEVELREPORT_FQDNSILENCE_ERRORSSTATUS_CHANGE_GAPSTICKY_PATCHSTICKY_PATCHSETUPDATE_DELAYUPDATE_POLICYUPDATE_SYSCTL_CONFIGUSERSPACE_PATCHESr	   KERNEL_VERSION_FILEKCARE_UNAME_FILESUCCESS_TIMEOUTr   c        	      K   s   t t}|j }|j  x| j D ]\}}d}|d }|d }x^tt|D ]N}|| j|sl|| j|rL|d kr|||= n|d t| d ||< d}P qLW |s"|j	|d t| d  q"W t
jtdj| d S )NF= z = 
T )openCONFIG	readlinescloseitemsrangelen
startswithstrr$   r   atomic_writer'   )	kwargsZcflinesZpropr   updatedZprop_eqZprop_spir   r   r   update_configw   s"    rm   c       
      C   s   i }t jd}xD| D ]<}|j|}|r<|j \}}|sHd }ntd| |||< qW t|tt }|r~tddjt| x`|j	 D ]T\}}t| }	|d ks|	d krqy|	| W q t
k
r   td||f Y qX qW tf | d S )Nz^([^=]+)=([^=]*)$z8Invalid parameter format: %s. Format should be KEY=VALUEzUnknown parameter: %sz, zBad value for %s: %s)recompiler#   groups
SystemExitsetPOSSIBLE_CONFIG_OPTIONSr'   sortedrc   	Exceptionrm   )
paramsZparams_for_updatepatternparamr#   keyr   Zunknown_paramsvar_nameconvertr   r   r   update_config_from_args   s,    


r|   c               @   s$   e Zd Zdd Zdd Zdd ZdS )FakeSecHeadc             C   s   || _ d| _d S )Nz[asection]
)fpsechead)selfr~   r   r   r   __init__   s    zFakeSecHead.__init__c             C   s&   | j rz| j S d | _ X n
| jj S d S )N)r   r~   readline)r   r   r   r   r      s
    
zFakeSecHead.readlinec             c   s.   | j r| j V  d | _ x| jD ]
}|V  qW d S )N)r   r~   )r   liner   r   r   __iter__   s
    zFakeSecHead.__iter__N)__name__
__module____qualname__r   r   r   r   r   r   r   r}      s   	r}   c                 s   i t dddd y,ttt} tjr4 j|  n
 j|  W n tk
rT   i S X d fdd	}x4dD ],\}}t	j
|sl jd
|}|rl|tj|< qlW x tj D ]\}}|||d qW S )Nr^   )
HTTP_PROXYHTTPS_PROXY)defaultsc                sJ   y j d| }W n tk
r(   |}Y nX |d k	rF|r>||}|| < d S )Nasection)getru   )namedefaultr{   r   )cpresultr   r   read_var   s    
z%get_config_settings.<locals>.read_varhttpr   httpsr   r   )r{   )NNr   r   r   r   )r   r   )r   r}   r_   r`   r   PY2readfp	read_fileru   r   get_proxy_from_envr   osenvironrs   rc   )r   r   schemevariableproxyrz   r{   r   )r   r   r   get_config_settings   s$    
r   c              C   s(   t j  t } tjj|  t j|  d S )N)_CONFIG_OPTIONSclearr   r   __dict__update)Zsettingsr   r   r   set_settings_from_config_file   s    r   c             C   s   i }xv| j  D ]j\}}|j }|jds*q|jddjdd}ytt|||< W q tk
rv   tjj	d|| Y qX qW |S )ak  
    Checking headers for feature flags which start with 'KC-Flag-' and
    reformat it to dictionary with keys in upper case and without 'KC-Flag-' prefix
    and dashes replaced with underscores. For unification all header keys are checked in upper case.
    For example:
    'KC-Flag-Some-Value' -> 'SOME_VALUE'
    :return: dict {'SOME_VALUE': bool, ...}
    zKC-FLAG-r^   -_z(Invalid feature flag header value %s: %s)
rc   r   rf   replaceboolint
ValueErrorr   kcarelogerror)headersflagsZhdr_nameZ	hdr_valueZ
upper_name
param_namer   r   r    convert_headers_to_feature_flags   s    	
r   c             C   s   t |  tjst  d S )N)save_feature_flags_cacher   r;   set_feature_flags_from_cache)r   r   r   r   set_feature_flags_from_headers  s    r   )loggerc             C   s"   t | }tjtjtj|d d S )N)content)r   r   rh   r   FEATURE_FLAGS_CACHEjsondumps)r   feature_flagsr   r   r   r   	  s    r   c              C   sz   t jjtjsdS ttj} tj| }W dQ R X xB|j D ]6\}}|t	krNq<|t
krXq<|tj|< tjjd|| q<W dS )z
    Set global variables using feature flag from cached values received with patchserver headers.
    Checks that option is allowed by whitelist and update global variable
    using globals()
    :return: None
    Nz$feature flags config override: %s=%s)r   pathexistsr   r   r_   r   loadrc   FEATURE_FLAGS_WHITELISTr   r   r   r   r   info)fr   ry   r   r   r   r   r     s    
r   )%r   r   rn   r^   r   r   r   r   r   py23r   r`   r   rr   r   r   r!   ro   r"   r*   r   rg   r   r   rs   rm   r|   objectr}   r   r   r   r   catch_errorsr%   r   r   r   r   r   r   <module>   s   
%	