o
    ¦®Øfé<  ã                
   @   s¾   U d Z ddlZddlmZmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZ e e¡Zdg d	¢ed
gdœZe
ed< dededededdf
dd„ZG dd„ deƒZG dd„ dƒZddd„ZdS )zDRed Hat Subscription: Register Red Hat Enterprise Linux based systemé    N)ÚsubpÚutil)ÚCloud)ÚConfig)Ú
MetaSchema)ÚPER_INSTANCEÚcc_rh_subscription)ÚfedoraÚrhelÚ	openeulerÚrh_subscription)ÚidÚdistrosÚ	frequencyÚactivate_by_schema_keysÚmetaÚnameÚcfgÚcloudÚargsÚreturnc              
   C   s`  t |td}| ¡ st d| ¡ d S | ¡ s©zs| ¡ \}}|dur%t|ƒ‚| ¡ }|s/tdƒ‚|jrF|j	d urF| 
¡ s?tdƒ‚|j d¡ n|jrW| ¡ sQtdƒ‚|j d¡ |jd urxt|jtƒshd	}t|ƒ‚| |j¡}	|	sxtd
 |j¡ƒ‚| ¡ }	|	s‚tdƒ‚| d¡ W d S  ty¨ }
 z| t|
ƒ¡ | d¡ W Y d }
~
d S d }
~
ww | d¡ d S )N)Úlogz%s: module not configured.Tz-Registration failed or did not run completelyzSetting of service-level failedz(Completed auto-attach with service levelzSetting auto-attach failedzCompleted auto-attachz"Pools must in the format of a listzUnable to attach pools {0}zUnable to add or remove reposz-rh_subscription plugin completed successfullyz4rh_subscription plugin did not complete successfullyzSystem is already registered)ÚSubscriptionManagerÚLOGÚis_configuredÚdebugÚis_registeredÚ_verify_keysÚSubscriptionErrorÚrhn_registerÚauto_attachÚservicelevelÚ_set_service_levelr   Ú_set_auto_attachÚpoolsÚ
isinstanceÚlistÚaddPoolÚformatÚupdate_reposÚlog_successÚlog_warnÚstr)r   r   r   r   ÚsmÚverifyÚ
verify_msgÚcontÚ	pool_failÚreturn_statÚe© r4   úE/usr/lib/python3/dist-packages/cloudinit/config/cc_rh_subscription.pyÚhandle   sR   ÿ	

ÿ€þr6   c                   @   s   e Zd ZdS )r   N)Ú__name__Ú
__module__Ú__qualname__r4   r4   r4   r5   r   P   s    r   c                   @   s~   e Zd Zg d¢Zddd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )r   )Úorgúactivation-keyÚusernameÚpasswordúdisable-repoúenable-repoúadd-poolúrhsm-baseurlúserver-hostnameúauto-attachúservice-levelNc                 C   sÆ   |d u rt }|| _|| _| j di ¡| _| j d¡| _| j d¡| _| j d¡| _| j d¡| _| j d¡| _	| j d¡| _
| j d¡| _| j d	¡| _| j d
¡| _| j d¡| _| j d¡| _d S )Nr   rA   rB   r@   r;   r:   r<   r=   rC   r?   r>   rD   )r   r   r   ÚgetÚrhel_cfgÚrhsm_baseurlÚserver_hostnamer$   Úactivation_keyr:   Úuseridr=   r    Úenable_repoÚdisable_repor!   )Úselfr   r   r4   r4   r5   Ú__init__c   s    zSubscriptionManager.__init__c                 C   ó   | j  |¡ dS )z>Simple wrapper for logging info messages. Useful for unittestsN)r   Úinfo©rM   Úmsgr4   r4   r5   r*   u   ó   zSubscriptionManager.log_successc                 C   rO   )zASimple wrapper for logging warning messages. Useful for unittestsN)r   ÚwarningrQ   r4   r4   r5   r+   y   rS   zSubscriptionManager.log_warnc                 C   s”   | j D ]}|| jvrd |d | j¡¡}d|f  S q| jdur2t | j¡s2t | j¡s2d}d|fS | jdurH| jrBt t	| jƒ¡rHd}d|fS dS )zq
        Checks that the keys in the rh_subscription dict from the user-data
        are what we expect.
        z?{0} is not a valid key for rh_subscription. Valid keys are: {1}ú, FNz8The key auto-attach must be a boolean value (True/False zqThe service-level key must be used in conjunction with the auto-attach key.  Please re-run with auto-attach: True)TN)
rF   Úvalid_rh_keysr(   Újoinr    r   Úis_trueÚis_falser!   r,   )rM   ÚkÚbad_keyÚnot_boolÚno_autor4   r4   r5   r   }   s0   

ýú
	
ÿ
ÿÿ
ÿÿÿz SubscriptionManager._verify_keysc                 C   s,   dg}zt |ƒ W dS  tjy   Y dS w )zg
        Checks if the system is already registered and returns
        True if so, else False
        ÚidentityFT)Ú_sub_man_clir   ÚProcessExecutionError)rM   Úcmdr4   r4   r5   r       s   
ýÿz!SubscriptionManager.is_registeredc              
   C   s¼  | j dur`| jdur`dd | j ¡d | j¡g}| jdur%| d | j¡¡ | jdur3| d | j¡¡ z
t|ddd	 }W nŽ tjy_ } z|j	d
krT|  
d |j¡¡ W Y d}~dS d}~ww | jdurÀ| jdurÀdd | j¡d | j¡g}| jdur…| d | j¡¡ | jdur“| d | j¡¡ z
t|ddd	 }W n. tjy¿ } z|j	d
kr´|  
d |j¡¡ W Y d}~dS d}~ww |  
d¡ |  
d¡ dS | d¡d  ¡ }| j d|¡ dS )zŽ
        Registers the system by userid and password or activation key
        and org.  Returns True when successful False when not.
        NÚregisterz--activationkey={0}z	--org={0}z--baseurl={0}z--serverurl={0}T)Úlogstring_valr   Ú zRegistration failed due to: {0}Fz--username={0}z--password={0}z8Unable to register system due to incomplete information.z9Use either activationkey and org *or* userid and passwordzID: é   z"Registered successfully with ID %s)rI   r:   r(   rG   ÚappendrH   r_   r   r`   Ústdoutr+   ÚstderrrJ   r=   ÚsplitÚrstripr   r   )rM   ra   Ú
