o
    ϴfD!                     @   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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*dedee( de+fddZ,de j dee j  de+fddZ-de.de+fddZ/de)de+fddZ0dedee1 dee) fd d!Z2edefd"d#Z3dedee. fd$d%Z4dedee. fd&d'Z5d(e.de.fd)d*Z6defd+d,Z7d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	dee	e
  dee	e
  dee dee	e
  dee	e	e
   f
d
dZdS )AptNewsMessageSelectors	codenamesF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      s2    


r   c                
   @   sn   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de	j	de
e	j	 de
e dee fd	d
ZdS )AptNewsMessagebeginendFr   	selectorslinesN)r.   r/   c                C   s   || _ || _|| _|| _d S r!   )r-   r.   r/   r0   )r"   r-   r.   r/   r0   r#   r#   r$   r%   B   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 y   td|  Y dS w t|}|d u r"dS t||}t|dko/|dv |dk o6|dv |dko=|dv gS )NzInvalid package selector: %rFr   )z==<=>=)<r2   )>r3   )
ValueErrorLOGwarningr   r   any)package_selectorpackage_nameversion_operatorpackage_versioninstalled_package_versionversion_comparisonr#   r#   r$   _does_package_selector_applyP   s&   r@   cfgr/   returnc                 C   s   |d u rdS |j d urt j|j vrdS |jd ur,t \}}|d ur%dS ||jvr,dS |jd ur;|jt| jkr;dS |j	d urIt
 |j	vrIdS |jd urZtdd |jD sZdS dS )NTFc                 S      g | ]}t |qS r#   )r@   ).0r:   r#   r#   r$   
<listcomp>   s    z&do_selectors_apply.<locals>.<listcomp>)r   r   get_release_infoseriesr   r   r   r	   is_attachedr   get_dpkg_archr   r9   )rA   r/   cloud_idfailr#   r#   r$   do_selectors_applyh   s2   






rL   r-   r.   c                 C   sV   t j t jj}|| k rdS | t jdd }|d u s||kr!|}n|}||kr)dS dS )NF   )daysT)r1   nowtimezoneutc	timedelta)r-   r.   rO   one_month_after_begin
end_to_user#   r#   r$   do_dates_apply   s   rU   cc                 C   s   t | d dkS )Nr   C)unicodedatacategory)rV   r#   r#   r$   is_control_char   s   rZ   msgc                 C   s^   t | jdk r	dS t | jdkrdS | jD ]}tdd |D r# dS t |dkr, dS qdS )N   F   c                 S   rC   r#   )rZ   )rD   rV   r#   r#   r$   rE      s    z$is_message_valid.<locals>.<listcomp>M   T)lenr0   r9   )r[   liner#   r#   r$   is_message_valid   s   
ra   r   c                 C   s   |D ]K}zt |}W n ty# } ztd| W Y d }~qd }~ww t|s/td| qt|j|js=td| qt	| |j
sJt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,   	from_dict	Exceptionr7   debugra   rU   r-   r.   rL   r/   )rA   r   msg_dictr[   er#   r#   r$   select_message   s&   rg   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 )hashdestdir)cls)osmakedirsr   UAC_RUN_PATHapt_pkgAcquireAcquireFileapt_news_urlrunr   	load_filedestfilejsonloadsr   DatetimeAwareJSONDecoder)rA   acqapt_news_fileapt_news_contentsr#   r#   r$   fetch_aptnews_json   s   r}   c                 C   s>   t | }t| |dg }td| |d urd|jS d S )Nr   zusing msg: %r
)r}   rg   getr7   rd   joinr0   )rA   	news_dictr[   r#   r#   r$   fetch_and_process_apt_news   s   r   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r6tj|j|dS |tjjkr[tj| }|j}|du rKd}n|d}tj|j||dS dS )z4
    :return: str if local news, None otherwise
    )remaining_daysNUnknownz%d %b %Y)expired_dater   )r	   contract_statuscontract_remaining_daysr   get_machine_token_filer   EXPIREDvaluer   addNoticeCONTRACT_EXPIREDr   removeACTIVE_EXPIRED_SOONCONTRACT_EXPIRES_SOON	pluralizeformatEXPIRED_GRACE_PERIODr   !CONTRACT_EXPIRY_GRACE_PERIOD_DAYScontract_expiry_datetimestrftimeCONTRACT_EXPIRED_GRACE_PERIOD)rA   is_attached_infoexpiry_statusr   machine_token_filegrace_period_remainingexp_dt
exp_dt_strr#   r#   r$   local_apt_news   s4   

r   newsc                 C   s.   d}|  dD ]	}|d|7 }q|d7 }|S )Nz#
r~   z# {}
)splitr   )r   resultr`   r#   r#   r$   format_news_for_apt_update  s
   r   c              
   C   s   z,t | }|st| }|r tj| t|}tj| W d S tj  tj  W d S  tyO } zt	
d| tj  tj  W Y d }~d S d }~ww )Nz2something went wrong while processing apt_news: %r)r   r   r   apt_news_raw_filewriter   apt_news_contents_filedeleterc   r7   rd   )rA   r   apt_update_formatted_newsrf   r#   r#   r$   update_apt_news  s    

r   )8r1   rw   loggingrm   rX   typingr   r   rp   uaclientr   r   r   r   (uaclient.api.u.pro.status.is_attached.v1r   r	   uaclient.aptr
   r   r   uaclient.clouds.identityr   uaclient.configr   uaclient.data_typesr   r   r   r   r   r   uaclient.filesr   r   r   	getLoggerreplace_top_level_logger_namer&   r7   r   r,   r@   r+   rL   rU   r*   rZ   ra   dictrg   r}   r   r   r   r   r#   r#   r#   r$   <module>   s^     
%

	&