
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
;j*:                @   s  d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZ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 d dlmZ ddlmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"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. dd	l/m0Z0m1Z1m2Z2m3Z3m4Z4 d
Z5dZ6dZ7dZ8dZ9dZ:dZ;dZ<ej=dej>Z?ej=dZ@ejAjBdrejAjCd d ejDdeEd e$jFjGejH dd ZIdd ZJdd  ZKd!d" ZLd#d$ ZMdd%d&ZNd'd( ZOd)d* ZPd+d, ZQd-d. ZRd/d0 ZSd1d2 ZTG d3d4 d4eUZVG d5d6 d6e,ZWG d7d8 d8e,ZXG d9d: d:e,ZYd;d< ZZed=d> Z[dd?d@Z\dAdB Z]dCdD Z^i Z_dEdF Z`e`e2ja_becedGdsy8d dldZed dlfZgeejhjiegjjeejhjidHk rekdIW n ekk
r   Y n8X dJdK Zle2jmZnG dLdM dMeoZpG dNdO dOe2jmZqeqe2_mdPdQ ZrejsfdRdSZtdTdU ZudVdW ZvG dXdY dYeoZwdZd[ Zxd\d] Zydd_d`Zzdadb Z{dcdd Z|ddedfZ}dgdh Z~didj Zdkdl Zdmdn Zdodp Zdqdr Zdsdt Zdudv Zdwdx Zdydz Zd{d| Zd}d~ Zdd Zdd Zdd Zdd ZdddZdd Zdd Zdd Zdd ZdddZdd Zdd Zdd Zdd Ze&jdddZdd Zdd ZG dd dZdd Zdd Zdd Zdd ZejejsfddZdd Ze&je*jdejfddZdd Zdd Zdd ZdddZdd Zdd ZdS )    )print_functionN)ArgumentParser)contextmanager)datetime   )anomalyauthcapabilitiesconfigconfig_handlers	constantsdoctorerrorsfetch
http_utilsipv6_supportkcarelibcare	log_utilsplatform_utilsprocess_utilsselinuxserver_infoserveridupdate_utilsutils)
KcareErrorNotFoundSafeExceptionWrapper)	HTTPErrorURLErrorhttplibjson_loads_nstr	urlencodec   Zv312h24h48htestz./etc/sysconfig/kcare/freezer.modules.blacklistz/usr/libexec/kcare/kcdoctor.sh	latest.v3	latest.v2z /etc/sysconfig/kcare/sysctl.conf
   z$==BLACKLIST==
(.*)==END BLACKLIST==
z'(kpatch.*|ksplice.*|kpatch_livepatch.*)z/usr/libexec/kcare/pythonignore)categoryc              C   sD   t  } tjjtr@ttd}x|D ]}| j|j  q"W |j  | S )Nr)	setospathisfileFREEZER_BLACKLISTopenaddrstripclose)resultfline r;   ./usr/libexec/kcare/python/kcarectl/__init__.pyget_freezer_blacklistS   s    

r=   c             C   sB   |j d}| r(dj|d | |d g}ndj|d |d g}|S )N.r   r   r?   )splitjoin)ptypefilenameZ
name_partsr;   r;   r<   _apply_ptype]   s
    
rD   c             C   sJ   t | tjt_t | tjt_t | tjt_t | tjt_t | tjt_d S )N)rD   r
   	PATCH_BIN
PATCH_INFOBLACKLIST_FILEFIXUPS_FILE
PATCH_DONE)rB   r;   r;   r<   apply_ptypef   s
    rJ   c              C   s   t j \} }}d}t|trbt|t rbyd|jtj|j|jf }W q t	t
fk
r^   Y qX nPt|tt
tfrt|t rd| }n*t|tr|jpt|j} |jpd|j }tj }tjtj |d |d t| dt| |djtj|dt|ddd	S )
N z[Errno %i] %s: '%s'z%sr   r   __name__d   attempts)Zagent_versionZpython_versiondistroZdistro_versionerrordetails	tracebackrN   )sysexc_info
isinstanceOSErrorr    errnor0   strerrorrC   AttributeError	TypeErrorKeyErrorIOErrorr   etypetypeinnerrQ   r   
get_distror   VERSIONget_python_versiongetattrstrrA   rR   Z	format_tb)r]   valuetbZdetails_sanitizedrO   r;   r;   r<    format_exception_without_detailsn   s*    

rg   c              C   sv   t jr
d S tjt } tjtjtj	| }tj
dd | }tj|tj }ytj| W n tk
rp   Y nX d S )Nz/api/kcarectl-tracez?trace=)r
   UPDATE_FROM_LOCALjsondumpsrg   r   nstrbase64Zurlsafe_b64encodeZbstrget_patch_server_urlr   Zhttp_requestr   Zget_http_auth_stringZurlopen_base	Exception)ZtraceZencoded_traceurlZrequestr;   r;   r<   send_exc   s    rp   c             C   s   t j }|dkr t j|d dS t j  t j }|dkrBt jd t jd ttjd&}t j	|j
 d t j	|j
 d W dQ R X |rtj| y
|   W n* tk
r   tjjd t jd Y nX t jd dS )z
    Run func in a fork in an own process group
    (will stay alive after kcarectl process death).
    :param func: function to execute
    :return:
    r   Nar      zWait exception)r0   forkwaitpidsetsid_exitr7   r4   r   ZLOG_FILEdup2filenotimesleeprn   r   kcarelog	exception)funcrz   pidfdr;   r;   r<   
nohup_fork   s(    



r   c              C   s   t jjtjd} t jj| rtt| dH}y,t|j }|t	j
 tj krRt|| W n tk
rh   Y nX W dQ R X tj| tj  dS )a  Check the fact that there was a failed patching attempt.
    If anchor file not exists we should create an anchor with
    timestamp and schedule its deletion at $timeout.

    If anchor exists and its timestamp more than $timeout from now
    we should raise an error.
    z.kcareprev.lockr.   N)r0   r1   rA   r   PATCH_CACHEr2   r4   intreadr
   SUCCESS_TIMEOUTry   PreviousPatchFailedException
ValueErrorr   atomic_writetimestamp_str)Zanchor_filepathZafile	timestampr;   r;   r<   touch_anchor   s    r   c             C   sx   yt jt jjtjd W n tk
r.   Y nX td|  tj	j
  ytdd W n  tk
rr   tjjd Y nX dS )z
    See touch_anchor() for detailed explanation of anchor mechanics.
    See KPT-730 for details about action registration.
    :param state_data: dict with current level, kernel_id etc.
    z.kcareprev.lockdone)reasonzCannot send update info!N)r0   remover1   rA   r   r   rV   register_actionr   get_loaded_modulesclearget_latest_patch_levelrn   r   r{   r|   )
state_datar;   r;   r<   commit_update   s    

r   c             C   s(   t jtjjtjdtj| |dd d S )NpatchesrK   )Zexclude_path)	r   clean_directoryr0   r1   rA   r   r   r   get_cache_path)khashZplevelr;   r;   r<   clear_cache   s    r   c             C   s>   t jpd}dj|| g}tjd|f}|r2||f7 }tjj| S )Nnone-modules)r
   PREFIXrA   r   r   r0   r1   )r   fnameprefixZ
module_dirr8   r;   r;   r<   get_current_level_path   s    

r   c             C   s   t jt| dt|dd d S )NlatestT)Z
ensure_dir)r   r   r   rd   )r   patch_levelr;   r;   r<   save_cache_latest   s    r   c             C   sV   t | d}tjj|rRy"tt|dj j }tj	| |S  t
tfk
rP   Y nX d S )Nr   r.   )r   r0   r1   r2   r   r4   r   stripr   LegacyKernelPatchLevelr   rZ   )r   Zpath_with_latestplr;   r;   r<   get_cache_latest   s    
r   c               @   s   e Zd ZdS )CertificateErrorN)rL   
__module____qualname__r;   r;   r;   r<   r     s   r   c                   s    e Zd ZdZ fddZ  ZS )UnknownKernelExceptionzunknown kernelc                s6   dj tj d tj tj }tt| j	|f| d S )NzLNew kernel detected ({0} {1} {2}).
There are no updates for this kernel yet.r   )
formatr   r`   platformreleaser   get_kernel_hashsuperr   __init__)selfkwargsmsg)	__class__r;   r<   r     s    zUnknownKernelException.__init__)rL   r   r   statusr   __classcell__r;   r;   )r   r<   r     s   r   c                   s(   e Zd ZdZ fddZdd Z  ZS )ApplyPatchErrorzpatch apply errorc                sF   t t| j|| || _|| _|| _|| _tj d | _	t
j | _d S )Nr   )r   r   r   codefreezer_stylelevel
patch_filer   r`   rO   r   r   )r   r   r   r   r   argsr   )r   r;   r<   r     s    zApplyPatchError.__init__c          	   C   s0   dj | j| j| j| j| jdjdd | jD S )Nz0Unable to apply patch ({0} {1} {2} {3} {4}, {5})z, c             S   s   g | ]}t |qS r;   )rd   ).0ir;   r;   r<   
<listcomp>-  s    z+ApplyPatchError.__str__.<locals>.<listcomp>)r   r   r   r   rO   r   rA   r   )r   r;   r;   r<   __str__&  s    zApplyPatchError.__str__)rL   r   r   r   r   r   r   r;   r;   )r   r<   r     s   	r   c                   s(   e Zd ZdZ fddZdd Z  ZS )r   zprevious patch failedc                s"   t t| j|| || _|| _d S )N)r   r   r   r   anchor)r   r   r   r   r   )r   r;   r<   r   5  s    z%PreviousPatchFailedException.__init__c             C   s   d}|j | j| jS )NzIt seems, the latest patch, applying at {0}, crashed, and further attempts will be suspended. To force patch applying, remove `{1}` file)r   r   r   )r   messager;   r;   r<   r   :  s    z$PreviousPatchFailedException.__str__)rL   r   r   r   r   r   r   r;   r;   )r   r<   r   2  s   r   c             C   s   t j dj|  }yztj|}tjtj|j }t	|d }|dkrRtj
d n8|dkrftj
d n$|dkrztj
d ntj
d	j| |S  tk
r } ztj|| W Y d d }~X nX d
S )Nz"/nagios/register_key.plain?key={0}r   r   zKey successfully registeredr   zWrong key format or sizerr   z!No KernelCare license for that IPzUnknown error {0}r?   )r   get_registration_urlr   r   urlopenr   data_as_dictrk   r   r   print_wrapperr   r   print_cln_http_error)keyro   responseresr   er;   r;   r<   !set_monitoring_key_for_ip_licenseC  s     
r   c               c   s>   t jrtjt jdd z
d V  W d t jr8tjt jdd X d S )NT)shell)r
   ZBEFORE_UPDATE_COMMANDr   run_commandZAFTER_UPDATE_COMMANDr;   r;   r;   r<   execute_hooksW  s    
r   c             C   s   t  }|j}|j}tj }| dkrht|tjtj	 t
j |ttj |d}tjd tjtj| njtjd tjt| tjdt|  tjtj tjtj	  tjt
j  tj| tjtj  dS )a1  
    The output will consist of:
    Ignore output up to the line with "--START--"
    Line 1: show if update is needed:
        0 - updated to latest,
        1 - update available,
        2 - unknown kernel
        3 - kernel doesn't need patches
        4 - no license, cannot determine
    Line 2: licensing message (can be skipped, can be more then one line)
    Line 3: LICENSE: CODE: 1: license present, 2: trial license present, 0: no license
    Line 4: Update mode (True - auto-update, False, no auto update)
    Line 5: Effective kernel version
    Line 6: Real kernel version
    Line 7: Patchset Installed # --> If None, no patchset installed
    Line 8: Uptime (in seconds)

    If *format* is 'json' return the results in JSON format.

    Any other output means error retrieving info
    :return:
    ri   )Z
updateCodeZ
autoUpdateZeffectiveKernelZ
realKernelZloadedPatchLevelZuptimelicensez	--START--z	LICENSE: N)_patch_level_infor   applied_lvlr   license_inford   r
   AUTO_UPDATEr   kcare_unamer   r   r   r   Z
get_uptimer   r   ri   rj   )fmtpliZupdate_codeZ	loaded_plZlicense_info_resultZresultsr;   r;   r<   plugin_infoc  s,    



r   c              C   s^   t j } ytdd}W n tk
r4   tjr0dS dS X | d krBdS | |krNdS tj rZdS dS )Ninfo)r   r      r   rr   )r   loaded_patch_levelr   r   r
   IGNORE_UNKNOWN_KERNELr   Zstatus_gap_passed)current_levelZlatest_patch_levelr;   r;   r<   get_update_status  s    r   c              C   s2   t j d d \} }| dkr*|jdr*dS dS d S )Nrr   Z
CloudLinuxz7.extrarK   )r   r`   
startswith)rO   versionr;   r;   r<   edf_fallback_ptype  s    r   c             C   sl   | j | jf}tj||}tj|| j| _| jjtj	tj
d |tkrZ| jj dd t|< | jrh| j  dS )zFunction remembers IP address of host connected to
    and uses it for later connections.

    Replaces stdlib version of httplib.HTTPConnection.connect
    r   Nrr   )hostZportCONNECTION_STICKY_MAPgetsocketZcreate_connectionZtimeoutsockZ