return_outr3   Úreg_idr4   r4   r5   r   ®   s`   

ý
	


ÿ€û

ý
	


ÿ€ûÿÿz SubscriptionManager.rhn_registerc              
   C   s¾   ddd  | j¡g}zt|ƒd }W n9 tjyJ } z,|j ¡ dkr4|j d¡D ]}|dkr2|  |¡ q'n|  d  |j	 
¡ ¡¡ W Y d }~dS d }~ww | d¡D ]}|dkr\| j |¡ qPd	S )
NÚattachú--autoz--servicelevel={0}r   rd   Ú
z*Setting the service level failed with: {0}FT)r(   r!   r_   r   r`   rg   rj   ri   r+   rh   Ústripr   r   ©rM   ra   rk   r3   Úliner4   r4   r5   r"   ö   s4   
ý
€þÿÿ€õ€z&SubscriptionManager._set_service_levelc              
   C   sz   ddg}zt |ƒd }W n tjy( } z|  d |¡¡ W Y d }~dS d }~ww | d¡D ]}|dkr:| j |¡ q.dS )	Nrm   rn   r   zAuto-attach failed with: {0}Fro   rd   T)r_   r   r`   r+   r(   ri   r   r   rq   r4   r4   r5   r#     s   €þ€z$SubscriptionManager._set_auto_attachc                 C   sT   g }g }g d¢}t |ƒd }| ¡  d¡}g d¢}t |ƒd }| ¡  d¡}||fS )zh
        Gets the list pools for the active subscription and returns them
        in list form.
        )r&   z--availableú--pool-onlyr   ro   )r&   z
--consumedrs   )r_   rj   ri   )rM   Ú	availableÚconsumedra   Úresultsr4   r4   r5   Ú	_getPools  s   zSubscriptionManager._getPoolsc                 C   s˜   ddg}t |ƒd }g }| d¡D ]}d|v r#| | d¡d  ¡ ¡ qddg}t |ƒd }g }| d¡D ]}d|v rG| | d¡d  ¡ ¡ q5||fS )	zl
        Obtains the current list of active yum repositories and returns
        them in list form.
        Úreposz--list-enabledr   ro   zRepo ID:ú:re   z--list-disabled)r_   ri   rf   rp   )rM   ra   rk   Úactive_reposÚrepoÚinactive_reposr4   r4   r5   Ú	_getRepos0  s   €€zSubscriptionManager._getReposc              
   C   sî   t |ƒdkr| j d¡ dS |  ¡ \}}g }dg}|D ]}||vr.||v r.| d |¡¡ q|  d |¡¡ qt |ƒdkru| |¡ zt|ƒ | j dd 	|¡ 
d	d
¡¡ W dS  tjyt } z|  d ||¡¡ W Y d}~dS d}~ww dS )zl
        Takes a list of subscription pools and "attaches" them to the
        current subscription
        r   zNo pools to attachTrm   z
--pool={0}zPool {0} is not availablez/Attached the following pools to your system: %srU   z--pool=rd   z$Unable to attach pool {0} due to {1}NF)Úlenr   r   rw   rf   r(   r+   Úextendr_   rW   Úreplacer   r`   )rM   r$   Úpool_availableÚpool_consumedÚ	pool_listra   Úpoolr3   r4   r4   r5   r'   F  s6   
þ
ÿ€ü÷zSubscriptionManager.addPoolc              
   C   s$  | j }| j}|du rg }|du rg }t|tƒs|  d¡ dS t|tƒs*|  d¡ dS t|ƒdkr>t|ƒdkr>| j d¡ dS |  ¡ \}}g }g }|D ]}||v rY| 	d 
