
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
;j)                 @   s  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	m
Z
mZmZmZ ddlmZ ddlmZ dZdd Zd	d
 Zdd Zdd Zdd Zdd Zdd ZG dd deZG dd deZG dd deZdd Zdd Zdd  Z d!d" Z!d#d$ Z"d%d& Z#d'd( Z$d)d* Z%ej&d+d, Z'ej&d-d. Z(ej&d/d0 Z)d1d2 Z*d3d4 Z+d5d6 Z,d7d8 Z-d9d: Z.d;d< Z/ej&d=d> Z0d?d@ Z1dAdB Z2dCdD Z3dEdF Z4dS )G    N   )config	constants	log_utilsprocess_utilsutils)SafeExceptionWrapper)json_loads_nstrzuname: c             C   s   t j| p| dkS )Nz.-_+)strisalnum)c r   +/usr/libexec/kcare/python/kcarectl/kcare.pyis_uname_char   s    r   c             C   sf   t  }tt|| tjdB}x:|j D ].}|jtr&djt	t
|ttd  j S q&W W d Q R X dS )Nr )get_kernel_hashopenget_cache_pathr   
PATCH_INFO	readlines
startswithUNAME_LABELjoinfilterr   lenstrip)patch_levelkhashfliner   r   r   parse_uname   s    
.r!   c             C   sJ   t jjtjrFy"ttjd}|j|  |j  dS  tk
rD   Y nX dS )NwTF)	ospathexistsr   KCARE_UNAME_FILEr   writeclose	Exception)new_versionr   r   r   r   kcare_update_effective_version%   s    
r+   c           
   C   s.   t tjd} ztj| j j S | j  X d S )Nrb)r   r   KERNEL_VERSION_FILEhashlibsha1read	hexdigestr(   )r   r   r   r   r   1   s    r   c              C   s   t jjtjd} t jj| rt| dV}|j j }yt	| W n6 t
k
rd   tt	t jj| S  tk
rv   dS X |S Q R X dS )z:Returns timestamp from PATCH_CACHE/stoped.at if its exsitsz
stopped.atr   errorNz-1)r#   r$   r   r   PATCH_CACHEr%   r   r0   rstripint
ValueErrorr
   getctimer)   )Zstopped_at_filenameZfhvaluer   r   r   get_last_stop<   s    
r9   c             C   sP   t jpd}t jpd}dj|| t||g}tjd|f}|rD||f7 }tjj| S )Nnonedefault-patches)	r   PREFIX
PATCH_TYPEr   r
   r   r3   r#   r$   )r   plevelfnameprefixptypeZ	patch_dirresultr   r   r   r   M   s    


r   c              G   s   t jtjf|  S )N)r   get_patch_server_urlr   r>   )partsr   r   r   get_kernel_prefixed_urlW   s    rG   c               @   s   e Zd Zdd Zdd ZdS )BaseKernelPatchLevelc             G   s   t | jt| f| S )N)r   r   r
   )selfrF   r   r   r   
cache_path\   s    zBaseKernelPatchLevel.cache_pathc             C   s   | j | j| j| jdS )N)levelr   baseurlrelease)rK   r   rL   rM   )rI   r   r   r   as_dict_   s    zBaseKernelPatchLevel.as_dictN)__name__
__module____qualname__rJ   rN   r   r   r   r   rH   [   s   rH   c                   s8   e Zd Zd
 fdd	ZdddZdd Zdd	 Z  ZS )KernelPatchLevelNc                s   t | | j| |S )N)super__new__)clsr   rK   rL   rM   )	__class__r   r   rT   i   s    zKernelPatchLevel.__new__c             C   s   || _ || _|| _|| _d S )N)rK   r   rL   rM   )rI   r   rK   rL   rM   r   r   r   __init__l   s    zKernelPatchLevel.__init__c             G   s   t j| j| jf| S )N)r   rE   rL   r   )rI   rF   r   r   r   kmod_urlr   s    zKernelPatchLevel.kmod_urlc             G   s   t j| j| jt| f| S )N)r   rE   rL   r   r
   )rI   rF   r   r   r   file_urlu   s    zKernelPatchLevel.file_url)N)N)rO   rP   rQ   rT   rW   rX   rY   __classcell__r   r   )rV   r   rR   h   s   
