1 Star 0 Fork 23

庞庆/anaconda_4

forked from src-anolis-os/anaconda 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
0006-anaconda-add-kernel_selection.patch 21.93 KB
一键复制 编辑 原始数据 按行查看 历史
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569
From 2a390f04c193dd9116c32c7303d9ad1a298e34d2 Mon Sep 17 00:00:00 2001
From: pangqing <pangqing@uniontech.com>
Date: Mon, 26 Jul 2021 17:55:50 +0800
Subject: [PATCH] anaconda add double kernel version to anaconda
---
.../ui/gui/spokes/kernel_selection.glade | 125 ++++++++++
pyanaconda/ui/gui/spokes/kernel_selection.py | 225 ++++++++++++++++++
pyanaconda/ui/tui/spokes/kernel_selection.py | 184 ++++++++++++++
3 files changed, 534 insertions(+)
create mode 100644 pyanaconda/ui/gui/spokes/kernel_selection.glade
create mode 100644 pyanaconda/ui/gui/spokes/kernel_selection.py
create mode 100644 pyanaconda/ui/tui/spokes/kernel_selection.py
diff --git a/pyanaconda/ui/gui/spokes/kernel_selection.glade b/pyanaconda/ui/gui/spokes/kernel_selection.glade
new file mode 100644
index 0000000..ae2c2c7
--- /dev/null
+++ b/pyanaconda/ui/gui/spokes/kernel_selection.glade
@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface>
+ <requires lib="gtk+" version="3.10"/>
+ <requires lib="AnacondaWidgets" version="1.0"/>
+ <object class="AnacondaSpokeWindow" id="kernelWindow">
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="window_name" translatable="yes">KERNEL SELECTION</property>
+ <signal name="button-clicked" handler="on_back_clicked" swapped="no"/>
+ <child internal-child="main_box">
+ <object class="GtkBox" id="AnacondaSpokeWindow-main_box1">
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child internal-child="nav_box">
+ <object class="GtkEventBox" id="AnacondaSpokeWindow-nav_box1">
+ <property name="can_focus">False</property>
+ <child internal-child="nav_area">
+ <object class="GtkGrid" id="AnacondaSpokeWindow-nav_area1">
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child internal-child="alignment">
+ <object class="GtkAlignment" id="AnacondaSpokeWindow-alignment1">
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0</property>
+ <property name="top_padding">12</property>
+ <property name="bottom_padding">48</property>
+ <property name="left_padding">24</property>
+ <property name="right_padding">24</property>
+ <child internal-child="action_area">
+ <object class="GtkBox" id="AnacondaSpokeWindow-action_area1">
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkGrid" id="grid1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="column_spacing">24</property>
+ <property name="column_homogeneous">True</property>
+ <child>
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_bottom">6</property>
+ <property name="hexpand">True</property>
+ <property name="label" translatable="yes">Kernel Selection</property>
+ <property name="xalign">0</property>
+ <attributes>
+ <attribute name="font-desc" value="Cantarell 12"/>
+ <attribute name="weight" value="normal"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="kernelScrolledWindow">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="events">GDK_STRUCTURE_MASK | GDK_SCROLL_MASK</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="hscrollbar_policy">never</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkViewport" id="kernelViewport">
+ <property name="width_request">250</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkListBox" id="kernelListBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <signal name="row-activated" handler="on_kernel_activated" swapped="no"/>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/pyanaconda/ui/gui/spokes/kernel_selection.py b/pyanaconda/ui/gui/spokes/kernel_selection.py
new file mode 100644
index 0000000..27de5a7
--- /dev/null
+++ b/pyanaconda/ui/gui/spokes/kernel_selection.py
@@ -0,0 +1,225 @@
+# kernel selection spoke classes
+#
+# Copyright (C) 2021 OpenAnolis Community
+#
+import re
+import gi
+gi.require_version("Gtk", "3.0")
+gi.require_version("Pango", "1.0")
+
+from gi.repository import Gtk, Pango
+
+from pyanaconda.flags import flags
+from pyanaconda.core.i18n import _, C_, CN_
+from pyanaconda.payload import PackagePayload, payloadMgr, NoSuchGroup, PayloadError
+from pyanaconda.threading import threadMgr, AnacondaThread
+from pyanaconda.core import util, constants
+
+from pyanaconda.ui.communication import hubQ
+from pyanaconda.ui.gui.spokes import NormalSpoke
+from pyanaconda.ui.gui.spokes.lib.detailederror import DetailedErrorDialog
+from pyanaconda.ui.gui.utils import blockedHandler, escape_markup
+from pyanaconda.core.async_utils import async_action_wait
+from pyanaconda.ui.categories.software import SoftwareCategory
+
+from pyanaconda.anaconda_loggers import get_module_logger
+log = get_module_logger(__name__)
+
+import sys, copy
+
+__all__ = ["KernelSelectionSpoke"]
+
+class KernelSelectionSpoke(NormalSpoke):
+ builderObjects = ["kernelWindow"]
+ mainWidgetName = "kernelWindow"
+ uiFile = "spokes/kernel_selection.glade"
+ help_id = "KernelSelectionSpoke"
+
+ category = SoftwareCategory
+
+ #icon = "applications-system"
+ icon = "package-x-generic-symbolic"
+ title = CN_("GUI|Spoke", "_Kernel Selection")
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+ self._errorMsgs = None
+ self._orig_kernel = None
+ self._kickstarted = flags.automatedInstall and self.data.packages.seen
+
+ self._kernelListBox = self.builder.get_object("kernelListBox")
+ self._kernelViewport = self.builder.get_object("kernelViewport")
+ self._kernelListBox.set_focus_vadjustment(Gtk.Scrollable.get_vadjustment(self._kernelViewport))
+
+ self._fakeRadio = Gtk.RadioButton(group=None)
+ self._fakeRadio.set_active(True)
+
+
+ @property
+ def available_kernels(self):
+ return self.payload.available_kernels
+
+ @property
+ def current_kernel(self):
+ return self.payload.current_kernel
+
+
+ @current_kernel.setter
+ def current_kernel(self, value):
+ self.payload.current_kernel = value
+
+ def apply(self):
+ self._apply()
+
+ def _apply(self):
+ hubQ.send_not_ready(self.__class__.__name__)
+ hubQ.send_not_ready("SourceSpoke")
+ threadMgr.add(AnacondaThread(name="AnaCheckKernel", target=self.checkKernelSelection))
+
+ def checkKernelSelection(self):
+ # we do this only kernel changed
+ if self.changed:
+ kernel_keys = self.available_kernels.keys()
+ for kernel in kernel_keys:
+ if kernel == self.current_kernel:
+ self.payload.data.packages.packageList.extend(self.available_kernels[kernel])
+ for package in self.available_kernels[kernel]:
+ if package in self.payload.data.packages.excludedList:
+ self.payload.data.packages.excludedList.remove(package)
+ else:
+ self.payload.data.packages.excludedList.extend(self.available_kernels[kernel])
+ for package in self.available_kernels[kernel]:
+ if package in self.payload.data.packages.packageList:
+ self.payload.data.packages.packageList.remove(package)
+ # store kernel selection
+ self._orig_kernel = self.current_kernel
+
+ hubQ.send_ready(self.__class__.__name__, False)
+ hubQ.send_ready("SourceSpoke", False)
+
+ def initialize(self):
+ super().initialize()
+ self.initialize_start()
+ threadMgr.add(AnacondaThread(name="AnaKernelWatcher", target=self._initialize))
+
+ def _initialize(self):
+ threadMgr.wait(constants.THREAD_PAYLOAD)
+
+ self.payload.detectMultiKernel()
+
+ # find kernel in package list
+ kernel_pattern=re.compile(r"kernel-[4,5].\d+.\d+")
+ if self._kickstarted:
+ for package in self.payload.data.packages.packageList:
+ if kernel_pattern.search(package):
+ self.current_kernel = package.split('-')[1]
+
+ # use first kernel as default, normally it's rhck
+ if not self.current_kernel:
+ self.current_kernel = list(self.available_kernels.keys())[0]
+
+ hubQ.send_ready(self.__class__.__name__, False)
+ self._apply()
+ # report that software spoke initialization has been completed
+ self.initialize_done()
+
+ @property
+ def completed(self):
+ processingDone = bool(not threadMgr.get("AnaCheckKernel") and
+ not threadMgr.get(constants.THREAD_PAYLOAD) and
+ not self._errorMsgs)
+
+ if processingDone:
+ return True
+
+ @property
+ def changed(self):
+ if self.current_kernel == self._orig_kernel:
+ return False
+ else:
+ return True
+
+ @property
+ def mandatory(self):
+ return True
+
+ @property
+ def ready(self):
+ return bool(not threadMgr.get("AnaKernelWatcher") and
+ not threadMgr.get(constants.THREAD_PAYLOAD) and
+ not threadMgr.get("AnaCheckKernel")
+ )
+
+ @property
+ def showable(self):
+ return isinstance(self.payload, PackagePayload)
+
+ @property
+ def status(self):
+ if self._errorMsgs:
+ return _("Error select kernel")
+ return self.current_kernel
+
+
+ def _add_row(self, listbox, name, desc, button, clicked):
+ row = Gtk.ListBoxRow()
+ box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=6)
+
+ button.set_valign(Gtk.Align.START)
+ button.connect("toggled", clicked, row)
+ box.add(button)
+
+ label = Gtk.Label(label="<b>%s</b>\n%s" % (escape_markup(name), escape_markup(desc)),
+ use_markup=True, wrap=True, wrap_mode=Pango.WrapMode.WORD_CHAR,
+ hexpand=True, xalign=0, yalign=0.5)
+ box.add(label)
+
+ row.add(box)
+ listbox.insert(row, -1)
+
+ def refresh(self):
+ super().refresh()
+
+ threadMgr.wait(constants.THREAD_PAYLOAD)
+
+ self._clear_listbox(self._kernelListBox)
+ kernel_keys = self.available_kernels.keys()
+ for kernel in kernel_keys:
+ radio = Gtk.RadioButton(group=self._fakeRadio)
+ if not self.current_kernel:
+ self.current_kernel = kernel
+ radio.set_active(self.current_kernel and kernel == self.current_kernel)
+ if kernel == '4.18.0':
+ kernel_desc = _("RHCK")
+ kernel_info = _("Compatible with RHEL")
+ elif kernel == '4.19.91':
+ kernel_desc = _("ANCK")
+ kernel_info = _("Support Anolis OS verified platform")
+ else:
+ kernel_desc = ''
+ kernel_info = ''
+ self._add_row(self._kernelListBox, "%s (%s)" % (kernel, kernel_desc), "%s (%s)" % (kernel_info, self.available_kernels[kernel][0]), radio, self.on_radio_button_toggled)
+
+ self._kernelListBox.show_all()
+
+ def _clear_listbox(self, listbox):
+ for child in listbox.get_children():
+ listbox.remove(child)
+ del(child)
+
+ # Signal handlers
+ def on_radio_button_toggled(self, radio, row):
+ # If the radio button toggled to inactive, don't reactivate the row
+ if not radio.get_active():
+ return
+ row.activate()
+
+ def on_kernel_activated(self, listbox, row):
+ box = row.get_children()[0]
+ button = box.get_children()[0]
+
+ with blockedHandler(button, self.on_radio_button_toggled):
+ button.set_active(True)
+
+ kernel_keys = list(self.available_kernels.keys())
+ self.current_kernel=kernel_keys[row.get_index()]
diff --git a/pyanaconda/ui/tui/spokes/kernel_selection.py b/pyanaconda/ui/tui/spokes/kernel_selection.py
new file mode 100644
index 0000000..d03fcc0
--- /dev/null
+++ b/pyanaconda/ui/tui/spokes/kernel_selection.py
@@ -0,0 +1,184 @@
+# Copyright (C) 2021 OpenAnolis Community
+#
+#
+import re
+from pyanaconda.flags import flags
+from pyanaconda.ui.categories.software import SoftwareCategory
+from pyanaconda.ui.tui.spokes import NormalTUISpoke
+from pyanaconda.threading import threadMgr, AnacondaThread
+from pyanaconda.payload import DependencyError, PackagePayload, payloadMgr, NoSuchGroup
+from pyanaconda.core.i18n import N_, _, C_
+
+from pyanaconda.core.constants import THREAD_PAYLOAD, THREAD_CHECK_SOFTWARE, \
+ THREAD_SOFTWARE_WATCHER
+
+from simpleline.render.containers import ListColumnContainer
+from simpleline.render.screen import InputState
+from simpleline.render.screen_handler import ScreenHandler
+from simpleline.render.widgets import TextWidget, CheckboxWidget
+
+from pyanaconda.anaconda_loggers import get_module_logger
+log = get_module_logger(__name__)
+
+__all__ = ["KernelSpoke"]
+
+
+class KernelSpoke(NormalTUISpoke):
+ """ Spoke used to read new value of text to represent source repo.
+
+ .. inheritance-diagram:: SoftwareSpoke
+ :parts: 3
+ """
+ help_id = "KernelSelectionSpoke"
+ category = SoftwareCategory
+
+ def __init__(self, data, storage, payload, instclass):
+ super().__init__(data, storage, payload, instclass)
+ self.title = N_("Kernel selection")
+ self._container = None
+ self.errors = []
+
+ self._orig_kernel = None
+ self._kickstarted = flags.automatedInstall and self.data.packages.seen
+
+ def initialize(self):
+ self.initialize_start()
+ super().initialize()
+ threadMgr.add(AnacondaThread(name="AnaKernelWatcher", target=self._initialize))
+
+ def _initialize(self):
+ threadMgr.wait(THREAD_PAYLOAD)
+
+ self.payload.detectMultiKernel()
+
+ # find kernel in package list
+ kernel_pattern=re.compile(r"kernel-[4,5].\d+.\d+")
+ if self._kickstarted:
+ for package in self.payload.data.packages.packageList:
+ if kernel_pattern.search(package):
+ self.current_kernel = package.split('-')[1]
+
+ # use first kernel as default, normally it's rhck
+ if not self.current_kernel:
+ self.current_kernel = list(self.available_kernels.keys())[0]
+
+ self._apply()
+ threadMgr.wait("AnaCheckKernel")
+ self.initialize_done()
+
+ @property
+ def changed(self):
+ if self.current_kernel == self._orig_kernel:
+ return False
+ else:
+ return True
+
+ @property
+ def showable(self):
+ return isinstance(self.payload, PackagePayload)
+
+ @property
+ def status(self):
+ if self.errors:
+ return _("Error checking kernel selection")
+ return self.current_kernel
+
+ @property
+ def completed(self):
+ processing_done = self.ready and not self.errors
+ return processing_done and self.payload.baseRepo
+
+ def refresh(self, args=None):
+ """ Refresh screen. """
+ NormalTUISpoke.refresh(self, args)
+
+ threadMgr.wait(THREAD_PAYLOAD)
+ self._container = None
+
+ threadMgr.wait("AnaCheckKernel")
+ self._container = ListColumnContainer(2, columns_width=38, spacing=2)
+
+ msg = self._refresh_kernels()
+
+ self.window.add_with_separator(TextWidget(msg))
+ self.window.add_with_separator(self._container)
+
+ def _refresh_kernels(self):
+ kernel_keys = self.available_kernels.keys()
+ for kernel in kernel_keys:
+ selected = (self.current_kernel == kernel)
+ if kernel == '4.18.0':
+ kernel_desc = _("RHCK")
+ kernel_info = _("Compatible with RHEL")
+ elif kernel == '4.19.91':
+ kernel_desc = _("ANCK")
+ kernel_info = _("Support Anolis OS verified platform")
+ else:
+ kernel_desc = ''
+ kernel_info = ''
+ widget = CheckboxWidget(title="%s (%s)" % (kernel, kernel_desc), completed=selected)
+ self._container.add(widget, callback=self._set_kernel_callback, data=kernel)
+
+ return _("Kernel List")
+
+ def _set_kernel_callback(self, data):
+ self.current_kernel = data
+
+ def input(self, args, key):
+ if self._container is not None and self._container.process_user_input(key):
+ self.redraw()
+ else:
+ # TRANSLATORS: 'c' to continue
+ if key.lower() == C_('TUI|Spoke Navigation', 'c'):
+
+ if self.current_kernel is None:
+ self.close()
+ else:
+ self.apply()
+ self.close()
+ else:
+ return super().input(args, key)
+
+ return InputState.PROCESSED
+
+ @property
+ def ready(self):
+ """ If we're ready to move on. """
+ return (not threadMgr.get(THREAD_PAYLOAD) and
+ not threadMgr.get("AnaCheckKernel") and
+ not threadMgr.get("AnaKernelWatcher"))
+
+ @property
+ def available_kernels(self):
+ return self.payload.available_kernels
+
+ @property
+ def current_kernel(self):
+ return self.payload.current_kernel
+
+ @current_kernel.setter
+ def current_kernel(self, value):
+ self.payload.current_kernel = value
+
+ def apply(self):
+ self._apply()
+
+ def _apply(self):
+ threadMgr.add(AnacondaThread(name="AnaCheckKernel", target=self.checkKernelSelection))
+
+ def checkKernelSelection(self):
+ if self.changed:
+ kernel_keys = self.available_kernels.keys()
+ for kernel in kernel_keys:
+ if kernel == self.current_kernel:
+ self.payload.data.packages.packageList.extend(self.available_kernels[kernel])
+ for package in self.available_kernels[kernel]:
+ if package in self.payload.data.packages.excludedList:
+ self.payload.data.packages.excludedList.remove(package)
+ else:
+ self.payload.data.packages.excludedList.extend(self.available_kernels[kernel])
+ for package in self.available_kernels[kernel]:
+ if package in self.payload.data.packages.packageList:
+ self.payload.data.packages.packageList.remove(package)
+ # store kernel selection
+ self._orig_kernel = self.current_kernel
--
2.18.4
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/pang-qing/anaconda_4.git
git@gitee.com:pang-qing/anaconda_4.git
pang-qing
anaconda_4
anaconda_4
a8

搜索帮助

23e8dbc6 1850385 7e0993f3 1850385