a àiÿ2ã@sÆdZddlmZddlmZddlZddlZddlZddlm Z m Z ddl Z ddl Z ddl Z ddlZ ddlZ ddlZdZdZdZd Zd d „Zd d „Zdd„ZGdd„de jjƒZGdd„de jƒZdS)z¤ The DNF plugin helps customers to install kpatch-patch packages when the kernel is upgraded and filter kernel-core packages that are supported by the kpatch team. é)Úabsolute_import)Úunicode_literalsN)Ú_ÚloggerÚkpatchZ autoupdateZ autofilterú kernel-corecCs2dd„|jDƒ}|D]}tj |¡r|SqdS)NcSsg|]}d|tf‘qS)z %s/%s.conf)ÚKPATCH_PLUGIN_NAME)Ú.0Úpath©r ú6/usr/lib/python3.9/site-packages/dnf-plugins/kpatch.pyÚ 5óz(_get_plugin_cfg_file..)ZpluginconfpathÚosr Úisfile)Z base_confÚfilesÚfiler r r Ú_get_plugin_cfg_file4s   rcCs:t d|j¡ d¡}| dd¡}|j dd¡}d ||¡S)Nz (.*)\.el.*éÚ.rzkpatch-patch-{}-{})ÚreÚmatchÚreleaseÚgroupÚreplaceÚversionÚformat)Ú kernel_pkgZkernel_releaseZkpp_kernel_releaseZkpp_kernel_versionr r r Ú_kpp_name_from_kernel_pkg<s rcCsVt|ƒ}|j ¡j||jd}tj |j¡}|j|  ¡d|j j ||j j ddS)N©ÚnameÚarch)Úpkg)ZselectZoptional)rÚsackÚqueryÚfilterr!ÚdnfÚselectorZSelectorÚsetÚlatestZgoalÚinstallÚconfÚstrict)Zdnf_baserÚ kpp_pkg_nameÚkpp_pkgs_queryZkpp_sltrr r r Ú_install_kpp_pkgCs ÿr/csheZdZdZdZedƒZ‡fdd„Zedd„ƒZ dd „Z d d „Z d d „Z dd„Z dd„Zdd„Z‡ZS)Ú KpatchCmdz* Extend DNF with kpatch specific commands )rz7Toggles automatic installation of kpatch-patch packagescstƒ |¡t|jjƒ|_dS)N)ÚsuperÚ__init__rÚbaser+Úcfg_file)ÚselfÚcli©Ú __class__r r r2Ss zKpatchCmd.__init__cCs|jddddS)z' argparse python class ÚactionzJauto-update|manual-update|auto-filter|no-filter|install|status|auto|manual)ÚmetavarN)Ú add_argument)Úparserr r r Ú set_argparserXsÿzKpatchCmd.set_argparsercCsD|jj}d|_|jjdvr.d|_d|_d|_nd|_d|_d|_dS)zr configure DemandSheet Collection of demands that different CLI parts have on other parts T)ú auto-updater*ÚstatusÚautoFN)r6ÚdemandsZ root_userÚoptsr9Z resolvingZsack_activationZavailable_repos)r5rAr r r Ú configureds zKpatchCmd.configurec CsÎg}|jj ¡ ¡jtd}|D]¨}t|ƒ}|jj ¡ ¡j|d ¡}|r”|jj ¡j||dj|dj d}|jj ¡j||j d  ¡  |¡}n|jj ¡j||j d  ¡}|D]}|  t|ƒ¡q´q |S)N©r r)r rrr)r3r#r$Ú installedr%ÚKERNEL_PKG_NAMErÚrunrrr!r)Ú differenceÚappendÚstr) r5ÚkppsÚinstalled_kernelsrr-rEZsub_qr.r"r r r Ú_list_missing_kpp_pkgsvs0 ý þ ý þ z KpatchCmd._list_missing_kpp_pkgscCs2|jj ¡ ¡jtd}|D]}t|j|ƒqdS)NrD)r3r#r$rEr%rFr/)r5rLrr r r Ú_install_missing_kpp_pkgs•sz#KpatchCmd._install_missing_kpp_pkgsc Csv|jdurt d¡dSzt ¡}| |j¡|WStyp}z&tj  t dƒ  t |ƒ¡¡‚WYd}~n d}~00dS)Nú Couldn't find configuration fileúParsing file failed: {}) r4rÚwarningÚ configparserZ ConfigParserÚreadÚ Exceptionr&Ú exceptionsÚErrorrrrJ©r5r<Úer r r Ú _read_confœs   zKpatchCmd._read_confc CsÔ|jdurt d¡dS| ¡}|dur,dS| d¡s@| d¡| d|t|ƒ¡z>t|jddd}|  |¡Wdƒn1s„0YWn>t yÎ}z&t j   tdƒ t|ƒ¡¡‚WYd}~n d}~00dS)NrOÚmainÚwzutf-8)ÚencodingzFailed to update conf file: {})r4rrQrYÚ has_sectionZ add_sectionr(rJÚopenÚwriterTr&rUrVrr)r5ÚoptionÚvaluer+Z cfg_streamrXr r r Ú_update_plugin_cfg¨s    ,zKpatchCmd._update_plugin_cfgcCsÆ|jj}|dvr<| ¡| td¡t tdƒ |¡¡n†|dvrh| td¡t tdƒ |¡¡nZ|dkr”| t d¡t tdƒ |¡¡n.|dkrÀ| t d¡t tdƒ |¡¡n|d kr˜|  ¡}d }|d ur |  d ¡r |  d t¡r |  d t¡r d }t tdƒ |¡¡d}|d urZ|  d ¡rZ|  d t ¡rZ|  d t ¡rZd}t tdƒ |¡¡| ¡}|rÂt tdƒ d |¡¡¡n*|dkr¬| ¡ntj tdƒ |¡¡‚d S)z: Decision tree, execution based on config )r>r@TzKpatch update setting: {})ú manual-updateZmanualFz auto-filterzKpatch filter setting: {}z no-filterr?rcNrZr>zAvailable patches: {}z, r*zInvalid argument: {})rBr9rNrbÚKPATCH_UPDATE_OPTrÚinforrÚKPATCH_FILTER_OPTrYr]Ú has_optionÚ getbooleanrMÚjoinr&rUrV)r5r9r+Z kp_statusrKr r r rG¼sL      ÿ þ ÿ þ  z KpatchCmd.run)Ú__name__Ú __module__Ú __qualname__Ú__doc__ÚaliasesrZsummaryr2Ú staticmethodr=rCrMrNrYrbrGÚ __classcell__r r r7r r0Ls   r0csTeZdZdZeZgd¢ZddgZ‡fdd„Zdd„Z d d „Z d d „Z d d„Z ‡Z S)Ú KpatchPluginz´ The DNF plugin helps customers to install kpatch-patch packages when the kernel is upgraded and filter kernel-core packages that are supported by the kpatch team. )Úkernelrzkernel-moduleszkernel-modules-corezkernel-modules-extrarrzkernel-uname-rcs6tƒ ||¡d|_d|_d|_|dur2| t¡dS)NF)r1r2Ú _commitingÚ _autoupdateÚ _autofilterZregister_commandr0)r5r3r6r7r r r2üs zKpatchPlugin.__init__c Csœ| |jj¡}zL| d¡o0| dt¡o0| dt¡|_| d¡oT| dt¡oT| dt¡|_ Wn<t y–}z$t   t dƒ t|ƒ¡¡WYd}~n d}~00dS)NrZrP)Z read_configr3r+r]rgrdrhrtrfrurTrrQrrrJrWr r r Úconfigs  ÿ þ  ÿ þzKpatchPlugin.configcCs"d|_|j |jjj¡d|_dS)NTF)rsr3Úresolver6rAZ allow_erasing)r5r r r Ú_commit_changesszKpatchPlugin._commit_changesc Cs|js dStdƒ|jj ¡jdd}|jjjtjd}|j|jd|  ¡}|jjjtjd}|jdd|D]|}|j D]p}t |ƒ  d¡}t |ƒd kršqz|d |jvrz|j|d }d}|D]} | j}qÌq¼|duræ| |j|d ¡}qpqzqp|jj | |¡¡dS) NzOPlease note, kpatch filter is enabled, only kpatch supported kernels are shown.T)Úempty)ÚflagsrDzkpatch-patch-*)Z name__globú ér)Zprovides)Úevr)ruÚprintr3r#r$ZfiltermÚhawkeyZIGNORE_EXCLUDESÚkernel_pkg_namesZ availableZrequiresrJÚsplitÚlenÚkpatch_requirementr%r}ÚunionZ add_excludesrH) r5Z kernels_keepZ kernels_queryZ kpatch_queryZ kpatch_pkgZrequireZrequire_parsedZ kernel_coreZ kernel_evrZkernel_core_pkgr r r r#s0    zKpatchPlugin.sackcs¢|jr |jrdSg}g‰|jjD]H}|jtjjvr |jjt krL|  |j¡q |jj  d¡r ˆ  |jj¡q ‡fdd„|Dƒ}|D]}t |j|ƒq€|rž|  ¡dS)Nz kpatch-patch-csg|]}t|ƒˆvr|‘qSr )r)r r"©Zexplicit_kpp_installr r r Vs ÿz)KpatchPlugin.resolved..)rtrsr3Z transactionr9r&ZFORWARD_ACTIONSr"r rFrIÚ startswithr/rx)r5Z need_kpp_forZtr_itemrr r…r ÚresolvedCs   zKpatchPlugin.resolved)rjrkrlrmrr r€rƒr2rvrxr#r‡rpr r r7r rqîs  *rq)rmZ __future__rrrRZos.pathrrZdnfpluginscorerrr&Z dnf.callbackZdnf.cliZdnf.exceptionsZdnf.transactionrrrdrfrFrrr/r6ZCommandr0ZPluginrqr r r r Ús,   #