o
    K&b4                     @   sh  d Z ddlZddlZddlZddlmZmZ ddlmZm	Z	m
Z
mZ ddlmZmZmZmZmZmZmZmZmZ ddlmZ ejG dd dejZejG d	d
 d
ejZdejdeeef fddZdedefddZ dedee fddZ!dejde
j"j#dedededededefddZ$dejd eddfd!d"Z%dejd eddfd#d$Z&dejde'fd%d&Z(dS )'a1  
Update messaging text for use in MOTD and APT custom Ubuntu Advantage messages.

Messaging files will be emitted to /var/lib/ubuntu-advantage/message-* which
will be sourced by apt-hook/hook.cc and various /etc/update-motd.d/ hooks to
present updated text about Ubuntu Advantage service and token state.
    N)ListTuple)configdefaultsentitlementsutil)	ANNOUNCE_ESM_TMPL!CONTRACT_EXPIRED_APT_NO_PKGS_TMPLCONTRACT_EXPIRED_APT_PKGS_TMPL"CONTRACT_EXPIRED_GRACE_PERIOD_TMPLCONTRACT_EXPIRED_MOTD_PKGS_TMPLCONTRACT_EXPIRED_SOON_TMPLDISABLED_APT_PKGS_TMPLDISABLED_MOTD_NO_PKGS_TMPLUBUNTU_NO_WARRANTY)ApplicationStatusc                   @   s    e Zd ZdZdZdZdZdZdS )ContractExpiryStatusr               N)__name__
__module____qualname__NONEACTIVEACTIVE_EXPIRED_SOONEXPIRED_GRACE_PERIODEXPIRED r   r   @/usr/lib/python3/dist-packages/uaclient/jobs/update_messaging.pyr      s    r   c                   @   s<   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdS )ExternalMessagezmotd-no-packages-apps.tmplzmotd-no-packages-infra.tmplzmotd-packages-apps.tmplzmotd-packages-infra.tmplz$apt-pre-invoke-no-packages-apps.tmplz%apt-pre-invoke-no-packages-infra.tmplz!apt-pre-invoke-packages-apps.tmplz"apt-pre-invoke-packages-infra.tmplz!apt-pre-invoke-esm-service-statuszmotd-esm-service-statuszmotd-esm-announcezubuntu-no-warrantyN)r   r   r   MOTD_APPS_NO_PKGSMOTD_INFRA_NO_PKGSMOTD_APPS_PKGSMOTD_INFRA_PKGSAPT_PRE_INVOKE_APPS_NO_PKGSAPT_PRE_INVOKE_INFRA_NO_PKGSAPT_PRE_INVOKE_APPS_PKGSAPT_PRE_INVOKE_INFRA_PKGSZAPT_PRE_INVOKE_SERVICE_STATUSZMOTD_ESM_SERVICE_STATUSESM_ANNOUNCEr   r   r   r   r    r!   '   s    r!   cfgreturnc                 C   s   | j stjdfS tj}tj}| j}d|  kr|kr"n ntj|fS | |  kr-dk r4n ntj|fS || k r>tj	|fS tj
|fS )z/Return a tuple [ContractExpiryStatus, num_days]r   )Zis_attachedr   r   r   !CONTRACT_EXPIRY_GRACE_PERIOD_DAYSCONTRACT_EXPIRY_PENDING_DAYSZcontract_remaining_daysr   r   r   r   )r+   Zgrace_periodZpending_expiryremaining_daysr   r   r    get_contract_expiry_status7   s   





r0   msg	tmpl_filec                 C   sB   | r
t ||  dS t | |drt |dd dS dS )zhWrite a template to tmpl_file.

    When msg is empty, remove both tmpl_file and the generated msg.
    .tmpl N)r   
write_fileremove_fileendswithreplace)r1   r2   r   r   r    _write_template_or_removeJ   s   

