
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!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mZmZmZmZ ddl	m
Z
 dZddd	„Zdd
d„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )é    Né   )ÚconfigÚ	constantsÚ	log_utilsÚutils)Újson_loads_nstré   é<   ú.kcarestatusc             C   s$   t jjtj| ƒ}tj|tjƒ ƒ d S )N)ÚosÚpathÚjoinr   ÚPATCH_CACHEr   Úatomic_writeÚtimestamp_str)ÚfilenameÚstatus_filepath© r   ú2/usr/libexec/kcare/python/kcarectl/update_utils.pyÚtouch_status_gap_file   s    r   c             C   sz   t jjtj| ƒ}t jj|ƒrvt|dƒ�J}y.t|jƒ ƒ}t|ƒt	j
 t tjƒ krTdS W n tk
rj   Y nX W d Q R X dS )NÚrFT)r   r   r   r   r   ÚisfileÚopenÚintÚreadr   ÚSTATUS_CHANGE_GAPÚSTATUS_CHANGE_GAP_DELAYÚtimeÚ	Exception)r   r   ÚsfileÚ	timestampr   r   r   Ústatus_gap_passed   s    r!   c             C   s   | dkrt dj| ƒƒ‚d S )NÚkernelÚlibcarez$Unknown update status component: {0})r"   r#   )Ú
ValueErrorÚformat)Ú	componentr   r   r   Ú_check_component%   s    r'   c              C   sN   t jtjƒ} | d kri S yt| ƒ}|S  ttfk
rH   tjj	dƒ i S X d S )Nz"Failed to parse update status file)
r   Ú	read_filer   ÚUPDATE_STATUS_PATHr   r$   Ú	TypeErrorr   ÚkcarelogÚwarning)ÚcontentÚresultr   r   r   Ú_load_update_status+   s    r/   c             C   sf   t | ƒ y4tƒ }|ttjƒ ƒdœ|| < tjtjtj	|ƒƒ W n$ t
k
r`   tjjddd� Y nX d S )N)Úerrorr    zFailed to save update statusT)Úexc_info)r'   r/   r   r   r   r   r   r)   ÚjsonÚdumpsr   r   r+   r,   )r&   r0   Údatar   r   r   Úsave_update_status9   s    r5   c             C   s>   t | ƒ}t t| ddƒƒ}|r:||kr:|jƒ r6dj|ƒS |S |S )NÚstatusÚ zHTTP Error: {0})ÚstrÚgetattrÚisdigitr%   )ÚerrÚmessager6   r   r   r   Ú_error_statusG   s    
r=   c                s   t ˆ ƒ ‡ fdd„}|S )Nc                s   t jˆ ƒ‡‡ fdd„ƒ}|S )Nc                 sT   yˆ| |Ž}W n4 t k
rB } ztˆ t|ƒd� ‚ W Y d d }~X nX tˆ dd� |S )N)r0   r7   )r   r5   r=   )ÚargsÚkwargsr.   r;   )r&   Úfnr   r   Úinner_   s    z5track_update_status.<locals>.decorator.<locals>.inner)Ú	functoolsÚwraps)r@   rA   )r&   )r@   r   Ú	decorator^   s    z&track_update_status.<locals>.decorator)r'   )r&   rD   r   )r&   r   Útrack_update_statusZ   s    rE   c             C   s^   t | ƒ y,tƒ }|j| i ƒjddƒ}t|ƒd tj… S  tk
rX   tjj	ddd� dS X d S )Nr0   r7   zFailed to read update statusT)r1   )
r'   r/   Úgetr8   r   ÚUPDATE_ERROR_MAX_LENGTHr   r   r+   r,   )r&   r4   r0   r   r   r   Úread_update_erroro   s    rH   i,  )r
   )r
   )rB   r2   r   r   r7   r   r   r   r   Úpy23r   r   r   r!   r'   r/   r5   r=   rE   rH   r   r   r   r   Ú<module>   s   

