o
    ÙKÕiAK  ã                   @   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@jAd1 Be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r¾t | ˆˆ¡}t | ˆ|j¡}tj| jdd�}tj	j
||d	�}|sµtj|d
�sÀt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 |s†z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_|rŒd }nt j|d
�}ˆ dkrŸt| |||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 ]}|	|ƒ q×t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sžt	 ¡ }|	|jƒ | d|j|jdœ¡ t||||||dd� dS |r¨t|dd|d�S t| dg ƒ}|s´t	 ¡ ‚t ||¡\}}t |ƒj!}t"|ƒj#}d}t $||¡D ]4}t%|||
|||| &d¡||ƒ	}|j'rï| |¡ |j(rîd|d< qÎd}| |¡ |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ýþ
ÿþ
ý'üÿþ
ü,ÿþýüûú
ù\ÿ
þýüûú
ùÿþýüûú
ùø	÷

ö #
 ÿÿø
ýýýýûýÚÿÿ
ù