o
    KiAK                     @   s  d dl Z d dlZd dlmZ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mZ d dlmZmZ d dlmZmZmZ d dlmZmZ d dlmZ d dlm Z  d d	l!m"Z"m#Z#m$Z$ d d
l%m&Z& d dl'm(Z( e)e*e+Z,edde-fde-fdeee.ef  fgZ/de
j0de.de-fddZ1	dFde
j0de-dee	j2 fddZ3de
j0de.dee dee de.de.de.fddZ4d e-d!ee.ef d"ee. d#ee. d$eee.ef  d%eee.ef  de-fd&d'Z5de
j0d(e.de.de-de-d e-d)eee.  dee dee d*e/fd+d,Z6e j7e j8e 9e j:d*e;fd-d.Z<e$d/ej=ej>e<e&j?d0e#e"dej@jAd1BejCe
0 d2d3d4d5d6e"d7ejDd8d9e"d:ejEjAd/d;d8d9e"d<ejFd8d9e"d=ejGd8d9e"d>ejHjAd?d@d4d?dAgd?dBe"dCejId4d9gdDgdEZJdS )G    N)AnyDictList
NamedTupleOptional)
apiconfigcontractentitlementsevent_logger
exceptionslockmessagesstatusutil)ServiceWithDependencies_dependencies)EnableOptionsEnableResult_enable)EnabledService_enabled_services)_is_attached)cli_util)ProArgumentProArgumentGroup
ProCommand)HelpCategory)machine_token_EnableOneServiceResultsuccessneeds_rebooterrorcfgvariant
assume_yesc           
      C   st   t |}t| }t| | }|s|tj d S t	| j
}t| j}|D ]}	t| |	j|d||d ||d	 q'd S )NF)	r#   ent_namer$   access_onlyr%   json_output
extra_argsenabled_servicesall_dependencies)r   &create_interactive_only_print_functionr   get_machine_token_filer	   get_enabled_by_default_servicesr
   r   NO_SERVICES_TO_AUTO_ENABLEr   r*   r   services_enable_one_servicename)
r#   r$   r%   r(   interactive_only_printmachine_token_fileservices_to_be_enabledr*   r+   enable_by_default_service r7   5/usr/lib/python3/dist-packages/uaclient/cli/enable.py_auto_enable_services0   s2   



r9   r'   progress_objectc           
   
   C   s   t |}tj| d||d}d}d}z tjdd |j|d\}}W d   n1 s,w   Y  W n tyD } zt  |d}~ww |s^|durT|j	durT|j	}	nt
j}	tjd|	dtdgg dg d	S )
a  
    Landscape gets special treatment because it currently not supported by our
    enable API. This function is a temporary workaround until we have a proper
    API for enabling landscape, which will happen after Landscape is fully
    integrated with the contracts backend.
    	landscape)called_namer'   r)   FNzcli.enable._enable_landscape)lock_holder)progress)servicereason)enableddisabledreboot_requiredr   )r   ProgressWrapperr
   LandscapeEntitlementr   	RetryLockenable	Exceptionclear_lock_file_if_presentmessager   GENERIC_UNKNOWN_ISSUEr   EntitlementNotEnabledErrorr   )
r#   r'   r)   r:   r>   r;   r    fail_reasoner@   r7   r7   r8   _enable_landscapeS   s>   

rO   r?   r+   r*   r<   service_titlec                    s  g }g }dd |D  t fdd|D d }	|	d ur/ fdd|	jD } fdd|	jD }|D ]'}
tj| jdd}t| |
}tj	j
||d	}|sQtj|d
sXtj||d	q1|D ]}t| |}tjj
||d}tj|d
sxtj||dq[t fdd|D d }|d urd urt| }t| |j}tj| jdd}tj	j
||d	}|stj|d
stj||d	d S d S d S )Nc                 S   s   g | ]}|j qS r7   r2   .0sr7   r7   r8   
<listcomp>   s    z2prompt_for_dependency_handling.<locals>.<listcomp>c                 3   s    | ]
}|j  kr|V  qd S NrQ   rR   )r?   r7   r8   	<genexpr>   s    z1prompt_for_dependency_handling.<locals>.<genexpr>c                    s   g | ]
}|j  v r|j qS r7   rQ   rR   enabled_service_namesr7   r8   rU      
    
c                    s   g | ]
}|j  vr|j qS r7   rQ   rR   rX   r7   r8   rU      rZ   z features.block_disable_on_enable)r   path_to_value)service_being_enabledincompatible_service)msg)r\   required_servicec                 3   s.    | ]}|j  kr|jr|jkr|V  qd S rV   r2   variant_enabledvariant_namerR   )r?   r$   r7   r8   rW      s    

)nextincompatible_with
depends_onr   is_config_value_truer#   r
   	get_titler   INCOMPATIBLE_SERVICEformatprompt_for_confirmationr   IncompatibleServiceStopsEnableREQUIRED_SERVICERequiredServiceStopsEnablerb   )r#   r?   r+   r*   r<   r$   rP   incompatible_servicesrequired_servicesdependenciesr]   cfg_block_disable_on_enableincompatible_service_titleuser_msgr_   required_service_titlera   to_be_enabled_titleenabled_variant_titler7   )rY   r?   r$   r8   prompt_for_dependency_handling   s   	