r9   msg_dirmsg_template_namesc                 C   s"   |D ]}t dtj| | qd S )Nr4   )r9   ospathjoin)r:   r;   namer   r   r    _remove_msg_templatesW   s   r@   entexpiry_statusr/   	pkgs_fileno_pkgs_filemotd_pkgs_filemotd_no_pkgs_filec                 C   s  d } }	 }
}|j  dd}d|}d|}t }t|d }|rC|j dkrC|d }tjj|d	dd
}dj|d}nd}tj	}|
 d tjkr|tjkrgtj|j|tjd}| }
 }}	n`|tjkrtj| }tj|j| jd|tjd}| }
 }}	n@|tjkrtj|||j|j tjd}tj|jtjd}	|	}tj|j|tjd}
n|tjkrtj|j||||d}tj|j|d}	tj| j d}t!|	tj|| t!|tj|| t!|tj|| t!|
tj|| dS )a  Write any related template content for an ESM service.

    If no content is applicable for the current service state, remove
    all service-related template files.

    :param cfg: UAConfig instance for this environment.
    :param ent: entitlements.base.UAEntitlement,
    :param expiry_status: Current ContractExpiryStatus enum for attached VM.
    :param remaining_days: Int remaining days on contrat, negative when
        expired.
    :param *_file: template file names to write.
    r4   -_z{{{}_PKG_COUNT}}z{{{}_PACKAGES}}series	esm-infrarelease.Zhyphenatedreleasezfor Ubuntu {release} )rK   r   )titler/   urlz%d %b %Y)rN   Zexpired_dater/   rO   )pkg_num	pkg_namesrN   r?   rO   )rN   rO   )rN   rP   rO   )rN   rP   rQ   eol_releaserO   messagesN)"r?   upperr8   formatr   get_platform_infois_active_esmr   EOL_UA_URL_TMPLBASE_ESM_URLapplication_statusr   ENABLEDr   r   r   rN   ZBASE_UA_URLr   r-   r   Zcontract_expiry_datetimestrftimer   r
   r	   r   r   r   r<   r=   r>   data_dirr9   )r+   rA   rB   r/   rC   rD   rE   rF   Zpkgs_msgZno_pkgs_msgZmotd_pkgs_msgZmotd_no_pkgs_msgZtmpl_prefixZtmpl_pkg_count_varZtmpl_pkg_names_varplatform_inforW   rK   
ua_esm_urlrR   Zgrace_period_remainingr:   r   r   r     _write_esm_service_msg_templates]   s   







r`   rI   c              	   C   s  t jj}t jj}t jj}t jj}t jj}t jj}t jj}t j	j}	t j
j}
tj| jd}td}|| }tj| jdd}t|pC|j }td}|| }t| \}}tj}d}d}t|rd}|tjtjfv rlt
}| d |kryd	}t
}n|tjkrd	}t |tj||
 |s|d
kr|}|rt!| ||||||	| nt"tj| jd|||	|gd |rt!| ||||||| dS t"tj| jd||||gd dS )zWrite messaging templates about available esm packages.

    :param cfg: UAConfig instance for this environment.
    :param series: string of Ubuntu release series: 'xenial'.
    rS   esm-appsfeatures.allow_betar   Zpath_to_valuerJ   Fr4   r   Ttrusty)r:   r;   N)#r!   r&   valuer(   r'   r)   r"   r$   r#   r%   r   r<   r=   r>   r]   r   entitlement_factoryr   is_config_value_truer+   boolis_betar0   r   r[   rW   r   r   r   rZ   r   r.   r9   r`   r@   )r+   rI   Zapps_no_pkg_fileZapps_pkg_fileZinfra_no_pkg_fileZinfra_pkg_fileZmotd_apps_no_pkg_fileZmotd_apps_pkg_fileZmotd_infra_no_pkg_fileZmotd_infra_pkg_fileZno_warranty_filer:   apps_cls	apps_instconfig_allow_betaZ
apps_validZ	infra_clsZ
infra_instrB   r/   enabled_statusZmsg_esm_appsZmsg_esm_infraZno_warranty_msgr   r   r    write_apt_and_motd_templates   s   





rn   c                 C   s   t d}|| }tj}| d |k}tj| jdd}t|p"|j	 }t
j| jd}t
j|tjj}	t }
t|
d }|rPtjj|
d dd	d
}ntj}t|dk||grjt|	dtj|d  dS t|	 dS )a  Write human-readable messages if ESM is offered on this LTS release.

    Do not write ESM announcements on trusty, esm-apps is enable or beta.

    :param cfg: UAConfig instance for this environment.
    :param series: string of Ubuntu release series: 'xenial'.
    ra   r   rb   rc   rS   rI   rK   rL   rG   rM   rd   
)rO   N)r   rf   r   r[   rZ   r   rg   r+   rh   ri   r<   r=   r>   r]   r!   r*   re   rV   rW   r   rX   rU   r8   rY   allr5   r   r6   )r+   rI   rj   rk   rm   Zapps_not_enabledrl   Zapps_not_betar:   Zesm_news_filer^   rW   r_   r   r   r    write_esm_announcement_message  s,   
rq   c                 C   s   t d tj| jd}tj|st| t	 d }t
|sEtD ]}tj||j}t| |drBt|dd q%dS t| | t| | tddg dS )	au  Emit templates and human-readable status messages in msg_dir.

    These structured messages will be sourced by both /etc/update.motd.d
    and APT UA-configured hooks. APT hook content will orginate from
    apt-hook/hook.cc

    Call esm-apt-hook process-templates to render final human-readable
    messages.

    :param cfg: UAConfig instance for this environment.
    z&Updating UA messages for APT and MOTD.rS   rI   r3   r4   Tz&/usr/lib/ubuntu-advantage/apt-esm-hookzprocess-templates)loggingdebugr<   r=   r>   r]   existsmakedirsr   rV   Zis_ltsr!   re   r6   r7   r8   rq   rn   Zsubp)r+   r:   rI   Zmsg_enumZmsg_pathr   r   r    update_apt_and_motd_messagesB  s"   






rv   ))__doc__enumrr   r<   typingr   r   Zuaclientr   r   r   r   Zuaclient.messagesr   r	   r
   r   r   r   r   r   r   Zuaclient.statusr   uniqueEnumr   r!   ZUAConfigintr0   strr9   r@   baseZUAEntitlementr`   rn   rq   rh   rv   r   r   r   r    <module>   sN    ,	


c_#