U ϴfD!@sddlZddlZddlZddlZddlZddlmZmZddlZddl m Z m Z m Z m Z ddlmZmZddlmZmZmZddlmZddlmZddlmZmZmZmZmZmZdd l m!Z!m"Z"m#Z#e$e %e&Z'Gd d d eZ(Gd d d eZ)ddZ*eee(e+dddZ,ejeeje+dddZ-e.e+dddZ/e)e+dddZ0eee1ee)dddZ2eedd d!Z3eee.d"d#d$Z4eee.d"d%d&Z5e.e.d'd(d)Z6edd*d+Z7dS),N)ListOptional)defaultsmessagessystemutil)ContractExpiryStatus _is_attached)ensure_apt_pkg_initget_pkg_versionversion_compare)get_cloud_type)UAConfig) BoolDataValue DataObjectDatetimeDataValueFieldStringDataValue data_list) machine_tokennotices state_filesc @seZdZedeeddedeeddededdedeeddedeeeddgZdddddd ee e ee e ee ee e ee e e d d d Z dS) AptNewsMessageSelectors codenamesFZrequiredcloudspro architecturespackagesNrrrrrcCs"||_||_||_||_||_dSNr)selfrrrrrr"3/usr/lib/python3/dist-packages/uaclient/apt_news.py__init__*s z AptNewsMessageSelectors.__init__) __name__ __module__ __qualname__rrrrfieldsrrstrboolr$r"r"r"r#rs,      rc@sheZdZedeededdededdedeegZddde j e e j e ee e d d d Z dS) AptNewsMessagebeginendFr selectorslinesN)r-r.r,r-r.r/cCs||_||_||_||_dSr r0)r!r,r-r.r/r"r"r#r$BszAptNewsMessage.__init__)r%r&r'rrrrrr(datetimerrr)r$r"r"r"r#r+:s    r+cCsz|\}}}Wn"tk r0td|YdSXt|}|dkrFdSt||}t|dko`|dk|dkon|dk|dko||dkgS)NzInvalid package selector: %rFr)z==<=>=)r3) ValueErrorLOGZwarningr r any)package_selectorZ package_nameZversion_operatorZpackage_versionZinstalled_package_versionZversion_comparisonr"r"r#_does_package_selector_applyPs& r:)cfgr.returncCs|dkr dS|jdk r*tj|jkr*dS|jdk rXt\}}|dk rJdS||jkrXdS|jdk rv|jt|jkrvdS|j dk rt |j krdS|j dk rt dd|j DsdSdS)NTFcSsg|] }t|qSr")r:).0r9r"r"r# sz&do_selectors_apply..) rrZget_release_infoZseriesrr rr Z is_attachedrZ get_dpkg_archrr8)r;r.Zcloud_idZfailr"r"r#do_selectors_applyhs2       r?)r,r-r<cCsVtjtjj}||krdS|tjdd}|dks<||krB|}n|}||krRdSdS)NF)ZdaysT)r1nowtimezoneZutcZ timedelta)r,r-rAZone_month_after_beginZ end_to_user"r"r#do_dates_applysrC)cr<cCst|ddkS)NrC) unicodedatacategory)rDr"r"r#is_control_charsrH)msgr<cCs^t|jdkrdSt|jdkr$dS|jD].}tdd|DrFdSt|dkr*dSq*dS)NFcSsg|] }t|qSr")rH)r=rDr"r"r#r>sz$is_message_valid..MT)lenr/r8)rIliner"r"r#is_message_valids  rO)r;rr<c Cs|D]}zt|}Wn6tk rL}ztd|WYqW5d}~XYnXt|sdtd|qt|j|jstd|qt ||j std|q|SdS)Nzmsg failed parsing: %rzmsg not valid: %rzmsg dates don't apply: %rzmsg selectors don't apply: %r) r+Z from_dict Exceptionr7debugrOrCr,r-r?r.)r;rZmsg_dictrIer"r"r#select_messages"     rS)r;cCsRtjtjddt}tj||jdtjd}|t |j }t j |tjdS)NT)exist_ok)hashZdestdir)cls)osmakedirsrZ UAC_RUN_PATHapt_pkgZAcquireZ AcquireFileZ apt_news_urlrunrZ load_fileZdestfilejsonloadsrZDatetimeAwareJSONDecoder)r;ZacqZ apt_news_fileZapt_news_contentsr"r"r#fetch_aptnews_jsons r^)r;r<cCs>t|}t||dg}td||dk r:d|jSdS)Nrz using msg: %r )r^rSgetr7rQjoinr/)r;Z news_dictrIr"r"r#fetch_and_process_apt_newss   rbcCst|}|j}|j}t|}|tjjkr>t tj j t j St tj j |tjjkrlt j|j|dS|tjjkrtj|}|j}|dkrd}n |d}t j|j||dSdS)z4 :return: str if local news, None otherwise )remaining_daysNZUnknownz%d %b %Y)Z expired_daterc)r Zcontract_statusZcontract_remaining_daysrZget_machine_token_filerZEXPIREDvalueraddZNoticeZCONTRACT_EXPIREDrremoveZACTIVE_EXPIRED_SOONZCONTRACT_EXPIRES_SOONZ pluralizeformatZEXPIRED_GRACE_PERIODrZ!CONTRACT_EXPIRY_GRACE_PERIOD_DAYSZcontract_expiry_datetimestrftimeZCONTRACT_EXPIRED_GRACE_PERIOD)r;Zis_attached_infoZ expiry_statusrcZmachine_token_fileZgrace_period_remainingZexp_dtZ exp_dt_strr"r"r#local_apt_newss4      ri)newsr<cCs.d}|dD]}|d|7}q|d7}|S)Nz# r_z# {} )splitrg)rjresultrNr"r"r#format_news_for_apt_updates rmc CszRt|}|st|}|rsJ    &   &