o
    wÚ7eD  ã                
   @   sø   U d 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 ddlmZmZ ddlmZ e e¡Zd	Zd
ddeg d¢eedƒedƒedƒgdgdœZeed< eeƒZ 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é    )Údedent©Úlog)ÚsubpÚutil)ÚCloud)ÚConfig)Ú
MetaSchemaÚget_meta_doc)ÚPER_INSTANCEa[  Register a Red Hat system either by username and password *or* activation and
org. Following a successful registration, you can:

 - auto-attach subscriptions
 - set the service level
 - add subscriptions based on pool id
 - enable/disable yum repositories based on repo id
 - alter the rhsm_baseurl and server-hostname in ``/etc/rhsm/rhs.conf``.
Úcc_rh_subscriptionzRed Hat Subscriptionz.Register Red Hat Enterprise Linux based system)ÚfedoraÚrhelÚ	openeulerz¸            rh_subscription:
                username: joe@foo.bar
                ## Quote your password if it has symbols to be safe
                password: '1234abcd'
            zk            rh_subscription:
                activation-key: foobar
                org: 12345
            aò              rh_subscription:
                activation-key: foobar
                org: 12345
                auto-attach: true
                service-level: self-support
                add-pool:
                  - 1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a
                  - 2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
                enable-repo:
                  - repo-id-to-enable
                  - other-repo-id-to-enable
                disable-repo:
                  - repo-id-to-disable
                  - other-repo-id-to-disable
                # Alter the baseurl in /etc/rhsm/rhsm.conf
                rhsm-baseurl: http://url
                # Alter the server hostname in /etc/rhsm/rhsm.conf
                server-hostname: foo.bar.com
            Úrh_subscription)ÚidÚnameÚtitleÚdescriptionÚdistrosÚ	frequencyÚexamplesÚactivate_by_schema_keysÚmetar   ÚcfgÚcloudÚargsÚreturnNc              
   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 )Nr   z%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© r:   úE/usr/lib/python3/dist-packages/cloudinit/config/cc_rh_subscription.pyÚhandleR   sR   ÿ	

ÿ€þr<   c                   @   s   e Zd ZdS )r$   N)Ú__name__Ú
__module__Ú__qualname__r:   r:   r:   r;   r$   ˆ   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   rG   rH   rF   rA   r@   rB   rC   rI   rE   rD   rJ   )r   r   r   ÚgetÚrhel_cfgÚrhsm_baseurlÚserver_hostnamer*   Úactivation_keyr@   ÚuseridrC   r&   Úenable_repoÚdisable_repor'   )Úselfr   r   r:   r:   r;   Ú__init__›   s    zSubscriptionManager.__init__c                 C   ó   | j  |¡ dS )z>Simple wrapper for logging info messages. Useful for unittestsN)r   Úinfo©rS   Úmsgr:   r:   r;   r0   ­   ó   zSubscriptionManager.log_successc                 C   rU   )zASimple wrapper for logging warning messages. Useful for unittestsN)r   ÚwarningrW   r:   r:   r;   r1   ±   rY   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)
rL   Úvalid_rh_keysr.   Újoinr&   r   Úis_trueÚis_falser'   r2   )rS   ÚkÚbad_keyÚnot_boolÚno_autor:   r:   r;   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)rS   Úcmdr:   r:   r;   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)rO   r@   r.   rM   ÚappendrN   re   r   rf   Ústdoutr1   ÚstderrrP   rC   ÚsplitÚrstripr   r!   )rS   rg   Ú
return_outr9   Úreg_idr:   r:   r;   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   rj   Ú
z*Setting the service level failed with: {0}FT)r.   r'   re   r   rf   rm   rp   ro   r1   rn   Ústripr   r!   ©rS   rg   rq   r9   Úliner:   r:   r;   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 )	Nrs   rt   r   zAuto-attach failed with: {0}Fru   rj   T)re   r   rf   r1   r.   ro   r   r!   rw   r:   r:   r;   r)   H  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   ru   )r,   z
--consumedry   )re   rp   ro   )rS   Ú	availableÚconsumedrg   Úresultsr:   r:   r;   Ú	_getPoolsT  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   ru   zRepo ID:ú:rk   z--list-disabled)re   ro   rl   rv   )rS   rg   rq   Úactive_reposÚrepoÚinactive_reposr:   r:   r;   Ú	_getReposh  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 attachTrs   z
--pool={0}zPool {0} is not availablez/Attached the following pools to your system: %sr[   z--pool=rj   z$Unable to attach pool {0} due to {1}NF)Úlenr   r!   r}   rl   r.   r1   Úextendre   r]   Úreplacer   rf   )rS   r*   Úpool_availableÚpool_consumedÚ	pool_listrg   Úpoolr9   r:   r:   r;   r-   ~  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 enabledr~   z Unable to alter repos due to {0}zEnabled the following repos: %sr[   z	--enable=rj   z Disabled the following repos: %sz
--disable=)rQ   rR   r+   r,   r1   r„   r   r!   rƒ   rl   r.   r…   re   r   rf   r]   r†   )rS   ÚereposÚdreposr€   r‚   Úenable_listÚenable_list_failÚrepoidÚdisable_listÚdisable_list_failÚfailrg   r9   r:   r:   r;   r/      s~   



ÿÿ

€þþþz SubscriptionManager.update_reposc                 C   s   t | jr| jp	| jƒS ©N)ÚboolrP   rC   rO   )rS   r:   r:   r;   r    ö  s   z!SubscriptionManager.is_configuredr“   )r=   r>   r?   r\   rT   r0   r1   r#   r"   r%   r(   r)   r}   rƒ   r-   r/   r    r:   r:   r:   r;   r   Œ   s    
#H"Vr   Fc                 C   s   t j dg|  |dS )z¶
    Uses the prefered 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   )rg   ri   r:   r:   r;   re   ú  s   re   )F)Ú__doc__Útextwrapr   Ú	cloudinitr   Úloggingr   r   Úcloudinit.cloudr   Úcloudinit.configr   Úcloudinit.config.schemar	   r
   Úcloudinit.settingsr   Ú	getLoggerr=   r   ÚMODULE_DESCRIPTIONr   Ú__annotations__r2   r,   r<   Ú	Exceptionr$   r   re   r:   r:   r:   r;   Ú<module>   sF   
ÿÿÿð'Ò16  p