
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
Ö;j[#  ã               @   sd  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
m
Z
 ddlmZ ejdƒZdZedƒZed	ƒZedƒZd<dd„Zd=dd„Zd>dd„Zd?dd„Zdd„ Zd@dd„Zdedfdd„Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Z ed)d*„ ƒZ!d+d,„ Z"dAd-d.„Z#dBd/d0„Z$d1d2„ Z%dCd4d5„Z&d6d7„ Z'd8d9„ Z(de)fdfd:d;„Z*dS )Dé    )Úprint_functionN)Údatetimeé   )Ú	constantsz^(\d+[.]\d+[-]\d+)é   Ú ó    FÚwé¤  c       
      C   sì   t jj| ƒ}|r(t jj|ƒ r(t j|ƒ yt j| ƒj}W n tk
rP   |}Y nX tj	||t jj
| ƒd dd��<}t j|jƒ |ƒ |j|ƒ |jƒ  t j|jƒ ƒ |j}W d Q R X t j|t jƒ}	zt j|	ƒ W d t j|	ƒ X t j|| ƒ d S )NÚ.F)ÚmodeÚdirÚprefixÚdelete)ÚosÚpathÚdirnameÚexistsÚmakedirsÚstatÚst_modeÚ	ExceptionÚtempfileÚNamedTemporaryFileÚbasenameÚfchmodÚfilenoÚwriteÚflushÚfsyncÚnameÚopenÚO_RDONLYÚcloseÚrename)
ÚfnameÚcontentÚ
ensure_dirr   Zcreate_modeZdnamer   ÚfZ	tmp_fnameZ	folder_fd© r)   ú+/usr/libexec/kcare/python/kcarectl/utils.pyÚatomic_write"   s$    

 
r+   úutf-8c             C   s4   t | ƒtkr| S t | ƒtkr&| j|ƒS | j|ƒS d S )N)ÚtypeÚntypeÚbtypeÚdecodeÚencode)ÚdataÚencodingr)   r)   r*   Únstr>   s
    
r4   Úlatin1c             C   s   t | ƒtkr| j|ƒ} | S )N)r-   Úutyper1   )r2   r3   r)   r)   r*   ÚbstrH   s    
r7   c             C   s   t | ƒtkr| j|ƒ} | S )N)r-   r/   r0   )r2   r3   r)   r)   r*   ÚustrO   s    
r8   c                s4   i ‰ t jˆƒ‡ ‡fdd„ƒ}ˆ |_ˆ j|_ˆ|_|S )Nc                 sH   | t t|jƒ ƒƒf}yˆ | S  tk
r0   Y nX ˆ| |Ž }ˆ |< |S )N)ÚtupleÚsortedÚitemsÚKeyError)ÚargsÚkwargsZ	cache_keyÚresult)ÚcacheÚfnr)   r*   ÚinnerZ   s    zcached.<locals>.inner)Ú	functoolsÚwrapsr@   ÚclearÚorig)rA   rB   r)   )r@   rA   r*   ÚcachedV   s    
rG   c                sF   ˆd krt j‰ˆd krt j‰ˆ d kr*t j‰ i ‰‡ ‡‡‡‡fdd„}|S )Nc                s   ‡‡‡‡‡ ‡fdd„}|S )Nc                 s²   ˆ}xlt ˆƒD ]`}y
ˆ| |ŽS  tk
rJ } zˆ|ˆƒs:‚ W Y d d }~X nX tj|ƒ t|tjdˆ ƒ tjƒ}qW y
ˆ| |ŽS  tk
r¬ } zt	|dˆƒ ‚ W Y d d }~X nX d S )Nr   Úattempts)
Úranger   ÚtimeÚsleepÚminÚrandomÚuniformr   ÚRETRY_MAX_DELAYÚsetattr)r=   r>   ZldelayÚ_ÚexZfinal_ex)ÚbackoffÚcheck_retryÚcountÚdelayrA   Ústater)   r*   rB   v   s    



z'retry.<locals>.decorator.<locals>.innerr)   )rA   rB   )rS   rT   rU   rV   rW   )rA   r*   Ú	decoratoru   s    zretry.<locals>.decorator)r   ÚRETRY_DELAYÚRETRY_COUNTÚRETRY_BACKOFF)rT   rU   rV   rS   rX   r)   )rS   rT   rU   rV   rW   r*   Úretryj   s    r\   c       
      C   sÄ   t jj| ƒsd S g }t j| ƒ}|d k	r2tj||ƒ}xD|D ]<}t jj| |ƒ}||krh|jt j|ƒj	|fƒ |j
dd� q8W xF||d … D ]6\}}	t jj|	ƒs¦t jj|	ƒr²t j|	ƒ q†tj|	ƒ q†W d S )NT)Úreverse)r   r   r   ÚlistdirÚfnmatchÚfilterÚjoinÚappendr   Úst_mtimeÚsortÚisfileÚislinkÚremoveÚshutilÚrmtree)
Z	directoryÚexclude_pathÚkeep_nÚpatternr2   r;   ÚitemÚ	full_pathrQ   Úentryr)   r)   r*   Úclean_directoryŽ   s    

rp   c               C   sN   t tjjtjdƒdd� t tjjtjdƒdd� tjjtjƒrJtjtjƒ d S )NÚmodulesr   )rk   Úpatches)	rp   r   r   ra   r   ÚPATCH_CACHEr   ÚCACHE_KEY_DUMP_PATHÚunlinkr)   r)   r)   r*   Úclear_all_cache¢   s    rv   c          
   C   s^   t jj|ƒ}t jj|ƒs"t j|ƒ t|dƒ�(}tj| |ƒ |jƒ  t j	|j
ƒ ƒ W d Q R X d S )NÚwb)r   r   r   r   r   r!   rh   Úcopyfileobjr   r   r   )ÚresponseÚdstZ
parent_dirr(   r)   r)   r*   Úsave_to_fileª   s    
r{   c             C   s   t j| ƒ}|r|jdƒp| S )Nr   )Ú
VERSION_REÚmatchÚgroup)Úversionr}   r)   r)   r*   Ústrip_version_timestampµ   s    
r€   c             C   s0   | j dƒ\}}}|s$| j dƒ\}}}tj|dƒS )NÚTú z%Y-%m-%d)Ú	partitionr   Ústrptime)Zstr_rawZstr_dateÚseprQ   r)   r)   r*   Úparse_response_date»   s    r†   c              G   s0   ddl m} djdd„ td |jƒ f|  ƒD ƒƒS )Nr   )Úipv6_supportú/c             s   s   | ]}|j d ƒV  qdS )rˆ   N)Ústrip)Ú.0Úitr)   r)   r*   ú	<genexpr>É   s    z'get_patch_server_url.<locals>.<genexpr>)r   r‡   ra   r`   Úget_patch_server)Úpartsr‡   r)   r)   r*   Úget_patch_server_urlÅ   s    r�   c          	   C   s0   t jj| ƒsd S t| ƒ�}|jƒ jƒ S Q R X d S )N)r   r   r   r!   Úreadr‰   )Úfilenamer(   r)   r)   r*   Útry_to_readÌ   s    
r’   c               C   s
   t tjƒS )N)r’   r   rt   r)   r)   r)   r*   Úget_cache_keyÕ   s    r“   c          	   C   s.   t jj| ƒs|S t| |ƒ�
}|jƒ S Q R X d S )N)r   r   r   r!   r�   )r%   r   Údefaultr(   r)   r)   r*   Ú
_read_fileÛ   s    r•   c             C   s   t | d|ƒ}|S )NÚr)r•   )r%   r”   r?   r)   r)   r*   Ú	read_fileã   s    r—   c             C   s   t | d|ƒ}|S )NÚrb)r•   )r%   r”   r?   r)   r)   r*   Úread_file_biné   s    r™   c             C   sB   i }| j ƒ }x0|D ](}|r|jdƒ\}}}|r|jƒ ||< qW |S )Nú:)Ú
splitlinesrƒ   r‰   )r2   r?   Z
data_linesÚlineÚkeyÚ	delimiterÚvaluer)   r)   r*   Údata_as_dictï   s    
r    Úcvec             C   s0   t ƒ }x$| D ]}|j|ƒ}|r|j|ƒ qW |S )a  
    Extract unique CVEs from a list of patches.

    Args:
        patches: List of patch dictionaries
        cve_field: Field name to extract CVE from (default 'cve' for userspace, 'kpatch-cve' for kernel)

    Returns:
        Set of unique CVE strings
    )ÚsetÚgetÚadd)rr   Ú	cve_fieldZunique_cvesÚpatchr¡   r)   r)   r*   Úextract_unique_cvesû   s    