setsockoptZIPPROTO_TCPZTCP_NODELAYZgetpeername_tunnel_hostZ_tunnel)r   ZaddrZresolved_addrr;   r;   r<   sticky_connect  s    r   ZHAS_SNIz0.13z%No pyOpenSSL module with SNI ability.c              G   s   dS )NTr;   )r   r;   r;   r<   dummy_verify_callback  s    r   c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
SSLSockc             C   s   || _ d| _d S )Nr   )	_ssl_conn_makefile_refs)r   r   r;   r;   r<   r     s    zSSLSock.__init__c             G   s&   |  j d7  _ tj| jf|ddiS )Nr   r7   T)r   r   Z_fileobjectr   )r   r   r;   r;   r<   makefile  s    zSSLSock.makefilec             C   s"   | j  r| jr| jj  d | _d S )N)r   r   r7   )r   r;   r;   r<   r7     s    
zSSLSock.closec             G   s   | j j| S )N)r   sendall)r   r   r;   r;   r<   r     s    zSSLSock.sendallN)rL   r   r   r   r   r7   r   r;   r;   r;   r<   r     s   r   c               @   s   e Zd Zdd ZdS )PyOpenSSLHTTPSConnectionc             C   s   t jj|  tjjtjj}|jtjjtjj	B  t
jrJ|jtjjt n|jtjjt |j  tjj|| j}|j  | jp| j}|j|j  |j  t
jrt|j | t|| _d S )N)r!   HTTPConnectionconnectOpenSSLZSSLZContextZSSLv23_METHODZset_optionsZOP_NO_SSLv2ZOP_NO_SSLv3r
   CHECK_SSL_CERTSZ