rw   r(   json_responseprocessed_servicesfailed_serviceserrorswarningsc                 C   sb   | r/|   |   |rdnd|d< ||d< ||d< ||d< ||d< ttj|tjdd	 d S d S )
Nr    failureresultry   rz   r{   r|   T)cls	sort_keys)sortprintjsondumpsr   DatetimeAwareJSONEncoder)r(   rx   ry   rz   r{   r|   r    r7   r7   r8   _print_json_output   s    	r   r&   r)   returnc	                    s  t |}	tj| |||d}
|
j |
j}t fdd|D d }|d urItjj	|d}|	|j
 |	tjj	|d tddd||j
|jddS |szt|  ||||d	 W n- tjy } z t| |	|j
 |	tjj	|d tddd dW  Y d }~S d }~ww z_|rd }nt j|d
} dkrt| |||d}ntt||d| |d}tj| d |r|	tjj	|d n	|	tjj	|d |j}|r|	tjj	dd |jD ]}|	| qtd|d dW S  tjy$ } z1|jd }|d }|d }|d }|	| |	tjj	|d tddd||||ddW  Y d }~S d }~w tjyU } z$|	|j
 |	tjj	|d tddd||j
|j|jddW  Y d }~S d }~ww )N)r$   r'   r)   c                 3   s2    | ]}|j  krr|jr|jkr|V  qd S rV   r`   rR   	real_namer$   r7   r8   rW     s    

z&_enable_one_service.<locals>.<genexpr>)titleFr?   )typer?   rJ   message_code)r    r!   r"   )r<   r$   rP   )r%   r;   )r)   r:   )r?   r$   r'   )r:   r#   install)	operationTr@   coder   additional_infor   r?   rJ   r   r   )r   r,   r
   entitlement_factoryr2   r   rc   r   ALREADY_ENABLEDri   r^   ENABLE_FAILEDr   rw   r   UbuntuProErrorLOG	exceptionCLIEnableDisableProgressrO   r   r   r   ACCESS_ENABLED_TMPLENABLED_TMPLrC   ENABLE_REBOOT_REQUIRED_TMPLrL   r   msg_code)r#   r&   r$   r'   r%   r(   r)   r*   r+   r3   ent	ent_titlealready_enabledr^   rN   r>   enable_resultr!   rJ   r@   err_codeerr_msgerr_infor7   r   r8   r1      s  	

	






r1   c                K   s  g }g }g }g }t jdd}| jdk}t|}	t| dd}
| j}| j}| j}|
r2|r2t	j
ddd|
r=|r=t	j
dd	d|rH|rHt	j
dd	d|	tj z	tj|dd
 W n! t	jt	jfyw   tjddd |dtjjtjjd Y nw t|jst	 }|	|j |d|j|jd t||||||dd dS |rt|dd|dS t| dg }|st	 t||\}}t |j!}t"|j#}d}t$||D ]4}t%|||
||||&d||	}|j'r|| |j(rd|d< qd}|| |j)dur||j) q|r&d}||7 }tj*||d}|	|j |dd|j|j|j+d t,|}|-  t|||||||d |r?dS dS )z^Perform the enable action on a named entitlement.

    @return: 0 on success, 1 otherwise
    F)_schema_versionr!   r   r$    --access-only	--variant)option1option2--auto)verbosezFailed to refresh contractT)exc_infosystem)r   rJ   r   )r       )r#   r$   r%   r(   r?   r)   r!   Nr   r   r   ).r   JSON_SCHEMA_VERSIONri   r   r,   getattrr'   r%   autor   InvalidOptionCombinationr   REFRESH_CONTRACT_ENABLEr	   refreshConnectivityErrorr   r   warningappendE_REFRESH_CONTRACT_FAILUREr^   r2   r   is_attached_and_contract_validContractExpiredErrorr   r   r9   NoServicesToEnabler
   get_valid_entitlement_namesr   r*   r   r0   order_entitlements_for_enablingr1   getr    r!   r"   *create_enable_entitlements_not_found_errorr   UAContractClientupdate_activity_token)argsr#   kwargsry   rz   r{   r|   rx   r(   r3   r$   r'   r%   r   expired_errnamesentitlements_foundentitlements_not_foundr*   r+   retr&   r~   errcontract_clientr7   r7   r8   action_enable  s   



	








r   rG      z, r   )optionsstore*)helpactionnargsr   
store_true)r   r   z--assume-yes)commandr   z--betaz--formatcli)defaultr   )r   r   choicesr   r   )	arguments)r   descriptionr   help_categoryhelp_positionargument_groupsrV   )Kr   loggingtypingr   r   r   r   r   uaclientr   r   r	   r
   r   r   r   r   r   r   +uaclient.api.u.pro.services.dependencies.v1r   r   %uaclient.api.u.pro.services.enable.v1r   r   r   -uaclient.api.u.pro.status.enabled_services.v1r   r   (uaclient.api.u.pro.status.is_attached.v1r   uaclient.clir   uaclient.cli.commandsr   r   r   uaclient.cli.parserr   uaclient.filesr   	getLoggerreplace_top_level_logger_name__name__r   boolstrr   UAConfigr9   AbstractProgressrO   rw   r   r1   verify_json_format_argsassert_rootassert_attached&_raise_enable_disable_unattached_errorintr   CLI_ROOT_ENABLECLI_ENABLE_DESC
QUICKSTARTCLI_ENABLE_SERVICEri   joinvalid_servicesCLI_ENABLE_ACCESS_ONLYCLI_ASSUME_YESCLI_ENABLE_AUTOCLI_ENABLE_BETACLI_FORMAT_DESCCLI_ENABLE_VARIANTenable_commandr7   r7   r7   r8   <module>   s$   0

'
,
\


	

 #
 

