B
    žÒF^Ò,  ã               @   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
   úDC:\Users\ibrahim.fayad\Desktop\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 )N)r   )r&   r
   r
   r.   r*   /   s    zPayLoad.filenamec             C   s   | j }|dd… |dd…  S )Nr   é   é   é    )r   )r&   ÚprodNamer
   r
   r.   Úproduct_short_name3   s    zPayLoad.product_short_namec             C   s   | j S )N)r   )r&   r
   r
   r.   r(   8   s    zPayLoad.download_linkc             C   s   | j S )N)r   )r&   r
   r
   r.   r)   <   s    zPayLoad.output_dirc             C   s   | j d | j | j S )Nú/)r   r   r   )r&   r
   r
   r.   Ú	full_path@   s    zPayLoad.full_pathc             C   s   | j S )N)r   )r&   r
   r
   r.   ÚsizeD   s    zPayLoad.sizec             C   s   | j S )N)r   )r&   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.   r8   L   s    
c             C   s   | j S )N)r   )r&   r
   r
   r.   Ú
downloaderS   s    zPayLoad.downloaderc             C   s   | j S )N)r   )r&   r
   r
   r.   r,   W   s    zPayLoad.statusc             C   s
   || _ d S )N)r   )r&   r=   r
   r
   r.   r,   [   s    c             C   s   | j S )N)r   )r&   r
   r
   r.   Úlog_   s    zPayLoad.logc             C   s   | j S )N)r   )r&   r
   r
   r.   Úlog_textc   s    zPayLoad.log_textc             C   s   | j S )N)r   )r&   r
   r
   r.   Úqueued_for_downloadg   s    zPayLoad.queued_for_downloadc             C   s
   || _ d S )N)r   )r&   r=   r
   r
   r.   Úqueued_for_fownloadk   s    zPayLoad.queued_for_fownloadc             C   s   | j  | _ d S )N)r   )r&   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 correctlyr5   FÚmd5r   é   )	ÚdestÚprogress_barÚfix_urlsÚloggerÚhash_checksumÚ	hash_algoÚusernameÚpasswordÚthreadsT)r9   r   r:   r;   r<   ÚDMr   r   r   r   r   r   r   Úadd_basic_authenticationr   )r&   r
   r
   r.   Úconfigure_downloaderr   s    (zPayLoad.configure_downloaderc             C   sì   | j r¼| jtjkr¼y&| 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   rE   z7Download failed - Retries left [{}] - Next retry in: {}T)Ú	fmt_shortz,Download failed - No retries left
End Log
{}z####################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%   Úerror)r&   r
   r
   r.   Údownload}   s"    
"zPayLoad.download)Ú
main_timerc          
   C   s  | j  ¡  | tj¡rôy(| j d¡ tj| j	| j
dddd}W nB tk
r€ } z$| j d t|ƒ¡¡ | j  ¡  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   Ú	Exceptionr^   r\   ÚstrÚreleaseÚstatus_coder   Ú	Requestedr   rU   ÚPendingÚtick)r&   r`   ÚrÚer
   r
   r.   Úattempt_request”   s*    




zPayLoad.attempt_requestc          
   C   sÞ   | j  ¡  | tjd ¡rÐypt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  ¡  d S d }~X Y qÚX n
| j  ¡  d S )Nr   z$valuez?$format=jsonTra   )rb   rc   rd   re   rg   ÚdzChecking Online availabilityz'Could not check Online availability:
{})rh   ri   rj   r   rk   rm   rn   r   Úreplacer   rr   Úupdate_checksum_from_metaÚjsonÚupdate_status_from_metar   rl   ru   rq   ro   r\   rp   )r&   r`   rv   rw   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...éÿÿÿÿrS   r
   )ÚtargetÚargsT)	r   rl   r   Ú	threadingÚThreadÚ#_PayLoad__verify_hash_thread_targetr   ÚdaemonrV   )r&   r
   r
   r.   Úverify_hash_threadedÅ   s    
zPayLoad.verify_hash_threadedc             C   s   dS dS d S )NrE   rD   r5   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   )r&   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 )NT)r€   r   zwe will see if onliner   rE   z7Download failed - Retries left [{}] - Next retry in: {})rT   z,Download failed - No retries left
End Log
{}z####################rS   z/Resetting Downloader and requeuing for downloadr   zHash matches
End Log
{}z0Hash doesn't match.
Downloaded file is corrupted)&r   r   rs   r    Úis_aliver‚   rƒ   rx   r…   rV   r!   r   rl   r~   rW   r   Ú
isFinishedÚisSuccessfulÚHashr†   rY   r"   rZ   r#   r$   r[   r\   r   r]   r%   r^   Ú
Downloadedr   rX   rQ   ÚOfflineÚ	SucceededÚ	Corrupted)r&   r`   Úchr
   r
   r.   Úauto_update_statusÙ   sT    



"




zPayLoad.auto_update_statusc             C   s   |d d | _ d S )NÚChecksumÚValue)r   )r&   Ú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 )NrU   zImage is OnlinezImage is Online?: %s)r   rU   r   r   rl   )r&   r•   r
   r
   r.   r}     s    zPayLoad.update_status_from_metaN)'Ú__name__Ú
__module__Ú__qualname__rk   r   r‚   ÚRLockrh   r   rŽ   r/   Úpropertyr'   r*   r4   r(   r)   r6   r7   r8   Úsetterr>   r,   r?   r@   rA   rB   rC   rQ   r_   r   rx   r~   r†   rˆ   r„   r’   r{   r}   r
   r
   r
   r.   r   
   s>   	8r   )Úmiscr   r   r   Ú	pySmartDLr   rO   r   Úior   rm   r‚   rZ   r   r
   r
   r
   r.   Ú<module>   s   