U
    lHJe$                     @   s  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mZ d dlZd dl	m
Z
mZmZmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZmZ d d	lmZmZmZmZmZmZ d d
l m!Z! e"e#e$Z%G dd deZ&G dd deZ'eee& e(dddZ)e j ee j  e(dddZ*e+e(dddZ,e'e(dddZ-eee. ee' dddZ/eeddd Z0eee+ d!d"d#Z1eee+ d!d$d%Z2e+e+d&d'd(Z3edd)d*Z4dS )+    N)ListOptional)defaultsmessagessystemutil)_is_attached)ensure_apt_pkg_init)get_cloud_type)UAConfig)ContractExpiryStatusget_contract_expiry_status)BoolDataValue
DataObjectDatetimeDataValueFieldStringDataValue	data_list)state_filesc                   @   sl   e Zd ZedeeddedeeddededdgZddddee	e
  ee	e
  ee ddd	ZdS )
AptNewsMessageSelectors	codenamesFZrequiredcloudsproNr   r   r   c                C   s   || _ || _|| _d S Nr   )selfr   r   r    r   3/usr/lib/python3/dist-packages/uaclient/apt_news.py__init__$   s    z AptNewsMessageSelectors.__init__)__name__
__module____qualname__r   r   r   r   fieldsr   r   strboolr   r   r   r   r   r      s   	

r   c                   @   sh   e Zd ZedeededdededdedeegZddde	j	e
e	j	 e
e ee d	d
dZdS )AptNewsMessagebeginendFr   	selectorslinesN)r(   r)   r'   r(   r)   r*   c                C   s   || _ || _|| _|| _d S r   r+   )r   r'   r(   r)   r*   r   r   r   r   8   s    zAptNewsMessage.__init__)r    r!   r"   r   r   r   r   r   r#   datetimer   r   r$   r   r   r   r   r   r&   0   s   r&   )cfgr)   returnc                 C   sz   |d krdS |j d k	r*t j|j kr*dS |jd k	rXt \}}|d k	rJdS ||jkrXdS |jd k	rv|jt| jkrvdS dS )NTF)	r   r   Zget_release_infoZseriesr   r
   r   r   Zis_attached)r-   r)   Zcloud_idZfailr   r   r   do_selectors_applyF   s    




r/   )r'   r(   r.   c                 C   sV   t j t jj}|| k rdS | t jdd }|d ks<||krB|}n|}||krRdS dS )NF   )ZdaysT)r,   nowtimezoneZutcZ	timedelta)r'   r(   r1   Zone_month_after_beginZ
end_to_user   r   r   do_dates_apply^   s    r3   )cr.   c                 C   s   t | d dkS )Nr   C)unicodedatacategory)r4   r   r   r   is_control_charp   s    r8   )msgr.   c                 C   s^   t | jdk rdS t | jdkr$dS | jD ].}tdd |D rF dS t |dkr* dS q*dS )N   F   c                 S   s   g | ]}t |qS r   )r8   ).0r4   r   r   r   
<listcomp>{   s     z$is_message_valid.<locals>.<listcomp>M   T)lenr*   any)r9   liner   r   r   is_message_validt   s    
rB   )r-   r   r.   c                 C   s   |D ]}zt |}W n6 tk
rL } ztd| W Y qW 5 d }~X Y nX t|sdtd| qt|j|jstd| qt	| |j
std| q|  S d S )Nzmsg failed parsing: %rzmsg not valid: %rzmsg dates don't apply: %rzmsg selectors don't apply: %r)r&   Z	from_dict	ExceptionLOGdebugrB   r3   r'   r(   r/   r)   )r-   r   Zmsg_dictr9   er   r   r   select_message   s"    rG   )r-   c                 C   sR   t jtjdd t }tj|| jdtjd}|  t	
|j}tj|tjdS )NT)exist_ok )hashZdestdir)cls)osmakedirsr   ZUAC_RUN_PATHapt_pkgZAcquireZAcquireFileZapt_news_urlrunr   Z	load_fileZdestfilejsonloadsr   ZDatetimeAwareJSONDecoder)r-   ZacqZapt_news_fileZapt_news_contentsr   r   r   fetch_aptnews_json   s       rR   )r-   r.   c                 C   s>   t | }t| |dg }td| |d k	r:d|jS d S )Nr   zusing msg: %r
)rR   rG   getrD   rE   joinr*   )r-   Z	news_dictr9   r   r   r   fetch_and_process_apt_news   s    rV   c                 C   s   t | \}}|tjkr*tj|j|dS |tjkrttj	| }| j
j}|dkrTd}n
|d}tj|j||dS |tjkrtjS dS )z4
    :return: str if local news, None otherwise
    )remaining_daysNZUnknownz%d %b %Y)Zexpired_daterW   )r   r   ZACTIVE_EXPIRED_SOONr   ZCONTRACT_EXPIRES_SOONZ	pluralizeformatZEXPIRED_GRACE_PERIODr   Z!CONTRACT_EXPIRY_GRACE_PERIOD_DAYSZmachine_token_fileZcontract_expiry_datetimestrftimeZCONTRACT_EXPIRED_GRACE_PERIODZEXPIREDZCONTRACT_EXPIRED)r-   Zexpiry_statusrW   Zgrace_period_remainingZexp_dtZ
exp_dt_strr   r   r   local_apt_news   s*    


 
rZ   )newsr.   c                 C   s.   d}|  dD ]}|d|7 }q|d7 }|S )Nz#
rS   z# {}
)splitrX   )r[   resultrA   r   r   r   format_news_for_apt_update   s
    r^   c              
   C   s   zRt | }|st| }|r<tj| t|}tj| ntj  tj  W nB tk
r } z$t	
d| tj  tj  W 5 d }~X Y nX d S )Nz2something went wrong while processing apt_news: %r)rZ   rV   r   Zapt_news_raw_filewriter^   Zapt_news_contents_filedeleterC   rD   rE   )r-   r[   Zapt_update_formatted_newsrF   r   r   r   update_apt_news   s    

ra   )5r,   rP   ZloggingrL   r6   typingr   r   rN   Zuaclientr   r   r   r   Z(uaclient.api.u.pro.status.is_attached.v1r   Zuaclient.aptr	   Zuaclient.clouds.identityr
   Zuaclient.configr   Zuaclient.contractr   r   Zuaclient.data_typesr   r   r   r   r   r   Zuaclient.filesr   Z	getLoggerZreplace_top_level_logger_namer    rD   r   r&   r%   r/   r3   r$   r8   rB   dictrG   rR   rV   rZ   r^   ra   r   r   r   r   <module>   sJ       	 