
    g!                     D   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jJ                   ejL                  e'            Z( G d
 de      Z) G d de      Z*d Z+dedee)   de,fdZ-de j                   dee j                      de,fdZ.de/de,fdZ0de*de,fdZ1dedee2   dee*   fdZ3edefd       Z4dedee/   fdZ5dedee/   fdZ6de/de/fd Z7defd!Z8y)"    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                      e Zd Z ed ee      d       ed ee      d       eded       ed ee      d       ed e ee            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
Zy)AptNewsMessageSelectors	codenamesFrequiredcloudsproarchitecturespackagesNr   r   r   r    r!   c                J    || _         || _        || _        || _        || _        y Nr"   )selfr   r   r   r    r!   s         3/usr/lib/python3/dist-packages/uaclient/apt_news.py__init__z AptNewsMessageSelectors.__init__+   s(     #*     )__name__
__module____qualname__r   r   r   r   fieldsr   r   strboolr'    r(   r&   r   r       s    k9_5Fh	/2UCe]U3oy9EJ	)O"<=	
F *.&*"-1.2! DI&! c#	!
 d^!  S	*! 4S	?+!r(   r   c            
           e Zd Z ede       eded       ede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	Zy)
AptNewsMessagebeginendFr   	selectorslinesN)r3   r4   c                <    || _         || _        || _        || _        y r$   )r2   r3   r4   r5   )r%   r2   r3   r4   r5   s        r&   r'   zAptNewsMessage.__init__C   s      
"
r(   )r)   r*   r+   r   r   r   r   r   r,   datetimer   r   r-   r'   r/   r(   r&   r1   r1   ;   s    g()e&7k2UCgy12	F ,07;    h''(	
 34 Cyr(   r1   c                     	 | \  }}}t        |      }|yt	        ||      }t        |dk(  xr |dv |dk  xr |dv |dkD  xr |dv g      S # t         $ r t        j                  d|        Y yw xY w)NzInvalid package selector: %rFr   )z==<=>=)<r9   )>r:   )
ValueErrorLOGwarningr   r   any)package_selectorpackage_nameversion_operatorpackage_versioninstalled_package_versionversion_comparisons         r&   _does_package_selector_applyrG   Q   s    :J7& !0 = ((!?  #a' ;$(::!#G(8K(G!#G(8K(G	
	 	  24DEs   A A-,A-cfgr4   returnc                    |y|j                   +t        j                         j                  |j                   vry|j                  t               \  }}|y||j                  vry|j                  #|j                  t        |       j                  k7  ry|j                  !t        j                         |j                  vry|j                  -t        |j                  D cg c]  }t        |       c}      syyc c}w )NTF)r   r   get_release_infoseriesr   r   r   r
   is_attachedr    get_dpkg_archr!   r@   rG   )rH   r4   cloud_idfailrA   s        r&   do_selectors_applyrQ   i   s     &""$++93F3FF#')$9+++}} ==L-999*!)@)@@% )2(:(:$ --=>
 s   !C<r2   r3   c                     t         j                   j                  t         j                  j                        }|| k  ry| t        j                  d      z   }|||kD  r|}n|}||kD  ryy)NF   )daysT)r7   nowtimezoneutc	timedelta)r2   r3   rU   one_month_after_begin
end_to_uses        r&   do_dates_applyr[      sk     



 1 1 5 5
6C
U{!H$6$6B$??
{c11*


Zr(   cc                 8    t        j                  |       d   dk(  S )Nr   C)unicodedatacategory)r\   s    r&   is_control_charra      s    "1%,,r(   msgc           	          t        | j                        dk  ryt        | j                        dkD  ry| j                  D ]6  }t        |D cg c]  }t        |       c}      r yt        |      dkD  s6 y yc c}w )N   F   M   T)lenr5   r@   ra   )rb   liner\   s      r&   is_message_validri      sn    
399~
399~		 D1q"12t9r>	  2s   A9
r   c                    |D ]  }	 t         j                  |      }t        |      st        j	                  d|       ;t        |j                  |j                        st        j	                  d|       rt        | |j                        st        j	                  d|       |c S  y # t        $ r }t        j	                  d|       Y d }~d }~ww xY w)Nzmsg failed parsing: %rzmsg not valid: %rzmsg dates don't apply: %rzmsg selectors don't apply: %r)r1   	from_dict	Exceptionr>   debugri   r[   r2   r3   rQ   r4   )rH   r   msg_dictrb   es        r&   select_messagerp      s      	 **84C  $II)3/cii1II137!#s}}5II5s;
    	II.2	s   B((	C1CCc                    t        j                  t        j                  d       t	        j
                  t        j                  d       t        j                         }t        j                  || j                  dt        j                        }|j                          t        j                  |j                        }t        j                  |t         j"                        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)rH   acqapt_news_fileapt_news_contentss       r&   fetch_aptnews_jsonr      s    KK&&6
LL''f5
//
C''SB0F0FM GGI(()?)?@::)) r(   c                     t        |       }t        | |j                  dg             }t        j	                  d|       |dj                  |j                        S y )Nr   zusing msg: %r
)r   rp   getr>   rm   joinr5   )rH   	news_dictrb   s      r&   fetch_and_process_apt_newsr      sL    "3'I
immJ;
<CIIos#
yy##r(   c                    t        |       }|j                  }|j                  }t        j                  |       }|t
        j                  j                  k(  r=t        j                  t        j                  j                         t        j                  S t        j                  t        j                  j                         |t
        j                  j                  k(  r/t        j                  j!                  |      j#                  |      S |t
        j$                  j                  k(  ret&        j(                  |z   }|j*                  }|d}n|j-                  d      }t        j.                  j!                  |      j#                  ||      S y)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)rH   is_attached_infoexpiry_statusr   machine_token_filegrace_period_remainingexp_dt
exp_dt_strs           r&   local_apt_newsr      sJ    $C($44M%==N&==cB,44:::GNN334(((NN7>>223,@@FFF--77GNN) O 
 	
 ,AAGGG66G 	 $<<>"J4J55??

&#4J  
	
 r(   newsc                 h    d}| j                  d      D ]  }|dj                  |      z  } |dz  }|S )Nz#
r   z# {}
)splitr   )r   resultrh   s      r&   format_news_for_apt_updater   	  s@    F

4  ((//$''(
eOFMr(   c                    	 t        |       }|st        |       }|rJt        j                  j	                  |       t        |      }t        j                  j	                  |       y t        j                  j                          t        j                  j                          y # t        $ r\}t        j                  d|       t        j                  j                          t        j                  j                          Y d }~y d }~ww xY w)Nz2something went wrong while processing apt_news: %r)r   r   r   apt_news_raw_filewriter   apt_news_contents_filedeleterl   r>   rm   )rH   r   apt_update_formatted_newsro   s       r&   update_apt_newsr     s    /c"-c2D))//5(B4(H%..445NO..557))002 /		FJ**113%%,,../s   A#B# &<B# #	D,ADD)9r7   r   loggingry   r|   r_   typingr   r   r~   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)   r>   r   r1   rG   r.   rQ   r[   r-   ra   ri   dictrp   r   r   r   r   r   r/   r(   r&   <module>r      s      	   !  5 5 O N 3 $  ? >g:::8DE!j !6Z ,0"	"&'>?"	"J#+H,=,=#>	$-s -t -. T 	!$Zn, H   H # # #Xc] #LS S / /r(   