
    fC                     8   U d Z ddl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j                   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Z G d de      Z G d d      ZddZy) zDRed Hat Subscription: Register Red Hat Enterprise Linux based system    N)dedent)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returnc                 "   t        |t              }|j                         st        j                  d|        y |j	                         st	 |j                         \  }}|durt        |      |j                         }|st        d      |j                  rC|j                  7|j                         st        d      |j                  j                  d       nB|j                  r6|j                         st        d      |j                  j                  d       |j                  ht        |j                  t              sd	}t        |      |j!                  |j                        }	|	s$t        d
j#                  |j                              |j%                         }	|	st        d      |j'                  d       y |j'                  d       y # t        $ r5}
|j)                  t+        |
             |j)                  d       Y d }
~
y d }
~
ww xY w)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es              E/usr/lib/python3/dist-packages/cloudinit/config/cc_rh_subscription.pyhandler<   R   s   	Sc	*B		.5*	P!#!2FJT!'
33??$D'C  ~~"//"=,,.+,MNNFFLL!KL**,+,HIIFFLL!89xx#!"((D1 DI+I66 jj2"+4;;BHHE  //+K'(GHHNNJK
 	56	 ! 	PKKAKKNOO	Ps   E2G 	H+H		Hc                       e Zd Zy)r%   N)__name__
__module____qualname__     r;   r%   r%      s    rB   r%   c                   d    e Zd Zg dZddZd Zd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zd Zy)r   )orgactivation-keyusernamepassworddisable-repoenable-repoadd-poolrhsm-baseurlserver-hostnameauto-attachservice-levelNc                 2   |t         }|| _        || _        | j                  j                  di       | _        | j                  j                  d      | _        | j                  j                  d      | _        | j                  j                  d      | _        | j                  j                  d      | _        | j                  j                  d      | _	        | j                  j                  d      | _
        | j                  j                  d      | _        | j                  j                  d	      | _        | j                  j                  d
      | _        | j                  j                  d      | _        | j                  j                  d      | _        y )Nr   rK   rL   rJ   rE   rD   rF   rG   rM   rI   rH   rN   )r    r   r   getrhel_cfgrhsm_baseurlserver_hostnamer+   activation_keyrD   useridrG   r'   enable_repodisable_repor(   )selfr   r   s      r;   __init__zSubscriptionManager.__init__   s,   ;C%6; MM--n=#}}001BC]]&&z2
"mm//0@A==$$U+mm''
3))*5==,,];==,,]; MM--n= MM--o>rB   c                 :    | j                   j                  |       y)z>Simple wrapper for logging info messages. Useful for unittestsN)r   inforX   msgs     r;   r1   zSubscriptionManager.log_success   s    crB   c                 :    | j                   j                  |       y)zASimple wrapper for logging warning messages. Useful for unittestsN)r   warningr\   s     r;   r2   zSubscriptionManager.log_warn   s    rB   c                    | j                   D ]A  }|| j                  vsdj                  |dj                  | j                              }d|fc S  | j                  Dt        j                  | j                        s%t        j                  | j                        sd}d|fS | j                  :| j                  r(t        j                  t        | j                              rd}d|fS y)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}, Fz8The 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)
rQ   valid_rh_keysr/   joinr'   r   is_trueis_falser(   r3   )rX   kbad_keynot_boolno_autos        r;   r$   z SubscriptionManager._verify_keys   s      	&A*** &DIId.@.@$AB 
 g~%	& (LL))*dmmD<L<L.M K  (?")!!t}}S9I9I5J'K$ 
 '>!rB   c                 T    dg}	 t        |       y# t        j                  $ r Y yw xY w)zg
        Checks if the system is already registered and returns
        True if so, else False
        identityFT)_sub_man_clir   ProcessExecutionError)rX   cmds     r;   r#   z!SubscriptionManager.is_registered   s7    
 l	  )) 		s    ''c                 ^   | j                   | j                  ddj                  | j                         dj                  | j                        g}| j                  *|j	                  dj                  | j                               | j
                  *|j	                  dj                  | j
                               	 t        |d      d	   }n| j                  | j                  ddj                  | j                        dj                  | j                        g}| j                  *|j	                  dj                  | j                               | j
                  *|j	                  dj                  | j
                               	 t        |d      d	   }n#| j                  d       | j                  d       y|j                  d      d   j                         }| j                   j#                  d|       y# t        j                  $ rC}|j                  d
k(  r*| j                  dj                  |j                               Y d}~yd}~ww xY w# t        j                  $ rC}|j                  d
k(  r*| j                  dj                  |j                               Y d}~yd}~ww xY w)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)rT   rD   r/   rR   appendrS   rl   r   rm   stdoutr2   stderrrU   rG   splitrstripr   r"   )rX   rn   
return_outr:   reg_ids        r;   r&   z SubscriptionManager.rhn_register   sM    +$((2F %,,T-@-@A""488,C   ,

?11$2C2CDE##/

,33D4H4HIJ)#TB1E
 kk%DMM,E  ''4 ''6C   ,

?11$2C2CDE##/

,33D4H4HIJ)#TB1E
 MMJ MMK !!&)!,335;VD[ -- 88r>MM9@@J 6 -- 88r>MM9@@J s0   =G= 
I =I9IIJ,)9J''J,c                 &   dddj                  | j                        g}	 t        |      d   }|j                  d      D ]#  }|dk7  s	| j                  j                  |       % y	# t        j                  $ r}|j
                  j                         dk7  r8|j
                  j                  d      D ]  }|dk7  s	| j                  |        n8| j                  dj                  |j                  j                                      Y d }~yd }~ww xY w)