set_verifyZVERIFY_PEERr   ZVERIFY_NONEZset_default_verify_pathsZ
Connectionr   Zset_connect_stater   r   Zset_tlsext_host_nameencodeZdo_handshakematch_hostnameZget_peer_certificater   )r   ZctxZconnZserver_hostr;   r;   r<   r     s    z PyOpenSSLHTTPSConnection.connectN)rL   r   r   r   r;   r;   r;   r<   r     s   r   c             C   s  t jr&tj| |}tjtj|ddS |dk}t jo6|}xrd|fd|fdgD ]Z\}}t	j	|||d}	t	j
|	|d}
|rdj|
}
tj| t||d	 |
 }d
}|s|rt||kr|rdnd}tjdj| qNyxtjtj|dd}t jrJtj|	rJtj|	}tj|}|r.tjdj|dd ntjddd |rJ|j  |S  tk
r } z>|sl|r|jdks|jdkrtjdj| wN W Y d d }~X qNX qNW d S )NF)check_license	latest.v1	latest.v2T)secure_boot_infoperf_metrics)b64_encodingzinfo={0}?iX  zsecure boot infozperf metricsz/Check-in URL param is too large, discarding {0}z:Automatic kernel anomaly report uploaded successfully: {0})	print_msgz$Failed to send kernel anomaly report    i  zCCheck-in request failed with error: {0}, retrying with reduced info)r   r   )FF)r   r   )r
   rh   r   Zget_kernel_prefixed_urlr   Zwrap_with_cache_keyr   urlopen_authZSEND_PERF_METRICSr   Zencode_checkin_payloadr   stickyfylenr   logwarnZKERNEL_ANOMALY_REPORT_ENABLEr   Zdetect_anomalyprepare_kernel_anomaly_reportsend_data_packageloginforemove_archiver   r   )r   r   r   modero   r   Zperf_enabledr   r   ZsinfoZrequest_paramZmax_url_lengthZdiscard_infor8   data_packageupload_nameexr;   r;   r<   _fetch_patch_level_request  sB    
 


$r  c       	      C   s8  t j }tjd k	r$t j|ttjS xtD  ]}yt||| |}tj	|j
 t  tj|j j }tjdj| |dd |r|jdrt|}|jdg }tj|stjdt j||d |d |d	 S t j|t|S  tk
r   Y q, tk
r( } z|jdkrtd W Y d d }~X q,X q,W t d S )Nz;fetch patch level, reason: {0}, kernel latest response: {1}F)r   {r	   zeLatest KernelCare patchset is incompatible with the current kernecare package version, please upgrader   baseurlr       zKC licence is required)r  r  ) r   r   r
   PATCH_LEVELr   r   PATCH_LATESTr  r   Zset_feature_flags_from_headersheadersupdate_all_kmod_paramsr   rk   r   r   r   r  r   r   r"   r   r	   Zhas_kc_capabilitiesr   CapabilitiesMismatchZKernelPatchLevelr   r   r   r   r   )	r   r	  r   r   r   r   Zlatest_infoZrequired_capabilitiesr  r;   r;   r<   fetch_patch_level;  s2    

r  c             C   s<  | j t|tj}tjjdj| ytj	|ddd dS  t
k
r^   tjjdj| dS  tk
r } ztjjdj|t| W Y d d }~X nX | j t|tjtj }tjjdj| ytj	|dd W nb t
k
 r   tjjdj| dS  tk
r6 } ztjjd	j|t| W Y d d }~X nX dS )
NzProbing patch URL: {0}FHEAD)r   methodTz{0} is not available: 404zFHEAD request for {0} raised an error, fallback to the GET request: {1})r   z{0} is not available: {1})file_urlrD   r
   rE   r   r{   r   r   r   r  r   rn   debugrd   r   ZSIGr    )r   rB   Zbin_urlr  ro   r;   r;   r<   probe_patch\  s(    **r  c             C   sF   |t jkr| jt j}n
| j|}| j|}tj||tjtj	| dS )N)Zhash_checker)
r   KMOD_BINZkmod_urlr  
cache_pathr   Z	fetch_urlr
   USE_SIGNATUREZget_hash_checker)r   namero   Zdstr;   r;   r<   fetch_and_verify_kernel_fileu  s
    


r!  c               @   s>   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd ZdS )PatchFetcherNc             C   s
   || _ d S )N)r   )r   r   r;   r;   r<   r     s    zPatchFetcher.__init__c             C   s   t | j|S )N)r!  r   )r   r   r;   r;   r<   _fetch  s    zPatchFetcher._fetchc             C   sr   | j jtj}| j jtj}| j jtj}| j jtj}tdd ||||fD opt	j
j|dkopt	j
j|dkS )Nc             s   s   | ]}t jj|V  qd S )N)r0   r1   r2   )r   r1   r;   r;   r<   	<genexpr>  s    z0PatchFetcher.is_patch_fetched.<locals>.<genexpr>r   )r   r  r
   rI   rE   rF   r   r  allr0   r1   getsize)r   Zpatch_done_pathZpatch_bin_pathZpatch_info_pathZkmod_bin_pathr;   r;   r<   is_patch_fetched  s    zPatchFetcher.is_patch_fetchedc             C   s4  | j d krtd| j s| j S | j r6tjd | j S tjd t| j tjrytj	| j j
tjdd}W n tk
r~   Y n(X |jjdd }|r| j jtj|| _ y| jtj W n0 tk
r   tdj| j tjpdd	d
Y nX | jtj | jtj | j  tj| j jtjddd tjtj  | j S )Nz+Cannot fetch patch as no patch level is setzUpdates already downloadedzDownloading updatesr  )r  zKC-Base-UrlzfThe `{0}` patch level is not found for `{1}` patch type. Please select valid patch type or patch leveldefaultzpatch level not found)r       wb)r	  )!r   r   r'  r   r  rU   r   r   r   r  r  r
   rE   r   r  r   upgrader   rk   r#  r   r   
PATCH_TYPErF   r   r  extract_blacklistr   r  rI   r   restore_selinux_contextr   )r   respr  r;   r;   r<   fetch_patch  s:    


zPatchFetcher.fetch_patchc             C   sJ   t | jjtjdj }|rFtj|}|rFtj	| jjtj
|jd d S )Nr.   r   )r4   r   r  r
   rF   r   BLACKLIST_REsearchr   r   rG   group)r   ZbufZmor;   r;   r<   r-    s
    
zPatchFetcher.extract_blacklistc             C   s   |dkrdS yt |tj}W n tk
r0   dS X |jjdd}|rT|jtj|}|j	tj}t
|d}tdd |j D }W dQ R X x|D ]}t || qW tjtj dS )z
        Download fixup files for defined patch level
        :param level: download fixups for this patch level (usually it's a level of loaded patch)
        :return: None
        NzKC-Base-Urlr.   c             S   s   g | ]}|j  qS r;   )r   )r   fixupr;   r;   r<   r     s    z-PatchFetcher.fetch_fixups.<locals>.<listcomp>)r!  r
   rH   r   r  r   r+  r   rk   r  r4   r/   	readlinesr   r.  r   r   )r   r   r/  r  Zfixups_fnamer9   fixupsr4  r;   r;   r<   fetch_fixups  s     
zPatchFetcher.fetch_fixups)N)	rL   r   r   r   r#  r'  r0  r-  r7  r;   r;   r;   r<   r"  ~  s   
)r"  c              C   s8   t  } tj| j | jtjkr*tjd n
tjd d S )Nr   r   )	r   r   r   r   r   PLIPATCH_NEED_UPDATErS   exit)r   r;   r;   r<   kcare_check  s
    r;  c              C   s\  t  } t| }ytj }W n tk
r2   i }Y nX tj }d}|d k	r\tj|d j	d}tj
 }|jdg }ttj|dd}t|}dd |D }	ttj|	d	d}
td
d |D }|| }tj }|stjd n
tjd tjdj| tjdj| |dkr tjdj| |
dkr:tjdj|
 |dkrNtjd tjd d S )NZUnknowntsz%Y-%m-%dr   z