r§   c               C   s   t ttjƒ ƒƒS )N)ÚstrÚintrJ   r)   r)   r)   r*   Útimestamp_str  s    rª   c              G   s   t | Ž  dS )za workaround to fix T201N)Úprint)Úvaluesr)   r)   r*   Úprint_wrapper  s    r­   c                s   ‡ ‡‡fdd„}|S )Nc                s    t jˆ ƒ‡‡‡ ‡fdd„ƒ}|S )Nc                 sn   y
ˆ| |ŽS  ˆk
rh } zBˆrZdd„ | D ƒdd„ |j ƒ D ƒ }ˆdjˆjdj|ƒ|ƒƒ ˆ S d }~X nX d S )Nc             S   s   g | ]}t |ƒ‘qS r)   )r¨   )rŠ   Úar)   r)   r*   ú
<listcomp>&  s    zBcatch_errors.<locals>.decorator.<locals>.inner.<locals>.<listcomp>c             S   s   g | ]\}}d j ||ƒ‘qS )z{0}={1})Úformat)rŠ   ÚkÚvr)   r)   r*   r¯   &  s    z{0}({1}) failed: {2}z, )r;   r°   Ú__name__ra   )r=   r>   ÚeÚarg_list)Údefault_returnÚerrorsrA   Úloggerr)   r*   rB     s    
 z.catch_errors.<locals>.decorator.<locals>.inner)rC   rD   )rA   rB   )r¶   r·   r¸   )rA   r*   rX     s    zcatch_errors.<locals>.decoratorr)   )r¸   r·   r¶   rX   r)   )r¶   r·   r¸   r*   Úcatch_errors  s    r¹   )Fr	   r
   )r,   )r5   )r5   )NNN)N)N)r¡   )+Ú
__future__r   r_   rC   r   rM   Úrerh   r   rJ   r   r   r   Úcompiler|   ZCACHE_ENTRIESr-   r.   r/   r6   r+   r4   r7   r8   rG   r\   rp   rv   r{   r€   r†   r�   r’   r“   r•   r—   r™   r    r§   rª   r­   r   r¹   r)   r)   r)   r*   Ú<module>   sJ   






$
	


