a '¡DgÙ<ã@s¶UdZddlZddlmZmZddlmZddlmZddl m Z ddl m Z e  e¡Zdgd ¢e d gd œZe ed <eeeedd œdd„ZGdd„deƒZGdd„dƒZddd„ZdS)zDRed Hat Subscription: Register Red Hat Enterprise Linux based systeméN)ÚsubpÚutil)ÚCloud)ÚConfig)Ú MetaSchema)Ú PER_INSTANCEZcc_rh_subscription)ZfedoraZrhelZ openeulerÚrh_subscription)ÚidZdistrosZ frequencyZactivate_by_schema_keysÚmeta)ÚnameÚcfgÚcloudÚargsÚreturnc Csht|td}| ¡s$t d|¡dS| ¡sZzê| ¡\}}|durLt|ƒ‚| ¡}|s`tdƒ‚|jr|j dur|  ¡s‚tdƒ‚q´|j  d¡n$|jr´|  ¡s¨tdƒ‚n |j  d¡|j duröt|j tƒsÖd }t|ƒ‚| |j ¡} | sötd  |j ¡ƒ‚| ¡} | s td ƒ‚| d ¡Wn>tyV} z$| t| ƒ¡| d ¡WYd} ~ n d} ~ 00n | d¡dS)N)Úlogz%s: module not configured.Tz-Registration failed or did not run completelyzSetting of service-level failedz(Completed auto-attach with service levelzSetting auto-attach failedzCompleted auto-attachz"Pools must in the format of a listzUnable to attach pools {0}zUnable to add or remove reposz-rh_subscription plugin completed successfullyz4rh_subscription plugin did not complete successfullyzSystem 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 rZsmZverifyZ verify_msgZcontZ pool_failZ return_statÚe©r'úG/usr/lib/python3.9/site-packages/cloudinit/config/cc_rh_subscription.pyÚhandlesN    ÿ        ÿ"r)c@s eZdZdS)rN)Ú__name__Ú __module__Ú __qualname__r'r'r'r(rPsrc@s~eZdZgd¢Zddd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„ZdS)r) Úorgúactivation-keyÚusernameÚpasswordú disable-repoú enable-repoúadd-poolú rhsm-baseurlúserver-hostnameú auto-attachú service-levelNcCsÆ|dur t}||_||_|j di¡|_|j d¡|_|j d¡|_|j d¡|_|j d¡|_|j d¡|_ |j d¡|_ |j d¡|_ |j d ¡|_ |j d ¡|_ |j d ¡|_|j d ¡|_dS) Nrr4r5r3r.r-r/r0r6r2r1r7)rrr ÚgetÚrhel_cfgÚ rhsm_baseurlÚserver_hostnamerÚactivation_keyr-Úuseridr0rÚ enable_repoÚ disable_repor)Úselfr rr'r'r(Ú__init__cs zSubscriptionManager.__init__cCs|j |¡dS)z>Simple wrapper for logging info messages. Useful for unittestsN)rÚinfo©r@Úmsgr'r'r(r#uszSubscriptionManager.log_successcCs|j |¡dS)zASimple wrapper for logging warning messages. Useful for unittestsN)rZwarningrCr'r'r(r$yszSubscriptionManager.log_warncCs”|jD].}||jvrd |d |j¡¡}d|fSq|jdurdt |j¡sdt |j¡sdd}d|fS|jdur|jr„t t |jƒ¡rd}d|fSdS)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) r9Ú valid_rh_keysr!ÚjoinrrZis_trueZis_falserr%)r@ÚkZbad_keyZnot_boolZno_autor'r'r(r}s0   þÿ  ÿ ÿÿ ÿÿÿz SubscriptionManager._verify_keyscCs.dg}z t|ƒWntjy(YdS0dS)zg Checks if the system is already registered and returns True if so, else False ÚidentityFT)Ú _sub_man_clirÚProcessExecutionError)r@Úcmdr'r'r(r s  z!SubscriptionManager.is_registeredc CsÌ|jdurÂ|jdurÂdd |j¡d |j¡g}|jdurJ| d |j¡¡|jdurf| d |j¡¡zt|ddd }WnDtjy¾}z*|j d kr¨|  d  |j ¡¡WYd}~d Sd}~00næ|j dur|j durdd  |j ¡d |j ¡g}|jdur| d |j¡¡|jdur0| d |j¡¡zt|ddd }WnHtjyŒ}z,|j d krv|  d  |j ¡¡WYd}~d Sd}~00n|  d¡|  d¡d S| d¡d ¡}|j d|¡dS)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ÚzRegistration 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 passwordzID: éz"Registered successfully with ID %s)r<r-r!r:Úappendr;rJrrKÚstdoutr$Ústderrr=r0ÚsplitÚrstriprr)r@rLÚ return_outr&Zreg_idr'r'r(r®sX  ý    ÿ  ý    ÿÿÿz SubscriptionManager.rhn_registerc Cs¾ddd |j¡g}zt|ƒd}Wnrtjy”}zX|j ¡dkrh|j d¡D]}|dkrN| |¡qNn| d |j   ¡¡¡WYd}~dSd}~00| d¡D]}|dkr |j   |¡q d S) NÚattachú--autoz--servicelevel={0}rrOÚ z*Setting the service level failed with: {0}FT) r!rrJrrKrRrUrTr$rSÚstriprr©r@rLrVr&Úliner'r'r(rös* ýÿÿz&SubscriptionManager._set_service_levelc Cszddg}zt|ƒd}Wn8tjyP}z| d |¡¡WYd}~dSd}~00| d¡D]}|dkr\|j |¡q\dS) NrWrXrzAuto-attach failed with: {0}FrYrOT)rJrrKr$r!rTrrr[r'r'r(rsz$SubscriptionManager._set_auto_attachcCsTg}g}gd¢}t|ƒd}| ¡ d¡}gd¢}t|ƒd}| ¡ d¡}||fS)zh Gets the list pools for the active subscription and returns them in list form. )rz --availableú --pool-onlyrrY)rz --consumedr])rJrUrT)r@Z availableÚconsumedrLÚresultsr'r'r(Ú _getPoolss  zSubscriptionManager._getPoolscCs˜ddg}t|ƒd}g}| d¡D]$}d|vr"| | d¡d ¡¡q"ddg}t|ƒd}g}| d¡D]$}d|vrj| | d¡d ¡¡qj||fS) zl Obtains the current list of active yum repositories and returns them in list form. Úreposz--list-enabledrrYzRepo ID:ú:rPz--list-disabled)rJrTrQrZ)r@rLrVÚ active_reposZrepoÚinactive_reposr'r'r(Ú _getRepos0s  zSubscriptionManager._getReposc Csît|ƒdkr|j d¡dS| ¡\}}g}dg}|D]6}||vr\||vr\| d |¡¡q6| d |¡¡q6t|ƒdkrê| |¡z*t|ƒ|j dd  |¡  d d ¡¡WdSt j yè}z | d  ||¡¡WYd }~d Sd }~00d S)zl Takes a list of subscription pools and "attaches" them to the current subscription rzNo pools to attachTrWz --pool={0}zPool {0} is not availablez/Attached the following pools to your system: %srEz--pool=rOz$Unable to attach pool {0} due to {1}NF) Úlenrrr`rQr!r$ÚextendrJrGÚreplacerrK)r@rZpool_availableZ pool_consumedZ pool_listrLZpoolr&r'r'r(r Fs0     þ ÿzSubscriptionManager.addPoolc Cs6|j}|j}|durg}|dur$g}t|tƒs<| d¡dSt|tƒsT| d¡dSt|ƒdkr|t|ƒdkr||j d¡dS| ¡\}}g}g}|D](}||vr²|  d  |¡¡q”|  |¡q”g}g} |D](}||vrè|  d  |¡¡qÊ|   |¡qÊt|ƒdkr8|D]0} | |vr$|j d | ¡n| d   | ¡¡qt| ƒdkr`| D]} |j d | ¡qJd g} t|ƒdkr~|   |¡t|ƒdkr–|   |¡z t | ƒWn:t jyÜ} z| d   | ¡¡WYd} ~ dSd} ~ 00t|ƒdkr|j dd |¡ dd¡¡t|ƒdkr2|j dd |¡ dd¡¡dS)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.Frz No repo IDs to enable or disableTz --enable={0}z --disable={0}zRepo %s is already enabledz!Repo {0} does not appear to existz.Repo %s not disabled because it is not enabledraz Unable to alter repos due to {0}zEnabled the following repos: %srEz --enable=rOz Disabled the following repos: %sz --disable=)r>r?rrr$rfrrrerQr!rgrJrrKrGrh) r@ZereposZdreposrcrdZ enable_listZenable_list_failZrepoidZ disable_listZdisable_list_failZfailrLr&r'r'r(r"hsz         ÿÿ   þþz SubscriptionManager.update_reposcCst|jr|jp|jƒS)N)Úboolr=r0r<)r@r'r'r(r¾sz!SubscriptionManager.is_configured)N)r*r+r,rFrAr#r$rrrrrr`rer r"rr'r'r'r(rTs #H "VrFcCstjdg||dS)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 zsubscription-manager)Z logstring)r)rLrNr'r'r(rJÂsrJ)F)Ú__doc__ZloggingZ cloudinitrrZcloudinit.cloudrZcloudinit.configrZcloudinit.config.schemarZcloudinit.settingsrZ getLoggerr*rr Ú__annotations__r%rr)Ú ExceptionrrrJr'r'r'r(Ús$     ü6p