rR   c                   s<   e Zd Z fddZdd Zdd Zdd Zd	d
 Z  ZS )LegacyKernelPatchLevelc                sB   yt | | j| |S  tk
r< } zt|W Y d d }~X nX d S )N)rS   rT   r6   r   )rU   r   rK   exc)rV   r   r   rT   z   s    zLegacyKernelPatchLevel.__new__c             C   s   || _ || _d | _d | _d S )N)rK   r   rL   rM   )rI   r   rK   r   r   r   rW      s    zLegacyKernelPatchLevel.__init__c             G   s0   dt jkr t| jt| f| S t| jf| S )Nzpatches.kernelcare.com)r   PATCH_SERVERrG   r   r
   )rI   rF   r   r   r   rX      s    
zLegacyKernelPatchLevel.kmod_urlc             G   s   t | jt| f| S )N)rG   r   r
   )rI   rF   r   r   r   rY      s    zLegacyKernelPatchLevel.file_urlc             C   s   t | jt| |S )N)rR   r   r5   )rI   rL   r   r   r   upgrade   s    zLegacyKernelPatchLevel.upgrade)	rO   rP   rQ   rT   rW   rX   rY   r^   rZ   r   r   )rV   r   r[   y   s
   r[   c             C   s^   y6t tjjtjdd}tj| j | W d Q R X W n" t	k
rX   t
jddd Y nX d S )Nzkernel_patch_level.jsonr"   z!failed to dump kernel patch levelF)	print_msg)r   r#   r$   r   r   r3   jsondumprN   r)   r   logexc)Zkernel_patch_levelr   r   r   r   dump_kernel_patch_level   s
    rc   c              C   sT   y,t tjjtjd} t| j S Q R X W n" tk
rN   t	j
ddd Y nX d S )Nzkernel_patch_level.jsonz(failed to read dumped kernel patch levelF)r_   )r   r#   r$   r   r   r3   r	   r0   r)   r   rb   )r   r   r   r   read_dumped_kernel_patch_level   s
    rd   c             C   s   t dd | D dd ddS )Nc             S   s   g | ]}|t jj|fqS r   )r#   r$   r7   ).0itr   r   r   
<listcomp>   s    z'sort_files_by_ctime.<locals>.<listcomp>c             S   s   | d S )Nr   r   )pairr   r   r   <lambda>   s    z%sort_files_by_ctime.<locals>.<lambda>T)keyreverse)sorted)Z
files_listr   r   r   sort_files_by_ctime   s    rm   c              C   s\   d} t jjds| S td6}x.|D ]&}|j }|jdr$|jd d\}} q$W W d Q R X | S )Nz
/var/crashz/etc/kdump.confzpath r   )r#   r$   isfiler   r   r   split)Z
kdump_pathZ
kdump_confr    _r   r   r   get_kdump_root   s    


