o
    ÙKÕi‹!  ã                   @   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+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„Z0de*de,fdd„Z1dedee2 dee* fd d!„Z3edefd"d#„ƒZ4dedee/ fd$d%„Z5dedee/ fd&d'„Z6d(e/de/fd)d*„Z7def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	œ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%   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 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_applyQ   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_applyi   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   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_okÚ_apt)ÚuserÚ )ÚhashÚdestdir)Úcls)ÚosÚmakedirsr   ÚAPT_NEWS_PATHÚshutilÚchownÚ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¬   )9r1   r{   Úloggingro   rr   rX   Útypingr   r   rt   Ú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`     ÿÿ
þ%ÿÿ
þÿÿ
þ	&