kpatch-cve)Z	cve_fieldc             S   s"   g | ]}|j d g D ]}|qqS )r   )r   )r   recpatchr;   r;   r<   r     s    z%show_generic_info.<locals>.<listcomp>Zcvec             s   s   | ]}t |jd g V  qdS )r   N)r  r   )r   r=  r;   r;   r<   r$    s    z$show_generic_info.<locals>.<genexpr>z$KernelCare live patching is disabledz"KernelCare live patching is activez - Last updated on {0}z - Effective kernel version {0}r   z* - {0} kernel vulnerabilities live patchedz- - {0} userspace vulnerabilities live patchedz% - This system has no applied patchesz(Type kcarectl --patch-info to learn more)r   _kcare_patch_info_jsonr   Zlibcare_patch_info_basicr   r   Z	get_stater   ZfromtimestampZstrftimer   r   r  r   Zextract_unique_cvessumr   r   r   )r   
kcare_infolibcare_infostateZlatest_updateZeffective_versionZkernel_patchesZkernel_vulnerabilitiesZkernel_patches_countZuserspace_patchesZuserspace_vulnerabilitiesZuserspace_patches_countZtotal_patches_countr   r;   r;   r<   show_generic_info  s>    





rD  Fc       	      C   s   yt dtjd}|st|jtj}tjt	j
|j }| rg i  }}x>|jdD ]0}tj|}|rxd|krx|j| qR|j| qRW ||d< tj|}tj| W nJ tk
r } ztj||j dS d}~X n tk
r   tjd Y nX d	S )
z
    Retrieve and output to STDOUT latest patch info, so it is easy to get
    list of CVEs in use. More info at
    https://cloudlinux.atlassian.net/browse/KCARE-952
    :return: None
    r   )r   policyz

zkpatch-namer   r   NzNo patches availabler   )r   r   POLICY_REMOTEr   r  r
   rF   r   rk   r   r  r   r@   r   appendupdateri   rj   r   r   r   r   ro   )	is_jsonr   ro   
patch_infor   r8   chunkdatar   r;   r;   r<   kcare_latest_patch_info  s,    


rM  c             C   s   d| j i}| jd k	rt| }g }x>|jdD ]0}tj|}|rRd|krR|j| q,|j| q,W ||d< tj	 }|r||d nd|d< |S )Nr   z

zkpatch-namer   r   unknown)
r   r   _kcare_patch_infor@   r   r   rG  rH  r   Zread_dumped_kernel_patch_level)r   r8   rJ  r   rK  rL  Zsaved_patch_levelr;   r;   r<   r?  4  s    


r?  c             C   sT   t j }t j|| jtj}tjj|s2t	dddt
|dj }|rPtjd|}|S )NzvCan't find information due to the absent patch information file. Please, run /usr/bin/kcarectl --update and try again.zpatch info not found)r   r.   rK   )r   r   r   r   r
   rF   r0   r1   r2   r   r4   r   r1  sub)r   r   r  r   r;   r;   r<   rO  H  s    rO  c             C   sZ   t  }| s>|jdkr tj|j |jd kr.d S tjt| ntjtjt	|dd d S )Nr   T)Z	sort_keys)
r   r   r   r   r   r   rO  ri   rj   r?  )rI  r   r;   r;   r<   rJ  W  s    

rJ  c             C   s:   t jd| g}tj|}tj }d}tj||tj||kS )Nz	file-infozkpatch-build-time)r   
KPATCH_CTLr   check_outputr   _patch_infoZget_patch_value)new_patch_filer   Znew_patch_infoZcurrent_patch_infoZbuild_time_labelr;   r;   r<   is_same_patchc  s
    
rU  c             C   sL   |dkrdS | r|| k rdS | |kr(dS t jt j |tj}t|sHdS dS )Nr   FT)r   r   r   r
   rE   rU  )applied_level	new_levelrT  r;   r;   r<   kcare_need_updatek  s    rX  c              C   sp   t jrltjjtotjttjs6tj	j
djt d S tjdddtgdd\} }}| dkrltj	j
dj|  d S )	Nz-File {0} does not exist or has no read accessz/sbin/sysctlz-qz-pT)catch_stdoutr   z%Unable to load kcare sysctl.conf: {0})r
   ZUPDATE_SYSCTL_CONFIGr0   r1   r2   SYSCTL_CONFIGaccessR_OKr   r{   warningr   r   r   )r   _r;   r;   r<   update_sysctl}  s    r_  c                s   t jjtsttdj  t jtt js>tj	j
djt dS ttdj}|j }|jd x,|D ]$ t fdd| D sb|j  qbW x|D ]}|j|d  qW |j  W dQ R X dS )	z*Update SYSCTL_CONFIG accordingly the editsrq   zFile {0} has no read accessNzr+r   c             3   s   | ]} j |V  qd S )N)r   )r   r.   )r:   r;   r<   r$    s    z#edit_sysctl_conf.<locals>.<genexpr>
)r0   r1   r2   rZ  r4   r7   r[  r\  r   r{   r]  r   r5  seekanywritetruncate)r   rG  Zsysctllinesrq   r;   )r:   r<   edit_sysctl_conf  s    


rf  c             C   s.   x(| D ] }t j|rtdj|ddqW d S )NzDDetected '{0}' kernel module loaded. Please unload that module firstzconflicting kernel module)r   )CONFLICTING_MODULES_REmatchr   r   )r   moduler;   r;   r<   detect_conflicting_modules  s
    

rj  c               C   s   dj tj S )Nz/lib/modules/{0}/extra/kcare.ko)r   r   Zget_system_unamer;   r;   r;   r<   get_kcare_kmod_link  s    rk  c           
   C   sX   t dd} tjtj | tj}tjj|s.d S t	|d}|j
 dd  dkS Q R X d S )Nr   )r   rb   s   ~Module signature appended~
i)r   r   r   r   r   r  r0   r1   r2   r4   r   )r   Z	kmod_fileZvfdr;   r;   r<   kmod_is_signed  s    
rn  c                 s4   t jd  d krd S ddg} t fdd| D S )Nz
/proc/keysZ(12ff0613c0f80cfba3b2f8eba71ebc27c5a76170Z(69a6d9eed3f620d5c2e13a1d211c46510a5ad9f5c             3   s   | ]}| kV  qd S )Nr;   )r   r   )system_keysr;   r<   r$    s    z'kcare_certs_enrolled.<locals>.<genexpr>)r   Ztry_to_readrb  )Z
kcare_keysr;   )ro  r<   kcare_certs_enrolled  s    
rp  c             K   sd   d| g}x&|j  D ]\}}|jdj|| qW tj|dd\}}}|dkr`tdj| |ddd S )	Nz/sbin/insmodz{0}={1}T)rY  r   zLUnable to load kmod ({0} {1}). Try to run with `--check-compatibility` flag.zkmod load error)r   )itemsrG  r   r   r   r   )Zkmodr   cmdr   re   r   r^  r;   r;   r<   	load_kmod  s    
rs  c               C   sT   t j r,t dkrtdt dkr,tdt j sDt j sDt j rPtdddd S )NFz4Secure boot is enabled. Not supported by KernelCare.z<Secure boot is enabled. No KernelCare certificates enrolled.zWYou are running inside a container. Kernelcare should be executed on host side instead.zrunning in container)r   )r   Zis_secure_bootrn  r   rp  Zinside_vz_containerZinside_lxc_containerZinside_docker_containerr;   r;   r;   r<   check_compatibility  s    

rt  c             C   sP   t jd}t j|dgdddd dk}|rL| d
krLtjdj|  tjd	 d S )NZmodinfoZkmodlveT)rY  catch_stderrr   freer   z3{0} patch type conflicts with kmodlve kernel moduler   )rv  r   )r   Zfind_cmdr   r   logerrorr   rS   r:  )rB   rr  Zhas_kmodlver;   r;   r<   check_patch_type_compatibility  s
    
rx  c             C   sP   t jddd| g}g }x4|jdD ]&}|j r"|jd\}}}|j| q"W |S )Nz/sbin/modinfoz-FZparmr`  :)r   rR  r@   r   	partitionrG  )
kcare_linkstdoutZavailable_paramsr:   Z
param_namer^  r;   r;   r<   get_kmod_available_params  s    r}  c               C   sL   t jr
dndt jrdndt jr$t jndtt jtr8t jndt jrDdnddS )Nr   r   rK   )kpatch_debugZkmsg_outputZkcore_outputZ
kdumps_dirZenable_crashreporter)	r
   KPATCH_DEBUGZKMSG_OUTPUTZKCORE_OUTPUTZKCORE_OUTPUT_SIZErU   
