o
    KiQ                   
   @   s|  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 d dlmZ d dl	m
Z
mZmZmZmZmZmZmZmZmZ d dlmZ d dlmZ d dlmZmZ d dlmZ d d	lmZ e Z d
Z!G dd dej"Z#dd Z$de%fddZ&d1ddZ'dd Z(dd Z)d1ddZ*dd Z+dd Z,dd Z-d ed!dfd"d#Z.d ed$ed%e/d&ee/ d!df
d'd(Z0d)d* Z1d2d,ee/ fd-d.Z2d/d0 Z3dS )3    Nwraps)Optional)
actionsapidaemonentitlementsevent_logger
exceptionslockmessagesstatusutil)CVE_OR_USN_REGEX)_is_attached)AptProxyScopesetup_apt_proxy)UAConfig)machine_tokenz[Kc                	   @   sJ   e Zd ZdefddZdededee dee fdd	Zd
efddZ	dS )CLIEnableDisableProgress
assume_yesc                C   s   | | _ || _d S N)is_interactiver   )selfr    r   7/usr/lib/python3/dist-packages/uaclient/cli/cli_util.py__init__"   s   
z!CLIEnableDisableProgress.__init__total_steps
done_stepsprevious_step_messagecurrent_step_messagec                C   s   |d ur
t | d S d S r   )print)r   r   r   r   r    r   r   r   progress&   s   z!CLIEnableDisableProgress.progresseventc                 C   s:   |dkr
t | d S |dkrt|| jst d S d S )Ninfomessage_operation)r!   r   handle_message_operationsr   r
   PromptDeniedError)r   r#   payloadr   r   r   	_on_event1   s   z"CLIEnableDisableProgress._on_eventN)
__name__
__module____qualname__boolr   intr   strr"   r)   r   r   r   r   r   !   s    
r   c                  O   s   d S r   r   argskwargsr   r   r   _null_print9   s   r3   json_outputc                 C   s   | rt S tS r   )r3   r!   )r4   r   r   r   &create_interactive_only_print_function=   s   r5   c                        fdd}|S )z1Decorator asserting exclusive access to lock filec                       t   fdd}|S )Nc                    sF   t jdd  |d| i|}W d    |S 1 sw   Y  |S )N   )lock_holder
sleep_timecfg)r   	RetryLock)r;   r1   r2   retval)fr9   r   r   new_fH   s   
z0assert_lock_file.<locals>.wrapper.<locals>.new_fr   r>   r?   r9   r>   r   wrapperG   s   z!assert_lock_file.<locals>.wrapperr   )r9   rC   r   rA   r   assert_lock_fileD   s   	rD   c                       t   fdd}|S )zDecorator asserting root userc                     s   t  st  | i |S r   )r   we_are_currently_rootr
   NonRootUserErrorr0   rB   r   r   r?   V   s   zassert_root.<locals>.new_fr   r@   r   rB   r   assert_rootS   s   rH   c                    rE   )z>Decorator to verify if correct params are used for json formatc                    sH   | s | g|R i |S | j dkr| jst  | g|R i |S )Njson)formatr   r
   CLIJSONFormatRequireAssumeYes)cmd_argsr1   r2   rB   r   r   r?   c   s
   z&verify_json_format_args.<locals>.new_fr   r@   r   rB   r   verify_json_format_args`   s   	rM   c                    r6   )zDecorator asserting attached config.
    :param msg_function: Optional function to generate a custom message
    if raising an UnattachedError
    c                    r7   )Nc                    sR   t |jsrt| dd}t| dd}|||d nt  | fd|i|S )Ncommand service)rN   service_namesr;   r;   )r   is_attachedgetattrr
   UnattachedError)r1   r;   r2   rN   rQ   )r>   raise_custom_error_functionr   r   r?   w   s   
z/assert_attached.<locals>.wrapper.<locals>.new_fr   r@   rU   rB   r   rC   v   s   z assert_attached.<locals>.wrapperr   )rU   rC   r   rV   r   assert_attachedp   s   rW   c                    rE   )z&Decorator asserting unattached config.c                    s<   t |jrt }tj|jddd | fd|i|S )NnamerO   )account_namer;   )r   rR   r   get_machine_token_filer
   AlreadyAttachedErroraccountget)r1   r;   r2   machine_token_filerB   r   r   r?      s   
z"assert_not_attached.<locals>.new_fr   r@   r   rB   r   assert_not_attached   s   r_   c                    r6   )Nc                    s   t   fdd}|S )Nc                    s:   t | dd}tt|stj| d| fd|i|S )Nsecurity_issuerO   )issuecmdr;   )rS   rematchr   r
   InvalidSecurityIssueIdFormat)r1   r;   r2   r`   )rb   r>   r   r   r?      s   z@assert_vulnerability_issue_valid.<locals>.wrapper.<locals>.new_fr   r@   rb   rB   r   rC      s   