Nattach--autoz--servicelevel={0}r   rr   
z*Setting the service level failed with: {0}FT)r/   r(   rl   r   rm   ru   rx   rw   r2   rv   stripr   r"   rX   rn   ry   r:   lines        r;   r)   z&SubscriptionManager._set_service_level.  s     ''(9(9:
	%c*1-J $$T* 	%Drzt$	%  )) 	xx B&HHNN40 ,Drzd+, @GG(
 	s   A& &D9A D:ADDc                    ddg}	 t        |      d   }|j                  d      D ]#  }|dk7  s	| j                  j                  |       % y# t        j                  $ r*}| j                  dj	                  |             Y d }~yd }~ww xY w)	Nr|   r}   r   zAuto-attach failed with: {0}Fr~   rr   T)rl   r   rm   r2   r/   rw   r   r"   r   s        r;   r*   z$SubscriptionManager._set_auto_attachH  s    "	%c*1-J $$T* 	%Drzt$	%  )) 	MM8??BC	s   A B	 BB	c                     g }g }g d}t        |      d   }|j                         j                  d      }g d}t        |      d   }|j                         j                  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
--consumedr   )rl   rx   rw   )rX   	availableconsumedrn   resultss        r;   	_getPoolszSubscriptionManager._getPoolsT  ss    
 	 5s#A&^^%,,T2	 4s#A&NN$++D1(""rB   c                    ddg}t        |      d   }g }|j                  d      D ]8  }d|v s|j                  |j                  d      d   j                                : ddg}t        |      d   }g }|j                  d      D ]8  }d|v s|j                  |j                  d      d   j                                : ||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)rl   rw   rt   r   )rX   rn   ry   active_reposrepoinactive_reposs         r;   	_getReposzSubscriptionManager._getReposh  s     ()!#&q)
$$T* 	BDT!##TZZ_Q%7$>$>$@A	B )*!#&q)
$$T* 	DDT!%%tzz#q'9&@&@&BC	D ^++rB   c                 x   t        |      dk(  r| j                  j                  d       y| j                         \  }}g }dg}|D ]K  }||vr%||v r!|j	                  dj                  |             ,| j                  dj                  |             M t        |      dkD  rY|j                  |       	 t        |       | j                  j                  ddj                  |      j                  d	d
             yy# t        j                  $ r+}| j                  dj                  |             Y d}~yd}~ww xY w)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: %sra   z--pool=rr   z$Unable to attach pool {0} due to {1}NF)lenr   r"   r   rt   r/   r2   extendrl   rc   replacer   rm   )rX   r+   pool_availablepool_consumed	pool_listrn   poolr:   s           r;   r.   zSubscriptionManager.addPool~  s'    u:?HHNN/0(,(8%	j 	HDM)0F  !4!4T!:;9@@FG		H
 y>AJJy!S!EYYy)229bA   -- :AA$J 	s   3AC; ;D9!D44D9c                    | j                   }| j                  }|g }|g }t        |t              s| j	                  d       yt        |t              s| j	                  d       yt        |      dk(  r*t        |      dk(  r| j                  j                  d       y| j                         \  }}g }g }|D ]8  }||v r!|j                  dj                  |             (|j                  |       : g }g }	|D ]8  }||v r!|j                  dj                  |             (|	j                  |       : t        |      dkD  rH|D ]C  }
|
|v r| j                  j                  d	|
       $| j	                  d
j                  |
             E t        |	      dkD  r#|	D ]  }
| j                  j                  d|
         dg}t        |      dkD  r|j                  |       t        |      dkD  r|j                  |       	 t        |       t        |      dkD  r;| j                  j                  ddj                  |      j!                  dd             t        |      dkD  r;| j                  j                  ddj                  |      j!                  dd             y# t        j                  $ r*}| j	                  dj                  |             Y d}~yd}~ww xY w)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: %sra   z	--enable=rr   z Disabled the following repos: %sz
--disable=)rV   rW   r,   r-   r2   r   r   r"   r   rt   r/   r   rl   r   rm   rc   r   )rX   ereposdreposr   r   enable_listenable_list_failrepoiddisable_listdisable_list_failfailrn   r:   s                r;   r0   z SubscriptionManager.update_repos  s    !!"">F>F&$'MMBC&$'MMBC K13v;!#3HHNN=>'+~~'7$n 	0F'"">#8#8#@A ''/		0  	1F%##O$:$:6$BC!((0		1  1$( <'HHNN#?FMM;BB4H  !A%) Dd
 i|q JJ|${aJJ{#	
 {aHHNN1;'00bA |q HHNN2<(11,C  )) 	MM<CCAFG	s   ;J K, KKc                 d    t        | j                  xr | j                  xs | j                        S N)boolrU   rG   rT   )rX   s    r;   r!   z!SubscriptionManager.is_configured  s%    T[[2T]]Jt7J7JKKrB   r   )r>   r?   r@   rb   rY   r1   r2   r$   r#   r&   r)   r*   r   r   r.   r0   r!   rA   rB   r;   r   r      sQ    M?$!FFP4
#(,, DTlLrB   r   c                 8    t        j                   dg| z   |      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   )rn   rq   s     r;   rl   rl     s     99,-3}MMrB   )F)__doc__loggingtextwrapr   	cloudinitr   r   cloudinit.cloudr   cloudinit.configr   cloudinit.config.schemar   r	   cloudinit.settingsr
   	getLoggerr>   r    MODULE_DESCRIPTIONr   __annotations__r3   r-   r<   	Exceptionr%   r   rl   rA   rB   r;   <module>r      s    K     ! # < +g!	  "=%.	
 		
 		
!&N !22]/j /b t
37 376 37% 37t 37 37l		 	kL kL\NrB   