KDUMPS_DIRrd   ZENABLE_CRASHREPORTERr;   r;   r;   r<   make_kmod_new_params  s
    r  c              C   sH   t jr"tjjt j r"tjt j x t j D ]\} }t| | q.W d S )N)	r
   r  r0   r1   existsmakedirsr  rq  update_kmod_param)Zparamvalr;   r;   r<   r    s    r  c             C   st   d}t jj|| }t jj|s"d S y(t|d}|jt| W d Q R X W n$ tk
rn   tj	j
d| | Y nX d S )Nz/sys/module/kcare/parameterswz!failed to set %s kmod param to %s)r0   r1   rA   r  r4   rc  rd   rn   r   r{   rP   )Zkmod_param_nameZparam_valueZparams_rootZ
param_pathr9   r;   r;   r<   r    s    r  c                s   t  }tj| |tj}ytj|| W n tk
r>   |}Y nX tj	rbt
jjtj	 rbt
jtj	 t }t| t fdd|j D }t|f| t  d S )Nc             3   s"   | ]\}}| kr||fV  qd S )Nr;   )r   kv)available_kmod_paramsr;   r<   r$  !  s    z"load_kcare_kmod.<locals>.<genexpr>)rk  r   r   r   r  shutilcopyrn   r
   r  r0   r1   r  r  r  r}  dictrq  rs  update_depmod)r   r   r{  Z
kcare_fileZkmod_paramsr;   )r  r<   load_kcare_kmod  s    
r  c             C   sX   dg}| d k	r|j d| g tj|ddd\}}}|rTtjdjdj|||dd d S )	Nz/sbin/depmodz-aT)rY  ru  z%Running of `{0}` failed with {1}: {2} F)r   )extendr   r   r   rw  r   rA   )unamerr  r   r^  stderrr;   r;   r<   r  '  s    r  c             C   s8   t jd| gdd\}}}|dkr4tdj| |ddd S )Nz/sbin/rmmodT)rY  r   zUnable to unload {0} kmod {1}zkmod unload error)r   )r   r   r   r   )modnamer   r^  r;   r;   r<   unload_kmod3  s    r  c             C   sT   g }xJdg| D ]<}t j| |dj|}tjj|rt| |jdj| qW |S )NZvmlinuxzfixup_{0}.koz	fixup_{0})r   r   r   r0   r1   r  rs  rG  )r   r   r   ZloadedmodZmodpathr;   r;   r<   apply_fixups9  s    r  c             C   sD   x>| D ]6}yt | W q tk
r:   tjjd|  Y qX qW d S )Nz$Exception while unloading module %s.)r  rn   r   r{   r|   )r6  r  r;   r;   r<   remove_fixupsC  s
    
r  c             C   s   | r
| }n6t jrt j}n(t j|r2d| t jdfS d| t jdfS dddddd}|j }||krj|| }ntdj|| t jdd	d
|| t jdfS )NZfreeze_conflictTr(  FZfreeze_noneZ
freeze_all)ZNONEZNOFREEZEZFULLZFREEZEZSMARTz3Unable to detect freezer style ({0}, {1}, {2}, {3})zfreezer style detection error)r   )r
   ZPATCH_METHODr=   intersectionupperr   r   )freezerr   r  Zpatch_method_mapr;   r;   r<   get_freezer_styleK  s&    
r  rK   c                s  | ||d t d  tj }tj }t| t||}tj| |tj}t	| | dj
|tjtj tj|}	d|k}
|
otj| |}|d k	}|ot|otj|	} j||d |rt d  d S |rt d  t| ||}t d  t| t d	  t| |r"t d
  td d}
|
s<t d  t| | |rHt  t d  t|| ||	| t  tjdj
|tj  tj  t d  t  fddtj!d d S )N)r   Zfuturer	  startz{0}-{1}:{2};{3}r   )Zcurrentkmod_changedr   ZfxpunpatchZunfxpunloadFloadr>  z5Patch level {0} applied. Effective kernel version {1}waitc                  s   t  S )N)r   r;   )r   r;   r<   <lambda>  s    zkcare_load.<locals>.<lambda>)rz   )"r   r   r   r   rj  r  r   r
   rE   r   r   r,  r   r   Zparse_unameZis_kmod_version_changedrU  Zkcare_update_effective_versionrH  r  kpatch_ctl_unpatchr  r  r  r   kpatch_ctl_patchr_  r   r  r   r   Ztouch_status_gap_filer   r   )r   r   r	  r  
use_anchorr   r   r   r   descriptionZkmod_loadedr  Zpatch_loadedZ
same_patchr6  r;   )r   r<   
kcare_loadm  sR    











r  c       	      C   s   t jg}tj||tj}tjj|r2|j	d|g |j	dd|g |j	d|d g |j
|  tj|dd\}}}|dkrt|||| d S )Nz-br>  z-dz-mr   T)rY  )r   rQ  r   r   r
   rG   r0   r1   r  r  rG  r   r   r   )	r   r   r   r  r   r   Zblacklist_filer   r^  r;   r;   r<   r    s    
r  c             C   s^   t jtjdd| d gddd\}}}|dkrZtjdj||dd td	j|t| d
dd S )Nr  z-mr   T)rY  ru  z4Error unpatching, kpatch_ctl stdout:
{0}
stderr:
{1}F)r   zError unpatching [{0}] {1}zunpatch error)r   )	r   r   r   rQ  r   rw  r   r   rd   )r   r   r|  r  r;   r;   r<   r    s
     r  c             C   s8   | |d< t tj |d< tjtjjtjdt	| d S )Nactionr<  zkcare.state)
r   ry   r   r   r0   r1   rA   r   r   rd   )r  r   r;   r;   r<   r     s    r   c             C   sp   d}t jj|sd S xVt j|D ]H}t jj||dd}t jj|sDq t j|}|| kr t j| t| q W d S )Nz/usr/lib/modules/zweak-updateszkcare.ko)	r0   r1   isdirlistdirrA   islinkreadlinkunlinkr  )	kmod_linkZmodules_pathentryZsym_link_pathZtarget_pathr;   r;   r<   update_weak_modules  s    

r  c             C   sJ  t j }t }y|j| W n8 tk
rT } z|sDtdj|ddW Y d d }~X nX t j }t| |}t	  d|kr|d k	}|rt
t j ||}tjtjdd|d gddd	\}	}
}t| |	dkrtjd
j|
|dd tdj|	t|ddtjtjtdtdtd t }tjj|r4tj| t| W d Q R X d S )NzUnable to retrieve fixups: '{0}'. The unloading of patches has been interrupted. To proceed without fixups, use the --force flag.zfixups retrieval error)r   r   r  z-mr   T)rY  ru  z4Error unpatching, kpatch_ctl stdout:
{0}
stderr:
{1}F)r   zError unpatching [{0}] {1}zunpatch errorr   )countdelay) r   r   r"  r7  rn   r   r   r   r  r   r  r   r   r   r   rQ  r  r   rw  rd   r   Zretryr   Z	check_excUNLOAD_RETRY_DELAYr  rk  r0   r1   r2   r  r  )r  forcer   pferrr   r   Zneed_unpatchr6  r   r|  r  r  r;   r;   r<   kcare_unload  s:    

 
r  c             C   s8   t  }| rt|S |jdkr"|jS |jd k	r4tj S d S )Nr   )r   _kcare_info_jsonr   r   r   r   rS  )rI  r   r;   r;   r<   rA    s    

rA  c             C   sR   d| j i}| jd k	r>|jtjtj  |jtj|jd | j	|d< t
j|S )Nr   zkpatch-descriptionzkpatch-state)r   r   rH  r   r   r   rS  Zparse_patch_descriptionr   rC  ri   rj   )r   r8   r;   r;   r<   r    s    


