o
    ƒtÖh¡@  ã                
   @   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   sn  t |ƒ}| ¡ st d| ¡ d S | ¡ s°z|| ¡ \}}|dur#t|ƒ‚| ¡ }|s-tdƒ‚|jrC|j	d urC| 
¡ s=tdƒ‚t d¡ n|jrS| ¡ sNtdƒ‚t d¡ |jd urtt|jtƒsdd}t|ƒ‚| |j¡}	|	sttd	 |j¡ƒ‚| ¡ }	|	s~td
ƒ‚|jr‰| ¡  | ¡  t d¡ W d S  ty¯ }
 zt t|
ƒ¡ t d¡ W Y d }
~
d S d }
~
ww t d¡ d S )Nz%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Úis_configuredÚLOGÚdebugÚis_registeredÚ_verify_keysÚSubscriptionErrorÚrhn_registerÚauto_attachÚservicelevelÚ_set_service_levelÚ_set_auto_attachÚpoolsÚ
isinstanceÚlistÚaddPoolÚformatÚupdate_reposÚrelease_versionÚ_set_release_versionÚ_delete_packagemanager_cacheÚinfoÚwarningÚstr)r   r   r   r   ÚsmÚverifyÚ
verify_msgÚcontÚ	pool_failÚreturn_statÚe© r6   úE/usr/lib/python3/dist-packages/cloudinit/config/cc_rh_subscription.pyÚhandle   sX   ÿ	


ÿ€þr8   c                   @   s   e Zd ZdS )r   N)Ú__name__Ú
__module__Ú__qualname__r6   r6   r6   r7   r   T   s    r   c                   @   st   e Z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d„ ZdS )r   c                 C   s
  |  di ¡| _| j  d¡| _| j  d¡| _| j  d¡| _| j  d¡| _| j  d| j  d¡¡| _| j  d| j  d	¡¡| _| j  d
| 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   ÚorgÚusernameÚpasswordr)   Úrhsm_baseurlzrhsm-baseurlÚserver_hostnamezserver-hostnameÚadd_poolzadd-poolÚactivation_keyzactivation-keyr   zauto-attachÚenable_repozenable-repoÚdisable_repozdisable-repoÚservice_levelzservice-level)ÚgetÚrhel_cfgr<   Úuseridr>   r)   r?   r@   r#   rB   r   rC   rD   r    )Úselfr   r6   r6   r7   Ú__init__Z   s:   ÿÿÿÿÿÿÿ
ÿzSubscriptionManager.__init__c                 C   s^   | j durt | j ¡st | j ¡sd}d|fS | jdur-| j r't t| j ƒ¡r-d}d|fS dS )zq
        Checks that the keys in the rh_subscription dict from the user-data
        are what we expect.
        Nz8The key auto_attach must be a boolean value (True/False)FzqThe service_level key must be used in conjunction with the auto_attach key.  Please re-run with auto_attach: True)TN)r   r   Úis_trueÚis_falser    r.   )rI   Únot_boolÚno_autor6   r6   r7   r      s"   

ÿ
ÿÿ
ÿÿÿ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)rI   Úcmdr6   r6   r7   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rRt
 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°t
 d|j¡ W Y d}~dS d}~ww t
 d¡ t
 d¡ dS | d¡d  ¡ }t
 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: %sFz--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)rB   r<   r'   r?   Úappendr@   rP   r   rQ   Ústdoutr   r-   ÚstderrrH   r>   ÚsplitÚrstripr   )rI   rR   Ú
return_outr5   Úreg_idr6   r6   r7   r   ®   sX   

ý
	

€ý

ý
	

€ýÿÿz SubscriptionManager.rhn_registerc              
   C   s¸   ddd  | j¡g}zt|ƒd }W n7 tjyH } z*|j ¡ dkr4|j d¡D ]}|dkr2t 	|¡ q'n	t 	d|j
 ¡ ¡ W Y d }~dS d }~ww | d¡D ]}|dkrYt |¡ qNd	S )
NÚattachú--autoz--servicelevel={0}r   rU   Ú
z)Setting the service level failed with: %sFT)r'   r    rP   r   rQ   rX   r[   rZ   r   r-   rY   Ústripr   ©rI   rR   r\   r5   Úliner6   r6   r7   r!   ò   s2   
ý
€þþ€ö
€z&SubscriptionManager._set_service_levelc              
   C   st   ddg}zt |ƒd }W n tjy& } zt d|¡ W Y d }~dS d }~ww | d¡D ]}|dkr7t |¡ q,dS )	Nr^   r_   r   zauto_attach failed with: %sFr`   rU   T)rP   r   rQ   r   r-   rZ   r   rb   r6   r6   r7   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   r`   )r%   z
