U
    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dddgeedƒedƒedƒgdgdœZeed< eeƒZ eee	eddœ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``.
Zcc_rh_subscriptionzRed Hat Subscriptionz.Register Red Hat Enterprise Linux based systemZfedoraZrhelZ	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ÚtitleZdescriptionZdistrosZ	frequencyZexamplesZactivate_by_schema_keysÚmetaN)r   ÚcfgÚcloudÚargsÚreturnc              
   C   sf  t |td}| ¡ s$t d| ¡ d S | ¡ sXzê| ¡ \}}|dk	rLt|ƒ‚| ¡ }|s`tdƒ‚|jr|j	d k	r| 
¡ s‚tdƒ‚q´|j d¡ n$|jr´| ¡ s¨tdƒ‚n|j d¡ |jd k	röt|jtƒsÖd	}t|ƒ‚| |j¡}	|	sötd
 |j¡ƒ‚| ¡ }	|	stdƒ‚| d¡ W n< tk
rT }
 z| t|
ƒ¡ | d¡ W 5 d }
~
X Y nX n
| 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   ZsmZverifyZ
verify_msgZcontZ	pool_failZreturn_statÚe© r+   úE/usr/lib/python3/dist-packages/cloudinit/config/cc_rh_subscription.pyÚhandleR   sN    
ÿ	



ÿ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ddddddddd	d
dg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 k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   r8   r9   r7   r2   r1   r3   r4   r:   r6   r5   r;   )r   r   r   ÚgetÚrhel_cfgÚrhsm_baseurlÚserver_hostnamer!   Úactivation_keyr1   Úuseridr4   r   Úenable_repoÚdisable_repor   )Úselfr   r   r+   r+   r,   Ú__init__›   s     zSubscriptionManager.__init__c                 C   s   | j  |¡ dS )z>Simple wrapper for logging info messages. Useful for unittestsN)r   Úinfo©rD   Úmsgr+   r+   r,   r'   ­   s    zSubscriptionManager.log_successc                 C   s   | j  |¡ dS )zASimple wrapper for logging warning messages. Useful for unittestsN)r   ZwarningrG   r+   r+   r,   r(   ±   s    zSubscriptionManager.log_warnc                 C   s”   | j D ].}|| jkrd |d | j¡¡}d|f  S q| jdk	rdt | j¡sdt | j¡sdd}d|fS | jdk	r| jr„t t	| jƒ¡rd}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)
r=   Úvalid_rh_keysr%   Újoinr   r   Zis_trueZis_falser   r)   )rD   ÚkZbad_keyZnot_boolZno_autor+   r+   r,   r   µ   s2    

 
þÿ

ÿ
ÿÿ
ÿÿÿz SubscriptionManager._verify_keysc                 C   s0   dg}zt |ƒ W n tjk
r*   Y dS X dS )zg
        Checks if the system is already registered and returns
        True if so, else False
        ZidentityFT)Ú_sub_man_clir   ÚProcessExecutionError)rD   Úcmdr+   r+   r,   r   Ø   s    z!SubscriptionManager.is_registeredc              
   C   sÐ  | j dk	rÄ| jdk	rÄdd | j ¡d | j¡g}| jdk	rJ| d | j¡¡ | jdk	rf| d | j¡¡ zt|ddd	 }W nF tjk
rÀ } z&|j	d
krª|  
d |j¡¡ W Y ¢dS d}~X Y nX nè| jdk	r”| jdk	r”dd | j¡d | j¡g}| jdk	r| d | j¡¡ | jdk	r2| d | j¡¡ zt|ddd	 }W nJ tjk
r } z(|j	d
krz|  
d |j¡¡ W Y ¢dS d}~X Y nX n|  
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)r@   r1   r%   r>   Úappendr?   rM   r   rN   Ústdoutr(   ÚstderrrA   r4   ÚsplitÚrstripr   r   )rD   rO   Ú
return_outr*   Zreg_idr+   r+   r,   r   æ   sX    

ý	



ÿ

ý	
ÿÿÿz SubscriptionManager.rhn_registerc              
   C   sÀ   ddd  | j¡g}zt|ƒd }W nt tjk
r– } zT|j ¡ dkrj|j d¡D ]}|dkrP|  |¡ qPn|  d  |j	 
¡ ¡¡ W Y ¢dS d }~X Y nX | d¡D ]}|dkr¢| j |¡ q¢d	S )
NÚattachú--autoz--servicelevel={0}r   rR   Ú
z*Setting the service level failed with: {0}FT)r%   r   rM   r   rN   rU   rX   rW   r(   rV   Ústripr   r   ©rD   rO   rY   r*   Úliner+   r+   r,   r   .  s*    
ýÿÿz&SubscriptionManager._set_service_levelc              
   C   s|   ddg}zt |ƒd }W n: tjk
rR } z|  d |¡¡ W Y ¢dS d }~X Y nX | d¡D ]}|dkr^| j |¡ q^dS )	NrZ   r[   r   zAuto-attach failed with: {0}Fr\   rR   T)rM   r   rN   r(   r%   rW   r   r   r^   r+   r+   r,   r    H  s    z$SubscriptionManager._set_auto_attachc                 C   sX   g }g }dddg}t |ƒd }| ¡  d¡}dddg}t |ƒd }| ¡  d¡}||fS )zh
        Gets the list pools for the active subscription and returns them
        in list form.
        r#   z--availablez--pool-onlyr   r\   z
--consumed)rM   rX   rW   )rD   Z	availableÚconsumedrO   Zresultsr+   r+   r,   Ú	_getPoolsT  s    

zSubscriptionManager._getPoolsc                 C   s˜   ddg}t |ƒd }g }| d¡D ]$}d|kr"| | d¡d  ¡ ¡ q"ddg}t |ƒd }g }| d¡D ]$}d|krj| | d¡d  ¡ ¡ qj||fS )	zl
        Obtains the current list of active yum repositories and returns
        them in list form.
        Úreposz--list-enabledr   r\   zRepo ID:ú:rS   z--list-disabled)rM   rW   rT   r]   )rD   rO   rY   Úactive_reposZrepoÚinactive_reposr+   r+   r,   Ú	_getReposh  s    zSubscriptionManager._getReposc              
   C   sð   t |ƒdkr| j d¡ dS |  ¡ \}}g }dg}|D ]6}||kr\||kr\| d |¡¡ q6|  d |¡¡ q6t |ƒdkrì| |¡ z*t|ƒ | j dd 	|¡ 
d	d
¡¡ W dS  tjk
rê } z|  d ||¡¡ W Y ¢dS d}~X Y nX dS )zl
        Takes a list of subscription pools and "attaches" them to the
        current subscription
        r   zNo pools to attachTrZ   z
--pool={0}zPool {0} is not availablez/Attached the following pools to your system: %srI   z--pool=rR   z$Unable to attach pool {0} due to {1}FN)Úlenr   r   ra   rT   r%   r(   ÚextendrM   rK   Úreplacer   rN   )rD   r!   Zpool_availableZpool_consumedZ	pool_listrO   Zpoolr*   r+   r+   r,   r$   ~  s0    
þ
ÿzSubscriptionManager.addPoolc              
   C   s8  | j }| j}|dkrg }|dkr$g }t|tƒs<|  d¡ dS t|tƒsT|  d¡ dS t|ƒdkr|t|ƒdkr|| j d¡ dS |  ¡ \}}g }g }|D ](}||kr²| 	d 
|¡¡ q”| 	|¡ q”g }g }	|D ](}||krè| 	d 
|¡¡ qÊ|	 	|¡ qÊt|ƒdkr8|D ]0}
|
|kr$| j d	|
¡ n|  d
 
|
¡¡ qt|	ƒdkr`|	D ]}
| j d|
¡ qJdg}t|ƒdkr~| |¡ t|ƒdkr–| |¡ zt|ƒ W n< tjk
rÞ } z|  d 
|¡¡ W Y ¢dS d}~X Y nX t|ƒdkr
| j dd |¡ dd¡¡ t|ƒdkr4| 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 enabledrb   z Unable to alter repos due to {0}zEnabled the following repos: %srI   z	--enable=rR   z Disabled the following repos: %sz
--disable=)rB   rC   r"   r#   r(   rg   r   r   rf   rT   r%   rh   rM   r   rN   rK   ri   )rD   ZereposZdreposrd   re   Zenable_listZenable_list_failZrepoidZdisable_listZdisable_list_failZfailrO   r*   r+   r+   r,   r&      s|    




ÿ ÿ

þþz SubscriptionManager.update_reposc                 C   s   t | jr| jp| jƒS )N)ÚboolrA   r4   r@   )rD   r+   r+   r,   r   ö  s    z!SubscriptionManager.is_configured)N)r.   r/   r0   rJ   rE   r'   r(   r   r   r   r   r    ra   rf   r$   r&   r   r+   r+   r+   r,   r   Œ   s2   õ
#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)Z	logstring)r   )rO   rQ   r+   r+   r,   rM   ú  s    rM   )F)Ú__doc__Útextwrapr   Z	cloudinitr   Zloggingr   r   Zcloudinit.cloudr   Zcloudinit.configr   Zcloudinit.config.schemar	   r
   Zcloudinit.settingsr   Z	getLoggerr.   r   ZMODULE_DESCRIPTIONr   Ú__annotations__r)   r#   r-   Ú	Exceptionr   r   rM   r+   r+   r+   r,   Ú<module>   sD   
ÿÿÿð'Ò16  p