r  c               @   s$   e Zd ZdZdZdZdZdd ZdS )r8  r   r   rr   r   c             C   s"   || _ || _|| _|| _|| _d S )N)r   r   
remote_lvlr   rC  )r   r   r   r  r   rC  r;   r;   r<   r   %  s
    zPLI.__init__N)rL   r   r   r  r9  PATCH_UNAVALIABLEPATCH_NOT_NEEDEDr   r;   r;   r;   r<   r8    s
   r8  c              C   s   t j } ytdd}| rJt| |r6tjdd  }}}qxtjdd  }}}n.|dkrftjdd  }}}ntjd	d  }}}t|||| |}W nl tk
r   tj	}t
jrd
jt
jtj d tj }ndjtj d tj t j }t||d d d}Y nX |S )Nr   )r   z*Update available, run 'kcarectl --update'.ZappliedzThe latest patch is applied.r   z(This kernel doesn't require any patches.ZunsetzDNo patches applied, but some are available, run 'kcarectl --update'.zuInvalid sticky patch tag {0} for kernel ({1} {2}). Please check /etc/sysconfig/kcare/kcare.conf STICKY_PATCH settingszLNew kernel detected ({0} {1} {2}).
There are no updates for this kernel yet.Zunavailable)r   r   r   rX  r8  r9  r  r  r   r  r
   STICKY_PATCHr   r   r`   r   r   r   )Zcurrent_patch_levelZnew_patch_levelr   r   rC  r   r;   r;   r<   r   -  s8    

r   c       	      C   s   d}yXt j }td|fd| fg}tj dj| }tj|}tj	tj
|j }t|d S  tk
r } ztj|| d
S d}~X nZ tk
r } ztj|| dS d}~X n0 tk
r } ztjdj| dS d}~X nX dS )z
    Request to tag server from ePortal. See KCARE-947 for more info

    :param tag: String used to tag the server
    :return: 0 on success, -1 on wrong server id, other values otherwise
    N	server_idtagz/tag_server.plain?{0}r   r      zInternal Error {0}   )r   get_serveridr#   r   r   r   r   r   r   r   rk   r   r   r   r   r   r    rn   rw  )	r  ro   r  Zqueryr   r   r   ZueZeer;   r;   r<   
tag_server_  s"    
r  c              C   s   t jd} tjdj|  t}tj }y:tj	| |j
}t jtj| |j
 tj|j
| |j
}W n2 tk
r } ztjdj| W Y d d }~X nX tjd|tj gdd\}}}|rtdj||dd	W d Q R X d S )
Nz	doctor.shz#Requesting doctor script from `{0}`z3Kcare doctor error: {0}. Fallback to the local one.ZbashT)ru  zScript failed with '{0}' {1}zdoctor script failed)r   )r   rm   r   Zlogdebugr   KCDOCTORtempfileZNamedTemporaryFiler   Zfetch_signaturer   Zsave_to_filer   r   Zcheck_gpg_signaturern   rw  r   r   r   Zget_patch_serverr   )Z
doctor_urlZdoctor_filenameZ
doctor_dstZ	signaturer  r   r^  r  r;   r;   r<   kcdoctorz  s    


"r  c              C   sB   t jdjt} ytj|  W n tk
r2   dS X tjd dS )Nz{0}-new-versionFzwA new version of the KernelCare package is available. To continue to get kernel updates, please install the new versionT)	r   rm   r   EFFECTIVE_LATESTr   r   r    r   r  )ro   r;   r;   r<   check_new_kc_version  s    r  c       
      C   s  t j }t|}|tjkp*|tjko*|dk}yt| |}W n tjk
r } z.|dkrX t	j
t| t	j
d tj}W Y dd}~X n< tk
r } z |r nt	jjdj| W Y dd}~X nX |tjkr|}	n@|}	|dkr|tjkrt j|d}	n|tjkr
|}	ntd|	S )a  
    Get patch level to apply.
    :param reason: what was the source of request (update, info etc.)
    :param policy: REMOTE -- get latest patch_level from patchserver,
                   LOCAL -- use cached latest,
                   LOCAL_FIRST -- if cached level is None get latest from patchserver, use cache otherwise
    :param mode: constants.UPDATE_MODE_MANUAL, constants.UPDATE_MODE_AUTO or constants.UPDATE_MODE_SMART
    :return: patch_level string
    Nz#Using previously downloaded patcheszUnable to send data: {0}r   z9Unknown policy, choose one of: REMOTE, LOCAL, LOCAL_FIRST)r   r   r   r   rF  ZPOLICY_LOCAL_FIRSTr  r   r  r   r  rd   ZPOLICY_LOCALrn   r{   r]  r   r   r   )
r   rE  r	  r   Zcached_levelZconsider_remote_exZremote_levelr   r  r   r;   r;   r<   r     s2    
$


r   c             C   s   | dkrd S | dkrdn| t _ttddt jrtjt jd t jdkrntj rnt jpXt	}t
dddj|f tjdj|  ntdj| ddd S )Nedfr(  rK   Zprobe)r   )r,  rv  r   fs.enforce_symlinksifownerfs.symlinkown_gidzfs.enforce_symlinksifowner=1zfs.symlinkown_gid={0}z'{0}' patch type selectedz/'{0}' patch type is unavailable for your kernelzpatch type unavailable)r   )rv  r   )r  r  )r
   r,  r  r  r   update_configr   Z	is_cpanelZ	FORCE_GID
CPANEL_GIDrf  r   r   r  r   )rB   Zgidr;   r;   r<   update_patch_type  s    
r  Zkernelc       	   $   C   sh  t tj |tjkrt  ytd||d}W nR tk
r~ } z6|tjtj	fkrltj
rlt|}tjj| dS  W Y dd}~X nX tj }|tjkrtj rdS t|}|j  t||dstjd dS y(tjtjddd tjtjdd	d W n" tk
r   tjjd
 Y nX tj }t ( |j| t|||| |tj	kd W dQ R X tj| t || dS )ax  
    :param mode: constants.UPDATE_MODE_MANUAL, constants.UPDATE_MODE_AUTO or constants.UPDATE_MODE_SMART
    :param policy: REMOTE -- download latest and patches from patchserver,
                   LOCAL -- use cached files,
                   LOCAL_FIRST -- download latest and patches if cached level is None, use cache in other cases
    :param freezer: freezer mode
    rH  )r   rE  r	  N)rV  rW  z%No updates are needed for this kernelr   zkcore*.dump)Zkeep_nZpatternz	kmsg*.logz#Error during crash reporter cleanup)r  )!rx  r
   r,  r   rF  r  r   r   UPDATE_MODE_AUTOUPDATE_MODE_SMARTr   rd   r   r{   r]  r   r   r   r"  r0  rX  r  r   r   r  rn   r|   r   r   r7  r  Zdump_kernel_patch_levelr   )	r  r	  rE  r   r   r   r   r  r   r;   r;   r<   	do_update  s<    




"
r  c             C   s   t ttjttjptjttjp$tjf}|dkr@tdddtjrLtjS | t	j
krptjp`tj}tjpltj}ntj}tj}|r|S |rd| S d S )Nr   zInvalid configuration: conflicting settings STICKY_PATCH, [AUTO_]UPDATE_DELAY or [AUTO_]STICKY_PATCHSET. There should be only one of themzconflicting sticky settings)r   zrelease-)r@  boolr
   r  ZUPDATE_DELAYZAUTO_UPDATE_DELAYZSTICKY_PATCHSETZAUTO_STICKY_PATCHSETr   r   UPDATE_MODE_MANUAL)r	  r  r  Zpatchsetr;   r;   r<   
