U '¡DgÙ<ã@s¸UdZddlZddlmZmZddlmZddlmZddl m Z ddl m Z e  e¡Zdd d d ge 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_subscriptionZfedoraZrhelZ openeulerÚrh_subscription)ÚidZdistrosZ frequencyZactivate_by_schema_keysÚmeta)ÚnameÚcfgÚcloudÚargsÚreturnc Csft|td}| ¡s$t d|¡dS| ¡sXzê| ¡\}}|dk rLt|ƒ‚| ¡}|s`tdƒ‚|jr|j dk r|  ¡s‚tdƒ‚q´|j  d¡n$|jr´|  ¡s¨tdƒ‚n |j  d¡|j dk röt|j tƒsÖd }t|ƒ‚| |j ¡} | sötd  |j ¡ƒ‚| ¡} | s td ƒ‚| d ¡Wn<tk rT} z| t| ƒ¡| d ¡W5d} ~ XYnXn | 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'úE/usr/lib/python3/dist-packages/cloudinit/config/cc_rh_subscription.pyÚhandlesN    ÿ        ÿr)c@s eZdZdS)rN)Ú__name__Ú __module__Ú __qualname__r'r'r'r(rPsrc @seZdZddddddddd d d g Zd'd d„Zdd„Zdd„Zdd„Zdd„Zdd„Z dd„Z dd„Z dd„Z dd „Z d!d"„Zd#d$„Zd%d&„Zd S)(rÚorgúactivation-keyÚusernameÚpasswordú disable-repoú enable-repoúadd-poolú rhsm-baseurlúserver-hostnameú auto-attachú service-levelNcCsÆ|dkr 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].}||jkrd |d |j¡¡}d|fSq|jdk rdt |j¡sdt |j¡sdd}d|fS|jdk r|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}s2   þÿ  ÿ ÿÿ ÿÿÿz SubscriptionManager._verify_keyscCs0dg}z t|ƒWntjk r*YdSXdS)zg Checks if the system is already registered and returns True if so, else False ZidentityFT)Ú _sub_man_clirÚProcessExecutionError)r@Úcmdr'r'r(r s  z!SubscriptionManager.is_registeredc CsÐ|jdk rÄ|jdk rÄdd |j¡d |j¡g}|jdk rJ| d |j¡¡|jdk rf| d |j¡¡zt|ddd }WnFtjk rÀ}z&|j d krª|  d  |j ¡¡WY¢d Sd}~XYnXnè|j dk r”|j dk r”dd  |j ¡d |j ¡g}|jdk r| d |j¡¡|jdk r2| d |j¡¡zt|ddd }WnJtjk r}z(|j d krz|  d  |j ¡¡WY¢d Sd}~XYnXn|  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;rIrrJÚstdoutr$Ústderrr=r0ÚsplitÚrstriprr)r@rKÚ return_outr&Zreg_idr'r'r(r®sX  ý    ÿ  ý    ÿÿÿz SubscriptionManager.rhn_registerc CsÀddd |j¡g}zt|ƒd}Wnttjk r–}zT|j ¡dkrj|j d¡D]}|dkrP| |¡qPn| d |j   ¡¡¡WY¢dSd}~XYnX| d¡D]}|dkr¢|j   |¡q¢d S) NÚattachú--autoz--servicelevel={0}rrNÚ z*Setting the service level failed with: {0}FT) r!rrIrrJrQrTrSr$rRÚstriprr©r@rKrUr&Úliner'r'r(rös* ýÿÿz&SubscriptionManager._set_service_levelc Cs|ddg}zt|ƒd}Wn:tjk rR}z| d |¡¡WY¢dSd}~XYnX| d¡D]}|dkr^|j |¡q^dS) NrVrWrzAuto-attach failed with: {0}FrXrNT)rIrrJr$r!rSrrrZr'r'r(rsz$SubscriptionManager._set_auto_attachcCsXg}g}dddg}t|ƒd}| ¡ d¡}dddg}t|ƒd}| ¡ d¡}||fS)zh Gets the list pools for the active subscription and returns them in list form. rz --availablez --pool-onlyrrXz --consumed)rIrTrS)r@Z availableÚconsumedrKZresultsr'r'r(Ú _getPoolss    zSubscriptionManager._getPoolscCs˜ddg}t|ƒd}g}| d¡D]$}d|kr"| | d¡d ¡¡q"ddg}t|ƒd}g}| d¡D]$}d|krj| | d¡d ¡¡qj||fS) zl Obtains the current list of active yum repositories and returns them in list form. Úreposz--list-enabledrrXzRepo ID:ú:rOz--list-disabled)rIrSrPrY)r@rKrUÚ active_reposZrepoÚinactive_reposr'r'r(Ú _getRepos0s  zSubscriptionManager._getReposc Csðt|ƒdkr|j d¡dS| ¡\}}g}dg}|D]6}||kr\||kr\| d |¡¡q6| d |¡¡q6t|ƒdkrì| |¡z*t|ƒ|j dd  |¡  d d ¡¡WdSt j k rê}z| d  ||¡¡WY¢d Sd }~XYnXd S)zl Takes a list of subscription pools and "attaches" them to the current subscription rzNo pools to attachTrVz --pool={0}zPool {0} is not availablez/Attached the following pools to your system: %srEz--pool=rNz$Unable to attach pool {0} due to {1}FN) Úlenrrr]rPr!r$ÚextendrIrGÚreplacerrJ)r@rZpool_availableZ pool_consumedZ pool_listrKZpoolr&r'r'r(r Fs0     þ ÿzSubscriptionManager.addPoolc Cs8|j}|j}|dkrg}|dkr$g}t|tƒs<| d¡dSt|tƒsT| d¡dSt|ƒdkr|t|ƒdkr||j d¡dS| ¡\}}g}g}|D](}||kr²|  d  |¡¡q”|  |¡q”g}g} |D](}||krè|  d  |¡¡qÊ|   |¡qÊt|ƒdkr8|D]0} | |kr$|j d | ¡n| d   | ¡¡qt| ƒdkr`| D]} |j d | ¡qJd g} t|ƒdkr~|   |¡t|ƒdkr–|   |¡z t | ƒWn<t jk rÞ} z| d   | ¡¡WY¢dSd} ~ XYnXt|ƒdkr |j dd |¡ dd¡¡t|ƒdkr4|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 enabledr^z Unable to alter repos due to {0}zEnabled the following repos: %srEz --enable=rNz Disabled the following repos: %sz --disable=)r>r?rrr$rcrrrbrPr!rdrIrrJrGre) r@ZereposZdreposr`raZ enable_listZenable_list_failZrepoidZ disable_listZdisable_list_failZfailrKr&r'r'r(r"hs|         ÿÿ   þþ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]rbr r"rr'r'r'r(rTs2õ #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)rKrMr'r'r(rIÂsrI)F)Ú__doc__ZloggingZ cloudinitrrZcloudinit.cloudrZcloudinit.configrZcloudinit.config.schemarZcloudinit.settingsrZ getLoggerr*rr Ú__annotations__r%rr)Ú ExceptionrrrIr'r'r'r(Ús$     ü6p