--consumedrd   )rP   r[   rZ   )rI   Ú	availableÚconsumedrR   Úresultsr6   r6   r7   Ú	_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   r`   zRepo ID:ú:rV   z--list-disabled)rP   rZ   rW   ra   )rI   rR   r\   Úactive_reposÚrepoÚinactive_reposr6   r6   r7   Ú	_getRepos+  s   €€zSubscriptionManager._getReposc              
   C   sÚ   |s	t  d¡ dS |  ¡ \}}g }dg}|D ]}||vr)||v r)| d |¡¡ qt  d|¡ qt|ƒdkrk| |¡ zt|ƒ t  dd 	|¡ 
d	d
¡¡ W dS  tjyj } zt  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
        zNo pools to attachTr^   z
--pool={0}zPool %s is not availabler   z/Attached the following pools to your system: %sú, z--pool=rU   z"Unable to attach pool %s due to %sNF)r   r   rh   rW   r'   r-   ÚlenÚextendrP   ÚjoinÚreplacer   rQ   )rI   r#   Úpool_availableÚpool_consumedÚ	pool_listrR   Úpoolr5   r6   r6   r7   r&   A  s2   

þ€þ÷zSubscriptionManager.addPoolc              
   C   s   | j }| j}|du rg }|du rg }t|tƒst d¡ dS t|tƒs*t d¡ dS |s5|s5t d¡ dS |  ¡ \}}g }g }|D ]}||v rP| d 	|¡¡ qA| |¡ qAg }g }	|D ]}||v rk| d 	|¡¡ q\|	 |¡ q\t
|ƒdkr|D ]}
|
|v r†t d	|
¡ qyt d
|
¡ qyt
|	ƒdkrž|	D ]}
t d|
¡ q•dg}t
|ƒdkr¬| |¡ t
|ƒdkr·| |¡ zt|ƒ W n tjy× } zt d|¡ W Y d}~dS d}~ww t
|ƒdkrët dd |¡ dd¡¡ t
|ƒdkrþt 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.Fz No repo IDs to enable or disableTz--enable={0}z--disable={0}r   zRepo %s is already enabledz Repo %s does not appear to existz.Repo %s not disabled because it is not enabledri   zUnable to alter repos due to %szEnabled the following repos: %sro   z	--enable=rU   z Disabled the following repos: %sz
--disable=)rC   rD   r$   r%   r   r-   r   rn   rW   r'   rp   rq   rP   r   rQ   rr   rs   )rI   ÚereposÚdreposrk   rm   Úenable_listÚenable_list_failÚrepoidÚdisable_listÚdisable_list_failÚfailrR   r5   r6   r6   r7   r(   a  sz   




ÿ

€þþþz SubscriptionManager.update_reposc                 C   s   t | jr| jp	| jƒS )N)ÚboolrH   r>   rB   )rI   r6   r6   r7   r   µ  s   z!SubscriptionManager.is_configuredc              
   C   sJ   dd| j › g}zt|ƒ W dS  tjy$ } ztd|› ƒ|‚d}~ww )z‡
        Execute "subscription-manager release --set=<release_version>"
        Raises Subscription error if the command fails
        Úreleasez--set=z%Unable to set release_version using: N)r)   rP   r   rQ   r   )rI   rR   r5   r6   r6   r7   r*   ¸  s   ÿþ€ÿz(SubscriptionManager._set_release_versionc              
   C   sH   t  d¡ zt d¡ t d¡ W dS  ty# } ztdƒ|‚d}~ww )zk
        Delete the package manager cache.
        Raises Subscription error if the deletion fails
        z"Deleting the package manager cachez/var/cache/dnfz/var/cache/yumz*Unable to delete the package manager cacheN)r   r   r   Údel_dirÚ	Exceptionr   )rI   r5   r6   r6   r7   r+   Æ  s   

ÿþ€ÿz0SubscriptionManager._delete_packagemanager_cacheN)r9   r:   r;   rJ   r   r   r   r!   r"   rh   rn   r&   r(   r   r*   r+   r6   r6   r6   r7   r   X   s    %!D Tr   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   )rR   rT   r6   r6   r7   rP   Õ  s   rP   )F)Ú__doc__ÚloggingÚ	cloudinitr   r   Úcloudinit.cloudr   Úcloudinit.configr   Úcloudinit.config.schemar   Úcloudinit.settingsr   Ú	getLoggerr9   r   r   Ú__annotations__r.   r%   r8   rƒ   r   r   rP   r6   r6   r6   r7   Ú<module>   s&   
ü:  