
    x[h<              
           U d Z ddlZddlmZmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZ  ej                  e      Zdg d	ed
gdZe
ed<   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)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                 "   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handler7      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__     r6   r    r    P   s    r=   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   rF   rG   rE   r@   r?   rA   rB   rH   rD   rC   rI   )r   r   r   getrhel_cfgrhsm_baseurlserver_hostnamer&   activation_keyr?   useridrB   r"   enable_repodisable_repor#   )selfr   r   s      r6   __init__z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                 :    | j                   j                  |       y)z>Simple wrapper for logging info messages. Useful for unittestsN)r   inforS   msgs     r6   r,   zSubscriptionManager.log_successu   s    cr=   c                 :    | j                   j                  |       y)zASimple wrapper for logging warning messages. Useful for unittestsN)r   warningrW   s     r6   r-   zSubscriptionManager.log_warny   s    r=   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)
rL   valid_rh_keysr*   joinr"   r   is_trueis_falser#   r.   )rS   kbad_keynot_boolno_autos        r6   r   z SubscriptionManager._verify_keys}   s      	&A*** &DIId.@.@$AB 
 g~%	& (LL))*dmmD<L<L.M K  (?")!!t}}S9I9I5J'K$ 
 '>!r=   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)rS   cmds     r6   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)rO   r?   r*   rM   appendrN   rg   r   rh   stdoutr-   stderrrP   rB   splitrstripr   r   )rS   ri   
return_outr5   reg_ids        r6   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   rm   
z*Setting the service level failed with: {0}FT)r*   r#   rg   r   rh   rp   rs   rr   r-   rq   stripr   r   rS   ri   rt   r5   lines        r6   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)	Nrw   rx   r   zAuto-attach failed with: {0}Fry   rm   T)rg   r   rh   r-   r*   rr   r   r   r{   s        r6   r%   z$SubscriptionManager._set_auto_attach  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   ry   )r(   z
--consumedr   )rg   rs   rr   )rS   	availableconsumedri   resultss        r6   	_getPoolszSubscriptionManager._getPools  ss    
 	 5s#A&^^%,,T2	 4s#A&NN$++D1(""r=   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   ry   zRepo ID::rn   z--list-disabled)rg   rr   ro   rz   )rS   ri   rt   active_reposrepoinactive_reposs         r6   	_getReposzSubscriptionManager._getRepos0  s     ()!#&q)
$$T* 	BDT!##TZZ_Q%7$>$>$@A	B )*!#&q)
$$T* 	DDT!%%tzz#q'9&@&@&BC	D ^++r=   c                 `   |s| 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
        zNo pools to attachTrw   z
--pool={0}zPool {0} is not availabler   z/Attached the following pools to your system: %sr\   z--pool=rm   z$Unable to attach pool {0} due to {1}NF)r   r   r   ro   r*   r-   lenextendrg   r^   replacer   rh   )rS   r&   pool_availablepool_consumed	pool_listri   poolr5   s           r6   r)   zSubscriptionManager.addPoolF  s    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   'AC/ /D-!D((D-c                    | j                   }| j                  }|g }|g }t        |t              s| j	                  d       yt        |t              s| j	                  d       y|s|s| 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.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: %sr\   z	--enable=rm   z Disabled the following repos: %sz
--disable=)rQ   rR   r'   r(   r-   r   r   r   ro   r*   r   r   rg   r   rh   r^   r   )rS   ereposdreposr   r   enable_listenable_list_failrepoiddisable_listdisable_list_failfailri   r5   s                r6   r+   z SubscriptionManager.update_reposh  s    !!"">F>F&$'MMBC&$'MMBC 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 J> J99J>c                 d    t        | j                  xr | j                  xs | j                        S N)boolrP   rB   rO   )rS   s    r6   r   z!SubscriptionManager.is_configured  s%    T[[2T]]Jt7J7JKKr=   r   )r9   r:   r;   r]   rT   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                 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   )ri   rl   s     r6   rg   rg     s     99,-3}MMr=   )F)__doc__logging	cloudinitr   r   cloudinit.cloudr   cloudinit.configr   cloudinit.config.schemar   cloudinit.settingsr   	getLoggerr9   r   r   __annotations__r.   r(   r7   	Exceptionr    r   rg   r<   r=   r6   <module>r      s    K    ! # . +g! . 12	j 37 376 37% 37t 37 37l		 	kL kL\Nr=   