U
    Tr­`Ò,  ã                   @   sb   d dl mZmZmZ d dlmZ d dlmZ d dlm	Z	 d dl
Z
d dlZd dlZG dd„ dƒZdS )é    )ÚTimerÚStatusÚsetup_logger)ÚSmartDL)Úutils)ÚStringIONc                   @   sV  e Zd ZdZdZe ¡ Zej	dfdd„Z
edd„ ƒZedd	„ ƒZed
d„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZejdd„ ƒZedd„ ƒZedd„ ƒZejdd„ ƒZedd„ ƒZedd„ ƒZed d!„ ƒZejd"d#„ ƒZd$d%„ Zd&d'„ Zd(d)„ Zed*œd+d,„Zd-d.„ Z d/d0„ Z!d1d2„ Z"d3d4„ Z#ed*œd5d6„Z$d7d8„ Z%d9d:„ Z&d;S )<ÚPayLoadéx   © z.zipc	           	      C   s˜   || _ || _|| _|| _tj| _|| _tƒ | _	t
|| j	ƒ| _d | _d| _d| _g | _| ¡ | _|| _|| _d | _d | _d | _d| _d| _d | _d| _d S )NFTé   é<   é   )Ú_PayLoad__keyÚ_PayLoad__filenameÚ_PayLoad__download_linkÚ_PayLoad__output_dirr   ÚESA_CREDENTIALSÚ_PayLoad__credentialsÚ_PayLoad__statusr   Ú_PayLoad__logger_streamr   Ú_PayLoad__loggerÚ_PayLoad__downloaderÚ_PayLoad__downloader_readyÚ_PayLoad__queued_for_downloadÚ_PayLoad__is_hash_correctÚupperÚ_PayLoad__md5_checksumÚ_PayLoad__payload_sizeÚ_PayLoad__extÚ_PayLoad__hash_check_threadÚ_PayLoad__request_threadÚ_PayLoad__recheck_threadÚ_PayLoad__fail_retriesÚ_PayLoad__fail_retry_inÚ_PayLoad__fail_retry_atÚ_PayLoad__retry_in_multiplier)	ÚselfÚkeyÚdownload_linkÚ
output_dirÚfilenameÚmd5_checksumZpayload_sizeÚstatusÚextr
   r
   úE/mnt/cestravail/FreezeDetection/sentSatProg_v.0.1.3/payloadmanager.pyÚ__init__   s,    
zPayLoad.__init__c                 C   s   | j S ©N)r   ©r&   r
   r
   r.   r'   +   s    zPayLoad.keyc                 C   s   | j S r0   ©r   r1   r
   r
   r.   r*   /   s    zPayLoad.filenamec                 C   s   | j }|dd… |dd…  S )Nr   é   é   é    r2   )r&   ÚprodNamer
   r
   r.   Úproduct_short_name3   s    zPayLoad.product_short_namec                 C   s   | j S r0   )r   r1   r
   r
   r.   r(   8   s    zPayLoad.download_linkc                 C   s   | j S r0   )r   r1   r
   r
   r.   r)   <   s    zPayLoad.output_dirc                 C   s   | j d | j | j S )Nú/)r   r   r   r1   r
   r
   r.   Ú	full_path@   s    zPayLoad.full_pathc                 C   s   | j S r0   )r   r1   r
   r
   r.   ÚsizeD   s    zPayLoad.sizec                 C   s   | j S r0   )r   r1   r
   r
   r.   Úesa_credentialsH   s    zPayLoad.esa_credentialsc                 C   s,   t |ƒtk	r"t|ƒdkr"tdƒ‚n|| _d S )Nr   z)Credentials should be a tuple of length 2)ÚtypeÚtupleÚlenÚ
ValueErrorr   ©r&   Úvaluer
   r
   r.   r;   L   s    
c                 C   s   | j S r0   )r   r1   r
   r
   r.   Ú
downloaderS   s    zPayLoad.downloaderc                 C   s   | j S r0   ©r   r1   r
   r
   r.   r,   W   s    zPayLoad.statusc                 C   s
   || _ d S r0   rC   r@   r
   r
   r.   r,   [   s    c                 C   s   | j S r0   )r   r1   r
   r
   r.   Úlog_   s    zPayLoad.logc                 C   s   | j S r0   )r   r1   r
   r
   r.   Úlog_textc   s    zPayLoad.log_textc                 C   s   | j S r0   ©r   r1   r
   r
   r.   Úqueued_for_downloadg   s    zPayLoad.queued_for_downloadc                 C   s
   || _ d S r0   rF   r@   r
   r
   r.   Úqueued_for_fownloadk   s    zPayLoad.queued_for_fownloadc                 C   s   | j  | _ d S r0   rF   r1   r
   r
   r.   Útoggle_downloado   s    zPayLoad.toggle_downloadc                 C   sŠ   t | jƒtk	r$t| jƒdkr$tdƒ‚t| j| jd | j | j	 dd| j
| jd| jd | jd dd
| _| j | jd | jd ¡ d	| _d S )
Nr   zCredentials Not setup correctlyr8   FÚmd5r   é   )	ÚdestÚprogress_barÚfix_urlsÚloggerÚhash_checksumÚ	hash_algoÚusernameÚpasswordÚthreadsT)r<   r   r=   r>   r?   ÚDMr   r   r   r   r   r   r   Úadd_basic_authenticationr   r1   r
   r
   r.   Úconfigure_downloaderr   s           ÿzPayLoad.configure_downloaderc                 C   sì   | j r¼| jtjkr¼z&| jjdd tj| _| j d¡ W qè   tj	| _| j
dkr¢| j
d | _
t ¡ | j | _| j d | j
tj| jdd¡¡ |  j| j9  _n| j d	 d
¡¡ Y qèX n,| j sÐ| j d¡ n| jtjkrè| j d¡ d S )NF)Úblockingéþÿÿÿr   rK   ú7Download failed - Retries left [{}] - Next retry in: {}T©Ú	fmt_shortú,Download failed - No retries left
End Log
{}ú####################zACould not start downlad because the download manager is not Readyz@could not start download because download is already in progress)r   r   r   ÚOnliner   ÚstartÚDownloadingr   ÚappendÚFailedr"   Útimer#   r$   r   ÚwarningÚformatr   Ú
time_humanr%   Úerrorr1   r
   r
   r.   Údownload}   s"    
"zPayLoad.download)Ú
main_timerc              
   C   s  | j  ¡  | tj¡rúz(| j d¡ tj| j	| j
dddd}W nH tk
r† } z*| j d t|ƒ¡¡ | j  ¡  W Y ¢d S d }~X Y nX |jdkr¨tj| _| j d¡ nF|jdkrÈtj| _| j d	¡ n&|jd
krîtj| _| j d¡ | ¡  | j  ¡  n
| j  ¡  d S )NZ
RequestingTé
   ©ÚauthÚverifyÚstreamÚtimeoutzCould not attempt request:
{}éÊ   zImage has been requestedéÈ   z%Image is Online - Queued for downloadi“  zRequests exceed user quota)Ú_PayLoad__thread_rlockÚacquireÚhas_elapsedr   ÚRECHECK_PERIODr   ÚinfoÚrequestsÚgetr   r   Ú	Exceptionrh   rf   ÚstrÚreleaseÚstatus_coder   Ú	Requestedr   r_   ÚPendingÚtick©r&   rj   ÚrÚer
   r
   r.   Úattempt_request”   s*    




zPayLoad.attempt_requestc              
   C   sä   | j  ¡  | tjd ¡rÖzptj| j dd¡| j	dddd}|j
dkr~|  | ¡ d ¡ |  | ¡ d ¡ | j d	¡ | ¡  | j  ¡  W qà tk
rÒ } z*| j d
 t|ƒ¡¡ | j  ¡  W Y ¢d S d }~X Y qàX n
| j  ¡  d S )Nr   z$valuez?$format=jsonTrk   rl   rr   ÚdzChecking Online availabilityz'Could not check Online availability:
{})rs   rt   ru   r   rv   rx   ry   r   Úreplacer   r}   Úupdate_checksum_from_metaÚjsonÚupdate_status_from_metar   rw   r€   r|   rz   rf   r{   r   r
   r
   r.   Úcheck_online°   s    
 

zPayLoad.check_onlinec                 C   sL   | j  d¡ | jd dkrHtj| jdd| _d| j_| j ¡  d| jd< d S )NzCalculating Hash...éÿÿÿÿrY   r
   ©ÚtargetÚargsT)	r   rw   r   Ú	threadingÚThreadÚ#_PayLoad__verify_hash_thread_targetr   Údaemonr`   r1   r
   r
   r.   Úverify_hash_threadedÅ   s    
