U
    ¯Ad0D  ã                
   @   sþ   U d Z ddlm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geedƒedƒedƒgdgdœZeed< eeƒZ e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é    )ÚLogger)Ú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¸            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Úcloudr   ÚargsÚreturnc              
   C   sf  t ||d}| ¡ s$| 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Ú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   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ÚhandleS   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;   )ÚLOGr   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©rE   Ú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warningrH   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)   )rE   Ú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)rE   Ú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)rA   r1   r%   r?   Úappendr@   rN   r   rO   Ústdoutr(   ÚstderrrB   r4   ÚsplitÚrstripr   r   )rE   rP   Ú
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   rS   Ú
z*Setting the service level failed with: {0}FT)r%   r   rN   r   rO   rV   rY   rX   r(   rW   Ústripr   r   ©rE   rP   rZ   r*   Úliner+   r+   r,   r   1  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 )	Nr[   r\   r   zAuto-attach failed with: {0}Fr]   rS   T)rN   r   rO   r(   r%   rX   r   r   r_   r+   r+   r,   r    K  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)rN   rY   rX   )rE   Z	availableÚconsumedrP   Zresultsr+   r+   r,   Ú	_getPoolsW  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:ú:rT   z--list-disabled)rN   rX   rU   r^   )rE   rP   rZ   Úactive_reposZrepoÚinactive_reposr+   r+   r,   Ú	_getReposk  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 attachTr[   z
--pool={0}zPool {0} is not availablez/Attached the following pools to your system: %srJ   z--pool=rS   z$Unable to attach pool {0} due to {1}FN)Úlenr   r   rb   rU   r%   r(   ÚextendrN   rL   Úreplacer   rO   )rE   r!   Zpool_availableZpool_consumedZ	pool_listrP   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 enabledrc   z Unable to alter repos due to {0}zEnabled the following repos: %srJ   z	--enable=rS   z Disabled the following repos: %sz
--disable=)rC   rD   r"   r#   r(   rh   r   r   rg   rU   r%   ri   rN   r   rO   rL   rj   )rE   ZereposZdreposre   rf   Zenable_listZenable_list_failZrepoidZdisable_listZdisable_list_failZfailrP   r*   r+   r+   r,   r&   £  s|    




ÿ ÿ

þþz SubscriptionManager.update_reposc                 C   s   t | jr| jp| jƒS )N)ÚboolrB   r4   rA   )rE   r+   r+   r,   r   ù  s    z!SubscriptionManager.is_configured)N)r.   r/   r0   rK   rF   r'   r(   r   r   r   r   r    rb   rg   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   )rP   rR   r+   r+   r,   rN   ý  s    rN   )F)Ú__doc__Zloggingr   Útextwrapr   Z	cloudinitr   r   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   rN   r+   r+   r+   r,   Ú<module>   sR   
ÿÿÿð'Ò1    þ8  p