|¡¡ qJ| 	|¡ qJg }g }	|D ]}||v rt| 	d 
|¡¡ qe|	 	|¡ qet|ƒdkr™|D ]}
|
|v r| j d	|
¡ q‚|  d
 
|
¡¡ q‚t|	ƒdkr«|	D ]	}
| j d|
¡ q¡dg}t|ƒdkr¹| |¡ t|ƒdkrÄ| |¡ zt|ƒ W n tjyæ } z|  d 
|¡¡ W Y d}~dS d}~ww t|ƒdkrû| j dd |¡ dd¡¡ t|ƒdkr| j dd |¡ dd¡¡ dS )zÑ
        Takes a list of yum repo ids that need to be disabled or enabled; then
        it verifies if they are already enabled or disabled and finally
        executes the action to disable or enable
        Nz&Repo IDs must in the format of a list.Fr   z No repo IDs to enable or disableTz--enable={0}z--disable={0}zRepo %s is already enabledz!Repo {0} does not appear to existz.Repo %s not disabled because it is not enabledrx   z Unable to alter repos due to {0}zEnabled the following repos: %srU   z	--enable=rd   z Disabled the following repos: %sz
--disable=)rK   rL   r%   r&   r+   r~   r   r   r}   rf   r(   r   r_   r   r`   rW   r€   )rM   ÚereposÚdreposrz   r|   Úenable_listÚenable_list_failÚrepoidÚdisable_listÚdisable_list_failÚfailra   r3   r4   r4   r5   r)   h  s~   



ÿÿ

€þþþz SubscriptionManager.update_reposc                 C   s   t | jr| jp	| jƒS ©N)ÚboolrJ   r=   rI   )rM   r4   r4   r5   r   ¾  s   z!SubscriptionManager.is_configuredr   )r7   r8   r9   rV   rN   r*   r+   r   r   r   r"   r#   rw   r}   r'   r)   r   r4   r4   r4   r5   r   T   s    
#H"Vr   Fc                 C   s   t j dg|  |dS )z·
    Uses the preferred cloud-init subprocess def of subp.subp
    and runs subscription-manager.  Breaking this to a
    separate function for later use in mocking and unittests
    zsubscription-manager)Ú	logstring)r   )ra   rc   r4   r4   r5   r_   Â  s   r_   )F)Ú__doc__ÚloggingÚ	cloudinitr   r   Úcloudinit.cloudr   Úcloudinit.configr   Úcloudinit.config.schemar   Úcloudinit.settingsr   Ú	getLoggerr7   r   r   Ú__annotations__r,   r&   r6   Ú	Exceptionr   r   r_   r4   r4   r4   r5   Ú<module>   s&   
ü6  p