
    x[h<              
           % S r SSKrSSKJrJr  SSKJr  SSKJr  SSK	J
r
  SSKJr  \R                  " \5      rS/ S	Q\S
/S.r\
\S'   S\S\S\S\SS4
S jr " S S\5      r " S S5      rSS jrg)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                    [        U[        S9nUR                  5       (       d  [        R                  SU 5        g UR	                  5       (       Gd   UR                  5       u  pVUSLa  [        U5      eUR                  5       nU(       d  [        S5      eUR                  (       aI  UR                  b<  UR                  5       (       d  [        S5      eUR                  R                  S5        OLUR                  (       a;  UR                  5       (       d  [        S5      eUR                  R                  S5        UR                  br  [        UR                  [        5      (       d  S	n[        U5      eUR!                  UR                  5      n	U	(       d$  [        S
R#                  UR                  5      5      eUR%                  5       n	U	(       d  [        S5      eUR'                  S5        g UR'                  S5        g ! [         a5  n
UR)                  [+        U
5      5        UR)                  S5         S n
A
g S n
A
ff = f)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handler7      s   	Sc	*B		.5*	P!#!2FT!'
33??$D'C  ~~"//"=,,..+,MNNFFLL!KL**,,+,HIIFFLL!89xx#!"((D1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   FH 
I +H;;I c                       \ rS rSrSrg)r    P    N)__name__
__module____qualname____firstlineno____static_attributes__r:       r6   r    r    P   s    r@   r    c                   n    \ rS rSr/ SQrSS jrS rS rS rS r	S	 r
S
 rS rS rS rS rS rS rSrg)r   T   )orgactivation-keyusernamepassworddisable-repoenable-repoadd-poolrhsm-baseurlserver-hostnameauto-attachservice-levelNc                 0   Uc  [         nX l        Xl        U R                  R                  S0 5      U l        U R                  R                  S5      U l        U R                  R                  S5      U l        U R                  R                  S5      U l        U R                  R                  S5      U l        U R                  R                  S5      U l	        U R                  R                  S5      U l
        U R                  R                  S5      U l        U R                  R                  S	5      U l        U R                  R                  S
5      U l        U R                  R                  S5      U l        U R                  R                  S5      U l        g )Nr   rJ   rK   rI   rD   rC   rE   rF   rL   rH   rG   rM   )r   r   r   getrhel_cfgrhsm_baseurlserver_hostnamer&   activation_keyrC   useridrF   r"   enable_repodisable_repor#   )selfr   r   s      r6   __init__SubscriptionManager.__init__c   s(   ;C%6; MM--n=#}}001BC]]&&z2
"mm//0@A==$$U+mm''
3))*5==,,];==,,]; MM--n= MM--o>r@   c                 :    U R                   R                  U5        g)z>Simple wrapper for logging info messages. Useful for unittestsN)r   inforW   msgs     r6   r,   SubscriptionManager.log_successu   s    cr@   c                 :    U R                   R                  U5        g)zASimple wrapper for logging warning messages. Useful for unittestsN)r   warningr\   s     r6   r-   SubscriptionManager.log_warny   s    r@   c                    U R                    HC  nXR                  ;  d  M  SR                  USR                  U R                  5      5      nSU4s  $    U R                  bP  [
        R                  " U R                  5      (       d+  [
        R                  " U R                  5      (       d  SnSU4$ U R                  bE  U R                  (       a.  [
        R                  " [        U R                  5      5      (       a  SnSU4$ g)zY
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)
rP   valid_rh_keysr*   joinr"   r   is_trueis_falser#   r.   )rW   kbad_keynot_boolno_autos        r6   r    SubscriptionManager._verify_keys}   s     A*** &DIId.@.@$AB 
 g~%  (LL))**dmmD<L<L.M.M K  (?")!!t}}S9I9I5J'K'K$ 
 '>!r@   c                 V    S/n [        U5        g! [        R                   a     gf = f)zO
Checks if the system is already registered and returns
True if so, else False
identityFT)_sub_man_clir   ProcessExecutionError)rW   cmds     r6   r   !SubscriptionManager.is_registered   s7    
 l	  )) 		s    ((c                 j   U R                   b  U R                  b  SSR                  U R                   5      SR                  U R                  5      /nU R                  b*  UR	                  SR                  U R                  5      5        U R
                  b*  UR	                  SR                  U R
                  5      5         [        USS9S	   nOU R                  b  U R                  b  SSR                  U R                  5      SR                  U R                  5      /nU R                  b*  UR	                  SR                  U R                  5      5        U R
                  b*  UR	                  SR                  U R
                  5      5         [        USS9S	   nO#U R                  S5        U R                  S5        gUR                  S5      S   R                  5       nU R                   R#                  SU5        g! [        R                   aD  nUR                  S
:X  a*  U R                  SR                  UR                  5      5         SnAgSnAff = f! [        R                   aD  nUR                  S
:X  a*  U R                  SR                  UR                  5      5         SnAgSnAff = f)zv
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)rS   rC   r*   rQ   appendrR   ro   r   rp   stdoutr-   stderrrT   rF   splitrstripr   r   )rW   rq   
return_outr5   reg_ids        r6   r!    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:IIJ2.:J--J2c                 :   SSSR                  U R                  5      /n [        U5      S   nUR                  S5       H&  nUS:w  d  M  U R                  R                  U5        M(     g	! [        R                   a  nUR
                  R                  5       S:w  a<  UR
                  R                  S5       H  nUS:w  d  M  U R                  U5        M     O8U R                  SR                  UR                  R                  5       5      5         S nAgS nAff = f)
Nattach--autoz--servicelevel={0}r   rv   
z*Setting the service level failed with: {0}FT)r*   r#   ro   r   rp   ry   r|   r{   r-   rz   stripr   r   rW   rq   r}   r5   lines        r6   r$   &SubscriptionManager._set_service_level   s     ''(9(9:
	%c*1-J $$T*Drzt$ +  )) 	xx B&HHNN40Drzd+ 1 @GG(
 	s   A* *D>A DADDc                 "   SS/n [        U5      S   nUR                  S5       H&  nUS:w  d  M  U R                  R                  U5        M(     g! [        R                   a*  nU R                  SR	                  U5      5         S nAgS nAff = f)	Nr   r   r   zAuto-attach failed with: {0}Fr   rv   T)ro   r   rp   r-   r*   r{   r   r   r   s        r6   r%   $SubscriptionManager._set_auto_attach  s    "	%c*1-J $$T*Drzt$ +  )) 	MM8??BC	s   A B$ B		Bc                     / n/ n/ SQn[        U5      S   nUR                  5       R                  S5      n/ SQn[        U5      S   nUR                  5       R                  S5      nX4$ )zP
Gets the list pools for the active subscription and returns them
in list form.
)r(   z--available--pool-onlyr   r   )r(   z
--consumedr   )ro   r|   r{   )rW   	availableconsumedrq   resultss        r6   	_getPoolsSubscriptionManager._getPools  sq    
 	 5s#A&^^%,,T2	 4s#A&NN$++D1""r@   c                    SS/n[        U5      S   n/ nUR                  S5       H<  nSU;   d  M  UR                  UR                  S5      S   R                  5       5        M>     SS/n[        U5      S   n/ nUR                  S5       H<  nSU;   d  M  UR                  UR                  S5      S   R                  5       5        M>     X54$ )	zT
Obtains the current list of active yum repositories and returns
them in list form.
reposz--list-enabledr   r   zRepo ID::rw   z--list-disabled)ro   r{   rx   r   )rW   rq   r}   active_reposrepoinactive_reposs         r6   	_getReposSubscriptionManager._getRepos0  s     ()!#&q)
$$T*DT!##TZZ_Q%7$>$>$@A + )*!#&q)
$$T*DT!%%tzz#q'9&@&@&BC + ++r@   c                 v   U(       d  U R                   R                  S5        gU R                  5       u  p#/ nS/nU HO  nXc;  a'  Xb;   a"  UR                  SR	                  U5      5        M/  U R                  SR	                  U5      5        MQ     [        U5      S:  aY  UR                  U5         [        U5        U R                   R                  SSR                  U5      R                  S	S
5      5        gg! [        R                   a+  nU R                  SR	                  WU5      5         SnAgSnAff = f)zT
Takes a list of subscription pools and "attaches" them to the
current subscription
zNo pools to attachTr   z
--pool={0}zPool {0} is not availabler   z/Attached the following pools to your system: %src   z--pool=rv   z$Unable to attach pool {0} due to {1}NF)r   r   r   rx   r*   r-   lenextendro   re   replacer   rp   )rW   r&   pool_availablepool_consumed	pool_listrq   poolr5   s           r6   r)   SubscriptionManager.addPoolF  s    HHNN/0(,(8%	jD)0F  !4!4T!:;9@@FG	 
 y>AJJy!S!EYYy)229bA   -- :AA$J 	s   1AC9 9D8!D33D8c                    U R                   nU R                  nUc  / nUc  / n[        U[        5      (       d  U R	                  S5        g[        U[        5      (       d  U R	                  S5        gU(       d#  U(       d  U R
                  R                  S5        gU R                  5       u  p4/ n/ nU H;  nXt;   a"  UR                  SR                  U5      5        M*  UR                  U5        M=     / n/ n	U H;  nXs;   a"  UR                  SR                  U5      5        M*  U	R                  U5        M=     [        U5      S:  aL  U HF  n
X;   a  U R
                  R                  S	U
5        M&  U R	                  S
R                  U
5      5        MH     [        U	5      S:  a%  U	 H  n
U R
                  R                  SU
5        M!     S/n[        U5      S:  a  UR                  U5        [        U5      S:  a  UR                  U5         [        U5        [        U5      S:  a;  U R
                  R                  SSR                  U5      R!                  SS5      5        [        U5      S:  a;  U R
                  R                  SSR                  U5      R!                  SS5      5        g! [        R                   a*  nU R	                  SR                  U5      5         SnAgSnAff = f)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 {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: %src   z	--enable=rv   z Disabled the following repos: %sz
--disable=)rU   rV   r'   r(   r-   r   r   r   rx   r*   r   r   ro   r   rp   re   r   )rW   ereposdreposr   r   enable_listenable_list_failrepoiddisable_listdisable_list_failfailrq   r5   s                r6   r+    SubscriptionManager.update_reposh  s    !!"">F>F&$''MMBC&$''MMBC HHNN=>'+~~'7$F'"">#8#8#@A ''/	  F%##O$:$:6$BC!((0	   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                 x    [        U R                  =(       a    U R                  =(       d    U R                  5      $ N)boolrT   rF   rS   )rW   s    r6   r   !SubscriptionManager.is_configured  s%    T[[2T]]Jt7J7JKKr@   )rS   r"   r   rV   rU   r   rC   rF   r&   rP   rQ   rR   r#   rT   r   )r;   r<   r=   r>   rd   rX   r,   r-   r   r   r!   r$   r%   r   r   r)   r+   r   r?   r:   r@   r6   r   r   T   sQ    M?$!FFP4
#(,, DTlLr@   r   c                 4    [         R                   " S/U -   US9$ )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   )rq   ru   s     r6   ro   ro     s     99,-3}MMr@   )F)__doc__logging	cloudinitr   r   cloudinit.cloudr   cloudinit.configr   cloudinit.config.schemar   cloudinit.settingsr   	getLoggerr;   r   r   __annotations__r.   r(   r7   	Exceptionr    r   ro   r:   r@   r6   <module>r      s    K    ! # . +! . 12	j 37 376 37% 37t 37 37l		 	kL kL\Nr@   