o
    ϴfU                     @   s   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mZ d dlmZ d dlmZ d dlmZ d dlmZmZ eeeZg d	Zd
ZdedefddZdefddZ deddfddZ!dS )    N)
exceptionslockmessagessystemutil)r   )FullAutoAttachOptionsfull_auto_attach)_is_attached)UAConfig)AUTO_ATTACH_STATUS_MOTD_FILE)noticesstate_files)  r   i  i  i   i@8  p  r   Q r     r    r    F r   逗 r   z./run/ubuntu-advantage/flags/auto-attach-failedereturnc                 C   s   t | tjrtjj| jdS t | tjrtjS t | tj	r%tj
j| jdS t | tjr3tjj| jdS t | tjrItjj| jddt| j S t | tjrUd| jS tjd| d t| pbtjS )	N)detail)pid)	error_msg)urlz: "{}"z"{}"zUnexpected exception)exc_info)
isinstanceapi_exceptionsInvalidProImager   $RETRY_ERROR_DETAIL_INVALID_PRO_IMAGEformatr   NonAutoAttachImageError(RETRY_ERROR_DETAIL_NON_AUTO_ATTACH_IMAGELockHeldErrorRETRY_ERROR_DETAIL_LOCK_HELDr   ContractAPIError%RETRY_ERROR_DETAIL_CONTRACT_API_ERRORbodyConnectivityError RETRY_ERROR_DETAIL_URL_ERROR_URLr   strcause_errorUbuntuProErrormsgLOGerrorUNKNOWN_ERROR)r    r1   C/usr/lib/python3/dist-packages/uaclient/daemon/retry_auto_attach.py,full_auto_attach_exception_to_failure_reason)   s,   r3   cfgc                 C   s>   t j  t j  tt ttj	j
 ttj	j d S )N)r   retry_auto_attach_state_filedeleteretry_auto_attach_options_filer   ensure_file_absentr   r   removeNoticeAUTO_ATTACH_RETRY_FULL_NOTICEAUTO_ATTACH_RETRY_TOTAL_FAILURE)r4   r1   r1   r2   cleanupA   s   


r=   c                 C   s  t | jrd S tj }|d ur|j}t|d  }|j}nd}t}d }t|D ]\}}t	j	
t	jj}|t	j|d }|jddd}tjtj|| |d |}	|	d u rXtj}	z| }W n	 tyg   Y nw tjj|| d |	| d}
ttd|
 d  z)tjd	d
 tjtjj || d |	| d W d    n1 sw   Y  W n
 t!j"y   Y nw t#$| t | jr naztj% }t& }|d ur|j'|_'|j(|_(t)| W  nE t*j+y   t,-d Y  n6 t*j.y } zt,/|j0 W Y d }~ n d }~w ty! } zt1|}t,2| W Y d }~q'd }~ww t3|  t | jsitjtjt4t|d |}	|	d u rCtj}	tj5jt4td |	d}
ttd|
 d  tjtjj6t4td |	d d S d S )Nr   )seconds)secondmicrosecond)interval_indexfailure_reason   )num_attemptsreasonnext_run_datestring
z

z+pro.daemon.retry_auto_attach.notice_updates)lock_holderz&already attached, ending retry service)rD   rE   )7r	   is_attachedr   r5   readrA   RETRY_INTERVALSrB   	enumeratedatetimenowtimezoneutc	timedeltareplacewriteRetryAutoAttachStater   r0   
astimezone	ExceptionAUTO_ATTACH_RETRY_NOTICEr    	isoformatr   
write_filer   r   	RetryLockr   addr:   r;   r   r#   timesleepr7   r   enableenable_betar   r   AlreadyAttachedErrorr.   infoEntitlementsNotEnabledErrorwarningr-   r3   r/   r=   len&AUTO_ATTACH_RETRY_TOTAL_FAILURE_NOTICEr<   )r4   persisted_stateoffset	intervalsrB   indexintervallast_attemptnext_attempt
msg_reasonauto_attach_status_msgpersisted_optionsoptionsr   r1   r1   r2   retry_auto_attachM   s   




	






rq   )"rM   loggingr\   uaclientr   r   r   r   r   uaclient.apir   2uaclient.api.u.pro.attach.auto.full_auto_attach.v1r   r   (uaclient.api.u.pro.status.is_attached.v1r	   uaclient.configr
   uaclient.daemonr   uaclient.filesr   r   	getLoggerreplace_top_level_logger_name__name__r.   rK   FLAG_FILE_PATHrV   r*   r3   r=   rq   r1   r1   r1   r2   <module>   s     