get_sticky  s&    
r  c             C   s   | d | S )Nr>   r;   )r   r   r;   r;   r<   	_stickyfy<  s    r  c             C   s   t |}|s| S |dkr"t|| S tj }|sDtjjd tjd yt	j
tj dj| }W n: tk
r } ztj||j tjd W Y dd}~X nX tjtj|j }t|d }|dkrt|d	 | S |d
kr| S |dk rtjjd tjd tjjd|d   tjd dS )z
    Used to add sticky prefix to satisfy KCARE-953
    :param file: name of the file to stickify
    :return: stickified file.
    KEYzHPatch set to STICKY_PATCH=KEY, but server is not registered with the keyr  z!/sticky_patch.plain?server_id={0}r  Nr   r   r   r   rr   zEServer ID is not recognized. Please check if the server is registeredzError: r   r   r  r  r?   r  )r  r  r   r  r   r{   r   rS   r:  r   r   r   r   r   r   r   ro   r   r   rk   r   r   )filer	  sr  r   r   r   r   r;   r;   r<   r  @  s2    



r  c       
      C   s   g }| sdS | j d}|d }|dd }|jd}||krLtdt|  |s`| j |j kS |dkrt|jd n>|jd	s|jd	r|jtj| n|jtj|j	d
d x|D ]}|jtj| qW tj
ddj| d tj}	|	j|S )zhMatching according to RFC 6125, section 6.4.3

    http://tools.ietf.org/html/rfc6125#section-6.4.3
    Fr>   r   r   N*z,too many wildcards in certificate DNS name: z[^.]+zxn--z\*z[^.]*z\Az\.z\Z)r@   r  r   reprlowerrG  r   reescapereplacecompilerA   Z
IGNORECASErh  )
ZdnhostnameZmax_wildcardsZpatspiecesZleftmostZ	remainderZ	wildcardsZfragZpatr;   r;   r<   _dnsname_matchl  s(    


r  c       	      C   s
  g }xBt | j D ]2}| j|}|j dkrdd t|jdD }qW | sTtdg }x0|D ](\}}|dkr^t||r|d S |j| q^W |s| j	 j
}t||rd S |j| t|dkrtdj|d	jtt|n,t|dk rtd
j||d ntdd S )NZsubjectAltNamec             S   s   g | ]}|j  jd dqS )ry  r   )r   r@   )r   itr;   r;   r<   r     s    z"match_hostname.<locals>.<listcomp>,ztempty or no certificate, match_hostname needs a SSL socket or SSL context with either CERT_OPTIONAL or CERT_REQUIREDZDNSr   z(hostname {0} doesn't match either of {1}z, zhostname {0} doesn't match {1}r   z=no appropriate commonName or subjectAltName fields were found)rangeZget_extension_countZget_extensionZget_short_namerd   r@   r   r  rG  Zget_subjectZ
commonNamer  r   r   rA   mapr  )	Zcertr  Zsanr   r   Zdnsnamesr   re   Zcnr;   r;   r<   r     s0    




r   c           	   C   s  t ddd} | jdddd | jdd	d
dd | jdddd | jddddd | jdddd | jdddd | jdddd | jdddd | jdddd | jdddd | jdd dd | jd!d"dd | jd#d$dd | jd%d&dd | jd'd(d)d | jd*d+dd | jd,d-dd | jd.d/dd | jd0d1dd | jd2d3dd | jd4d5d6d | jd7d8d9d | jd:d;dd | jd<d=d)d | jd>d?dd | jd@dAdd | jdBdCdd | jdDdEddFdG | jdHdIdd | jdJdKdd | jdLdMdd | jdNdOdd | jdPdQdd | jdRdSdd | jdTdUdd | jdVdWdd | jdXdYdd | jdZd[d\td d]d^ | jd_d`dd | jdadbdd | j }|jdcddd\d |jdedfdd |jdgdhdd | jdidjd\d d]dk | jdldmdndd]do | jdpdqdr | jdsdtdd | jdudvdwdxdy tjs| jdzd{d|d}d]d~ | jddd|d}dd~ | jdddd | jddddd | jddddd | jdddd | jddddd | jddddd | jddddd | jdddddd | jdddd | jdddd | jddd6dd\d d]d | j }tj  tjsFt j	dg7  _	|j
d k	rzttd |j
jdjtj	rvdS dS |js|jrtjrtjt_ntjt_n|jrtjt_|jstj dkrtdtjd dS tj}|jrtj }n|jrtj!}t"j#| tj$stj%  |j&r,t'j(  |j)rn|j)dkr\t*|j)t_+tj,tj+d nd t_+tj,dd |j-d k	rtj,|j-d |j-t_.|j/rd]t_0|j1rd]t_2|j3rdt_4|j5rt5  |j6rt7j8dt9 n8|j:rtj;dkrtj<dkrdntj<pd|_=d|_>|j?r&|j?t_@|jAr@t7j8dt9 dt_@tj@jBdt_@tj@r~tj@tCkr~t"jDjEdjFtj@djGtC |jHrdt_Id|jH t_J|j=rtK|j= tj;dkrtL t_;t7j8djFtj;pdt9 |jMrt'jNtOjM|jPd d S |jQr$tQjQdddd}t'jNtPjR| d S tStj; |jTrJtTjUtV|jWd d S |jXrtYjZtQjQdddd}djF|j[}|j\rt'jN| nRtYj]|}|rt"j^djF| nt"j_ddd |j`rt'jN| n|r|ja  |jbr |jPrtbdd ntb  d S |jcrtj,dd d S |jdr0tj,dd d S |jerHtjf|je d S |jgrZth|jgS |jirjtjji  |jkrtj;dkrtj,dd tjjk|jk|jlS |jmrtjjm dkrdS dS |jnd k	rto|jnS |jprt'jNtjq tr|d|d d k		rtsjt|ju dS tj
s|jv	rd|jvini }|jw	r2tsjx S |jy	rVtsjzf |d k		rVt"j^dă |j{	rvtsjzf dtj|i| n|j}	rtsj~  t"j^dƃ |j	rtsj  t"j^dǃ |j	rt'jNtsj  |j	rt'jNtsj  |j	rtsj 	rt'jNtsj|j |jd k	
rj|jdk
r,tj
p(ttsj j }	nddɄ |jjdD }	tsjzf dt|	i|d k	
rjt"j^dă |j
rtsjzf tj|d d˜| |j
rt'jNt|jPd d}
|j
rt7j8dt9 d}
|j
r|j}
|j
rt|
tjtjd΍ |j>rt|
tjdύ t"j^dЃ |jrt'jNtj  |jr>t|
|jdэ t"j^d҃ |jrld]t_tjtjddӃ t|
tj|dύ |jrt|jPd |jrt S |jrt|jPd |jrt  ttjdkrt  d S )NZkcarectlz)Manage KernelCare patches for your kernel)Zprogr  z--debugrK   Z
store_true)helpr  z-iz--infoz]Display information about KernelCare. Use with --json parameter to get result in JSON format.z
--app-infozcDisplay information about KernelCare agent. Use with --json parameter to get result in JSON format.z-uz--updatez<Download latest patches and apply them to the current kernelz--unloadzUnload patchesz--smart-updatez,Patch kernel based on UPDATE POLICY settingsz--auto-updatez-Check if update is available, if so -- updatez--localzNUpdate from a server local directory; accepts a path where patches are locatedPATH)r  metavarz--patch-infoz"Return the list of applied patchesz	--freezerz)Freezer type: full (default), smart, noner  z
--nofreezez/[deprecated] Don't freeze tasks before patchingz--unamezReturn safe kernel versionz--license-infozReturn current license infoz--statuszReturn status of updatesz
--registerzRegister using KernelCare Keyr  z--register-autoretryz=Retry registering indefinitely if failed on the first attemptz--unregisterz7Unregister from KernelCare (for key-based servers only)z--checkzCheck if new update availablez--latest-patch-infoziReturn patch info for the latest available patch. Use with --json parameter to get result in JSON format.z--testz&[deprecated] Use --prefix=test insteadz--tagz7Tag server with custom metadata, for ePortal users onlyZTAGz--prefixzpPatch source prefix used to test different builds by downloading builds from different locations based on prefixr   z--nosignaturezDo not check signaturez--set-monitoring-keyzPSet monitoring key for IP based licenses. 16 to 32 characters, alphanumeric onlyz--doctorz@Submits a vitals report to CloudLinux for analysis and bug-fixesz
--fallbackzNWith --doctor, force the legacy kcdoctor.sh flow instead of the v2 upload pathz--kernel-anomaly-reportzHSubmits a kernel anomaly report to CloudLinux for analysis and bug-fixesz	--no-sendzSkip sending artifacts	save_only)r  r  destz--keep-localz:Don't delete generated kernel anomaly report after sendingz--enable-auto-updatezEnable auto updatesz--disable-auto-updatezDisable auto updatesz--plugin-infozProvides the information shown in control panel plugins for KernelCare. Use with --json parameter to get result in JSON format.z--server-infoz3Provides information about the host in JSON format.z--jsonzoReturn '--plugin-info', '--latest-patch-info', '--patch-info', '--app-info' and '--info' results in JSON formatz	--versionz(Return the current version of KernelCarez--kpatch-debugzEnable the debug modez--no-check-certz2Disable the patch server SSL certificates checkingz--set-patch-levelzBSet patch level to be applied. To select latest patch level set -1ZstoreF)r  r  r^   r(  requiredz--check-compatibilityzCheck compatibility.z--clear-cachezClear all cached filesz--set-patch-typez@Set patch type feed. To select default feed use 'default' optionz--edf-enabledz"Enable exploit detection frameworkz--edf-disabledz#Disable exploit detection frameworkz--set-sticky-patchzjSet patch to stick to date in DDMMYY format, or retrieve it from KEY if set to KEY. Leave empty to unstick)r  r  r(  r  z-qz--quietz=Suppress messages, provide only errors and warnings to stderr)r  r  r  z--has-flagszCheck agent features)r  z--forcez-Force action and ignore several restristions.z--set-configzChange configuration optionrG  z	KEY=VALUE)r  r  r  z--disable-libcarezDisable libcare servicesenable_libcareZstore_const)r  r  r  constz--enable-libcarezEnable libcare servicesTz--lib-updatezIDownload latest patches and apply them to the current userspace librariesz--lib-unloadz--userspace-unloadzUnload userspace patchesz--lib-repluginz--userspace-repluginzReload libcare-server pluginz--lib-auto-updatez
--lib-infoz--userspace-infoz&Display information about KernelCare+.z--lib-patch-infoz--userspace-patch-infoz,Return the list of applied userspace patchesz--lib-versionz--userspace-versionzReturn safe package versionZPACKAGENAMEz--userspace-updateUSERSPACE_PATCHESr   zODownload latest patches and apply them to the corresponding userspace processes)r  Znargsr  r  z--userspace-auto-updatez--userspace-statusz"Return status of userspace updatesz	--lib-tagz--userspace-tagzApply userspace patches for a specific tag (DDMMYY, YYYY-MM-DD, Nd, Nh, release-<NAME>) into an isolated cache, leaving the default storage untouched. Use together with --lib-update or --userspace-update.)r  r  r  r(  r  zlibcare-enabledr  r   r   zPlease run as root)r  )r  )r  zTFlag --edf-enabled has been deprecated and will be not available in future releases.r  r(  zMFlag --test has been deprecated and will be not available in future releases.r(   /z(Prefix `{0}` is not in expected one {1}.r  zfile:z+edf patches are deprecated. Fallback to {0})rI  r  )r   r   r   )Zforce_fallbackz)Kernel anomaly report file generated: {0}z0Kernel anomaly report uploaded successfully: {0}z$Failed to send kernel anomaly report)r   ri   )r   ZYES)r   ZNOrv  r   )r,  r  zUserspace patches are applied.r	  zUserspace patches are unloaded.zLibcare plugin reloaded.c             S   s   g | ]}|j  j qS r;   )r   r  )r   Zptchr;   r;   r<   r   5  s    zmain.<locals>.<listcomp>limit)r	  r  zQFlag --nofreeze has been deprecated and will be not available in future releases.r   )r	  rE  )r	  zKernel is safe)r  z=KernelCare protection disabled. Your kernel might not be safe<   )r   Zadd_argumentr   Zadd_mutually_exclusive_groupr
   ZLIBCARE_DISABLEDZ
