
Ke$                 @   ss  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 j" e j# e$   Z% Gd d   d e  Z& Gd 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      Z0 e e e+ d! d" d#    Z1 e e e+ d! d$ d%    Z2 e+ e+ d& d' d(    Z3 e d d) d*    Z4 d 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               @   s   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 d d e e	 e
 e e	 e
 e e d d d	   Z d S)
AptNewsMessageSelectors	codenamesrequiredFcloudsproN)r   r   r   c            C   s   | |  _  | |  _ | |  _ d  S)N)r   r   r   )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               @   s   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	 e
 e	 j	 e
 e e e d d	 d
   Z d S)AptNewsMessagebeginendr   F	selectorslinesN)r%   r&   r'   r(   c            C   s(   | |  _  | |  _ | |  _ | |  _ d  S)N)r%   r&   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   s   | d  k r d S| j  d  k	 r; t j   j | j  k r; d S| j d  k	 r| t   \ } } | d  k	 ri d S| | j k r| d S| j d  k	 r | j t |   j k r d Sd 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   sy   t  j  j t  j j  } | |  k  r( d S|  t  j d d  } | d  k sV | | k r_ | } n | } | | k ru d Sd S)NFZdays   T)r)   nowZtimezoneZutcZ	timedelta)r%   r&   r.   Zone_month_after_beginZ
end_to_user   r   r   do_dates_apply^   s    	r/   )cr+   c             C   s   t  j |   d d k S)Nr   C)unicodedatacategory)r0   r   r   r   is_control_charp   s    r4   )msgr+   c             C   s}   t  |  j  d k  r d St  |  j  d k r2 d SxD |  j D]9 } t d d   | D  r_ d St  |  d k r< d Sq< Wd S)N   F   c             S   s   g  |  ] } t  |   q Sr   )r4   ).0r0   r   r   r   
<listcomp>{   s   	 z$is_message_valid.<locals>.<listcomp>M   T)lenr(   any)r5   liner   r   r   is_message_validt   s    r>   )r*   r   r+   c             C   s   x | D] } y t  j |  } Wn8 t k
 rZ } z t j d |  w WYd  d  } ~ Xn Xt |  sz t j d |  q t | j | j  s t j d |  q t	 |  | j
  s t j d |  q | SWd  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debugr>   r/   r%   r&   r,   r'   )r*   r   Zmsg_dictr5   er   r   r   select_message   s"    rC   )r*   c             C   sx   t  j t j d d t j   } t j | |  j d d d t j } | j   t	 j
 | j  } t j | d t j S)Nexist_okThash Zdestdircls)osmakedirsr   ZUAC_RUN_PATHapt_pkgZAcquireZAcquireFileZapt_news_urlZrunr   Z	load_filedestfilejsonloadsr   ZDatetimeAwareJSONDecoder)r*   ZacqZapt_news_fileZapt_news_contentsr   r   r   fetch_aptnews_json   s    
rN   )r*   r+   c             C   sW   t  |   } t |  | j d g    } t j d |  | d  k	 rS d j | j  Sd  S)Nr   zusing msg: %r
)rN   rC   getr@   rA   joinr(   )r*   Z	news_dictr5   r   r   r   fetch_and_process_apt_news   s    rR   c             C   s   t  |   \ } } | t j k r= t j j |  j d |  S| t j k r t j	 | } |  j
 j } | d k rz d } n | j d  } t j j |  j d | d |  S| t j k r t j Sd S)z4
    :return: str if local news, None otherwise
    remaining_daysNZUnknownz%d %b %YZexpired_date)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_datetimeZstrftimeZCONTRACT_EXPIRED_GRACE_PERIODZEXPIREDZCONTRACT_EXPIRED)r*   Zexpiry_statusrS   Zgrace_period_remainingZexp_dtZ
exp_dt_strr   r   r   local_apt_news   s     		rU   )newsr+   c             C   sA   d } x* |  j  d  D] } | d j |  7} q W| d 7} | S)Nz#
rO   z# {}
)splitrT   )rV   resultr=   r   r   r   format_news_for_apt_update   s
    
rY   c             C   s   yq t  |   } | s! t |   } | rV t j j |  t |  } t j j |  n t j j   t j j   WnO t k
 r } z/ t	 j
 d |  t j j   t j j   WYd  d  } ~ Xn Xd  S)Nz2something went wrong while processing apt_news: %r)rU   rR   r   Zapt_news_raw_filewriterY   Zapt_news_contents_fileZdeleter?   r@   rA   )r*   rV   Zapt_update_formatted_newsrB   r   r   r   update_apt_news   s    r[   )5r)   rL   ZloggingrH   r2   Ztypingr   r   rJ   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   r@   r   r$   r#   r,   r/   r"   r4   r>   dictrC   rN   rR   rU   rY   r[   r   r   r   r   <module>   s>   ".

	 