zPayLoad.verify_hash_threadedc                 C   s   dS dS d S )NrK   rJ   r8   r   )r   Úget_file_hashr   r   r   r   r   )r&   r+   Z	hashValuer
   r
   r.   Úverify_hashÍ   s        zPayLoad.verify_hashc                 C   s   |   | j¡| jd< d S )Nr‹   )r•   r   r   r1   r
   r
   r.   Z__verify_hash_thread_targetÖ   s    z#PayLoad.__verify_hash_thread_targetc              	   C   s*  | j tjk rT| jr | j ¡ dk	s*| jd krTtj| j|fd| _d| j_| j 	¡  nÒ| j tjkr´| j
rt| j
 ¡ dk	s~| j
d kr´| j d¡ tj| j|fd| _
d| j
_| j
 	¡  nr| j tjkrb| j ¡ r&| j ¡ rêtj| _ |  ¡  nvtj| _ | jdkrN| jd | _t ¡ | j | _| j d | jtj| jdd¡¡ |  j| j9  _n| j d d	¡¡ nÄ| j tjkrŽtj| _ | j  !d
¡ |  ¡  n˜| j tjkrÊt ¡ | jkr&| j d¡ |  "¡  tj#| _ n\| j tjkr&| j d }|dkrtj$| _ | j d d	¡¡ n|dkr&tj%| _ | j d¡ d S )NTrŒ   zwe will see if onliner   rK   rZ   r[   r]   r^   rY   z/Resetting Downloader and requeuing for downloadr‹   zHash matches
End Log
{}z0Hash doesn't match.
Downloaded file is corrupted)&r   r   r~   r    Úis_aliver   r   r„   r’   r`   r!   r   rw   rŠ   ra   r   Ú
isFinishedÚisSuccessfulÚHashr“   rc   r"   rd   r#   r$   re   rf   r   rg   r%   rh   Ú
Downloadedr   rb   rW   ÚOfflineÚ	SucceededÚ	Corrupted)r&   rj   Úchr
   r
   r.   Úauto_update_statusÙ   sd    ÿÿþÿÿþ

"




zPayLoad.auto_update_statusc                 C   s   |d d | _ d S )NÚChecksumÚValue)r   ©r&   ZresponseJsonr
   r
   r.   r‡     s    z!PayLoad.update_checksum_from_metac                 C   s6   |d rt j| _| j d¡ n| j d|d  ¡ d S )Nr_   zImage is OnlinezImage is Online?: %s)r   r_   r   r   rw   r¢   r
   r
   r.   r‰     s    zPayLoad.update_status_from_metaN)'Ú__name__Ú
__module__Ú__qualname__rv   r   r   ÚRLockrs   r   r›   r/   Úpropertyr'   r*   r7   r(   r)   r9   r:   r;   ÚsetterrB   r,   rD   rE   rG   rH   rI   rW   ri   r   r„   rŠ   r“   r•   r‘   rŸ   r‡   r‰   r
   r
   r
   r.   r   
   s^   















	8r   )Úmiscr   r   r   Ú	pySmartDLr   rU   r   Úior   rx   r   rd   r   r
   r
   r
   r.   Ú<module>   s   