
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
ôn»jë*  ã            7   @   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i Zdd„ Zdd„ Zd4d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dejƒedƒ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 œ6Z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/�d0d1„ ƒZ&ej$ej%d/�d2d3„ ƒZ'dS )5é    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!   c                s8   dj ˆd k	rdj ˆˆƒndj ˆƒƒ‰ ‡ ‡‡fdd„}|S )Nzmust be an integer {0}z{0}..{1}z>= {0}c                s,   t | ƒ}|ˆk s ˆd k	r(|ˆkr(tˆ ƒ‚|S )N)ÚintÚ
ValueError)r   Úresult)ÚexpectedÚhighÚlowr   r   Úconvert/   s    zbounded_int.<locals>.convert)Úformat)r'   r&   r(   r   )r%   r&   r'   r   Úbounded_int,   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   Úlogwarnr)   Újoin)r   ZvalidÚinvalidÚtokenr   r   r   Úlibcare_libs_list>   s    
r2   c             C   s   | j ƒ S )N)r   )Úvr   r   r   Ú<lambda>N   s    r4   c             C   s   | j ƒ S )N)r   )r3   r   r   r   r4   R   s    c             C   s
   | j dƒS )Nú/)Úrstrip)r3   r   r   r   r4   a   s    c             C   s   | pd S )Nr   )r3   r   r   r   r4   l   s    c             C   s
   | j dƒS )Nr5   )r6   )r3   r   r   r   r4   n   s    c             C   s
   | j dƒS )Nr5   )r6   )r3   r   r   r   r4   o   s    c             C   s
   | j dƒS )Nr5   )r6   )r3   r   r   r   r4   s   s    c             C   s
   | j dƒS )Nr5   )r6   )r3   r   r   r   r4   t   s    )6Ú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   ÚKPATCH_RETRIESÚKPATCH_TIMEOUT_SECÚ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 | r"|d k	r"|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_config‡   s"    rw   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|ƒƒ ƒ‚xp|j	ƒ D ]d\}}t| }	|d ksˆ|	d krªqˆy|	|ƒ W qˆ t
k
rê }
 ztd|||
f ƒ‚W Y d d }
~
X qˆX qˆW tf |Ž d S )Nz^([^=]+)=([^=]*)$z8Invalid parameter format: %s. Format should be KEY=VALUEzUnknown parameter: %sz, zBad value for %s: %s (%s))ÚreÚcompiler,   ÚgroupsÚ
SystemExitÚsetÚPOSSIBLE_CONFIG_OPTIONSr/   Úsortedrm   Ú	Exceptionrw   )ÚparamsZparams_for_updateÚpatternÚparamr,   Úkeyr   Zunknown_paramsÚvar_namer(   Úerrr   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 jƒ  tdddœd�‰ y,tttƒƒ} tjr<ˆ j| ƒ n
ˆ j	| ƒ W n t
k
r\   i S X d‡ ‡fdd„	}x4dD ],\}}tj|ƒstˆ jd
|ƒ}|rt|tj|< qtW x tjƒ D ]\}}|||d� q®W ˆS )Nrh   )Ú
HTTP_PROXYÚHTTPS_PROXY)Údefaultsc                sŒ   yˆ j d| ƒ}W n tk
r(   |}Y nX |d k	rˆ|dkr>d S |r€y||ƒ}W n0 tk
r~ } zdj||ƒt| < d S d }~X nX |ˆ| < d S )NÚasectionÚNonez	{0} ({1}))Úgetr   r)   ÚINVALID_CONFIG_OPTIONS)ÚnameÚdefaultr(   r   r…   )Úcpr$   r   r   Úread_varÞ   s    
z%get_config_settings.<locals>.read_varÚhttpr’   Úhttpsr“   r•   )r(   )NN©r�   r’   ©rž   r“   )rŸ   r    )r˜   Úclearr   r‡   ri   rj   r   ÚPY2ÚreadfpÚ	read_filer   r   Úget_proxy_from_envr—   ÚosÚenvironr}   rm   )r   rœ   ÚschemeÚvariableÚproxyr„   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_OPTIONSr¡   r«   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-rh   ú-Ú_z(Invalid feature flag header value %s: %s)
rm   r   rp   ÚreplaceÚboolr"   r#   r   Ú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   rC   Ú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   rr   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¿   ri   rÀ   Úloadrm   ÚFEATURE_FLAGS_WHITELISTr¬   r   r­   r   r´   Úinfo)ÚfrÂ   rƒ   r   r   r   r   r»   (  s    
r»   )N)(rÀ   r¦   rx   rh   r   r   r   r   r   Úpy23r   rj   rÆ   r|   r¬   r˜   r   r!   r*   ry   r+   r2   r"   ÚKPATCH_RETRIES_MAXrq   r   r   r}   rw   r†   Úobjectr‡   r«   r¯   r¹   r¼   Úcatch_errorsr.   rº   r»   r   r   r   r   Ú<module>   s¦   


-	