rq   c              C   s*   t  } tjj| sg S tjtjj| dS )Nz*/vmcore)rq   r#   r$   isdirglobr   )
kdump_rootr   r   r   list_kdump_vcore_files   s    ru   c              C   s*   t  } tjj| sg S tjtjj| dS )Nz*/*.txt)rq   r#   r$   rr   rs   r   )rt   r   r   r   list_kdump_txt_files   s    rv   c               C   s(   t jjtjsg S tjt jjtjdS )Nz*.log)r#   r$   rr   r   
KDUMPS_DIRrs   r   r   r   r   r   list_crashreporter_log_files   s    rx   c               C   s(   t jjtjsg S dd t jtjD S )Nc             S   s   g | ]}t jjtj|qS r   )r#   r$   r   r   rw   )re   rf   r   r   r   rg      s    z0list_crashreporter_artifacts.<locals>.<listcomp>)r#   r$   rr   r   rw   listdirr   r   r   r   list_crashreporter_artifacts   s    rz   c              C   s   t  } | sd S t| d d S )Nr   r   )ru   rm   )Zkdumpsr   r   r   kdumps_latest_event_timestamp   s    r{   c              C   s>   t jstjjt jr:tjt jddgddd\} }} |j S dS )Nz	is-activekdumpT)catch_stdoutcatch_stderrzsystemd-absent)	r   SKIP_SYSTEMCTL_CHECKr#   r$   rn   	SYSTEMCTLr   run_commandr   )rp   stdoutr   r   r   kdump_status   s    r   c              C   s   t  } | sd S t| d d S )Nr   r   )rz   rm   )Z	artifactsr   r   r   $crashreporter_latest_event_timestamp   s    r   c           	   C   s:   d} t jj| sd S t| d}|j j }W d Q R X |S )Nz/sys/module/kcare/versionr   )r#   r$   r%   r   r0   r   )Zkmod_version_filer   versionr   r   r   get_current_kmod_version   s    r   c             C   s6   t  }|sdS tjdddt| |tjgj }||kS )NTz/sbin/modinfoz-Fr   )r   r   check_outputr   r   KMOD_BINr   )r   r@   Zold_versionr*   r   r   r   is_kmod_version_changed   s    r   c              C   s   t  } | stj S t| S )N)loaded_patch_levelplatformrM   r!   )r   r   r   r   kcare_uname_su  s    r   c               C   s,   t jjtjr"ttjdj j S t S d S )Nr   )	r#   r$   r%   r   r&   r   r0   r   r   r   r   r   r   kcare_uname  s    r   c              C   s`   t t d } | r\yt|  W n0 tk
rN } zt|dt W Y d d }~X nX tt | S d S )Nzpatch-levelzUnexpected patch state)parse_patch_descriptionloaded_patch_descriptionr5   r6   r   _patch_infor[   r   )pler   r   r   r     s     r   c              C   sJ   yt jtjdgddS  tjk
rD }  z| jtjkr6 dS d } ~ X nX d S )NinfoT)checkr   )	r   r   r   
KPATCH_CTL
subprocessCalledProcessError
returncodeerrnoZEBUSY)r   r   r   r   r   !  s    r   c              C   sR   ydd t dD S  ttfk
rL }  ztjdt|  dd g S d } ~ X nX d S )Nc             S   s   g | ]}|j  d  qS )r   )ro   )re   r    r   r   r   rg   -  s    z&get_loaded_modules.<locals>.<listcomp>z/proc/modulesz#Error getting loaded modules list: F)r_   )r   OSErrorIOErrorr   logerrorr
   )exr   r   r   get_loaded_modules*  s
    r   c               C   s   dt  krd S tt dS )Nkcarezkpatch-description)r   get_patch_valuer   r   r   r   r   r   3  s    
r   c             C   s   t j| j|S )N)r   data_as_dictget)r   Zlabelr   r   r   r   ;  s    r   c       	      C   sr   d dddd}| s|S | j d\}}}|j d\}}}|j d\}}}|pLd |d< |pXd|d< ||d	< ||d
< |S )Nr;   r   )zpatch-levelz
patch-typezlast-updatezkernel-version;:r<   zpatch-levelz
patch-typezlast-updatezkernel-version)	partition)	descrD   Zlevel_type_timestamprp   kernelZ
level_type	timestampr   Z
patch_typer   r   r   r   ?  s    r   c              C   sh   t jjtjd} t jj| rdt| d8}y|j }tj	|S  t
ttttfk
rX   Y nX W d Q R X d S )Nzkcare.stater   )r#   r$   r   r   r3   r%   r   r0   astZliteral_evalSyntaxErrorr   r6   	TypeErrorUnicodeDecodeError)Z
state_filer   stater   r   r   	get_stateS  s    
r   )5r   r   rs   r.   r`   r#   r   r   r   r   r   r   r   r   errorsr   py23r	   r   r   r!   r+   r   r9   r   rG   r5   rH   rR   r[   rc   rd   rm   rq   ru   rv   rx   rz   cachedr{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sV   	
		
	
		