z1assert_vulnerability_issue_valid.<locals>.wrapperr   )rb   rC   r   rf   r    assert_vulnerability_issue_valid   s   rg   c                 C   sf   t j||d\}}|r|rtjd|| d|dd|r(tjd|| dtj| d|dd)zRaises a custom error for enable/disable commands when unattached.

    Takes into consideration if the services exist or not, and notify the user
    accordingly.)namesr;   z, rO   )valid_service	operationinvalid_serviceservice_msg)ri   rj   )rj   rk   rl   )r   get_valid_entitlement_namesr
   UnattachedMixedServicesErrorjoinUnattachedValidServicesErrorUnattachedInvalidServicesError)rN   rQ   r;   entitlements_foundentitlements_not_foundr   r   r   &_raise_enable_disable_unattached_error   s(   
rt   r;   returnc                 C   s|   t | }|j}|rttjj|d nttj t	
  t	|  t| \}}t|}tt| t  d S )N)contract_name)r   rZ   rv   r#   r$   r   ATTACH_SUCCESS_TMPLrJ   ATTACH_SUCCESS_NO_CONTRACT_NAMEr   stopcleanupr   r   format_tabularr   handle_unicode_charactersprocess_events)r;   r^   rv   status_dict_retoutputr   r   r   post_cli_attach   s   


r   scopeset_key	set_valuec                 C   sR   |t jkr| j}| j}n|t jkr| j}| j}d|v r|}n|}t|||d dS )zS
    Handles setting part the apt proxies - global and uaclient scoped proxies
    https)
http_proxyhttps_proxyproxy_scopeN)r   GLOBALglobal_apt_http_proxyglobal_apt_https_proxyUACLIENTua_apt_http_proxyua_apt_https_proxyr   )r;   r   r   r   r   r   r   r   r   configure_apt_proxy   s   
	

r   c                 C   s`   t g d}|  s.tjd|t|t tj	  t
d tjd |  rd S d S )N)|/-\z{}{}{}g?)	itertoolscycleis_setsysstdoutwriterJ   nextCLEAR_LINE_ANSI_CODEflushtimesleep)stop_spinnermsgspinnerr   r   r   run_spinner   s   

r   rO   r   c                    r6   )Nc                    r7   )Nc                   s   t j s | fd|i|S t }tjt|fd}|   | fd|i|}|  |	  t j
dt  t j  |S )Nr;   )targetr1   )r   r   isatty	threadingEventThreadr   startsetro   r   r   r   )r1   r;   r2   r   spinner_threadr=   )r>   r   r   r   r?      s   

z,with_spinner.<locals>.wrapper.<locals>.new_fr   r@   r   rB   r   rC      s   zwith_spinner.<locals>.wrapperr   )r   rC   r   r   r   with_spinner   s   r   c                 C   st   | dkrt jj|  t jj S | dkrt jj|  t jj S | dkr*t jj|  t jj S | dkr8t jj|  t jj S | S )Nlowmediumhighcritical)r   TxtColorINFOBLUEENDCWARNINGYELLOWORANGEFAIL)priorityr   r   r   colorize_priority  s   r   r   )rO   )4r   rc   r   r   r   	functoolsr   typingr   uaclientr   r   r   r   r	   r
   r   r   r   r   'uaclient.api.u.pro.security.fix._commonr   (uaclient.api.u.pro.status.is_attached.v1r   uaclient.aptr   r   uaclient.configr   uaclient.filesr   get_event_loggerr#   r   AbstractProgressr   r3   r-   r5   rD   rH   rM   rW   r_   rg   rt   r   r/   r   r   r   r   r   r   r   r   <module>   sP    0


