U
    Jh!                     @   s  d dl Z 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mZ d dlmZmZmZ d dlmZ d dlmZ d dlmZmZmZmZmZm Z  d d	l!m"Z"m#Z#m$Z$ e%e&e'Z(G d
d deZ)G dd deZ*dd Z+eee) e,dddZ-e j ee j  e,dddZ.e/e,dddZ0e*e,dddZ1eee2 ee* dddZ3eedd d!Z4eee/ d"d#d$Z5eee/ d"d%d&Z6e/e/d'd(d)Z7edd*d+Z8dS ),    N)ListOptional)defaultsmessagessystemutil)ContractExpiryStatus_is_attached)ensure_apt_pkg_initget_pkg_versionversion_compare)get_cloud_type)UAConfig)BoolDataValue
DataObjectDatetimeDataValueFieldStringDataValue	data_list)machine_tokennoticesstate_filesc                	   @   s   e Zd ZedeeddedeeddededdedeeddedeeeddgZdddddd	ee	e
  ee	e
  ee ee	e
  ee	e	e
   d	d
dZdS )AptNewsMessageSelectors	codenamesFZrequiredcloudsproarchitecturespackagesNr   r   r   r   r   c                C   s"   || _ || _|| _|| _|| _d S Nr   )selfr   r   r   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    r0   )r!   r,   r-   r.   r/   r"   r"   r#   r$   C   s    zAptNewsMessage.__init__)r%   r&   r'   r   r   r   r   r   r(   datetimer   r   r)   r$   r"   r"   r"   r#   r+   ;   s   r+   c                 C   s   z| \}}}W n" t k
r0   td|  Y dS X t|}|d krFdS t||}t|dko`|dk|dk on|dk|dko||dkgS )NzInvalid package selector: %rFr   )z==<=>=)<r2   )>r3   )
ValueErrorLOGZwarningr   r   any)package_selectorZpackage_nameZversion_operatorZpackage_versionZinstalled_package_versionZversion_comparisonr"   r"   r#   _does_package_selector_applyQ   s&     r:   )cfgr.   returnc                 C   s   |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 |j	d k	rt
 |j	krdS |jd k	rtdd |jD sdS dS )NTFc                 S   s   g | ]}t |qS r"   )r:   ).0r9   r"   r"   r#   
<listcomp>   s   z&do_selectors_apply.<locals>.<listcomp>)r   r   Zget_release_infoZseriesr   r   r   r	   Zis_attachedr   Zget_dpkg_archr   r8   )r;   r.   Zcloud_idZfailr"   r"   r#   do_selectors_applyi   s2    






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)r1   nowtimezoneZutcZ	timedelta)r,   r-   rA   Zone_month_after_beginZ
end_to_user"   r"   r#   do_dates_apply   s    rC   )cr<   c                 C   s   t | d dkS )Nr   C)unicodedatacategory)rD   r"   r"   r#   is_control_char   s    rH   )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"   )rH   )r=   rD   r"   r"   r#   r>      s     z$is_message_valid.<locals>.<listcomp>M   T)lenr/   r8   )rI   liner"   r"   r#   is_message_valid   s    
rO   )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	Exceptionr7   debugrO   rC   r,   r-   r?   r.   )r;   r   Zmsg_dictrI   er"   r"   r#   select_message   s"    rS   )r;   c                 C   sb   t jtjdd tjtjdd t }tj|| j	dtjd}|
  t|j}tj|tjdS )NT)exist_okZ_apt)user )hashZdestdir)cls)osmakedirsr   ZAPT_NEWS_PATHshutilchown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       ra   )r;   r<   c                 C   s>   t | }t| |dg }td| |d k	r:d|jS d S )Nr   zusing msg: %r
)ra   rS   getr7   rQ   joinr/   )r;   Z	news_dictrI   r"   r"   r#   fetch_and_process_apt_news   s    re   c                 C   s   t | }|j}|j}t| }|tjjkr>t	tj
j tjS ttj
j |tjjkrltj|j|dS |tjjkrtj| }|j}|dkrd}n
|d}tj|j||dS dS )z4
    :return: str if local news, None otherwise
    )remaining_daysNZUnknownz%d %b %Y)Zexpired_daterf   )r	   Zcontract_statusZcontract_remaining_daysr   Zget_machine_token_filer   ZEXPIREDvaluer   addZNoticeZCONTRACT_EXPIREDr   removeZACTIVE_EXPIRED_SOONZCONTRACT_EXPIRES_SOONZ	pluralizeformatZEXPIRED_GRACE_PERIODr   Z!CONTRACT_EXPIRY_GRACE_PERIOD_DAYSZcontract_expiry_datetimestrftimeZCONTRACT_EXPIRED_GRACE_PERIOD)r;   Zis_attached_infoZexpiry_statusrf   Zmachine_token_fileZgrace_period_remainingZexp_dtZ
exp_dt_strr"   r"   r#   local_apt_news   s4    

 rl   )newsr<   c                 C   s.   d}|  dD ]}|d|7 }q|d7 }|S )Nz#
rb   z# {}
)splitrj   )rm   resultrN   r"   r"   r#   format_news_for_apt_update	  s
    rp   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)rl   re   r   Zapt_news_raw_filewriterp   Zapt_news_contents_filedeleterP   r7   rQ   )r;   rm   Zapt_update_formatted_newsrR   r"   r"   r#   update_apt_news  s    

rs   )9r1   r_   ZloggingrY   r[   rF   typingr   r   r]   Zuaclientr   r   r   r   Z(uaclient.api.u.pro.status.is_attached.v1r   r	   Zuaclient.aptr
   r   r   Zuaclient.clouds.identityr   Zuaclient.configr   Zuaclient.data_typesr   r   r   r   r   r   Zuaclient.filesr   r   r   Z	getLoggerZreplace_top_level_logger_namer%   r7   r   r+   r:   r*   r?   rC   r)   rH   rO   dictrS   ra   re   rl   rp   rs   r"   r"   r"   r#   <module>   sL     &  	&