
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
ôn»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   sZ   t ƒ }tjt|| tjƒƒ}x:|jƒ D ].}|jtƒr$dj	t
t|ttƒd … jƒ ƒƒS q$W dS )NÚ )Úget_kernel_hashr   Úread_text_fileÚget_cache_pathr   Ú
PATCH_INFOÚ
splitlinesÚ
startswithÚUNAME_LABELÚjoinÚfilterr   ÚlenÚstrip)Úpatch_levelÚkhashÚbufÚ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_FILEÚopenÚwriteÚcloseÚ	Exception)Únew_versionÚfr   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| ƒr‚t| 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.atÚrÚerrorNz-1)r"   r#   r   r   ÚPATCH_CACHEr$   r&   r1   ÚrstripÚintÚ
ValueErrorr
   Úgetctimer)   )Zstopped_at_filenameZfhÚvaluer   r   r   Úget_last_stop<   s    
r;   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   r5   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    rI   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
   )ÚselfrH   r   r   r   Ú
cache_path\   s    zBaseKernelPatchLevel.cache_pathc             C   s   | j | j| j| jdœS )N)Úlevelr   ÚbaseurlÚrelease)rM   r   rN   rO   )rK   r   r   r   Úas_dict_   s    zBaseKernelPatchLevel.as_dictN)Ú__name__Ú
__module__Ú__qualname__rL   rP   r   r   r   r   rJ   [   s   rJ   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   rM   rN   rO   )Ú	__class__r   r   rV   i   s    zKernelPatchLevel.__new__c             C   s   || _ || _|| _|| _d S )N)rM   r   rN   rO   )rK   r   rM   rN   rO   r   r   r   Ú__init__l   s    zKernelPatchLevel.__init__c             G   s   t j| j| jf|žŽ S )N)r   rG   rN   r   )rK   rH   r   r   r   Úkmod_urlr   s    zKernelPatchLevel.kmod_urlc             G   s   t j| j| jt| ƒf|žŽ S )N)r   rG   rN   r   r
   )rK   rH   r   r   r   Úfile_urlu   s    zKernelPatchLevel.file_url)N)N)rQ   rR   rS   rV   rY   rZ   r[   Ú__classcell__r   r   )rX   r   rT   h   s   
rT   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)rU   rV   r8   r   )rW   r   rM   Úexc)rX   r   r   rV   z   s    zLegacyKernelPatchLevel.__new__c             C   s   || _ || _d | _d | _d S )N)rM   r   rN   rO   )rK   r   rM   r   r   r   rY   �   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_SERVERrI   r   r
   )rK   rH   r   r   r   rZ   ‡   s    
zLegacyKernelPatchLevel.kmod_urlc             G   s   t | jt| ƒf|žŽ S )N)rI   r   r
   )rK   rH   r   r   r   r[   �   s    zLegacyKernelPatchLevel.file_urlc             C   s   t | jt| ƒ|ƒS )N)rT   r   r7   )rK   rN   r   r   r   Úupgrade�   s    zLegacyKernelPatchLevel.upgrade)	rQ   rR   rS   rV   rY   rZ   r[   r`   r\   r   r   )rX   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   r5   ÚjsonÚdumprP   r)   r   Úlogexc)Zkernel_patch_levelr+   r   r   r   Údump_kernel_patch_level”   s
    re   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)ra   )r&   r"   r#   r   r   r5   r	   r1   r)   r   rd   )r+   r   r   r   Úread_dumped_kernel_patch_levelœ   s
    rf   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#   r9   )Ú.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    ro   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    


rs   c              C   s*   t ƒ } tjj| ƒsg S tjtjj| dƒƒS )Nz*/vmcore)rs   r"   r#   ÚisdirÚglobr   )Ú
kdump_rootr   r   r   Úlist_kdump_vcore_filesº   s    rw   c              C   s*   t ƒ } tjj| ƒsg S tjtjj| dƒƒS )Nz*/*.txt)rs   r"   r#   rt   ru   r   )rv   r   r   r   Úlist_kdump_txt_filesÂ   s    rx   c               C   s(   t jjtjƒsg S tjt jjtjdƒƒS )Nz*.log)r"   r#   rt   r   Ú
KDUMPS_DIRru   r   r   r   r   r   Úlist_crashreporter_log_filesÊ   s    rz   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   ry   )rg   rh   r   r   r   ri   Õ   s    z0list_crashreporter_artifacts.<locals>.<listcomp>)r"   r#   rt   r   ry   Úlistdirr   r   r   r   Úlist_crashreporter_artifactsÑ   s    r|   c              C   s   t ƒ } | sd S t| ƒd d S )Nr   r   )rw   ro   )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#   rp   Ú	SYSTEMCTLr   Úrun_commandr   )rr   Ústdoutr   r   r   Úkdump_statusá   s    r…   c              C   s   t ƒ } | sd S t| ƒd d S )Nr   r   )r|   ro   )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/versionr3   )r"   r#   r$   r&   r1   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   rB   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ÚplatformrO   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 )Nr3   )	r"   r#   r$   r   r%   r&   r1   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_descriptionr7   r8   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   )rq   )rg   r   r   r   r   ri   -  s    z&get_loaded_modules.<locals>.<listcomp>z/proc/modulesz#Error getting loaded modules list: F)ra   )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)	ÚdescrF   Zlevel_type_timestamprr   Ú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.stater3   )r"   r#   r   r   r5   r$   r&   r1   ÚastZliteral_evalÚSyntaxErrorrœ   r8   Ú	TypeErrorÚUnicodeDecodeError)Z
state_filer+   Ústater   r   r   Ú	get_stateS  s    
r°   )5r«   r›   ru   r/   rb   r"   r�   r˜   r   r   r   r   r   r   Úerrorsr   Úpy23r	   r   r   r    r,   r   r;   r   rI   r7   rJ   rT   r]   re   rf   ro   rs   rw   rx   rz   r|   Úcachedr}   r…   r†   rˆ   r‹   rŽ   r�   rŒ   r’   r    r‘   r¢   r�   r°   r   r   r   r   Ú<module>   sV   	
		
	
		