parse_argsr   Zset_settings_from_config_fileZFLAGSZ	has_flagsr/   filterr@   issubsetquietZauto_updateZSILENCE_ERRORSr   ZPRINT_CRITICALZPRINT_LEVELZPRINT_ERRORr  ZPRINT_DEBUGr  r0   getuidprintrS   r  loggingZINFOZWARNINGDEBUGr   Zinitialize_loggingZIGNORE_FEATURE_FLAGSZset_feature_flags_from_cacher   r   Zclear_all_cacheZset_patch_levelrd   r  r  Zset_sticky_patchr  Znosignaturer  Zno_check_certr   r~  r  rt  Zedf_enabledwarningswarnDeprecationWarningZedf_disabledr,  ZPREV_PATCH_TYPEZset_patch_typerH  r   r   r(   r   EXPECTED_PREFIXr{   r]  r   rA   Zlocalrh   ZPATCH_SERVERr  r   Zapp_infor   r   ri   r   rj   rJ   r   Zsend_doctor_reportr  ZfallbackZkernel_anomaly_reportr   r  Zarchive_pathr  r  r  r  Z
keep_localr  r   Zenable_auto_updateZdisable_auto_updateZ
set_configZupdate_config_from_argsZset_monitoring_keyr   Z
unregisterr   registerZregister_autoretryr   r  r  r   ra   rc   r   Zset_libcare_statusr  Zlib_tagZuserspace_statusZget_userspace_update_statusZ
lib_updateZdo_userspace_updateZlib_auto_updater  Z
lib_unloadZlibcare_unloadZlib_repluginZlibcare_repluginZlib_inforB  Zlib_patch_infoZlibcare_patch_infoZlib_versionZlibcare_server_startedZlibcare_versionZuserspace_updater  listZget_userspace_mapkeyssortedZuserspace_auto_updater   rA  Znofreezer  Zsmart_updater  r  ZUPDATE_POLICYr  r   r   r  r  r  ZCHECK_CLN_LICENSE_STATUSry   rz   randomZuniformrJ  r   r   Zlatest_patch_inforM  Zcheckr;  r  argvrD  )ZparserZexclusive_groupr   r   r   r
  Zlocal_path_messager  Z
lib_tag_kwr  r  r;   r;   r<   main  sr    













r  )r%   r&   r'   r(   )r)   r*   )N)N)F)F)N)rK   F)rK   F)r   )Z
__future__r   rl   ri   r  r0   r   r  r  r  r   ZsslrS   r  ry   rR   r  Zargparser   
contextlibr   r   rK   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zpy23r   r    r!   r"   r#   r  r  r  r3   r  r  rZ  r  r  ZDOTALLr1  rg  r1   r  insertfilterwarningsr  r{   ZsetLevelr  r=   rD   rJ   rg   rp   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rc   Zdistutils.versionZ	distutilsZOpenSSL.SSLr   r   ZStrictVersionZ__version__ImportErrorr   ZHTTPSConnectionZPureHTTPSConnectionobjectr   r   r  r  r  r  r!  r"  r;  rD  rM  r?  rO  rJ  rU  rX  r_  rf  rj  rk  rn  rp  rs  rt  rx  r}  r  r  r  r  r  r  r  r  r  r  r  r  r   r  Zlog_all_parent_processesr  rA  r  r8  r   r  r  r  rF  r   r  Ztrack_update_statusr  r  r  r  r  r   r  r;   r;   r;   r<   <module>   s  \ 

	
&	

4
-!	b	+
 
		



"
?
-2.= ,
3)