summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCoprDistGit <infra@openeuler.org>2023-09-19 03:19:34 +0000
committerCoprDistGit <infra@openeuler.org>2023-09-19 03:19:34 +0000
commite9f07e4582f7977395d5c26d41e3fc97ed9e077c (patch)
tree478a9376a299c9450151b72c29c5c790c1023564
parenta4252603249fd648f2870ce2dcbaf86ebcf1f118 (diff)
automatic import of anacondaopeneuler20.03
-rw-r--r--.gitignore1
-rw-r--r--Support-configuration-of-additional-boot-arguments.patch80
-rw-r--r--add-passwd-policy.patch45
-rw-r--r--anaconda.spec844
-rw-r--r--backport-Ignore-SIGINT-in-D-Bus-launcher-and-x11-too.patch76
-rw-r--r--backport-Sort-RPM-versions-via-rpm.labelCompare-and-not-via-p.patch109
-rw-r--r--backport-dracut-handle-compressed-kernel-modules.patch47
-rw-r--r--backport-network-use-separate-main-conext-for-NM-client-in-threads.patch824
-rw-r--r--bugfix-GUI-nfs-unknown-error.patch26
-rw-r--r--bugfix-Solve-the-problem-that-the-circular-loading-progress-bar-does-not-rotate.patch25
-rw-r--r--bugfix-adapt-active-connection-without-interface-name.patch26
-rw-r--r--bugfix-add-SM3-with-tui.patch173
-rw-r--r--bugfix-add-log-and-background.patch46
-rw-r--r--bugfix-change-gnome-kiosk-to-use-metacity.patch28
-rw-r--r--bugfix-change-product-name-do-not-with-upper.patch39
-rw-r--r--bugfix-change-the-startup-mode-of-do_transaction-sub-proces.patch160
-rw-r--r--bugfix-password-tooltip-text-adapt-language.patch36
-rw-r--r--bugfix-revert-Unify-GRUB-configuration-file-location-across-all-platforms.patch104
-rw-r--r--bugfix-set-up-LD_PRELOAD-for-the-Storage-and-Services-module.patch65
-rw-r--r--bugfix-with-use-local-kickstart-version.patch38
-rw-r--r--change-inst-repo-default-value.patch26
-rw-r--r--disable-disk-encryption.patch71
-rw-r--r--disable-ssh-login-checkbox.patch37
-rw-r--r--euleros.conf38
-rw-r--r--fix-hostname-info.patch61
-rw-r--r--hce.conf38
-rw-r--r--hide-help-button.patch131
-rw-r--r--modify-interface-is-extended-in-Chinese-mode.patch25
-rw-r--r--modify-timezone-and-delete-datezone-map.patch184
-rw-r--r--openeuler.conf37
-rw-r--r--remove-vender-issue-in-netdev.patch28
-rw-r--r--sources1
-rw-r--r--summer-ospp-replace-isomd5sum-with-isosm3sum.patch60
-rw-r--r--support-use-sm3-crypt-user-password.patch234
34 files changed, 3763 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index e69de29..ad20ae8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -0,0 +1 @@
+/anaconda-36.16.5.tar.bz2
diff --git a/Support-configuration-of-additional-boot-arguments.patch b/Support-configuration-of-additional-boot-arguments.patch
new file mode 100644
index 0000000..0c49d41
--- /dev/null
+++ b/Support-configuration-of-additional-boot-arguments.patch
@@ -0,0 +1,80 @@
+From 65258a808a703de25f790b2cb5aff8e734228ad1 Mon Sep 17 00:00:00 2001
+From: Qiumiao Zhang <zhangqiumiao1@huawei.com>
+Date: Mon, 7 Nov 2022 11:33:53 +0800
+Subject: [PATCH] Support configuration of additional boot arguments
+
+---
+ data/anaconda.conf | 2 ++
+ pyanaconda/argument_parsing.py | 2 +-
+ pyanaconda/core/configuration/bootloader.py | 8 ++++++++
+ pyanaconda/modules/storage/bootloader/base.py | 5 +++++
+ 4 files changed, 16 insertions(+), 1 deletion(-)
+
+diff --git a/data/anaconda.conf b/data/anaconda.conf
+index 703114a..b80440e 100644
+--- a/data/anaconda.conf
++++ b/data/anaconda.conf
+@@ -159,6 +159,8 @@ preserved_arguments =
+ biosdevname ipv6.disable net.ifnames net.ifnames.prefix
+ nosmt
+
++# Arguments added by default.
++additional_arguments =
+
+ [Storage]
+ # Enable dmraid usage during the installation.
+diff --git a/pyanaconda/argument_parsing.py b/pyanaconda/argument_parsing.py
+index 75f28f4..dd5ecdf 100644
+--- a/pyanaconda/argument_parsing.py
++++ b/pyanaconda/argument_parsing.py
+@@ -589,7 +589,7 @@ def getArgumentParser(version_string, boot_cmdline=None):
+
+ # some defaults change based on cmdline flags
+ if boot_cmdline is not None:
+- if "console" in boot_cmdline:
++ if "console" in boot_cmdline and "inst.text" in boot_cmdline:
+ ap.set_defaults(display_mode=DisplayModes.TUI)
+
+ return ap
+diff --git a/pyanaconda/core/configuration/bootloader.py b/pyanaconda/core/configuration/bootloader.py
+index 6746e45..7b782d3 100644
+--- a/pyanaconda/core/configuration/bootloader.py
++++ b/pyanaconda/core/configuration/bootloader.py
+@@ -69,3 +69,11 @@ class BootloaderSection(Section):
+ :return: a list of kernel arguments
+ """
+ return self._get_option("preserved_arguments", str).split()
++
++ @property
++ def additional_arguments(self):
++ """Arguments added by default.
++
++ :return: a list of kernel arguments
++ """
++ return self._get_option("additional_arguments", str).split()
+diff --git a/pyanaconda/modules/storage/bootloader/base.py b/pyanaconda/modules/storage/bootloader/base.py
+index be039c4..533d528 100644
+--- a/pyanaconda/modules/storage/bootloader/base.py
++++ b/pyanaconda/modules/storage/bootloader/base.py
+@@ -734,6 +734,7 @@ class BootLoader(object):
+ self._set_extra_boot_args(bootloader_proxy)
+ self._set_storage_boot_args(storage)
+ self._preserve_some_boot_args()
++ self._add_additional_boot_args()
+ self._set_graphical_boot_args()
+ self._set_security_boot_args()
+
+@@ -908,6 +909,10 @@ class BootLoader(object):
+
+ self.boot_args.add(new_arg)
+
++ def _add_additional_boot_args(self):
++ for opt in conf.bootloader.additional_arguments:
++ self.boot_args.add(opt)
++
+ def _set_graphical_boot_args(self):
+ """Set up the graphical boot."""
+ args = []
+--
+2.19.1
+
diff --git a/add-passwd-policy.patch b/add-passwd-policy.patch
new file mode 100644
index 0000000..b993e7a
--- /dev/null
+++ b/add-passwd-policy.patch
@@ -0,0 +1,45 @@
+From 3562cad5ea86afc5d2ce0ead649e64cf13e39128 Mon Sep 17 00:00:00 2001
+From: sun_hai_10 <sunhai10@huawei.com>
+Date: Mon, 7 Nov 2022 14:48:28 +0800
+Subject: [PATCH] add passwd policy
+
+---
+ data/anaconda.conf | 6 +++---
+ pyanaconda/input_checking.py | 4 ++++
+ 2 files changed, 7 insertions(+), 3 deletions(-)
+
+diff --git a/data/anaconda.conf b/data/anaconda.conf
+index 703114a..07e500f 100644
+--- a/data/anaconda.conf
++++ b/data/anaconda.conf
+@@ -308,9 +308,9 @@ can_change_users = False
+ # strict Require the minimum quality.
+ #
+ password_policies =
+- root (quality 1, length 6)
+- user (quality 1, length 6, empty)
+- luks (quality 1, length 6)
++ root (quality 1, length 8, strict)
++ user (quality 1, length 8, empty, strict)
++ luks (quality 1, length 8, strict)
+
+
+ [License]
+diff --git a/pyanaconda/input_checking.py b/pyanaconda/input_checking.py
+index 4482b26..4bed6c1 100644
+--- a/pyanaconda/input_checking.py
++++ b/pyanaconda/input_checking.py
+@@ -421,6 +421,10 @@ class PasswordValidityCheck(InputCheck):
+ pw_score = 4
+ status_text = _(constants.SecretStatus.STRONG.value)
+
++ #disable set password without confirnation
++ if not error_message and not check_request.password_confirmation:
++ error_message = _(constants.SECRET_CONFIRM_ERROR_GUI[check_request.secret_type])
++
+ # the policy influences the overall success of the check
+ # - score 0 & strict == True -> success = False
+ # - score 0 & strict == False -> success = True
+--
+2.23.0
+
diff --git a/anaconda.spec b/anaconda.spec
new file mode 100644
index 0000000..df520b2
--- /dev/null
+++ b/anaconda.spec
@@ -0,0 +1,844 @@
+%define _empty_manifest_terminate_build 0
+Name: anaconda
+Version: 36.16.5
+Release: 21
+Summary: Graphical system installer
+License: GPLv2+ and MIT
+URL: http://fedoraproject.org/wiki/Anaconda
+Source0: https://github.com/rhinstaller/%{name}/releases/download/%{name}-%{version}-1/%{name}-%{version}.tar.bz2
+Source1: openeuler.conf
+Source2: euleros.conf
+Source3: hce.conf
+Source4: disable-disk-encryption.patch
+
+%ifarch sw_64
+Patch6001: anaconda-33.19.sw.patch
+%endif
+%ifarch loongarch64
+Patch6002: 0001-add-loongarch-support-for-anaconda.patch
+%endif
+
+Patch9000: add-passwd-policy.patch
+Patch9001: bugfix-GUI-nfs-unknown-error.patch
+Patch9002: bugfix-set-up-LD_PRELOAD-for-the-Storage-and-Services-module.patch
+Patch9003: bugfix-Solve-the-problem-that-the-circular-loading-progress-bar-does-not-rotate.patch
+Patch9004: change-inst-repo-default-value.patch
+Patch9005: disable-disk-encryption.patch
+Patch9006: disable-ssh-login-checkbox.patch
+Patch9007: fix-hostname-info.patch
+Patch9008: hide-help-button.patch
+Patch9009: modify-interface-is-extended-in-Chinese-mode.patch
+Patch9010: modify-timezone-and-delete-datezone-map.patch
+Patch9011: remove-vender-issue-in-netdev.patch
+Patch9012: Support-configuration-of-additional-boot-arguments.patch
+Patch9013: support-use-sm3-crypt-user-password.patch
+Patch9014: bugfix-with-use-local-kickstart-version.patch
+Patch9015: bugfix-change-gnome-kiosk-to-use-metacity.patch
+Patch9016: bugfix-add-log-and-background.patch
+Patch9017: bugfix-add-SM3-with-tui.patch
+Patch9018: bugfix-change-product-name-do-not-with-upper.patch
+Patch6003: backport-dracut-handle-compressed-kernel-modules.patch
+Patch6004: backport-Ignore-SIGINT-in-D-Bus-launcher-and-x11-too.patch
+Patch6005: backport-network-use-separate-main-conext-for-NM-client-in-threads.patch
+Patch6006: backport-Sort-RPM-versions-via-rpm.labelCompare-and-not-via-p.patch
+
+Patch9019: bugfix-adapt-active-connection-without-interface-name.patch
+
+Patch9020: bugfix-password-tooltip-text-adapt-language.patch
+
+Patch9021: bugfix-revert-Unify-GRUB-configuration-file-location-across-all-platforms.patch
+Patch9022: bugfix-change-the-startup-mode-of-do_transaction-sub-proces.patch
+
+# openEuler summer ospp
+Patch10000: summer-ospp-replace-isomd5sum-with-isosm3sum.patch
+
+%define dasbusver 1.3
+%define dbusver 1.2.3
+%define dnfver 3.6.0
+%define dracutver 034-7
+%define gettextver 0.19.8
+%define gtk3ver 3.22.17
+# openEuler summer ospp
+%define isosm3sumver 1.0.0
+%define langtablever 0.0.54
+%define libarchivever 3.0.4
+%define libblockdevver 2.1
+%define libxklavierver 5.4
+%define mehver 0.23-1
+%define nmver 1.0
+%define pykickstartver 3.32-1
+%define pypartedver 2.5-2
+%define pythonblivetver 1:3.4.0-1
+%define rpmver 4.15.0
+%define simplelinever 1.1-1
+%define utillinuxver 2.15.1
+BuildRequires: python3-pygments
+
+BuildRequires: audit-libs-devel libtool gettext-devel >= %{gettextver} gtk3-devel >= %{gtk3ver}
+BuildRequires: gtk-doc gtk3-devel-docs >= %{gtk3ver} glib2-doc gobject-introspection-devel
+BuildRequires: glade-devel libgnomekbd-devel libxklavier-devel >= %{libxklavierver} pango-devel
+BuildRequires: make
+BuildRequires: python3-kickstart >= %{pykickstartver} python3-devel systemd
+BuildRequires: rpm-devel >= %{rpmver} libarchive-devel >= %{libarchivever} gdk-pixbuf2-devel
+BuildRequires: libxml2
+BuildRequires: gsettings-desktop-schemas metacity
+
+Requires: anaconda-core = %{version}-%{release}
+Requires: anaconda-tui = %{version}-%{release}
+Requires: libblockdev-plugins-all >= %{libblockdevver} realmd
+# openEuler summer ospp
+Requires: isosm3sum >= %{isosm3sumver}
+Requires: kexec-tools createrepo_c tmux gdb rsync python3-meh-gui >= %{mehver}
+Requires: adwaita-icon-theme python3-kickstart
+Requires: tigervnc-server-minimal libxklavier >= %{libxklavierver} libgnomekbd
+Requires: nm-connection-editor keybinder3 system-logos
+Requires: python3
+BuildRequires: desktop-file-utils
+Requires: zenity
+
+Provides: anaconda-gui = %{version}-%{release}
+Obsoletes: anaconda-gui < %{version}-%{release}
+
+Provides: anaconda-widgets = %{version}-%{release}
+Obsoletes: anaconda-widgets < %{version}-%{release}
+
+Provides: anaconda-install-env-deps = %{version}-%{release}
+Obsoletes: anaconda-install-env-deps < %{version}-%{release}
+
+%description
+The anaconda package is a metapackage for the Anaconda installer.
+
+%package core
+Summary: Core of the Anaconda installer
+Requires: python3-libs python3-dnf >= %{dnfver} python3-blivet >= %{pythonblivetver}
+Requires: python3-blockdev >= %{libblockdevver} rpm-python3 >= %{rpmver} python3-productmd
+Requires: libreport-anaconda >= 2.0.21-1 libselinux-python3 python3-meh >= %{mehver}
+Requires: python3-pyparted >= %{pypartedver} python3-requests python3-requests-file
+Requires: python3-requests-ftp python3-kickstart >= %{pykickstartver}
+Requires: python3-langtable >= %{langtablever} util-linux >= %{utillinuxver} python3-gobject-base
+Requires: python3-dbus python3-pwquality python3-systemd python3-dasbus >= %{dasbusver}
+Requires: python3-packaging
+Requires: cracklib-dicts python3-pytz teamd NetworkManager >= %{nmver} NetworkManager-libnm >= %{nmver}
+Requires: NetworkManager-team kbd chrony systemd python3-pid
+Requires: python3-ordered-set >= 2.0.0 glibc-langpack-en dbus-daemon
+Requires: systemd-resolved
+# Required by the systemd service anaconda-fips.
+Requires: crypto-policies
+Requires: /usr/bin/update-crypto-policies
+# required because of the rescue mode and VNC question
+Requires: anaconda-tui = %{version}-%{release}
+Provides: anaconda-images = %{version}-%{release}
+Obsoletes: anaconda-images <= 10
+Provides: anaconda-runtime = %{version}-%{release}
+Obsoletes: anaconda-runtime < %{version}-%{release}
+Obsoletes: booty <= 0.107-1
+
+# Ensure it's not possible for a version of grubby to be installed
+# that doesn't work with btrfs subvolumes correctly...
+Conflicts: grubby < 8.40-10
+Requires: usermode
+
+%description core
+The anaconda-core package contains the program which was used to install your
+system.
+
+%package tui
+Summary: Textual user interface for the Anaconda installer
+Requires: anaconda-core = %{version}-%{release} python3-simpleline >= %{simplelinever}
+
+%description tui
+This package contains textual user interface for the Anaconda installer.
+
+
+%package devel
+Summary: Development files for anaconda-widgets
+Requires: glade
+Requires: %{name}-widgets = %{version}-%{release}
+
+%description devel
+This package contains libraries and header files needed for writing the anaconda
+installer. It also contains Python and Glade support files, as well as
+documentation for working with this library.
+
+%package dracut
+Summary: The anaconda dracut module
+Requires: dracut >= %{dracutver}
+Requires: dracut-network
+Requires: dracut-live
+Requires: xz
+Requires: python3-kickstart
+
+%description dracut
+The 'anaconda' dracut module handles installer-specific boot tasks and
+options. This includes driver disks, kickstarts, and finding the anaconda
+runtime on NFS/HTTP/FTP servers or local disks.
+
+%prep
+%autosetup -n %{name}-%{version} -p1
+
+%build
+# use actual build-time release number, not tarball creation time release number
+%if "%toolchain" == "clang"
+%configure ANACONDA_RELEASE=%{release} CC=clang
+%else
+%configure ANACONDA_RELEASE=%{release}
+%endif
+%make_build
+
+%install
+%make_install
+%delete_la
+
+cp %{SOURCE1} %{SOURCE1}_tmp
+cp %{SOURCE2} %{SOURCE2}_tmp
+cp %{SOURCE3} %{SOURCE3}_tmp
+
+# install openEuler conf for anaconda
+%ifarch x86_64
+sed -i "/^additional_arguments =*/ s/$/ crashkernel=512M/" %{SOURCE1}
+sed -i "/^additional_arguments =*/ s/$/ panic=3 nmi_watchdog=1/" %{SOURCE2}
+sed -i "/^additional_arguments =*/ s/$/ panic=3 nmi_watchdog=1/" %{SOURCE3}
+%endif
+
+%ifarch aarch64
+sed -i "/^additional_arguments =*/ s/$/ crashkernel=1024M,high smmu.bypassdev=0x1000:0x17 smmu.bypassdev=0x1000:0x15/" %{SOURCE1}
+sed -i "/^additional_arguments =*/ s/$/ panic=1 vga=0x317 nohz=off smmu.bypassdev=0x1000:0x17 smmu.bypassdev=0x1000:0x15/" %{SOURCE2}
+sed -i "/^additional_arguments =*/ s/$/ panic=1 vga=0x317 nohz=off smmu.bypassdev=0x1000:0x17 smmu.bypassdev=0x1000:0x15/" %{SOURCE3}
+%endif
+install -m 0644 %{SOURCE1} %{buildroot}/%{_sysconfdir}/%{name}/profile.d/
+install -m 0644 %{SOURCE2} %{buildroot}/%{_sysconfdir}/%{name}/profile.d/
+install -m 0644 %{SOURCE3} %{buildroot}/%{_sysconfdir}/%{name}/profile.d/
+
+mv %{SOURCE1}_tmp %{SOURCE1}
+mv %{SOURCE2}_tmp %{SOURCE2}
+mv %{SOURCE3}_tmp %{SOURCE3}
+
+# Create an empty directory for addons
+install -d -m 0755 %{buildroot}%{_datadir}/anaconda/addons
+
+desktop-file-install --dir=%{buildroot}%{_datadir}/applications %{buildroot}%{_datadir}/applications/liveinst.desktop
+
+# If no langs found, keep going
+%find_lang %{name} || :
+
+%ldconfig_scriptlets
+
+%ifarch %{ix86} x86_64
+%post
+update-desktop-database &> /dev/null || :
+
+%postun
+update-desktop-database &> /dev/null || :
+%endif
+
+#Anaconda test cases require python3-nose. However, python3-nose on 22.03 has been deleted due to aging.
+#As a result, the anaconda lacks dependency. Now, the anaconda needs to remove the python3-nose dependency.
+#However, the removal will affect the test cases.
+
+%files
+%defattr(-,root,root)
+%license COPYING
+%{_libdir}/libAnacondaWidgets.so.*
+%{_libdir}/girepository*/AnacondaWidgets*typelib
+%{python3_sitearch}/gi/overrides/*
+%{python3_sitearch}/pyanaconda/ui/gui/*
+%exclude %{python3_sitearch}/pyanaconda/ui/gui/spokes/blivet_gui.*
+
+%files core
+%defattr(-,root,root)
+%license COPYING
+%{_sbindir}/anaconda
+%{_sbindir}/handle-sshpw
+%{_bindir}/instperf
+%{_bindir}/analog
+%{_bindir}/anaconda-cleanup
+%{_bindir}/anaconda-disable-nm-ibft-plugin
+%{_libdir}/libAnacondaWidgets.so
+%{_prefix}/libexec/anaconda
+%{_prefix}/lib/systemd/system-generators/*
+%{_unitdir}/*
+%{_datadir}/anaconda
+%{_datadir}/locale/*
+%{python3_sitearch}/pyanaconda
+%exclude %{_prefix}/libexec/anaconda/dd_*
+%exclude %{_libdir}/libAnacondaWidgets.so
+%exclude %{_datadir}/gtk-doc
+%exclude %{_datadir}/anaconda/ui/spokes/blivet_gui.*
+%exclude %{_datadir}/glade/catalogs/AnacondaWidgets.xml
+%exclude %{python3_sitearch}/pyanaconda/rescue.py*
+%exclude %{python3_sitearch}/pyanaconda/__pycache__/rescue.*
+%exclude %{python3_sitearch}/pyanaconda/ui/gui/*
+%exclude %{python3_sitearch}/pyanaconda/ui/tui/*
+%{_bindir}/analog
+%{_bindir}/anaconda-cleanup
+%dir %{_sysconfdir}/%{name}
+%config %{_sysconfdir}/%{name}/*
+%dir %{_sysconfdir}/%{name}/conf.d
+%config %{_sysconfdir}/%{name}/conf.d/*
+%dir %{_sysconfdir}/%{name}/profile.d
+%config %{_sysconfdir}/%{name}/profile.d/*
+%{_sbindir}/liveinst
+%{_bindir}/liveinst
+%{_libexecdir}/liveinst-setup.sh
+%{_datadir}/applications/*.desktop
+%{_sysconfdir}/xdg/autostart/*.desktop
+%config(noreplace) %{_sysconfdir}/pam.d/*
+%config(noreplace) %{_sysconfdir}/security/console.apps/*
+
+%files tui
+%{python3_sitearch}/pyanaconda/rescue.py
+%{python3_sitearch}/pyanaconda/__pycache__/rescue.*
+%{python3_sitearch}/pyanaconda/ui/tui/*
+
+%files devel
+%{_libdir}/libAnacondaWidgets.so
+%{_libdir}/glade/modules/libAnacondaWidgets.so
+%{_includedir}/*
+%{_datadir}/glade/catalogs/AnacondaWidgets.xml
+%{_datadir}/gtk-doc
+
+%files dracut
+%dir %{_prefix}/lib/dracut/modules.d/80%{name}
+%{_prefix}/lib/dracut/modules.d/80%{name}/*
+%{_prefix}/libexec/anaconda/dd_*
+
+%changelog
+* Thu Sep 07 2023 raki007 <278366432@qq.com> - 36.16.5-21
+- Type:enhance
+- ID:NA
+- SUG:NA
+- DESC: add summer ospp patch
+
+* Mon Jul 10 2023 sunhai <sunhai10@huawei.com> - 36.16.5-20
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC: keep source code consistency
+
+* Mon Jul 10 2023 sunhai <sunhai10@huawei.com> - 36.16.5-19
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC: change the startup mode of do_transaction sub proces
+
+* Fri Jun 09 2023 sunhai <sunhai10@huawei.com> - 36.16.5-18
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC: set grub configuration file is as original
+
+* Fri Jun 09 2023 sunhai <sunhai10@huawei.com> - 36.16.5-17
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC: Ignore SIGINT in D Bus launcher and x11 too
+ network use separate main conext for NM client in threads
+ dracut handle compressed kernel modules
+ Sort RPM versions via rpm.labelCompare
+
+* Sat Jun 03 2023 sunhai <sunhai10@huawei.com> - 36.16.5-16
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC: fix gui hostname warn info
+
+* Tue May 16 2023 Chenxi Mao <chenxi.mao@suse.com> - 36.16.5-15
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC: Support build with clang.
+
+* Fri Feb 24 2023 sunhai <sunhai10@huawei.com> - 36.16.5-14
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC: backport password tooltip text adapt language
+ close disk encryption
+
+* Tue Dec 27 2022 Chenxi Mao <chenxi.mao@suse.com> - 36.16.5-13
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC: Change patch sequence.
+
+* Mon Dec 26 2022 fengtao <fengtao40@huawei.com> - 36.16.5-12
+- Type:feature
+- ID:NA
+- SUG:NA
+- DESC: add loongarch and sw support patch in SP1
+
+* Tue Dec 20 2022 Qingqing Li <liqingqing3@huawei.com> - 36.16.5-11
+- Type:feature
+- ID:NA
+- SUG:NA
+- DESC:cgroup files is a additional enhanced cgroup feature, which will
+ limit cgroup opened files, add cgroup_disable=files to
+ default cmdline to disable this feature to keep cgroup's default behavior.
+
+* Thu Dec 15 2022 sunhai <sunhai10@huawei.com> - 36.16.5-10
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:fix conf of storage
+
+* Wed Dec 14 2022 sunhai <sunhai10@huawei.com> - 36.16.5-9
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:adapt active connection without interface name
+
+* Sat Dec 10 2022 sunhai <sunhai10@huawei.com> - 36.16.5-8
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:ignore detect enable smt
+ open swap in storage
+
+* Tue Nov 29 2022 sunhai <sunhai10@huawei.com> - 36.16.5-7
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:change product name not with upper
+ add SM3 with tui
+
+* Thu Nov 24 2022 sunhai <sunhai10@huawei.com> - 36.16.5-6
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:add logo with install
+ the kickstart version change to patch
+
+* Wed Nov 23 2022 sunhai <sunhai10@huawei.com> - 36.16.5-5
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:pxe kickstart version with local pykickstart
+ and with build save patch by source4
+
+* Mon Nov 21 2022 sunhai <sunhai10@huawei.com> - 36.16.5-4
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:open disk encryption on openEuler
+
+* Tue Nov 15 2022 sunhai <sunhai10@huawei.com> - 36.16.5-3
+- ID:NA
+- SUG:NA
+- DESC: fix install with tui and gui
+
+* Fri Nov 11 2022 sunhai <sunhai10@huawei.com> - 36.16.5-2
+- ID:NA
+- SUG:NA
+- DESC: use kickstart version with local pykickstart
+
+* Tue Nov 08 2022 sunhai <sunhai10@huawei.com> - 36.16.5-1
+- ID:NA
+- SUG:NA
+- DESC:update anaconda to 36.16.5
+
+* Mon Mar 28 2022 Wenlong Zhang <zhangwenlong@loongson.cn> - 33.19-49
+- ID:NA
+- SUG:NA
+- DESC: add loongarch support for anaconda
+
+* Tue Oct 18 2022 wuzx<wuzx1226@qq.com> - 33.19-48
+- Type:feature
+- CVE:NA
+- SUG:NA
+- DESC:Add sw64 architecture
+
+* Wed Sep 21 2022 sunhai <sunhai10@huawei.com> - 33.19-47
+- Type:bugfix
+- CVE:NA
+- SUG:NA
+- DESC:solve the problem that the circular loading progress bar does not rotate
+
+* Tue Aug 23 2022 zhangqiumiao <zhangqiumiao1@huawei.com> - 33.19-46
+- Type:bugfix
+- CVE:NA
+- SUG:NA
+- DESC:fix missing group information in dnf
+
+* Fri Aug 5 2022 wanglu <wanglu210@huawei.com> - 33.19-45
+- Type:bugfix
+- CVE:NA
+- SUG:NA
+- DESC:fix a mistake about revert "Set default entry to the BLS id instead of the entry index"
+
+* Thu Aug 4 2022 wanglu <wanglu210@huawei.com> - 33.19-44
+- Type:bugfix
+- CVE:NA
+- SUG:NA
+- DESC:revert "Set default entry to the BLS id instead of the entry index"
+
+* Fri Apr 8 2022 zhangqiumiao <zhangqiumiao1@huawei.com> - 33.19-43
+- Type:bugfix
+- CVE:NA
+- SUG:NA
+- DESC:change the grub2 user.cfg permission from 0700 to 0600
+
+* Thu Apr 7 2022 zhangqiumiao <zhangqiumiao1@huawei.com> - 33.19-42
+- Type:bugfix
+- CVE:NA
+- SUG:NA
+- DESC:add support for configuration of additional boot arguments
+ change the startup mode of do_transaction sub process to spawn
+
+* Sat Mar 05 2022 gaihuiying <eaglegai@163.com> - 33.19-41
+- Type:bugfix
+- CVE:NA
+- SUG:NA
+- DESC:separate anaconda-dracut
+
+* Mon Feb 21 2022 gaihuiying <eaglegai@163.com> - 33.19-40
+- Type:bugfix
+- CVE:NA
+- SUG:NA
+- DESC:remove yelp and foce-utils from requires
+
+* Sun Jan 30 2022 yanan <yanan@huawei.com> - 33.19-39
+- Type:bugfix
+- CVE:NA
+- SUG:NA
+- DESC:remove authconfig support
+
+* Thu Jan 27 2022 liufushou <liufushou@live.cn> - 33.19-38
+- Type:bugfix
+- CVE:NA
+- SUG:NA
+- DESC:let networking up after reboot
+
+* Wed Jan 26 2022 zhujunhao <zhujunhao11@huawei.com> - 33.19-37
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:support use sm3 crypt user password
+
+* Sun Jan 23 2022 liuxin <liuxin350@huawei.com> - 33.19-36
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:Cancel planned manual update of system time on turning ntp on
+
+* Sat Jan 22 2022 fengtao <fengtao40@huawei.com> - 33.19-35
+- Type:bugfix
+- CVE:NA
+- SUG:NA
+- DESC:revert "fix deadlock when forking in multithread"
+
+* Thu Jan 13 2022 gaihuiying <gaihuiying1@huawei.com> - 33.19-34
+- Type:bugfix
+- CVE:NA
+- SUG:NA
+- DESC:remove flatpak support in source code
+
+* Tue Jan 11 2022 gaihuiying <gaihuiying1@huawei.com> - 33.19-33
+- Type:bugfix
+- CVE:NA
+- SUG:NA
+- DESC:remove anaconda-user-help dependency
+
+* Fri Dec 31 2021 xihaochen <xihaochen@huawei.com> - 33.19-32
+- Type:bugfix
+- CVE:NA
+- SUG:NA
+- DESC:remove flatpak dependency
+
+* Fri Dec 31 2021 xihaochen <xihaochen@huawei.com> - 33.19-31
+- Type:bugfix
+- CVE:NA
+- SUG:NA
+- DESC:remove python3-nose dependency
+
+* Fri Oct 29 2021 zhujunhao <zhujunhao8@huawei.com> - 33.19-30
+- Type:bugfix
+- CVE:NA
+- SUG:NA
+- DESC:fix boot options generated by dracut module
+
+* Sat Aug 28 2021 yanan <yanan@huawei.com> - 33.19-29
+- Type:bugfix
+- CVE:NA
+- SUG:NA
+- DESC:fix deadlock when forking in multithread
+
+* Mon Aug 23 2021 wangce <wangce@uniontech.com> - 33.19-28
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:Change sidebar background size
+
+* Sat Aug 7 2021 zhujunhao <zhujunhao8@huawei.com> - 33.19-27
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:delete date zone map
+
+* Thu Jun 24 2021 youyifeng <ctyuncommiter05@chinatelecom.cn> - 33.19-26
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:change inst.repo default value
+
+* Mon Jun 21 2021 gaihuiying <gaihuiying1@huawei.com> - 33.19-25
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:change topbar background size
+
+* Mon Jun 21 2021 zhangqiumiao <zhangqiumiao1@huawei.com> - 33.19-24
+- Type:requirement
+- ID:NA
+- SUG:NA
+- DESC:replace openEuler by %{_vendor}
+
+* Mon Jun 21 2021 liuxin <liuxin264@huawei.com> - 33.19-23
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:Fix section headers in docstrings
+
+* Wed May 19 2021 liuxin <liuxin264@huawei.com> - 33.19-22
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:Fix issue when ns_info cannot be retrieved for NVDimm namespace
+
+* Sat May 8 2021 fengtao <fengtao40@huawei.com> - 33.19-21
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:fix xorg timeout and throw exception
+
+* Thu Apr 29 2021 zhangrui <zhangrui182@huawei.com> - 33.19-20
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:do not mount dbus sources
+
+* Mon Mar 29 2021 xuxiaolong <xuxiaolon23@huawei.com> - 33.19-19
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:sync 50 bugfix commit from github
+
+* Sat Mar 27 2021 zhangrui <zhangrui182@huawei.com> - 33.19-18
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:reset the state of the custom partitioning spoke
+
+* Mon Jan 25 2021 liuxin <liuxin264@huawei.com> - 33.19-17
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:Propagate a lazy proxy o the storage model
+
+* Thu Jan 14 2021 yuboyun <yuboyun@huawei.com> - 33.19-16
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:set up LD_PRELOAD for the Storage and Services module
+
+* Thu Dec 10 2020 zhouyihang <zhouyihang3@huawei.com> - 33.19-15
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:Change length limit of hostname from 255 to 64
+
+* Fri Dec 04 2020 gaihuiying <gaihuiying1@huawei.com> - 33.19-14
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:improve ntp servers to fix unkown error
+
+* Sat Nov 28 2020 lunankun <lunankun@huawei.com> - 33.19-13
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:fix issue of iscsi_tcp and sha256 not found
+
+* Mon Oct 26 2020 fengtao <fengtao40@huawei.com> - 33.19-12
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:bugfix for partitioning when sda exists a ext4 filesystem
+
+* Sat Sep 26 2020 fengtao <fengtao40@huawei.com> - 33.19-11
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:add dnf transactions timeout
+
+* Thu Sep 17 2020 zhuqingfu <zhuqingfu1@huawei.com> - 33.19-10
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:do not require treeinfo
+
+* Wed Sep 16 2020 xiaqirong <xiaqirong1@huawei.com> - 33.19-9
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:disable disk encryption
+
+* Fri Sep 11 2020 fengtao <fengtao40@huawei.com> - 33.19-8
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:add boot args for smmu and video
+
+* Thu Sep 10 2020 zhangqiumiao <zhangqiumiao1@huawei.com> - 33.19-7
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:revert add-passwd-check-policy.patch and bugfix-fix-encrypt-weak-passphrase-save.patch
+ fix password policy
+
+* Fri Sep 4 2020 zhangqiumiao <zhangqiumiao1@huawei.com> - 33.19-6
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:fix password policy
+
+* Mon Aug 31 2020 zhangqiumiao <zhangqiumiao1@huawei.com> - 33.19-5
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:fix kdump patch err
+
+* Fri Aug 28 2020 zhangqiumiao <zhangqiumiao1@huawei.com> - 33.19-4
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:remove dependency on blivet-gui-runtime
+
+* Fri Aug 7 2020 fengtao <fengtao40@huawei.com> - 33.19-3
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:fix stage2 as default sources
+
+* Tue Jul 14 2020 zhangqiumiao <zhangqiumiao1@huawei.com> - 33.19-2
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:add kdump parameter into kernel cmdline
+
+* Fri Jun 19 2020 fengtao <fengtao40@huawei.com> - 33.19-1
+- update version to 33.19
+
+* Mon Mar 9 2020 openEuler Buildteam <buildteam@openeuler.org> - 29.24.7-28
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:add boot options for dummy
+
+* Wed Feb 12 2020 openEuler Buildteam <buildteam@openeuler.org> - 29.24.7-27
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:Remove initThreading method from pyanaconda.threading
+
+* Thu Feb 06 2020 openEuler Buildteam <buildteam@openeuler.org> - 29.24.7-26
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:modify network hostname dot error
+
+* Thu Jan 16 2020 openEuler Buildteam <buildteam@openeuler.org> - 29.24.7-25
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:modify default timezone and zh_CN.po
+
+* Thu Jan 16 2020 openEuler Buildteam <buildteam@openeuler.org> - 29.24.7-24
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:fix setup fail in decode
+
+* Thu Jan 16 2020 openEuler Buildteam <buildteam@openeuler.org> - 29.24.7-23
+- Type:enhancement
+- ID:NA
+- SUG:NA
+- DESC:modify openeuler in welcome to lowercase
+
+* Thu Jan 16 2020 openEuler Buildteam <buildteam@openeuler.org> - 29.24.7-22
+- optimization the patch
+
+* Wed Jan 15 2020 openEuler Buildteam <buildteam@openeuler.org> - 29.24.7-21
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:add boot options for kdump.
+
+* Sat Jan 11 2020 openEuler Buildteam <buildteam@openeuler.org> - 29.24.7-20
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:add boot options for raid 3408
+
+* Wed Jan 8 2020 openEuler Buildteam <buildteam@openeuler.org> - 29.24.7-19
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:modify arguments parsing
+
+* Wed Jan 1 2020 openEuler Buildteam <buildteam@openeuler.org> - 29.24.7-18
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:bugfix for encrypting partition
+
+* Mon Dec 30 2019 openEuler Buildteam <buildteam@openeuler.org> - 29.24.7-17
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:bugfix in setup
+
+* Mon Dec 30 2019 openEuler Buildteam <buildteam@openeuler.org> - 29.24.7-16
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:bugfix in network spokes when add virtual devices
+
+
+* Mon Dec 30 2019 openEuler Buildteam <buildteam@openeuler.org> - 29.24.7-15
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:fix bug
+
+* Mon Dec 23 2019 openEuler Buildteam <buildteam@openeuler.org> - 29.24.7-14
+- Type:bugfix
+- ID:NA
+- SUG:NA
+- DESC:modify the patches
+
+* Mon Dec 16 2019 openEuler Buildteam <buildteam@openeuler.org> - 29.24.7-13
+- Type:bugfix
+- Id:NA
+- SUG:NA
+- DESC:modify interface is extended in Chinese mode
+
+* Thu Dec 12 2019 openEuler Buildteam <buildteam@openeuler.org> - 29.24.7-12
+- Type:bugfix
+- Id:NA
+- SUG:NA
+- DESC:add quiet cmdline args for x86
+
+* Tue Oct 22 2019 openEuler Buildteam <buildteam@openeuler.org> - 29.24.7-11
+- Type:bugfix
+- Id:NA
+- SUG:NA
+- DESC:add dracut-live packages as requires
+
+* Mon Oct 21 2019 openEuler Buildteam <buildteam@openeuler.org> - 29.24.7-10
+- Type:bugfix
+- Id:NA
+- SUG:NA
+- DESC:add anaconda-core and anaconda-tui package
+
+* Sun Oct 13 2019 openEuler Buildteam <buildteam@openeuler.org> - 29.24.7-9
+- Package init
diff --git a/backport-Ignore-SIGINT-in-D-Bus-launcher-and-x11-too.patch b/backport-Ignore-SIGINT-in-D-Bus-launcher-and-x11-too.patch
new file mode 100644
index 0000000..ad950d4
--- /dev/null
+++ b/backport-Ignore-SIGINT-in-D-Bus-launcher-and-x11-too.patch
@@ -0,0 +1,76 @@
+From d8060d01a01e3d5b187ae4388f10b0d0c2c0c4f3 Mon Sep 17 00:00:00 2001
+From: iasunsea <iasunsea@sina.com>
+Date: Tue, 6 Dec 2022 18:24:50 +0800
+Subject: [PATCH] Ignore SIGINT in D-Bus launcher and x11 too
+
+When we do install, especially use TUI to install, we some time have take
+a mistake to put "CTRL+C", then there will be stop with traceback. And we
+know the main process have shielded SIGINT, so we to shield subprocesses also.
+
+Conflict:NA
+Reference:https://github.com/rhinstaller/anaconda/commit/d8060d01a01e3d5b187ae4388f10b0d0c2c0c4f3
+---
+ pyanaconda/core/startup/dbus_launcher.py | 6 ++++++
+ pyanaconda/display.py | 8 +++++++-
+ 2 files changed, 13 insertions(+), 1 deletion(-)
+
+diff --git a/pyanaconda/core/startup/dbus_launcher.py b/pyanaconda/core/startup/dbus_launcher.py
+index 2881c28..a866df0 100644
+--- a/pyanaconda/core/startup/dbus_launcher.py
++++ b/pyanaconda/core/startup/dbus_launcher.py
+@@ -24,6 +24,7 @@
+ # Author(s): Jiri Konecny <jkonecny@redhat.com>
+ #
+ import os
++import signal
+ from subprocess import TimeoutExpired
+
+ from pyanaconda.core.configuration.anaconda import conf
+@@ -109,6 +110,10 @@ class AnacondaDBusLauncher(object):
+ "--syslog",
+ "--config-file={}".format(ANACONDA_BUS_CONF_FILE)
+ ]
++
++ def dbus_preexec():
++ # to set dbus subprocess SIGINT handler
++ signal.signal(signal.SIGINT, signal.SIG_IGN)
+
+ self._log_file = open('/tmp/dbus.log', 'a')
+ self._dbus_daemon_process = startProgram(
+@@ -117,6 +122,7 @@ class AnacondaDBusLauncher(object):
+ env_add={"LANG": DEFAULT_LANG},
+ env_prune=["LANGUAGE", "LC_ALL", "LC_MESSAGES"],
+ reset_lang=False,
++ preexec_fn=dbus_preexec
+ )
+
+ if self._dbus_daemon_process.poll() is not None:
+diff --git a/pyanaconda/display.py b/pyanaconda/display.py
+index ddf24fb..ed163e7 100644
+--- a/pyanaconda/display.py
++++ b/pyanaconda/display.py
+@@ -24,6 +24,7 @@ import subprocess
+ import time
+ import textwrap
+ import pkgutil
++import signal
+
+ from pyanaconda.core.configuration.anaconda import conf
+ from pyanaconda.core.process_watchers import WatchProcesses
+@@ -192,8 +193,13 @@ def do_startup_x11_actions():
+ else:
+ xdg_data_dirs = datadir + '/window-manager:/usr/share'
+
++ def x11_preexec():
++ # to set GUI subprocess SIGINT handler
++ signal.signal(signal.SIGINT, signal.SIG_IGN)
++
+ childproc = util.startProgram(["metacity", "--display", ":1", "--sm-disable"],
+- env_add={'XDG_DATA_DIRS': xdg_data_dirs})
++ env_add={'XDG_DATA_DIRS': xdg_data_dirs},
++ preexec_fn=x11_preexec)
+ WatchProcesses.watch_process(childproc, "metacity")
+
+
+--
+2.23.0 \ No newline at end of file
diff --git a/backport-Sort-RPM-versions-via-rpm.labelCompare-and-not-via-p.patch b/backport-Sort-RPM-versions-via-rpm.labelCompare-and-not-via-p.patch
new file mode 100644
index 0000000..447c5b9
--- /dev/null
+++ b/backport-Sort-RPM-versions-via-rpm.labelCompare-and-not-via-p.patch
@@ -0,0 +1,109 @@
+From 1742188518c9af7e3cd060a26f3a3b1e4cb61e91 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro@hroncok.cz>
+Date: Fri, 3 Feb 2023 21:46:15 +0100
+Subject: [PATCH] Sort RPM versions via rpm.labelCompare() and not via
+ packaging.version.LegacyVersion()
+
+Packaging 22+ removed the long-deprecated packaging.version.LegacyVersion class.
+The packaging.version library is intended to parse Python (PEP 440) versions,
+not arbitrary versions and definitively not RPM versions.
+
+Even if LegacyVersion was still available, it may produce incorrect results
+if the version contains ~, ^ or other characters with special meaning in RPM.
+
+This assumes the Python rpm module is always available.
+If that assumption is wrong
+the logic from rpm.labelCompare() needs to be reimplemented instead.
+
+Reference:https://github.com/rhinstaller/anaconda/commit/1742188518c9af7e3cd060a26f3a3b1e4cb61e91
+Conflict:NA
+---
+ pyanaconda/core/payload.py | 5 +++++
+ pyanaconda/modules/payloads/base/utils.py | 13 ++-----------
+ pyanaconda/modules/storage/checker/utils.py | 4 ++--
+ 3 files changed, 9 insertions(+), 13 deletions(-)
+
+diff --git a/pyanaconda/core/payload.py b/pyanaconda/core/payload.py
+index 17277b7..7817150 100644
+--- a/pyanaconda/core/payload.py
++++ b/pyanaconda/core/payload.py
+@@ -15,11 +15,16 @@
+ # License and may only be used or replicated with the express permission of
+ # Red Hat, Inc.
+ #
++from functools import cmp_to_key
+ from urllib.parse import quote, unquote
+
++import rpm
++
+ from pyanaconda.core.i18n import _
+ from pyanaconda.core.regexes import URL_PARSE
+
++rpm_version_key = cmp_to_key(rpm.labelCompare)
++
+
+ def parse_nfs_url(nfs_url):
+ """Parse NFS URL into components.
+diff --git a/pyanaconda/modules/payloads/base/utils.py b/pyanaconda/modules/payloads/base/utils.py
+index 738ae66..5f19b57 100644
+--- a/pyanaconda/modules/payloads/base/utils.py
++++ b/pyanaconda/modules/payloads/base/utils.py
+@@ -17,13 +17,11 @@
+ # License and may only be used or replicated with the express permission of
+ # Red Hat, Inc.
+ #
+-import functools
+ import os
+ import stat
+
+-from packaging.version import LegacyVersion as parse_version
+-
+ from pyanaconda.anaconda_loggers import get_module_logger
++from pyanaconda.core.payload import rpm_version_key
+ log = get_module_logger(__name__)
+
+
+@@ -70,11 +68,4 @@ def get_dir_size(directory):
+
+ def sort_kernel_version_list(kernel_version_list):
+ """Sort the given kernel version list."""
+- kernel_version_list.sort(key=functools.cmp_to_key(_compare_versions))
+-
+-
+-def _compare_versions(v1, v2):
+- """Compare two version number strings."""
+- first_version = parse_version(v1)
+- second_version = parse_version(v2)
+- return (first_version > second_version) - (first_version < second_version)
++ kernel_version_list.sort(key=rpm_version_key)
+diff --git a/pyanaconda/modules/storage/checker/utils.py b/pyanaconda/modules/storage/checker/utils.py
+index 180c351..9ccd398 100644
+--- a/pyanaconda/modules/storage/checker/utils.py
++++ b/pyanaconda/modules/storage/checker/utils.py
+@@ -20,7 +20,6 @@ gi.require_version("BlockDev", "2.0")
+ from gi.repository import BlockDev as blockdev
+
+ from collections import defaultdict
+-from packaging.version import LegacyVersion as parse_version
+
+ from blivet import arch, util
+ from blivet.devicefactory import get_device_type
+@@ -34,6 +33,7 @@ from pyanaconda.core.constants import productName, STORAGE_REFORMAT_BLOCKLIST, \
+ STORAGE_LUKS2_MIN_RAM, STORAGE_ROOT_DEVICE_TYPES, STORAGE_REQ_PARTITION_SIZES, \
+ STORAGE_MUST_NOT_BE_ON_ROOT
+ from pyanaconda.core.i18n import _
++from pyanaconda.core.payload import rpm_version_key
+ from pyanaconda.core.storage import DEVICE_TEXT_MAP
+ from pyanaconda.modules.storage.platform import platform
+
+@@ -259,7 +259,7 @@ def _check_opal_firmware_kernel_version(detected_version, required_version):
+ """
+ try:
+ if detected_version and required_version:
+- return parse_version(detected_version) >= parse_version(required_version)
++ return rpm_version_key(detected_version) >= rpm_version_key(required_version)
+ except Exception as e: # pylint: disable=broad-except
+ log.warning("Couldn't check the firmware kernel version: %s", str(e))
+
+--
+2.23.0 \ No newline at end of file
diff --git a/backport-dracut-handle-compressed-kernel-modules.patch b/backport-dracut-handle-compressed-kernel-modules.patch
new file mode 100644
index 0000000..651da26
--- /dev/null
+++ b/backport-dracut-handle-compressed-kernel-modules.patch
@@ -0,0 +1,47 @@
+From c4a388d3956088c96631b72f0631db2a380127b0 Mon Sep 17 00:00:00 2001
+From: Mikhail Novosyolov <m.novosyolov@rosalinux.ru>
+Date: Fri, 10 Jun 2022 22:03:43 +0300
+Subject: [PATCH] dracut: handle compressed kernel modules
+
+Compressed kernel modules could not be loaded.
+Now both compressed and not compressed ones will be loaded.
+
+$ uname -r
+5.10.74-generic-2rosa2021.1-x86_64
+$ ls -1v /lib/modules/$(uname -r)/kernel/drivers/scsi/device_handler/
+scsi_dh_alua.ko.zst
+scsi_dh_emc.ko.zst
+scsi_dh_hp_sw.ko.zst
+scsi_dh_rdac.ko.zst
+
+Replaces https://github.com/rhinstaller/anaconda/pull/3501
+Noted by slava86@
+Reference:https://github.com/rhinstaller/anaconda/commit/c4a388d3956088c96631b72f0631db2a380127b0
+Conflict:NA
+---
+ dracut/anaconda-modprobe.sh | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+diff --git a/dracut/anaconda-modprobe.sh b/dracut/anaconda-modprobe.sh
+index 97ee53bcb1..3640b4d42f 100755
+--- a/dracut/anaconda-modprobe.sh
++++ b/dracut/anaconda-modprobe.sh
+@@ -14,11 +14,12 @@ MODULE_LIST="cramfs squashfs iscsi_tcp "
+ shopt -s nullglob
+
+ SCSI_MODULES=/lib/modules/$KERNEL/kernel/drivers/scsi/device_handler/
+-for m in "$SCSI_MODULES"/*.ko; do
++for m in "$SCSI_MODULES"/*.ko*; do
+ # Shell spew to work around not having basename
+- # Trim the paths off the prefix, then the . suffix
+- a="${m##*/}"
+- MODULE_LIST+=" ${a%.*}"
++ m="${m##*/}"
++ # Handle *.ko, *.ko.zst, *.ko.gz, *.ko.xz etc.
++ IFS='.ko' read -r -a m <<< "$m"
++ MODULE_LIST+=" ${m[0]}"
+ done
+
+ shopt -u nullglob
+--
+2.23.0 \ No newline at end of file
diff --git a/backport-network-use-separate-main-conext-for-NM-client-in-threads.patch b/backport-network-use-separate-main-conext-for-NM-client-in-threads.patch
new file mode 100644
index 0000000..8ba07d7
--- /dev/null
+++ b/backport-network-use-separate-main-conext-for-NM-client-in-threads.patch
@@ -0,0 +1,824 @@
+From 3972b5dadcadd355d2ff25eae601bc35c336c45a Mon Sep 17 00:00:00 2001
+From: Radek Vykydal <rvykydal@redhat.com>
+Date: Thu, 29 Sep 2022 12:38:55 +0200
+Subject: [PATCH] network: use separate main conext for NM client in threads
+
+Resolves: rhbz#1931389
+
+Create a special NM client with separate main context for calling NM
+client from installation tasks which run in separate threads.
+
+Based on a pull request by t.feng <t.feng94 at foxmail.com> who deserves
+the biggest credit, and upated with suggestions by poncovka <vponcova at
+redhat.com>
+
+The created client should be used only in a limited scope as documented
+in nm_client_in_thread docstring. If we want to extend it and address
+potential issues with client instance releasing and reusing we'd need to
+follow recommendations from Thomas Haller's kind reviews:
+
+<snip>
+
+first of all, initializing a NMClient instance takes relatively long,
+because it makes D-Bus calls and the round trip time adds up. Btw, if
+you'd pass
+instance_flags=NM.ClientInstanceFlags.NO_AUTO_FETCH_PERMISSIONS it can
+make it faster, see here. If it's too slow, then the solution would be
+to re-use the nmclient instance or use async initialization and do stuff
+in parallel. Both is more complicated however, so not necessary unless
+we find that it's a problem.
+
+What is maybe more a problem is that each GMainContext consumes at least
+one file descriptor. When you use the sync nm_client_new() method, then
+NMClient has an additional internal GMainContext, so possibly there are
+2 or more file descriptors involved. The way to "stop" NMClient is by
+unrefing it. However, with all async operations in glib, they cannot
+complete right away. That is because when NMClient gets unrefed, it will
+cancel all (internally) pending operations, but even when you cancel a
+glib operation, the callback still will be invoked with the cancellation
+error. And callbacks only get invoked by iterating/running the
+mainloop/maincontext. This means, if you have a short-running
+application (e.g. not a GUI) and a reasonable small number of NMClient
+instances, then you don't need to care. Otherwise, you unfortunately
+need to make sure that the GMainContext is still iterated just long
+enough, for all operations to be cancelled. That's slightly cumbersome,
+and you can use nm_client_get_context_busy_watcher() to find that out.
+
+Btw, what you also cannot do, is having a NMClient instance alive and
+just not iterating the GMainContext anymore. NMClient will subscribe to
+D-Bus events, and those come (because GDBus has a separate worker
+thread) and will be enqueued in the GMainContext. This applies to all
+applications that register DBus signals via GDBus: you must iterate the
+context enough, so that those events get eventually processed. I think
+this does not apply to you here, but it would apply, if you try to keep
+the nmclient instance alive and reuse later.
+
+</snip>
+
+Reference:https://github.com/rhinstaller/anaconda/commit/3972b5dadcadd355d2ff25eae601bc35c336c45a
+Conflict:NA
+---
+ pyanaconda/core/glib.py | 109 +++++++++++-
+ pyanaconda/modules/network/initialization.py | 56 +++---
+ pyanaconda/modules/network/installation.py | 19 +-
+ pyanaconda/modules/network/network.py | 26 +--
+ pyanaconda/modules/network/nm_client.py | 167 +++++++++++-------
+ 5 files changed, 254 insertions(+), 123 deletions(-)
+
+diff --git a/pyanaconda/core/glib.py b/pyanaconda/core/glib.py
+index 03c598db43..32925384bb 100644
+--- a/pyanaconda/core/glib.py
++++ b/pyanaconda/core/glib.py
+@@ -24,34 +24,42 @@
+
+ import gi
+ gi.require_version("GLib", "2.0")
++gi.require_version("Gio", "2.0")
+
+ from gi.repository.GLib import markup_escape_text, format_size_full, \
+ timeout_add_seconds, timeout_add, idle_add, \
+ io_add_watch, child_watch_add, \
+- source_remove, \
++ source_remove, timeout_source_new, \
+ spawn_close_pid, spawn_async_with_pipes, \
+ MainLoop, MainContext, \
+ GError, Variant, VariantType, Bytes, \
+ IOCondition, IOChannel, SpawnFlags, \
+ MAXUINT
++from gi.repository.Gio import Cancellable
++
++from pyanaconda.anaconda_loggers import get_module_logger
++log = get_module_logger(__name__)
++
+
+ __all__ = ["create_main_loop", "create_new_context",
+ "markup_escape_text", "format_size_full",
+ "timeout_add_seconds", "timeout_add", "idle_add",
+ "io_add_watch", "child_watch_add",
+- "source_remove",
++ "source_remove", "timeout_source_new",
+ "spawn_close_pid", "spawn_async_with_pipes",
+ "GError", "Variant", "VariantType", "Bytes",
+ "IOCondition", "IOChannel", "SpawnFlags",
+- "MAXUINT"]
++ "MAXUINT", "Cancellable"]
+
+
+-def create_main_loop():
++def create_main_loop(main_context=None):
+ """Create GLib main loop.
+
++ :param main_context: main context to be used for the loop
++ :type main_context: GLib.MainContext
+ :returns: GLib.MainLoop instance.
+ """
+- return MainLoop()
++ return MainLoop(main_context)
+
+
+ def create_new_context():
+@@ -59,3 +67,94 @@ def create_new_context():
+
+ :returns: GLib.MainContext."""
+ return MainContext.new()
++
++
++class GLibCallResult():
++ """Result of GLib async finish callback."""
++ def __init__(self):
++ self.received_data = None
++ self.error_message = ""
++ self.timeout = False
++
++ @property
++ def succeeded(self):
++ """The async call has succeeded."""
++ return not self.failed
++
++ @property
++ def failed(self):
++ """The async call has failed."""
++ return bool(self.error_message) or self.timeout
++
++
++def sync_call_glib(context, async_call, async_call_finish, timeout, *call_args):
++ """Call GLib asynchronous method synchronously with timeout.
++
++ :param context: context for the new loop in which the method will be called
++ :type context: GMainContext
++ :param async_call: asynchronous GLib method to be called
++ :type async_call: GLib method
++ :param async_call_finish: finish method of the asynchronous call
++ :type async_call_finish: GLib method
++ :param timeout: timeout for the loop in seconds (0 == no timeout)
++ :type timeout: int
++
++ *call_args should hold all positional arguments preceding the cancellable argument
++ """
++
++ info = async_call.get_symbol()
++ result = GLibCallResult()
++
++ loop = create_main_loop(context)
++ callbacks = [loop.quit]
++
++ def _stop_loop():
++ log.debug("sync_call_glib[%s]: quit", info)
++ while callbacks:
++ callback = callbacks.pop()
++ callback()
++
++ def _cancellable_cb():
++ log.debug("sync_call_glib[%s]: cancelled", info)
++
++ cancellable = Cancellable()
++ cancellable_id = cancellable.connect(_cancellable_cb)
++ callbacks.append(lambda: cancellable.disconnect(cancellable_id))
++
++ def _timeout_cb(user_data):
++ log.debug("sync_call_glib[%s]: timeout", info)
++ result.timeout = True
++ cancellable.cancel()
++ return False
++
++ timeout_source = timeout_source_new(int(timeout * 1000))
++ timeout_source.set_callback(_timeout_cb)
++ timeout_source.attach(context)
++ callbacks.append(timeout_source.destroy)
++
++ def _finish_cb(source_object, async_result):
++ log.debug("sync_call_glib[%s]: call %s",
++ info,
++ async_call_finish.get_symbol())
++ try:
++ result.received_data = async_call_finish(async_result)
++ except Exception as e: # pylint: disable=broad-except
++ result.error_message = str(e)
++ finally:
++ _stop_loop()
++
++ context.push_thread_default()
++
++ log.debug("sync_call_glib[%s]: call", info)
++ try:
++ async_call(
++ *call_args,
++ cancellable=cancellable,
++ callback=_finish_cb
++ )
++ loop.run()
++ finally:
++ _stop_loop()
++ context.pop_thread_default()
++
++ return result
+diff --git a/pyanaconda/modules/network/initialization.py b/pyanaconda/modules/network/initialization.py
+index c7f0ba4cf8..bf1ffd12af 100644
+--- a/pyanaconda/modules/network/initialization.py
++++ b/pyanaconda/modules/network/initialization.py
+@@ -25,7 +25,7 @@ from pyanaconda.modules.network.network_interface import NetworkInitializationTa
+ from pyanaconda.modules.network.nm_client import get_device_name_from_network_data, \
+ update_connection_from_ksdata, add_connection_from_ksdata, bound_hwaddr_of_device, \
+ update_connection_values, commit_changes_with_autoconnection_blocked, \
+- get_config_file_connection_of_device, clone_connection_sync
++ get_config_file_connection_of_device, clone_connection_sync, nm_client_in_thread
+ from pyanaconda.modules.network.device_configuration import supported_wired_device_types, \
+ virtual_device_types
+ from pyanaconda.modules.network.utils import guard_by_system_configuration
+@@ -40,11 +40,9 @@ from gi.repository import NM
+ class ApplyKickstartTask(Task):
+ """Task for application of kickstart network configuration."""
+
+- def __init__(self, nm_client, network_data, supported_devices, bootif, ifname_option_values):
++ def __init__(self, network_data, supported_devices, bootif, ifname_option_values):
+ """Create a new task.
+
+- :param nm_client: NetworkManager client used as configuration backend
+- :type nm_client: NM.Client
+ :param network_data: kickstart network data to be applied
+ :type: list(NetworkData)
+ :param supported_devices: list of names of supported network devices
+@@ -55,7 +53,6 @@ class ApplyKickstartTask(Task):
+ :type ifname_option_values: list(str)
+ """
+ super().__init__()
+- self._nm_client = nm_client
+ self._network_data = network_data
+ self._supported_devices = supported_devices
+ self._bootif = bootif
+@@ -76,13 +73,17 @@ class ApplyKickstartTask(Task):
+ :returns: names of devices to which kickstart was applied
+ :rtype: list(str)
+ """
++ with nm_client_in_thread() as nm_client:
++ return self._run(nm_client)
++
++ def _run(self, nm_client):
+ applied_devices = []
+
+ if not self._network_data:
+ log.debug("%s: No kickstart data.", self.name)
+ return applied_devices
+
+- if not self._nm_client:
++ if not nm_client:
+ log.debug("%s: No NetworkManager available.", self.name)
+ return applied_devices
+
+@@ -92,7 +93,7 @@ class ApplyKickstartTask(Task):
+ log.info("%s: Wireless devices configuration is not supported.", self.name)
+ continue
+
+- device_name = get_device_name_from_network_data(self._nm_client,
++ device_name = get_device_name_from_network_data(nm_client,
+ network_data,
+ self._supported_devices,
+ self._bootif)
+@@ -102,28 +103,28 @@ class ApplyKickstartTask(Task):
+
+ applied_devices.append(device_name)
+
+- connection = self._find_initramfs_connection_of_iface(device_name)
++ connection = self._find_initramfs_connection_of_iface(nm_client, device_name)
+
+ if connection:
+ # if the device was already configured in initramfs update the settings
+ log.debug("%s: updating connection %s of device %s",
+ self.name, connection.get_uuid(), device_name)
+ update_connection_from_ksdata(
+- self._nm_client,
++ nm_client,
+ connection,
+ network_data,
+ device_name,
+ ifname_option_values=self._ifname_option_values
+ )
+ if network_data.activate:
+- device = self._nm_client.get_device_by_iface(device_name)
+- self._nm_client.activate_connection_async(connection, device, None, None)
++ device = nm_client.get_device_by_iface(device_name)
++ nm_client.activate_connection_async(connection, device, None, None)
+ log.debug("%s: activating updated connection %s with device %s",
+ self.name, connection.get_uuid(), device_name)
+ else:
+ log.debug("%s: adding connection for %s", self.name, device_name)
+ add_connection_from_ksdata(
+- self._nm_client,
++ nm_client,
+ network_data,
+ device_name,
+ activate=network_data.activate,
+@@ -132,8 +133,8 @@ class ApplyKickstartTask(Task):
+
+ return applied_devices
+
+- def _find_initramfs_connection_of_iface(self, iface):
+- device = self._nm_client.get_device_by_iface(iface)
++ def _find_initramfs_connection_of_iface(self, nm_client, iface):
++ device = nm_client.get_device_by_iface(iface)
+ if device:
+ cons = device.get_available_connections()
+ for con in cons:
+@@ -145,18 +146,15 @@ class ApplyKickstartTask(Task):
+ class DumpMissingConfigFilesTask(Task):
+ """Task for dumping of missing config files."""
+
+- def __init__(self, nm_client, default_network_data, ifname_option_values):
++ def __init__(self, default_network_data, ifname_option_values):
+ """Create a new task.
+
+- :param nm_client: NetworkManager client used as configuration backend
+- :type nm_client: NM.Client
+ :param default_network_data: kickstart network data of default device configuration
+ :type default_network_data: NetworkData
+ :param ifname_option_values: list of ifname boot option values
+ :type ifname_option_values: list(str)
+ """
+ super().__init__()
+- self._nm_client = nm_client
+ self._default_network_data = default_network_data
+ self._ifname_option_values = ifname_option_values
+
+@@ -186,7 +184,7 @@ class DumpMissingConfigFilesTask(Task):
+ return con
+ return None
+
+- def _update_connection(self, con, iface):
++ def _update_connection(self, nm_client, con, iface):
+ log.debug("%s: updating id and binding (interface-name) of connection %s for %s",
+ self.name, con.get_uuid(), iface)
+ s_con = con.get_setting_connection()
+@@ -196,7 +194,7 @@ class DumpMissingConfigFilesTask(Task):
+ if s_wired:
+ # By default connections are bound to interface name
+ s_wired.set_property(NM.SETTING_WIRED_MAC_ADDRESS, None)
+- bound_mac = bound_hwaddr_of_device(self._nm_client, iface, self._ifname_option_values)
++ bound_mac = bound_hwaddr_of_device(nm_client, iface, self._ifname_option_values)
+ if bound_mac:
+ s_wired.set_property(NM.SETTING_WIRED_MAC_ADDRESS, bound_mac)
+ log.debug("%s: iface %s bound to mac address %s by ifname boot option",
+@@ -216,19 +214,23 @@ class DumpMissingConfigFilesTask(Task):
+ :returns: names of devices for which config file was created
+ :rtype: list(str)
+ """
++ with nm_client_in_thread() as nm_client:
++ return self._run(nm_client)
++
++ def _run(self, nm_client):
+ new_configs = []
+
+- if not self._nm_client:
++ if not nm_client:
+ log.debug("%s: No NetworkManager available.", self.name)
+ return new_configs
+
+ dumped_device_types = supported_wired_device_types + virtual_device_types
+- for device in self._nm_client.get_devices():
++ for device in nm_client.get_devices():
+ if device.get_device_type() not in dumped_device_types:
+ continue
+
+ iface = device.get_iface()
+- if get_config_file_connection_of_device(self._nm_client, iface):
++ if get_config_file_connection_of_device(nm_client, iface):
+ continue
+
+ cons = device.get_available_connections()
+@@ -259,10 +261,10 @@ class DumpMissingConfigFilesTask(Task):
+ # Try to clone the persistent connection for the device
+ # from the connection which should be a generic (not bound
+ # to iface) connection created by NM in initramfs
+- con = clone_connection_sync(self._nm_client, cons[0], con_id=iface)
++ con = clone_connection_sync(nm_client, cons[0], con_id=iface)
+
+ if con:
+- self._update_connection(con, iface)
++ self._update_connection(nm_client, con, iface)
+ # Update some values of connection generated in initramfs so it
+ # can be used as persistent configuration.
+ if has_initramfs_con:
+@@ -285,7 +287,7 @@ class DumpMissingConfigFilesTask(Task):
+ )
+ log.debug("%s: dumping connection %s to config file for %s",
+ self.name, con.get_uuid(), iface)
+- commit_changes_with_autoconnection_blocked(con)
++ commit_changes_with_autoconnection_blocked(con, nm_client)
+ else:
+ log.debug("%s: none of the connections can be dumped as persistent",
+ self.name)
+@@ -298,7 +300,7 @@ class DumpMissingConfigFilesTask(Task):
+ if has_initramfs_con:
+ network_data.onboot = True
+ add_connection_from_ksdata(
+- self._nm_client,
++ nm_client,
+ network_data,
+ iface,
+ activate=False,
+diff --git a/pyanaconda/modules/network/installation.py b/pyanaconda/modules/network/installation.py
+index 3ac65e0df0..d91eb51ae7 100644
+--- a/pyanaconda/modules/network/installation.py
++++ b/pyanaconda/modules/network/installation.py
+@@ -23,7 +23,7 @@ from pyanaconda.modules.common.errors.installation import NetworkInstallationErr
+ from pyanaconda.modules.common.task import Task
+ from pyanaconda.anaconda_loggers import get_module_logger
+ from pyanaconda.modules.network.nm_client import update_connection_values, \
+- commit_changes_with_autoconnection_blocked
++ commit_changes_with_autoconnection_blocked, nm_client_in_thread
+ from pyanaconda.modules.network.utils import guard_by_system_configuration
+ from pyanaconda.modules.network.nm_client import get_config_file_connection_of_device
+ from pyanaconda.modules.network.config_file import IFCFG_DIR, KEYFILE_DIR
+@@ -281,16 +281,13 @@ Name={}
+ class ConfigureActivationOnBootTask(Task):
+ """Task for configuration of automatic activation of devices on boot"""
+
+- def __init__(self, nm_client, onboot_ifaces):
++ def __init__(self, onboot_ifaces):
+ """Create a new task.
+
+- :param nm_client: NetworkManager client used as configuration backend
+- :type nm_client: NM.Client
+ :param onboot_ifaces: interfaces that should be autoactivated on boot
+ :type onboot_ifaces: list(str)
+ """
+ super().__init__()
+- self._nm_client = nm_client
+ self._onboot_ifaces = onboot_ifaces
+
+ @property
+@@ -299,18 +296,22 @@ class ConfigureActivationOnBootTask(Task):
+
+ @guard_by_system_configuration(return_value=None)
+ def run(self):
+- if not self._nm_client:
++ with nm_client_in_thread() as nm_client:
++ return self._run(nm_client)
++
++ def _run(self, nm_client):
++ if not nm_client:
+ log.debug("%s: No NetworkManager available.", self.name)
+ return None
+
+ for iface in self._onboot_ifaces:
+- con_uuid = get_config_file_connection_of_device(self._nm_client, iface)
++ con_uuid = get_config_file_connection_of_device(nm_client, iface)
+ if con_uuid:
+- con = self._nm_client.get_connection_by_uuid(con_uuid)
++ con = nm_client.get_connection_by_uuid(con_uuid)
+ update_connection_values(
+ con,
+ [("connection", NM.SETTING_CONNECTION_AUTOCONNECT, True)]
+ )
+- commit_changes_with_autoconnection_blocked(con)
++ commit_changes_with_autoconnection_blocked(con, nm_client)
+ else:
+ log.warning("Configure ONBOOT: can't find config for %s", iface)
+diff --git a/pyanaconda/modules/network/network.py b/pyanaconda/modules/network/network.py
+index 445c9d8b46..a905ee31d6 100644
+--- a/pyanaconda/modules/network/network.py
++++ b/pyanaconda/modules/network/network.py
+@@ -23,7 +23,7 @@ from pyanaconda.core.async_utils import run_in_loop
+ from pyanaconda.core.configuration.anaconda import conf
+ from pyanaconda.core.configuration.network import NetworkOnBoot
+ from pyanaconda.core.kernel import kernel_arguments
+-from pyanaconda.core.dbus import DBus, SystemBus
++from pyanaconda.core.dbus import DBus
+ from pyanaconda.core.signal import Signal
+ from pyanaconda.modules.common.base import KickstartService
+ from pyanaconda.modules.common.containers import TaskContainer
+@@ -37,7 +37,7 @@ from pyanaconda.modules.network.firewall import FirewallModule
+ from pyanaconda.modules.network.device_configuration import DeviceConfigurations, \
+ supported_device_types, supported_wired_device_types
+ from pyanaconda.modules.network.nm_client import devices_ignore_ipv6, get_connections_dump, \
+- get_dracut_arguments_from_connection, get_kickstart_network_data
++ get_dracut_arguments_from_connection, get_kickstart_network_data, get_new_nm_client
+ from pyanaconda.modules.network.config_file import get_config_files_content, \
+ is_config_file_for_system
+ from pyanaconda.modules.network.installation import NetworkInstallationTask, \
+@@ -70,17 +70,12 @@ class NetworkService(KickstartService):
+ self._hostname_service_proxy = self._get_hostname_proxy()
+
+ self.connected_changed = Signal()
+- self.nm_client = None
+ # TODO fallback solution - use Gio/GNetworkMonitor ?
+- if SystemBus.check_connection():
+- nm_client = NM.Client.new(None)
+- if nm_client.get_nm_running():
+- self.nm_client = nm_client
+- self.nm_client.connect("notify::%s" % NM.CLIENT_STATE, self._nm_state_changed)
+- initial_state = self.nm_client.get_state()
+- self.set_connected(self._nm_state_connected(initial_state))
+- else:
+- log.debug("NetworkManager is not running.")
++ self.nm_client = get_new_nm_client()
++ if self.nm_client:
++ self.nm_client.connect("notify::%s" % NM.CLIENT_STATE, self._nm_state_changed)
++ initial_state = self.nm_client.get_state()
++ self.set_connected(self._nm_state_connected(initial_state))
+
+ self._original_network_data = []
+ self._device_configurations = None
+@@ -393,7 +388,6 @@ class NetworkService(KickstartService):
+ all_onboot_ifaces = list(set(onboot_ifaces + onboot_ifaces_by_policy))
+
+ task = ConfigureActivationOnBootTask(
+- self.nm_client,
+ all_onboot_ifaces
+ )
+ task.succeeded_signal.connect(lambda: self.log_task_result(task))
+@@ -616,8 +610,7 @@ class NetworkService(KickstartService):
+ :returns: a task applying the kickstart
+ """
+ supported_devices = [dev_info.device_name for dev_info in self.get_supported_devices()]
+- task = ApplyKickstartTask(self.nm_client,
+- self._original_network_data,
++ task = ApplyKickstartTask(self._original_network_data,
+ supported_devices,
+ self.bootif,
+ self.ifname_option_values)
+@@ -645,8 +638,7 @@ class NetworkService(KickstartService):
+ """
+ data = self.get_kickstart_handler()
+ default_network_data = data.NetworkData(onboot=False, ipv6="auto")
+- task = DumpMissingConfigFilesTask(self.nm_client,
+- default_network_data,
++ task = DumpMissingConfigFilesTask(default_network_data,
+ self.ifname_option_values)
+ task.succeeded_signal.connect(lambda: self.log_task_result(task, check_result=True))
+ return task
+diff --git a/pyanaconda/modules/network/nm_client.py b/pyanaconda/modules/network/nm_client.py
+index 3cc28ec48e..421ef1e0d9 100644
+--- a/pyanaconda/modules/network/nm_client.py
++++ b/pyanaconda/modules/network/nm_client.py
+@@ -21,18 +21,20 @@
+ import gi
+ gi.require_version("NM", "1.0")
+ from gi.repository import NM
++from contextlib import contextmanager
+
+ import socket
+-from queue import Queue, Empty
+ from pykickstart.constants import BIND_TO_MAC
++from pyanaconda.core.glib import create_new_context, GError, sync_call_glib
+ from pyanaconda.modules.network.constants import NM_CONNECTION_UUID_LENGTH, \
+- CONNECTION_ACTIVATION_TIMEOUT, NM_CONNECTION_TYPE_WIFI, NM_CONNECTION_TYPE_ETHERNET, \
++ CONNECTION_ADDING_TIMEOUT, NM_CONNECTION_TYPE_WIFI, NM_CONNECTION_TYPE_ETHERNET, \
+ NM_CONNECTION_TYPE_VLAN, NM_CONNECTION_TYPE_BOND, NM_CONNECTION_TYPE_TEAM, \
+- NM_CONNECTION_TYPE_BRIDGE, NM_CONNECTION_TYPE_INFINIBAND, CONNECTION_ADDING_TIMEOUT
++ NM_CONNECTION_TYPE_BRIDGE, NM_CONNECTION_TYPE_INFINIBAND
+ from pyanaconda.modules.network.kickstart import default_ks_vlan_interface_name
+ from pyanaconda.modules.network.utils import is_s390, get_s390_settings, netmask2prefix, \
+ prefix2netmask
+ from pyanaconda.modules.network.config_file import is_config_file_for_system
++from pyanaconda.core.dbus import SystemBus
+
+ from pyanaconda.anaconda_loggers import get_module_logger
+ log = get_module_logger(__name__)
+@@ -51,6 +53,51 @@ NM_BRIDGE_DUMPED_SETTINGS_DEFAULTS = {
+ }
+
+
++@contextmanager
++def nm_client_in_thread():
++ """Create NM Client with new GMainContext to be run in thread.
++
++ Expected to be used only in installer environment for a few
++ one-shot isolated network configuration tasks.
++ Destroying of the created NM Client instance and release of
++ related resources is not implemented.
++
++ For more information see NetworkManager example examples/python/gi/gmaincontext.py
++ """
++ mainctx = create_new_context()
++ mainctx.push_thread_default()
++
++ try:
++ yield get_new_nm_client()
++ finally:
++ mainctx.pop_thread_default()
++
++
++def get_new_nm_client():
++ """Get new instance of NMClient.
++
++ :returns: an instance of NetworkManager NMClient or None if system bus
++ is not available or NM is not running
++ :rtype: NM.NMClient
++ """
++ if not SystemBus.check_connection():
++ log.debug("get new NM Client failed: SystemBus connection check failed.")
++ return None
++
++ try:
++ nm_client = NM.Client.new(None)
++ except GError as e:
++ log.debug("get new NM Client constructor failed: %s", e)
++ return None
++
++ if not nm_client.get_nm_running():
++ log.debug("get new NM Client failed: NetworkManager is not running.")
++ return None
++
++ log.debug("get new NM Client succeeded.")
++ return nm_client
++
++
+ def get_iface_from_connection(nm_client, uuid):
+ """Get the name of device that would be used for the connection.
+
+@@ -268,7 +315,7 @@ def _add_existing_virtual_device_to_bridge(nm_client, device_name, bridge_spec):
+ bridge_spec),
+ ]
+ )
+- commit_changes_with_autoconnection_blocked(port_connection)
++ commit_changes_with_autoconnection_blocked(port_connection, nm_client)
+ return port_connection.get_uuid()
+
+
+@@ -532,7 +579,7 @@ def add_connection_from_ksdata(nm_client, network_data, device_name, activate=Fa
+ connection.to_dbus(NM.ConnectionSerializationFlags.NO_SECRETS))
+ added_connection = add_connection_sync(
+ nm_client,
+- connection,
++ connection
+ )
+
+ if not added_connection:
+@@ -557,37 +604,39 @@ def add_connection_from_ksdata(nm_client, network_data, device_name, activate=Fa
+ def add_connection_sync(nm_client, connection):
+ """Add a connection synchronously and optionally activate asynchronously.
+
++ Synchronous run is implemented by running a blocking GMainLoop with
++ GMainContext belonging to the nm_client created for the calling Task.
++
++ :param nm_client: NetoworkManager client
++ :type nm_client: NM.NMClient
+ :param connection: connection to be added
+ :type connection: NM.SimpleConnection
+ :return: added connection or None on timeout
+ :rtype: NM.RemoteConnection
+ """
+- sync_queue = Queue()
+-
+- def finish_callback(nm_client, result, sync_queue):
+- con, result = nm_client.add_connection2_finish(result)
+- log.debug("connection %s added:\n%s", con.get_uuid(),
+- con.to_dbus(NM.ConnectionSerializationFlags.NO_SECRETS))
+- sync_queue.put(con)
+-
+- nm_client.add_connection2(
++ result = sync_call_glib(
++ nm_client.get_main_context(),
++ nm_client.add_connection2,
++ nm_client.add_connection2_finish,
++ CONNECTION_ADDING_TIMEOUT,
+ connection.to_dbus(NM.ConnectionSerializationFlags.ALL),
+ (NM.SettingsAddConnection2Flags.TO_DISK |
+ NM.SettingsAddConnection2Flags.BLOCK_AUTOCONNECT),
+ None,
+- False,
+- None,
+- finish_callback,
+- sync_queue
++ False
+ )
+
+- try:
+- ret = sync_queue.get(timeout=CONNECTION_ADDING_TIMEOUT)
+- except Empty:
+- log.error("Adding of connection %s timed out.", connection.get_uuid())
+- ret = None
++ if result.failed:
++ log.error("adding of a connection %s failed: %s",
++ connection.get_uuid(),
++ result.error_message)
++ return None
++
++ con, _res = result.received_data
++ log.debug("connection %s added:\n%s", connection.get_uuid(),
++ connection.to_dbus(NM.ConnectionSerializationFlags.NO_SECRETS))
+
+- return ret
++ return con
+
+
+ def create_port_connection(port_type, port_idx, port, controller, autoconnect, settings=None):
+@@ -713,7 +762,7 @@ def update_connection_from_ksdata(nm_client, connection, network_data, device_na
+ else:
+ bind_connection(nm_client, connection, network_data.bindto, device_name)
+
+- commit_changes_with_autoconnection_blocked(connection)
++ commit_changes_with_autoconnection_blocked(connection, nm_client)
+
+ log.debug("updated connection %s:\n%s", connection.get_uuid(),
+ connection.to_dbus(NM.ConnectionSerializationFlags.NO_SECRETS))
+@@ -1013,42 +1062,47 @@ def get_connections_dump(nm_client):
+ return "\n".join(con_dumps)
+
+
+-def commit_changes_with_autoconnection_blocked(connection, save_to_disk=True):
++def commit_changes_with_autoconnection_blocked(connection, nm_client, save_to_disk=True):
+ """Implementation of NM CommitChanges() method with blocked autoconnection.
+
+- Update2() API is used to implement the functionality (called synchronously).
+-
++ Update2() API is used to implement the functionality.
+ Prevents autoactivation of the connection on its update which would happen
+ with CommitChanges if "autoconnect" is set True.
+
++ Synchronous run is implemented by running a blocking GMainLoop with
++ GMainContext belonging to the nm_client created for the calling Task.
++
+ :param connection: NetworkManager connection
+ :type connection: NM.RemoteConnection
++ :param nm_client: NetoworkManager client
++ :type nm_client: NM.NMClient
+ :param save_to_disk: should the changes be written also to disk?
+ :type save_to_disk: bool
+ :return: on success result of the Update2() call, None of failure
+ :rtype: GVariant of type "a{sv}" or None
+ """
+- sync_queue = Queue()
+-
+- def finish_callback(connection, result, sync_queue):
+- ret = connection.update2_finish(result)
+- sync_queue.put(ret)
+-
+ flags = NM.SettingsUpdate2Flags.BLOCK_AUTOCONNECT
+ if save_to_disk:
+ flags |= NM.SettingsUpdate2Flags.TO_DISK
+-
+ con2 = NM.SimpleConnection.new_clone(connection)
+- connection.update2(
++
++ result = sync_call_glib(
++ nm_client.get_main_context(),
++ connection.update2,
++ connection.update2_finish,
++ CONNECTION_ADDING_TIMEOUT,
+ con2.to_dbus(NM.ConnectionSerializationFlags.ALL),
+ flags,
+- None,
+- None,
+- finish_callback,
+- sync_queue
++ None
+ )
+
+- return sync_queue.get()
++ if result.failed:
++ log.error("comitting changes of connection %s failed: %s",
++ connection.get_uuid(),
++ result.error_message)
++ return None
++
++ return result.received_data
+
+
+ def clone_connection_sync(nm_client, connection, con_id=None, uuid=None):
+@@ -1063,36 +1117,19 @@ def clone_connection_sync(nm_client, connection, con_id=None, uuid=None):
+ :return: NetworkManager connection or None on timeout
+ :rtype: NM.RemoteConnection
+ """
+- sync_queue = Queue()
+-
+- def finish_callback(nm_client, result, sync_queue):
+- con, result = nm_client.add_connection2_finish(result)
+- log.debug("connection %s cloned:\n%s", con.get_uuid(),
+- con.to_dbus(NM.ConnectionSerializationFlags.NO_SECRETS))
+- sync_queue.put(con)
+-
+ cloned_connection = NM.SimpleConnection.new_clone(connection)
+ s_con = cloned_connection.get_setting_connection()
+ s_con.props.uuid = uuid or NM.utils_uuid_generate()
+ s_con.props.id = con_id or "{}-clone".format(connection.get_id())
+- nm_client.add_connection2(
+- cloned_connection.to_dbus(NM.ConnectionSerializationFlags.ALL),
+- (NM.SettingsAddConnection2Flags.TO_DISK |
+- NM.SettingsAddConnection2Flags.BLOCK_AUTOCONNECT),
+- None,
+- False,
+- None,
+- finish_callback,
+- sync_queue
+- )
+
+- try:
+- ret = sync_queue.get(timeout=CONNECTION_ACTIVATION_TIMEOUT)
+- except Empty:
+- log.error("Cloning of a connection timed out.")
+- ret = None
++ log.debug("cloning connection %s", connection.get_uuid())
++ added_connection = add_connection_sync(nm_client, cloned_connection)
+
+- return ret
++ if added_connection:
++ log.debug("connection was cloned into %s", added_connection.get_uuid())
++ else:
++ log.debug("connection cloning failed")
++ return added_connection
+
+
+ def get_dracut_arguments_from_connection(nm_client, connection, iface, target_ip,
+--
+2.23.0 \ No newline at end of file
diff --git a/bugfix-GUI-nfs-unknown-error.patch b/bugfix-GUI-nfs-unknown-error.patch
new file mode 100644
index 0000000..32d36f2
--- /dev/null
+++ b/bugfix-GUI-nfs-unknown-error.patch
@@ -0,0 +1,26 @@
+From 7af95c3ee0fe3f0c2a5ec6fb05673f10c19441f9 Mon Sep 17 00:00:00 2001
+From: t_feng <fengtao40@huawei.com>
+Date: Thu, 18 Jun 2020 22:48:03 +0800
+Subject: [PATCH] bugfix GUI nfs unknown error
+
+---
+ pyanaconda/ui/gui/spokes/installation_source.py | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/pyanaconda/ui/gui/spokes/installation_source.py b/pyanaconda/ui/gui/spokes/installation_source.py
+index 396cad6..16e81b4 100644
+--- a/pyanaconda/ui/gui/spokes/installation_source.py
++++ b/pyanaconda/ui/gui/spokes/installation_source.py
+@@ -1141,6 +1141,9 @@ class SourceSpoke(NormalSpoke, GUISpokeInputCheckHandler, SourceSwitchHandler):
+ else:
+ return _("Remote directory is required")
+
++ if ":" not in url_string or len(url_string.split(":")) != 2:
++ return _("Server must be specified as SERVER:/PATH")
++
+ return InputCheck.CHECK_OK
+
+ def _check_url_entry(self, inputcheck):
+--
+2.23.0
+
diff --git a/bugfix-Solve-the-problem-that-the-circular-loading-progress-bar-does-not-rotate.patch b/bugfix-Solve-the-problem-that-the-circular-loading-progress-bar-does-not-rotate.patch
new file mode 100644
index 0000000..b9ea22e
--- /dev/null
+++ b/bugfix-Solve-the-problem-that-the-circular-loading-progress-bar-does-not-rotate.patch
@@ -0,0 +1,25 @@
+From ccc28e983cd2c1f1f02fd00b9b1659fb572bac1b Mon Sep 17 00:00:00 2001
+From: yueyuankun <yueyuankun@kylinos.cn>
+Date: Tue, 23 Aug 2022 15:53:18 +0800
+Subject: [PATCH] Solve the problem that sometimes the circular
+ loading progress bar does not rotate
+
+---
+ pyanaconda/ui/gui/spokes/installation_progress.py | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/pyanaconda/ui/gui/spokes/installation_progress.py b/pyanaconda/ui/gui/spokes/installation_progress.py
+index 0de742b..5ed3424 100644
+--- a/pyanaconda/ui/gui/spokes/installation_progress.py
++++ b/pyanaconda/ui/gui/spokes/installation_progress.py
+@@ -85,6 +85,7 @@ class ProgressSpoke(StandaloneSpoke):
+
+ if code == progressQ.PROGRESS_CODE_INIT:
+ self._init_progress_bar(args[0])
++ gtk_call_once(self._spinner.start)
+ elif code == progressQ.PROGRESS_CODE_STEP:
+ self._step_progress_bar()
+ elif code == progressQ.PROGRESS_CODE_MESSAGE:
+--
+2.27.0
+
diff --git a/bugfix-adapt-active-connection-without-interface-name.patch b/bugfix-adapt-active-connection-without-interface-name.patch
new file mode 100644
index 0000000..d64ab0c
--- /dev/null
+++ b/bugfix-adapt-active-connection-without-interface-name.patch
@@ -0,0 +1,26 @@
+From ade550fb89b10cf218ce96541e1c540a2a8a7ea1 Mon Sep 17 00:00:00 2001
+From: sun_hai_10 <sunha10@huawei.com>
+Date: Wed, 14 Dec 2022 11:04:41 +0800
+Subject: [PATCH] adapt active connection without interface-name
+
+---
+ pyanaconda/modules/network/initialization.py | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/pyanaconda/modules/network/initialization.py b/pyanaconda/modules/network/initialization.py
+index c7f0ba4..85a1da7 100644
+--- a/pyanaconda/modules/network/initialization.py
++++ b/pyanaconda/modules/network/initialization.py
+@@ -136,6 +136,9 @@ class ApplyKickstartTask(Task):
+ def _find_initramfs_connection_of_iface(self, nm_client, iface):
+ device = nm_client.get_device_by_iface(iface)
+ if device:
++ active_connection = device.get_active_connection()
++ if active_connection:
++ return active_connection.get_connection()
+ cons = device.get_available_connections()
+ for con in cons:
+ if con.get_interface_name() == iface and con.get_id() == iface:
+--
+2.23.0
+
diff --git a/bugfix-add-SM3-with-tui.patch b/bugfix-add-SM3-with-tui.patch
new file mode 100644
index 0000000..01d77d9
--- /dev/null
+++ b/bugfix-add-SM3-with-tui.patch
@@ -0,0 +1,173 @@
+From 1a11874c57156e576620dd396b4357ec9bab2cc4 Mon Sep 17 00:00:00 2001
+From: sun_hai_10 <sunhai10@huawei.com>
+Date: Tue, 29 Nov 2022 09:34:09 +0800
+Subject: [PATCH] add SM3 with tui
+
+---
+ pyanaconda/ui/tui/spokes/root_password.py | 81 ++++++++++++++++++++---
+ pyanaconda/ui/tui/tuiobject.py | 7 +-
+ 2 files changed, 77 insertions(+), 11 deletions(-)
+
+diff --git a/pyanaconda/ui/tui/spokes/root_password.py b/pyanaconda/ui/tui/spokes/root_password.py
+index 3c5ba16..dfaca4e 100644
+--- a/pyanaconda/ui/tui/spokes/root_password.py
++++ b/pyanaconda/ui/tui/spokes/root_password.py
+@@ -26,7 +26,11 @@ from pyanaconda.core.i18n import N_, _
+ from pyanaconda.modules.common.constants.services import USERS
+ from pyanaconda.core.constants import PASSWORD_POLICY_ROOT
+
+-from simpleline.render.widgets import TextWidget
++from simpleline.render.containers import ListColumnContainer
++from simpleline.render.prompt import Prompt
++from simpleline.render.screen import InputState
++from simpleline.render.screen_handler import ScreenHandler
++from simpleline.render.widgets import TextWidget, CheckboxWidget
+
+
+ class PasswordSpoke(FirstbootSpokeMixIn, NormalTUISpoke):
+@@ -50,20 +54,18 @@ class PasswordSpoke(FirstbootSpokeMixIn, NormalTUISpoke):
+ return FirstbootSpokeMixIn.should_run(environment, data)
+
+ def __init__(self, data, storage, payload):
+- NormalTUISpoke.__init__(self, data, storage, payload)
+- self.initialize_start()
++ super().__init__(data, storage, payload)
+ self.title = N_("Root password")
+- self.input_required = False
+-
+- self._password = None
+-
+ self._users_module = USERS.get_proxy()
+- self.initialize_done()
++ self._sm3_config = False
++
++ def _set_sm3_config(self, args):
++ self._sm3_config = not self._sm3_config
+
+ @property
+ def completed(self):
+ return self._users_module.IsRootPasswordSet
+-
++
+ @property
+ def showable(self):
+ return can_modify_root_configuration(self._users_module)
+@@ -77,6 +79,59 @@ class PasswordSpoke(FirstbootSpokeMixIn, NormalTUISpoke):
+ def status(self):
+ return get_root_configuration_status(self._users_module)
+
++ def initialize(self):
++ self.initialize_start()
++ NormalTUISpoke.initialize(self)
++ self.initialize_done()
++
++ def refresh(self, args=None):
++ """ Refresh screen. """
++ NormalTUISpoke.refresh(self, args)
++
++ self._container = ListColumnContainer(1)
++
++ msg = _("SM3 encrypt")
++ sm3_check = CheckboxWidget(title=msg, completed=self._sm3_config)
++ self._container.add(sm3_check, self._set_sm3_config)
++
++ self.window.add_with_separator(self._container)
++
++ def input(self, args, key):
++ """Handle the user input."""
++ if self._container.process_user_input(key):
++ return InputState.PROCESSED_AND_REDRAW
++
++ if key.lower() == Prompt.CONTINUE:
++ spoke = RootPasswordSpoke(
++ self.data,
++ self.storage,
++ self.payload,
++ self._sm3_config,
++ )
++ ScreenHandler.push_screen_modal(spoke)
++ return InputState.PROCESSED_AND_CLOSE
++
++ return super().input(args, key)
++
++
++class RootPasswordSpoke(NormalTUISpoke):
++ """
++ .. inheritance-diagram:: PasswordSpoke
++ :parts: 3
++ """
++
++ def __init__(self, data, storage, payload, sm3_config):
++ NormalTUISpoke.__init__(self, data, storage, payload)
++ self.initialize_start()
++ self.title = N_("Root password")
++ self.input_required = False
++
++ self._password = None
++ self._sm3_config = sm3_config
++
++ self._users_module = USERS.get_proxy()
++ self.initialize_done()
++
+ def refresh(self, args=None):
+ NormalTUISpoke.refresh(self, args)
+
+@@ -85,10 +140,15 @@ class PasswordSpoke(FirstbootSpokeMixIn, NormalTUISpoke):
+
+ def show_all(self):
+ super().show_all()
++ if self._sm3_config:
++ algo = "sm3"
++ else:
++ algo = None
+
+ password_dialog = PasswordDialog(
+ title=_("Password"),
+- policy_name=PASSWORD_POLICY_ROOT
++ policy_name=PASSWORD_POLICY_ROOT,
++ func_args=(algo,)
+ )
+ password_dialog.no_separator = True
+ self._password = password_dialog.run()
+@@ -101,6 +161,7 @@ class PasswordSpoke(FirstbootSpokeMixIn, NormalTUISpoke):
+ self.close()
+
+ def apply(self):
++
+ self._users_module.SetCryptedRootPassword(self._password)
+ if self._password:
+ self._users_module.SetRootAccountLocked(False)
+diff --git a/pyanaconda/ui/tui/tuiobject.py b/pyanaconda/ui/tui/tuiobject.py
+index 6cb439b..c642931 100644
+--- a/pyanaconda/ui/tui/tuiobject.py
++++ b/pyanaconda/ui/tui/tuiobject.py
+@@ -209,12 +209,14 @@ class PasswordDialog(Dialog):
+ report_func=reporting_callback,
+ process_func=crypt_password,
+ secret_type=constants.SecretType.PASSWORD,
++ func_args=None,
+ message=None):
+ super().__init__(title, report_func=report_func)
+ self._no_separator = False
+ self._policy = input_checking.get_policy(policy_name)
+ self._secret_type = secret_type
+ self._process_password = process_func
++ self._func_args = func_args
+ self._dialog_message = message
+
+ def run(self):
+@@ -292,7 +294,10 @@ class PasswordDialog(Dialog):
+ if any(char not in constants.PW_ASCII_CHARS for char in password):
+ self._report(_(constants.SECRET_ASCII[self._secret_type]))
+
+- return self._process_password(password)
++ if self._func_args == None:
++ return self._process_password(password)
++ else:
++ return self._process_password(password, *self._func_args)
+
+ def _report(self, message):
+ if self._report_func:
+--
+2.28.0.windows.1
+
diff --git a/bugfix-add-log-and-background.patch b/bugfix-add-log-and-background.patch
new file mode 100644
index 0000000..7645f9e
--- /dev/null
+++ b/bugfix-add-log-and-background.patch
@@ -0,0 +1,46 @@
+From 8b5428e400ac80d57ae6bc6b0ec792e17a62a04e Mon Sep 17 00:00:00 2001
+From: sun_hai_10 <sunhai10@huawei.com>
+Date: Thu, 24 Nov 2022 11:13:58 +0800
+Subject: [PATCH] add log and background
+
+---
+ data/anaconda-gtk.css | 11 ++++++++++-
+ 1 file changed, 10 insertions(+), 1 deletion(-)
+
+diff --git a/data/anaconda-gtk.css b/data/anaconda-gtk.css
+index 7de933d..7c6643a 100644
+--- a/data/anaconda-gtk.css
++++ b/data/anaconda-gtk.css
+@@ -98,12 +98,18 @@ infobar.error {
+ @define-color anaconda_bg_color #2f4265;
+
+ .logo-sidebar {
++ background-image: url('/usr/share/anaconda/pixmaps/sidebar-bg.png');
++ background-size: 100% 100%;
++ background-repeat: no-repeat;
+ background-color: @anaconda_bg_color;
+ }
+
+ /* This is a placeholder to be filled by a product-specific logo. */
+ .logo {
+- background-image: none;
++ background-image: url('/usr/share/anaconda/pixmaps/sidebar-logo.png');
++ background-position: 50% 20px;
++ background-size: 90%;
++ background-repeat: no-repeat;
+ background-color: transparent;
+ }
+
+@@ -114,6 +120,9 @@ infobar.error {
+ }
+
+ AnacondaSpokeWindow #nav-box {
++ background-image: url('/usr/share/anaconda/pixmaps/topbar-bg.png');
++ background-size: 100% 100%;
++ background-repeat: no-repeat;
+ background-color: @anaconda_bg_color;
+ color: white;
+ }
+--
+2.23.0
+
diff --git a/bugfix-change-gnome-kiosk-to-use-metacity.patch b/bugfix-change-gnome-kiosk-to-use-metacity.patch
new file mode 100644
index 0000000..55dfea1
--- /dev/null
+++ b/bugfix-change-gnome-kiosk-to-use-metacity.patch
@@ -0,0 +1,28 @@
+From 4de5376d5b1b88d1190476b8d179b677a08fe03c Mon Sep 17 00:00:00 2001
+From: sun_hai_10 <sunhai10@huawei.com>
+Date: Tue, 15 Nov 2022 15:46:38 +0800
+Subject: [PATCH] change 'gnome-kiosk' to use 'metacity'
+
+---
+ pyanaconda/display.py | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/pyanaconda/display.py b/pyanaconda/display.py
+index 880af9c..ddf24fb 100644
+--- a/pyanaconda/display.py
++++ b/pyanaconda/display.py
+@@ -192,9 +192,9 @@ def do_startup_x11_actions():
+ else:
+ xdg_data_dirs = datadir + '/window-manager:/usr/share'
+
+- childproc = util.startProgram(["gnome-kiosk", "--display", ":1", "--sm-disable", "--x11"],
++ childproc = util.startProgram(["metacity", "--display", ":1", "--sm-disable"],
+ env_add={'XDG_DATA_DIRS': xdg_data_dirs})
+- WatchProcesses.watch_process(childproc, "gnome-kiosk")
++ WatchProcesses.watch_process(childproc, "metacity")
+
+
+ def set_x_resolution(runres):
+--
+2.23.0
+
diff --git a/bugfix-change-product-name-do-not-with-upper.patch b/bugfix-change-product-name-do-not-with-upper.patch
new file mode 100644
index 0000000..617525b
--- /dev/null
+++ b/bugfix-change-product-name-do-not-with-upper.patch
@@ -0,0 +1,39 @@
+From 613035ac2716f99ce2ec536c4769d3dc6e6f90e5 Mon Sep 17 00:00:00 2001
+From: sun_hai_10 <sunha10@huawei.com>
+Date: Tue, 29 Nov 2022 15:44:45 +0800
+Subject: [PATCH] change product name do not with upper
+
+---
+ pyanaconda/product.py | 4 ++--
+ pyanaconda/ui/gui/spokes/welcome.py | 2 +-
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/pyanaconda/product.py b/pyanaconda/product.py
+index b5e97d7..7fe28cb 100644
+--- a/pyanaconda/product.py
++++ b/pyanaconda/product.py
+@@ -57,6 +57,6 @@ productVersion = trim_product_version_for_ui(productVersion)
+
+ def distributionText():
+ return _("%(productName)s %(productVersion)s INSTALLATION") % {
+- "productName": productName.upper(),
+- "productVersion": productVersion.upper()
++ "productName": productName,
++ "productVersion": productVersion
+ }
+diff --git a/pyanaconda/ui/gui/spokes/welcome.py b/pyanaconda/ui/gui/spokes/welcome.py
+index 773d5a8..3fc5ebf 100644
+--- a/pyanaconda/ui/gui/spokes/welcome.py
++++ b/pyanaconda/ui/gui/spokes/welcome.py
+@@ -271,7 +271,7 @@ class WelcomeLanguageSpoke(StandaloneSpoke, LangLocaleHandler):
+ welcomeLabel = self.builder.get_object("welcomeLabel")
+
+ welcomeLabel.set_text(_("WELCOME TO %(name)s %(version)s.") %
+- {"name" : productName.upper(), "version" : productVersion}) # pylint: disable=no-member
++ {"name" : productName, "version" : productVersion}) # pylint: disable=no-member
+
+ # Retranslate the language (filtering) entry's placeholder text
+ languageEntry = self.builder.get_object("languageEntry")
+--
+2.23.0
+
diff --git a/bugfix-change-the-startup-mode-of-do_transaction-sub-proces.patch b/bugfix-change-the-startup-mode-of-do_transaction-sub-proces.patch
new file mode 100644
index 0000000..9179cd2
--- /dev/null
+++ b/bugfix-change-the-startup-mode-of-do_transaction-sub-proces.patch
@@ -0,0 +1,160 @@
+From 7dc41d9a1f3d0e3dfa48838cf0e75c2f0f04e207 Mon Sep 17 00:00:00 2001
+From: sun_hai_10 <sunhai10@huawei.com>
+Date: Sun, 25 Jun 2023 15:01:25 +0800
+Subject: [PATCH] change the startup mode of do_transaction sub proces
+
+---
+ .../payloads/payload/dnf/dnf_manager.py | 109 ++++++++++++++++--
+ 1 file changed, 102 insertions(+), 7 deletions(-)
+
+diff --git a/pyanaconda/modules/payloads/payload/dnf/dnf_manager.py b/pyanaconda/modules/payloads/payload/dnf/dnf_manager.py
+index b1f452c..c73f3d9 100644
+--- a/pyanaconda/modules/payloads/payload/dnf/dnf_manager.py
++++ b/pyanaconda/modules/payloads/payload/dnf/dnf_manager.py
+@@ -67,6 +67,50 @@ DNF_PLUGINCONF_DIR = '/tmp/dnf.pluginconf'
+ #
+ DNF_EXTRA_SIZE_PER_FILE = Size("6 KiB")
+
++g_include_list = []
++g_exclude_list = []
++
++def update_conf(conf, substitutions, releasever, installroot, multilib_policy, timeout, retries):
++ conf.cachedir = DNF_CACHE_DIR
++ conf.pluginconfpath = DNF_PLUGINCONF_DIR
++ conf.logdir = '/tmp/'
++
++ conf.substitutions = substitutions
++ conf.releasever = releasever
++ conf.installroot = installroot
++ conf.prepend_installroot('persistdir')
++ conf.multilib_policy = multilib_policy
++ conf.timeout = timeout
++ conf.retries = retries
++
++ conf.substitutions.update_from_etc(conf.installroot)
++
++ conf.reposdir = DNF_REPO_DIRS
++
++def update_proxy(conf, proxy, proxy_username, proxy_password):
++ conf.proxy = proxy
++ conf.proxy_username = proxy_username
++ conf.proxy_password = proxy_password
++
++def update_depdency(base, include_list, exclude_list, ignore_broken_packages, ignore_missing_packages):
++ base.fill_sack()
++ base.read_comps()
++
++ try:
++ base.install_specs(
++ install=include_list,
++ exclude=exclude_list,
++ strict=not ignore_broken_packages
++ )
++ except dnf.exceptions.MarkingErrors as e:
++ log.error("Failed to apply specs!\n%s", str(e))
++ if ignore_missing_packages:
++ log.info("Ignoring missing packages, groups or modules.")
++ else:
++ message = _("Some packages, groups or modules are missing.")
++ raise MissingSpecsError(message + "\n\n" + str(e).strip()) from None
++
++ base.resolve()
+
+ class DNFManagerError(Exception):
+ """General error for the DNF manager."""
+@@ -555,6 +599,10 @@ class DNFManager(object):
+ log.info("Including specs: %s", include_list)
+ log.info("Excluding specs: %s", exclude_list)
+
++ global g_include_list, g_exclude_list
++ g_include_list.extend(include_list)
++ g_exclude_list.extend(exclude_list)
++
+ try:
+ self._base.install_specs(
+ install=include_list,
+@@ -664,12 +712,35 @@ class DNFManager(object):
+ :param timeout: a time out of a failed process in seconds
+ :raise PayloadInstallationError: if the installation fails
+ """
+- queue = multiprocessing.Queue()
+- display = TransactionProgress(queue)
+- process = multiprocessing.Process(
+- target=self._run_transaction,
+- args=(self._base, display)
+- )
++ repos = dict()
++ for repo in self._base.repos.iter_enabled():
++ t_repo = dict()
++ repo_agrs = dict()
++ t_repo['baseurl'] = list(repo.baseurl)
++ repo_agrs['sslverify'] = repo.sslverify
++ repo_agrs['proxy'] = repo.proxy
++ t_repo['repo_agrs'] = repo_agrs
++ repos[repo.id] = t_repo
++
++ global g_include_list, g_exclude_list
++ ctx = multiprocessing.get_context('spawn')
++ queue = ctx.Queue()
++ process = ctx.Process(target=self._run_transaction,
++ args=(queue, repos,
++ self._base.conf.releasever,
++ self._base.conf.installroot,
++ self._base.conf.substitutions,
++ self._base.conf.multilib_policy,
++ self._base.conf.timeout,
++ self._base.conf.retries,
++ self._download_location,
++ self._base.conf.proxy,
++ self._base.conf.proxy_username,
++ self._base.conf.proxy_password,
++ g_include_list,
++ g_exclude_list,
++ self._ignore_broken_packages,
++ self._ignore_missing_packages))
+
+ # Start the transaction.
+ log.debug("Starting the transaction process...")
+@@ -688,7 +759,10 @@ class DNFManager(object):
+ log.debug("The transaction process exited with %s.", process.exitcode)
+
+ @staticmethod
+- def _run_transaction(base, display):
++ def _run_transaction(queue_instance, repos, releasever, installroot, substitutions,
++ multilib_policy, timeout, retries, pkgdir, proxy,
++ proxy_username, proxy_password, include_list, exclude_list,
++ ignore_broken_packages, ignore_missing_packages):
+ """Run the DNF transaction.
+
+ Execute the DNF transaction and catch any errors. An error
+@@ -702,6 +776,27 @@ class DNFManager(object):
+ exit_reason = None
+
+ try:
++ display = TransactionProgress(queue_instance)
++
++ base = dnf.Base()
++ conf = base.conf
++
++ update_conf(conf, substitutions, releasever, installroot, multilib_policy, timeout, retries)
++ update_proxy(conf, proxy, proxy_username, proxy_password)
++
++ queue_instance.put(('log', 'start to setup repo.'))
++
++ for (key, repo) in repos.items():
++ base.repos.add_new_repo(key, conf, repo['baseurl'], **repo['repo_agrs'])
++ base.repos[key].enable()
++
++ for repo in base.repos.iter_enabled():
++ repo.pkgdir = pkgdir
++
++ queue_instance.put(('log', 'start to update depdency.'))
++ update_depdency(base, include_list, exclude_list, ignore_broken_packages, ignore_missing_packages)
++ queue_instance.put(('log', 'start to transaction.'))
++
+ base.do_transaction(display)
+ exit_reason = "DNF done"
+ except BaseException as e: # pylint: disable=broad-except
+--
+2.19.1
+
diff --git a/bugfix-password-tooltip-text-adapt-language.patch b/bugfix-password-tooltip-text-adapt-language.patch
new file mode 100644
index 0000000..4ce6e75
--- /dev/null
+++ b/bugfix-password-tooltip-text-adapt-language.patch
@@ -0,0 +1,36 @@
+From a7de90b4741689b12137dc22f1b478bdd451762f Mon Sep 17 00:00:00 2001
+From: iasunsea <iasunsea@sina.com>
+Date: Thu, 23 Feb 2023 20:19:51 +0800
+Subject: [PATCH] password tooltip text adapt language
+
+---
+ pyanaconda/ui/gui/utils.py | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/pyanaconda/ui/gui/utils.py b/pyanaconda/ui/gui/utils.py
+index 282f1bc53c6..ae32ec2558b 100644
+--- a/pyanaconda/ui/gui/utils.py
++++ b/pyanaconda/ui/gui/utils.py
+@@ -37,6 +37,7 @@
+ from pyanaconda.core.async_utils import async_action_wait, run_in_loop
+ from pyanaconda.core.constants import NOTICEABLE_FREEZE, PASSWORD_HIDE, PASSWORD_SHOW, \
+ PASSWORD_HIDE_ICON, PASSWORD_SHOW_ICON
++from pyanaconda.core.i18n import _
+
+ from pyanaconda.anaconda_loggers import get_module_logger
+ log = get_module_logger(__name__)
+@@ -542,10 +543,10 @@ def set_password_visibility(entry, visible):
+
+ if visible:
+ icon = PASSWORD_HIDE_ICON
+- text = PASSWORD_HIDE
++ text = _(PASSWORD_HIDE)
+ else:
+ icon = PASSWORD_SHOW_ICON
+- text = PASSWORD_SHOW
++ text = _(PASSWORD_SHOW)
+
+ entry.set_visibility(visible)
+ entry.set_icon_from_icon_name(position, icon)
+--
+2.27.0
diff --git a/bugfix-revert-Unify-GRUB-configuration-file-location-across-all-platforms.patch b/bugfix-revert-Unify-GRUB-configuration-file-location-across-all-platforms.patch
new file mode 100644
index 0000000..2f2e29d
--- /dev/null
+++ b/bugfix-revert-Unify-GRUB-configuration-file-location-across-all-platforms.patch
@@ -0,0 +1,104 @@
+From d5d6b1498db9f9e3378c11421caa523556c04752 Mon Sep 17 00:00:00 2001
+From: sun_hai_10 <sunhai10@huawei.com>
+Date: Tue, 28 Mar 2023 14:22:39 +0800
+Subject: [PATCH] revert Unify GRUB configuration file location across all platforms
+Reference:https://github.com/rhinstaller/anaconda/commit/15c3b2044367d375db6739e8b8f419ef3e17cae7
+---
+ pyanaconda/modules/storage/bootloader/efi.py | 38 +------------------
+ .../modules/storage/bootloader/utils.py | 8 +++-
+ 2 files changed, 9 insertions(+), 37 deletions(-)
+
+diff --git a/pyanaconda/modules/storage/bootloader/efi.py b/pyanaconda/modules/storage/bootloader/efi.py
+index 1b47e24..6135699 100644
+--- a/pyanaconda/modules/storage/bootloader/efi.py
++++ b/pyanaconda/modules/storage/bootloader/efi.py
+@@ -35,11 +35,7 @@ class EFIBase(object):
+ """A base class for EFI-based boot loaders."""
+
+ @property
+- def efi_config_dir(self):
+- return "/boot/" + self._efi_config_dir
+-
+- @property
+- def _efi_config_dir(self):
++ def _config_dir(self):
+ return "efi/EFI/{}".format(conf.bootloader.efi_dir)
+
+ def efibootmgr(self, *args, **kwargs):
+@@ -62,7 +58,7 @@ class EFIBase(object):
+
+ @property
+ def efi_dir_as_efifs_dir(self):
+- ret = self._efi_config_dir.replace('efi/', '')
++ ret = self._config_dir.replace('efi/', '')
+ return "\\" + ret.replace('/', '\\')
+
+ def _add_single_efi_boot_target(self, partition):
+@@ -164,36 +160,6 @@ class EFIGRUB(EFIBase, GRUB2):
+ return self._packages32 + self._packages_common
+ return self._packages64 + self._packages_common
+
+- @property
+- def efi_config_file(self):
+- """ Full path to EFI configuration file. """
+- return "%s/%s" % (self.efi_config_dir, self._config_file)
+-
+- def write_config(self):
+- config_path = "%s%s" % (conf.target.system_root, self.efi_config_file)
+-
+- with open(config_path, "w") as fd:
+- grub_dir = self.config_dir
+- if self.stage2_device.format.type != "btrfs":
+- fs_uuid = self.stage2_device.format.uuid
+- else:
+- fs_uuid = self.stage2_device.format.vol_uuid
+-
+- if fs_uuid is None:
+- raise BootLoaderError("Could not get stage2 filesystem UUID")
+-
+- grub_dir = util.execWithCapture("grub2-mkrelpath", [grub_dir],
+- root=conf.target.system_root)
+- if not grub_dir:
+- raise BootLoaderError("Could not get GRUB directory path")
+-
+- fd.write("search --no-floppy --fs-uuid --set=dev %s\n" % fs_uuid)
+- fd.write("set prefix=($dev)%s\n" % grub_dir)
+- fd.write("export $prefix\n")
+- fd.write("configfile $prefix/grub.cfg\n")
+-
+- super().write_config()
+-
+
+ class Aarch64EFIGRUB(EFIGRUB):
+ _serial_consoles = ["ttyAMA", "ttyS"]
+diff --git a/pyanaconda/modules/storage/bootloader/utils.py b/pyanaconda/modules/storage/bootloader/utils.py
+index 27fc2a0..84e45b6 100644
+--- a/pyanaconda/modules/storage/bootloader/utils.py
++++ b/pyanaconda/modules/storage/bootloader/utils.py
+@@ -19,6 +19,7 @@ import os
+ from glob import glob
+
+ from pyanaconda.modules.common.errors.installation import BootloaderInstallationError
++from pyanaconda.modules.storage.bootloader.efi import EFIBase
+ from pyanaconda.modules.storage.bootloader.image import LinuxBootLoaderImage
+ from pyanaconda.core.configuration.anaconda import conf
+ from pyanaconda.core.util import execWithRedirect
+@@ -244,9 +245,14 @@ def create_bls_entries(sysroot, storage, kernel_versions):
+ # Update the bootloader configuration to make sure that the BLS
+ # entries will have the correct kernel cmdline and not the value
+ # taken from /proc/cmdline, that is used to boot the live image.
++ if isinstance(storage.bootloader, EFIBase):
++ grub_cfg_path = "/etc/grub2-efi.cfg"
++ else:
++ grub_cfg_path = "/etc/grub2.cfg"
++
+ rc = execWithRedirect(
+ "grub2-mkconfig",
+- ["-o", "/etc/grub2.cfg"],
++ ["-o", grub_cfg_path],
+ root=sysroot
+ )
+
+--
+2.23.0
+
diff --git a/bugfix-set-up-LD_PRELOAD-for-the-Storage-and-Services-module.patch b/bugfix-set-up-LD_PRELOAD-for-the-Storage-and-Services-module.patch
new file mode 100644
index 0000000..674500a
--- /dev/null
+++ b/bugfix-set-up-LD_PRELOAD-for-the-Storage-and-Services-module.patch
@@ -0,0 +1,65 @@
+From 769f395e80c92972900ef348d7dd747014666f70 Mon Sep 17 00:00:00 2001
+From: yu_boyun <1215979730@qq.com>
+Date: Mon, 11 Jan 2021 17:01:58 +0800
+Subject: [PATCH] set up LD_PRELOAD for the Storage and Services module
+
+---
+ data/dbus/org.fedoraproject.Anaconda.Modules.Services.service | 2 +-
+ data/dbus/org.fedoraproject.Anaconda.Modules.Storage.service | 2 +-
+ pyanaconda/modules/services/__main__.py | 4 ++++
+ pyanaconda/modules/storage/__main__.py | 4 ++++
+ 4 files changed, 10 insertions(+), 2 deletions(-)
+
+diff --git a/data/dbus/org.fedoraproject.Anaconda.Modules.Services.service b/data/dbus/org.fedoraproject.Anaconda.Modules.Services.service
+index 79c6949..c3a6098 100644
+--- a/data/dbus/org.fedoraproject.Anaconda.Modules.Services.service
++++ b/data/dbus/org.fedoraproject.Anaconda.Modules.Services.service
+@@ -1,4 +1,4 @@
+ [D-BUS Service]
+ Name=org.fedoraproject.Anaconda.Modules.Services
+-Exec=/usr/libexec/anaconda/start-module pyanaconda.modules.services
++Exec=/usr/libexec/anaconda/start-module --env LD_PRELOAD=libgomp.so.1 pyanaconda.modules.services
+ User=root
+diff --git a/data/dbus/org.fedoraproject.Anaconda.Modules.Storage.service b/data/dbus/org.fedoraproject.Anaconda.Modules.Storage.service
+index 018ecf1..780200e 100644
+--- a/data/dbus/org.fedoraproject.Anaconda.Modules.Storage.service
++++ b/data/dbus/org.fedoraproject.Anaconda.Modules.Storage.service
+@@ -1,4 +1,4 @@
+ [D-BUS Service]
+ Name=org.fedoraproject.Anaconda.Modules.Storage
+-Exec=/usr/libexec/anaconda/start-module pyanaconda.modules.storage
++Exec=/usr/libexec/anaconda/start-module --env LD_PRELOAD=libgomp.so.1 pyanaconda.modules.storage
+ User=root
+diff --git a/pyanaconda/modules/services/__main__.py b/pyanaconda/modules/services/__main__.py
+index d4b0879..4327dc9 100644
+--- a/pyanaconda/modules/services/__main__.py
++++ b/pyanaconda/modules/services/__main__.py
+@@ -20,6 +20,10 @@
+ from pyanaconda.modules.common import init
+ init()
+
++import os
++if "LD_PRELOAD" in os.environ:
++ del os.environ["LD_PRELOAD"]
++
+ from pyanaconda.modules.services.services import ServicesService
+ service = ServicesService()
+ service.run()
+diff --git a/pyanaconda/modules/storage/__main__.py b/pyanaconda/modules/storage/__main__.py
+index 327a129..29212a9 100644
+--- a/pyanaconda/modules/storage/__main__.py
++++ b/pyanaconda/modules/storage/__main__.py
+@@ -20,6 +20,10 @@
+ from pyanaconda.modules.common import init
+ init("/tmp/storage.log")
+
++import os
++if "LD_PRELOAD" in os.environ:
++ del os.environ["LD_PRELOAD"]
++
+ # Initialize Blivet.
+ from pyanaconda.modules.storage.initialization import enable_installer_mode
+ enable_installer_mode()
+--
+1.8.3.1
+
diff --git a/bugfix-with-use-local-kickstart-version.patch b/bugfix-with-use-local-kickstart-version.patch
new file mode 100644
index 0000000..6110c10
--- /dev/null
+++ b/bugfix-with-use-local-kickstart-version.patch
@@ -0,0 +1,38 @@
+From d361beead1ff91273aa0f13147b2b279172133aa Mon Sep 17 00:00:00 2001
+From: sun_hai_10 <sunhai10@huawei.com>
+Date: Thu, 24 Nov 2022 10:40:41 +0800
+Subject: [PATCH] with use local kickstart version
+
+---
+ dracut/parse-kickstart | 2 +-
+ pyanaconda/core/kickstart/version.py | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/dracut/parse-kickstart b/dracut/parse-kickstart
+index 56cacb8..e0fdd1f 100755
+--- a/dracut/parse-kickstart
++++ b/dracut/parse-kickstart
+@@ -41,7 +41,7 @@ from pykickstart.constants import *
+ from collections import OrderedDict
+
+ # Import the kickstart version.
+-from pykickstart.version import F36 as VERSION
++from pykickstart.version import DEVEL as VERSION
+
+ # Import all kickstart commands as version-less.
+ from pykickstart.commands.cdrom import FC3_Cdrom as Cdrom
+diff --git a/pyanaconda/core/kickstart/version.py b/pyanaconda/core/kickstart/version.py
+index 4170214..df743a6 100644
+--- a/pyanaconda/core/kickstart/version.py
++++ b/pyanaconda/core/kickstart/version.py
+@@ -18,6 +18,6 @@
+ # Red Hat, Inc.
+ #
+
+-from pykickstart.version import F36 as VERSION
++from pykickstart.version import DEVEL as VERSION
+
+ __all__ = ["VERSION"]
+--
+2.23.0
+
diff --git a/change-inst-repo-default-value.patch b/change-inst-repo-default-value.patch
new file mode 100644
index 0000000..8f0a155
--- /dev/null
+++ b/change-inst-repo-default-value.patch
@@ -0,0 +1,26 @@
+From e73464ef17f54743dc194ad28e32797a10e844a4 Mon Sep 17 00:00:00 2001
+From: ctyuncommiter05 <ctyuncommiter05@chinatelecom.cn>
+Date: Thu, 24 Jun 2021 16:30:45 +0800
+Subject: [PATCH] change inst.repo default value
+
+Solve the problem of U disk installation failure problem.
+---
+ anaconda.py | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/anaconda.py b/anaconda.py
+index 1abdeb2..44b573c 100755
+--- a/anaconda.py
++++ b/anaconda.py
+@@ -263,6 +263,8 @@ if __name__ == "__main__":
+ from pyanaconda.flags import flags
+ from pyanaconda.core.kernel import kernel_arguments
+ (opts, removed_no_inst_args) = parse_arguments(boot_cmdline=kernel_arguments)
++ if not opts.method:
++ opts.method = opts.stage2
+
+ from pyanaconda.core.configuration.anaconda import conf
+ conf.set_from_opts(opts)
+--
+2.27.0
+
diff --git a/disable-disk-encryption.patch b/disable-disk-encryption.patch
new file mode 100644
index 0000000..bdddea0
--- /dev/null
+++ b/disable-disk-encryption.patch
@@ -0,0 +1,71 @@
+From bec6776715baaff79d29e1703b7c3306c265071b Mon Sep 17 00:00:00 2001
+From: xia_qirong <xiaqirong1@huawei.com>
+Date: Wed, 16 Sep 2020 15:28:39 +0800
+Subject: [PATCH] disable disk encryption
+
+---
+ pyanaconda/ui/gui/spokes/custom_storage.py | 8 ++++----
+ pyanaconda/ui/gui/spokes/storage.py | 7 ++++---
+ 2 files changed, 8 insertions(+), 7 deletions(-)
+
+diff --git a/pyanaconda/ui/gui/spokes/custom_storage.py b/pyanaconda/ui/gui/spokes/custom_storage.py
+index 347a0e0..d72e315 100644
+--- a/pyanaconda/ui/gui/spokes/custom_storage.py
++++ b/pyanaconda/ui/gui/spokes/custom_storage.py
+@@ -796,8 +796,8 @@ class CustomPartitioningSpoke(NormalSpoke, StorageCheckHandler):
+ fancy_set_sensitive(self._reformatCheckbox, self._permissions.reformat)
+
+ # Set up the encryption.
+- self._encryptCheckbox.set_active(self._request.device_encrypted)
+- fancy_set_sensitive(self._encryptCheckbox, self._permissions.device_encrypted)
++ self._encryptCheckbox.set_active(False)
++ fancy_set_sensitive(self._encryptCheckbox, False)
+
+ self._encryptCheckbox.set_inconsistent(self._request.container_encrypted)
+ text = _("The container is encrypted.") if self._request.container_encrypted else ""
+@@ -1268,7 +1268,7 @@ class CustomPartitioningSpoke(NormalSpoke, StorageCheckHandler):
+ self._encryptCheckbox.set_active(False)
+ self._encryptCheckbox.set_inconsistent(True)
+
+- fancy_set_sensitive(self._encryptCheckbox, self._permissions.device_encrypted)
++ fancy_set_sensitive(self._encryptCheckbox, False)
+ self._update_luks_combo()
+
+ # Update the UI.
+@@ -1490,7 +1490,7 @@ class CustomPartitioningSpoke(NormalSpoke, StorageCheckHandler):
+
+ # Update the UI.
+ fancy_set_sensitive(self._labelEntry, self._permissions.label)
+- fancy_set_sensitive(self._encryptCheckbox, self._permissions.device_encrypted)
++ fancy_set_sensitive(self._encryptCheckbox, False)
+ self._update_luks_combo()
+ fancy_set_sensitive(self._fsCombo, self._permissions.format_type)
+ self.on_value_changed()
+diff --git a/pyanaconda/ui/gui/spokes/storage.py b/pyanaconda/ui/gui/spokes/storage.py
+index 9494d6a..b2c0d3e 100644
+--- a/pyanaconda/ui/gui/spokes/storage.py
++++ b/pyanaconda/ui/gui/spokes/storage.py
+@@ -289,6 +289,9 @@ class StorageSpoke(NormalSpoke, StorageCheckHandler):
+ # Configure the partitioning methods.
+ self._configure_partitioning_methods()
+
++ # disable disk encryption
++ self._encryption_revealer.set_reveal_child(False)
++
+ def _configure_partitioning_methods(self):
+ if "CustomPartitioningSpoke" in conf.ui.hidden_spokes:
+ self._custom_part_radio_button.set_visible(False)
+@@ -325,9 +328,7 @@ class StorageSpoke(NormalSpoke, StorageCheckHandler):
+ # as Blivet GUI handles encryption per encrypted device, not globally.
+ # Hide it also for the interactive partitioning as CustomPartitioningSpoke
+ # provides support for encryption of mount points.
+- self._encryption_revealer.set_reveal_child(
+- current_partitioning_method == PARTITIONING_METHOD_AUTOMATIC
+- )
++ self._encryption_revealer.set_reveal_child(False)
+
+ # Hide the reclaim space checkbox if automatic storage configuration is not used.
+ self._reclaim_revealer.set_reveal_child(
+--
+1.8.3.1
+
diff --git a/disable-ssh-login-checkbox.patch b/disable-ssh-login-checkbox.patch
new file mode 100644
index 0000000..5cbf801
--- /dev/null
+++ b/disable-ssh-login-checkbox.patch
@@ -0,0 +1,37 @@
+From 4229601e2c53c2e002436a0132663f83a89e6e47 Mon Sep 17 00:00:00 2001
+From: t_feng <fengtao40@huawei.com>
+Date: Wed, 1 Jul 2020 18:08:35 +0800
+Subject: [PATCH] disable ssh login checkbox
+
+---
+ pyanaconda/ui/gui/spokes/root_password.py | 7 ++++----
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+diff --git a/pyanaconda/ui/gui/spokes/root_password.py b/pyanaconda/ui/gui/spokes/root_password.py
+index 1d19380..f2e389d 100644
+--- a/pyanaconda/ui/gui/spokes/root_password.py
++++ b/pyanaconda/ui/gui/spokes/root_password.py
+@@ -80,6 +80,8 @@ class PasswordSpoke(FirstbootSpokeMixIn, NormalSpoke, GUISpokeInputCheckHandler)
+ self._enable_root_radio = self.builder.get_object("enable_root_radio")
+ self._disable_root_radio = self.builder.get_object("disable_root_radio")
+ self._root_password_ssh_login_override = self.builder.get_object("root_password_ssh_login_override")
++ self._root_password_ssh_login_override.set_visible(False)
++ self._root_password_ssh_login_override.set_no_show_all(True)
+ self._revealer = self.builder.get_object("password_revealer")
+
+ # Install the password checks:
+@@ -159,9 +160,8 @@ class PasswordSpoke(FirstbootSpokeMixIn, NormalSpoke, GUISpokeInputCheckHandler)
+ control.set_active(True)
+ self.on_root_enabled_changed(control)
+
+- self._root_password_ssh_login_override.set_active(
+- self._users_module.RootPasswordSSHLoginAllowed
+- )
++ self._root_password_ssh_login_override.set_visible(False)
++ self._root_password_ssh_login_override.set_no_show_all(True)
+ if self.root_enabled:
+ # rerun checks so that we have a correct status message, if any
+ self.checker.run_checks()
+--
+2.23.0
+
diff --git a/euleros.conf b/euleros.conf
new file mode 100644
index 0000000..fb008b5
--- /dev/null
+++ b/euleros.conf
@@ -0,0 +1,38 @@
+# Anaconda configuration file for EulerOS.
+
+[Profile]
+# Define the profile.
+profile_id = EulerOS
+
+[Profile Detection]
+# Match os-release values.
+os_id = EulerOS
+variant_id = server
+
+[Installation System]
+can_detect_enabled_smt = False
+
+[Network]
+default_on_boot = FIRST_WIRED_WITH_LINK
+
+[Bootloader]
+efi_dir = euleros
+additional_arguments = crash_kexec_post_notifiers softlockup_panic=1 reserve_kbox_mem=16M fsck.mode=auto fsck.repair=yes
+
+[Payload]
+enable_closest_mirror = True
+
+[Storage]
+default_partitioning =
+ / (min 1 GiB, max 70 GiB)
+ /home (min 500 MiB, free 50 GiB)
+ swap
+
+[Storage Constraints]
+swap_is_recommended = False
+
+[User Interface]
+blivet_gui_supported = False
+
+[License]
+eula = /usr/share/euleros-release/EULA
diff --git a/fix-hostname-info.patch b/fix-hostname-info.patch
new file mode 100644
index 0000000..a217dca
--- /dev/null
+++ b/fix-hostname-info.patch
@@ -0,0 +1,61 @@
+From cc1706cdbcabab80ab867c2a8f5a517884faa048 Mon Sep 17 00:00:00 2001
+From: t_feng <fengtao40@huawei.com>
+Date: Thu, 18 Jun 2020 17:13:47 +0800
+Subject: [PATCH] fix hostname info
+
+---
+ po/zh_CN.po | 6 +++---
+ pyanaconda/core/regexes.py | 2 +-
+ pyanaconda/network.py | 4 ++--
+ 3 files changed, 6 insertions(+), 6 deletions(-)
+
+diff --git a/po/zh_CN.po b/po/zh_CN.po
+index 18b0925..c2216e6 100644
+--- a/po/zh_CN.po
++++ b/po/zh_CN.po
+@@ -4089,11 +4089,11 @@ msgstr "本地主机名不能以英文句号“.”结尾。"
+ #: pyanaconda/network.py:119
+ msgid ""
+ "Host names can only contain the characters 'a-z', 'A-Z', '0-9', '-', or '.', "
+-"parts between periods must contain something and cannot start or end with "
+-"'-'."
++"parts between periods must contain something being 63 or fewer "
++"characters and cannot start or end with '.' and '-'."
+ msgstr ""
+ "主机名只能包含 'a-z'、'A-Z'、 '0-9'、 '-'(英文减号),或者 '.'(英文点号),"
+-"其中两个点号中不能为空且不能以 '-' 开头或结尾。"
++"其中两个点号中不能为空,必须少于64个字符且不能以'.'和'-'开头或结尾。"
+
+ #: pyanaconda/network.py:457
+ msgid "Status not available"
+diff --git a/pyanaconda/core/regexes.py b/pyanaconda/core/regexes.py
+index cc00702..388d1ff 100644
+--- a/pyanaconda/core/regexes.py
++++ b/pyanaconda/core/regexes.py
+@@ -103,7 +103,7 @@ IPV4_NETMASK_WITH_ANCHORS = re.compile("^" + IPV4_NETMASK_WITHOUT_ANCHORS + "$")
+ # with a period, but it can end with one.
+ # This regex uses negative lookahead and lookback assertions to enforce the
+ # hyphen rules and make it way more confusing
+-HOSTNAME_PATTERN_WITHOUT_ANCHORS = r'(?:(?!-)[A-Za-z0-9-]{1,63}(?<!-)(?:\.(?!-)[A-Za-z0-9-]{1,63}(?<!-))*\.?)'
++HOSTNAME_PATTERN_WITHOUT_ANCHORS = r'(?:(?!-)[A-Za-z0-9-]{1,63}(?<!-)(?:\.(?!-)[A-Za-z0-9-]{1,63}(?<!-))*)'
+
+ # URL Hostname
+ # This matches any hostname, IPv4 literal or properly encased IPv6 literal
+diff --git a/pyanaconda/network.py b/pyanaconda/network.py
+index 38fe957..8f04d63 100644
+--- a/pyanaconda/network.py
++++ b/pyanaconda/network.py
+@@ -114,8 +114,8 @@ def is_valid_hostname(hostname, local=False):
+ if not re.match('^' + HOSTNAME_PATTERN_WITHOUT_ANCHORS + '$', hostname):
+ return (False, _("Host names can only contain the characters 'a-z', "
+ "'A-Z', '0-9', '-', or '.', parts between periods "
+- "must contain something and cannot start or end with "
+- "'-'."))
++ "must contain something being 63 or fewer "
++ "characters and cannot start or end with '.' and '-'."))
+
+ return (True, "")
+
+--
+2.23.0
+
diff --git a/hce.conf b/hce.conf
new file mode 100644
index 0000000..98ea38f
--- /dev/null
+++ b/hce.conf
@@ -0,0 +1,38 @@
+# Anaconda configuration file for HCE.
+
+[Profile]
+# Define the profile.
+profile_id = HCE
+
+[Profile Detection]
+# Match os-release values.
+os_id = HCE
+variant_id = server
+
+[Installation System]
+can_detect_enabled_smt = False
+
+[Network]
+default_on_boot = FIRST_WIRED_WITH_LINK
+
+[Bootloader]
+efi_dir = hce
+additional_arguments = crash_kexec_post_notifiers softlockup_panic=1 reserve_kbox_mem=16M fsck.mode=auto fsck.repair=yes
+
+[Payload]
+enable_closest_mirror = True
+
+[Storage]
+default_partitioning =
+ / (min 1 GiB, max 70 GiB)
+ /home (min 500 MiB, free 50 GiB)
+ swap
+
+[Storage Constraints]
+swap_is_recommended = False
+
+[User Interface]
+blivet_gui_supported = False
+
+[License]
+eula = /usr/share/hce-release/EULA
diff --git a/hide-help-button.patch b/hide-help-button.patch
new file mode 100644
index 0000000..fec4d90
--- /dev/null
+++ b/hide-help-button.patch
@@ -0,0 +1,131 @@
+From cf192d77045b8aeb8cdcd55c98a93ad64fea3c3b Mon Sep 17 00:00:00 2001
+From: t_feng <fengtao40@huawei.com>
+Date: Fri, 19 Jun 2020 09:20:14 +0800
+Subject: [PATCH] hide help button
+
+---
+ data/tmux.conf | 3 +--
+ pyanaconda/ui/gui/__init__.py | 27 ---------------------------
+ widgets/src/BaseWindow.c | 21 ---------------------
+ 3 files changed, 1 insertion(+), 50 deletions(-)
+
+diff --git a/data/tmux.conf b/data/tmux.conf
+index 87c9cb7..63240f7 100644
+--- a/data/tmux.conf
++++ b/data/tmux.conf
+@@ -1,7 +1,6 @@
+ # tmux.conf for the anaconda environment
+
+ bind -n M-tab next
+-bind -n F1 list-keys
+
+ set-option -s exit-unattached off
+ set-option -g base-index 1
+@@ -25,7 +24,7 @@ set-option -g history-limit 10000
+ # then re-attach to it in the tmux service run on the console tty.
+ new-session -d -s anaconda -n main anaconda
+
+-set-option status-right '#[fg=blue]#(echo -n "Switch tab: Alt+Tab | Help: F1 ")'
++set-option status-right '#[fg=blue]#(echo -n "Switch tab: Alt+Tab ")'
+
+ new-window -d -n shell "bash --login"
+ new-window -d -n log "tail -F /tmp/anaconda.log"
+diff --git a/pyanaconda/ui/gui/__init__.py b/pyanaconda/ui/gui/__init__.py
+index 06373d9..6a6e3b9 100644
+--- a/pyanaconda/ui/gui/__init__.py
++++ b/pyanaconda/ui/gui/__init__.py
+@@ -443,20 +443,6 @@ class MainWindow(Gtk.Window):
+ # Return False to indicate that the child allocation is not yet set
+ return False
+
+- def _on_mnemonics_visible_changed(self, window, property_type, obj):
+- # mnemonics display has been activated or deactivated,
+- # add or remove the F1 mnemonics display from the help button
+- help_button = obj.window.get_help_button()
+- if window.props.mnemonics_visible:
+- # save current label
+- old_label = help_button.get_label()
+- self._saved_help_button_label = old_label
+- # add the (F1) "mnemonics" to the help button
+- help_button.set_label("%s (F1)" % old_label)
+- else:
+- # restore the old label
+- help_button.set_label(self._saved_help_button_label)
+-
+ def _on_child_added(self, widget, user_data):
+ # If this is GtkLabel, apply the language attribute
+ if isinstance(widget, Gtk.Label):
+@@ -480,8 +466,6 @@ class MainWindow(Gtk.Window):
+ old_screen = self._stack.get_visible_child()
+ if old_screen:
+ old_screen.remove_accelerator(self._accel_group, Gdk.KEY_F12, 0)
+- old_screen.remove_accelerator(self._accel_group, Gdk.KEY_F1, 0)
+- old_screen.remove_accelerator(self._accel_group, Gdk.KEY_F1, Gdk.ModifierType.MOD1_MASK)
+
+ # Check if the widget is already on the stack
+ if child not in self._stack_contents:
+@@ -498,17 +482,6 @@ class MainWindow(Gtk.Window):
+ child.window.add_accelerator("button-clicked", self._accel_group,
+ Gdk.KEY_F12, 0, 0)
+
+- # Configure the help button
+- child.window.add_accelerator("help-button-clicked", self._accel_group,
+- Gdk.KEY_F1, 0, 0)
+- child.window.add_accelerator("help-button-clicked", self._accel_group,
+- Gdk.KEY_F1, Gdk.ModifierType.MOD1_MASK, 0)
+-
+- # Connect to mnemonics-visible to add the (F1) mnemonic to the button label
+- if self._mnemonic_signal:
+- self.disconnect(self._mnemonic_signal)
+- self._mnemonic_signal = self.connect("notify::mnemonics-visible", self._on_mnemonics_visible_changed, child)
+-
+ self._stack.set_visible_child(child.window)
+
+ if child.focusWidgetName:
+diff --git a/widgets/src/BaseWindow.c b/widgets/src/BaseWindow.c
+index 6a1e372..203d4a7 100644
+--- a/widgets/src/BaseWindow.c
++++ b/widgets/src/BaseWindow.c
+@@ -393,30 +393,11 @@ G_GNUC_END_IGNORE_DEPRECATIONS
+ gtk_widget_set_margin_top(win->priv->layout_indicator, 6);
+ gtk_widget_set_margin_bottom(win->priv->layout_indicator, 6);
+
+- /* Create the help button. */
+- win->priv->help_button = gtk_button_new_with_label(_(HELP_BUTTON_LABEL));
+- gtk_widget_set_halign(win->priv->help_button, GTK_ALIGN_END);
+- gtk_widget_set_vexpand(win->priv->help_button, FALSE);
+- gtk_widget_set_valign(win->priv->help_button, GTK_ALIGN_END);
+- gtk_widget_set_margin_bottom(win->priv->help_button, 6);
+- gtk_widget_set_name(win->priv->help_button, "anaconda-help-button");
+-
+- atk = gtk_widget_get_accessible(win->priv->help_button);
+- atk_object_set_name(atk, _(HELP_BUTTON_LABEL));
+-
+- /* Hook up some signals for that button. The signal handlers here will
+- * just raise our own custom signals for the whole window.
+- */
+- g_signal_connect(win->priv->help_button, "clicked",
+- G_CALLBACK(anaconda_base_window_help_button_clicked), win);
+-
+-
+ /* Add everything to the nav area. */
+ gtk_grid_attach(GTK_GRID(win->priv->nav_area), win->priv->name_label, 0, 0, 1, 1);
+ gtk_grid_attach(GTK_GRID(win->priv->nav_area), win->priv->distro_label, 1, 0, 2, 1);
+ gtk_grid_attach(GTK_GRID(win->priv->nav_area), win->priv->beta_label, 1, 1, 1, 1);
+ gtk_grid_attach(GTK_GRID(win->priv->nav_area), win->priv->layout_indicator, 1, 2, 1, 1);
+- gtk_grid_attach(GTK_GRID(win->priv->nav_area), win->priv->help_button, 2, 1, 1, 2);
+
+ /* Last thing for the main_box is a revealer for the info bar */
+ win->priv->info_revealer = gtk_revealer_new();
+@@ -832,8 +813,6 @@ void anaconda_base_window_retranslate(AnacondaBaseWindow *win) {
+
+ gtk_label_set_text(GTK_LABEL(win->priv->beta_label), _(win->priv->orig_beta));
+
+- gtk_button_set_label(GTK_BUTTON(win->priv->help_button), _(HELP_BUTTON_LABEL));
+-
+ /* retranslate the layout indicator */
+ anaconda_layout_indicator_retranslate(ANACONDA_LAYOUT_INDICATOR(win->priv->layout_indicator));
+ }
+--
+2.23.0
+
diff --git a/modify-interface-is-extended-in-Chinese-mode.patch b/modify-interface-is-extended-in-Chinese-mode.patch
new file mode 100644
index 0000000..3899c87
--- /dev/null
+++ b/modify-interface-is-extended-in-Chinese-mode.patch
@@ -0,0 +1,25 @@
+From ae056f86eca56a76ae9736d7f199d73548a7574b Mon Sep 17 00:00:00 2001
+From: t_feng <fengtao40@huawei.com>
+Date: Mon, 7 Nov 2022 20:03:39 +0800
+Subject: [PATCH] modify interface is extended in Chinese mode
+
+---
+ po/zh_CN.po | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/po/zh_CN.po b/po/zh_CN.po
+index 8f48aad..18b0925 100644
+--- a/po/zh_CN.po
++++ b/po/zh_CN.po
+@@ -4433,7 +4433,7 @@ msgstr "搜索方式(_B):"
+
+ #: pyanaconda/ui/gui/spokes/advanced_storage.glade:153
+ msgid "Port / Target / LUN #"
+-msgstr "端口 / 目标 / 逻辑单位数标示符 (LUN #)"
++msgstr "端口 / 目标 / LUN # "
+
+ #: pyanaconda/ui/gui/spokes/advanced_storage.glade:154
+ msgid "Target WWID"
+--
+2.23.0
+
diff --git a/modify-timezone-and-delete-datezone-map.patch b/modify-timezone-and-delete-datezone-map.patch
new file mode 100644
index 0000000..959b9ca
--- /dev/null
+++ b/modify-timezone-and-delete-datezone-map.patch
@@ -0,0 +1,184 @@
+From 303b072992542dfa9a7e2b2a9dc99120564a3f07 Mon Sep 17 00:00:00 2001
+From: sun_hai_10 <sunhai10@huawei.com>
+Date: Mon, 7 Nov 2022 14:23:04 +0800
+Subject: [PATCH] modify timezone and delete datezone map
+
+---
+ pyanaconda/modules/timezone/installation.py | 4 +-
+ pyanaconda/modules/timezone/timezone.py | 2 +-
+ pyanaconda/ui/gui/spokes/datetime_spoke.glade | 14 -------
+ pyanaconda/ui/gui/spokes/datetime_spoke.py | 38 +++----------------
+ 4 files changed, 8 insertions(+), 50 deletions(-)
+
+diff --git a/pyanaconda/modules/timezone/installation.py b/pyanaconda/modules/timezone/installation.py
+index 08e24c0..f11874f 100644
+--- a/pyanaconda/modules/timezone/installation.py
++++ b/pyanaconda/modules/timezone/installation.py
+@@ -63,8 +63,8 @@ class ConfigureTimezoneTask(Task):
+ if not is_valid_timezone(self._timezone):
+ # this should never happen, but for pity's sake
+ log.warning("Timezone %s set in kickstart is not valid, "
+- "falling back to default (America/New_York).", self._timezone)
+- self._timezone = "America/New_York"
++ "falling back to default (Asia/Shanghai).", self._timezone)
++ self._timezone = "Asia/Shanghai"
+
+ def _make_timezone_symlink(self):
+ """Create the symlink that actually defines timezone."""
+diff --git a/pyanaconda/modules/timezone/timezone.py b/pyanaconda/modules/timezone/timezone.py
+index b5d5f7b..2a328a3 100644
+--- a/pyanaconda/modules/timezone/timezone.py
++++ b/pyanaconda/modules/timezone/timezone.py
+@@ -44,7 +44,7 @@ class TimezoneService(KickstartService):
+ def __init__(self):
+ super().__init__()
+ self.timezone_changed = Signal()
+- self._timezone = "America/New_York"
++ self._timezone = "Asia/Shanghai"
+
+ self.is_utc_changed = Signal()
+ self._is_utc = False
+diff --git a/pyanaconda/ui/gui/spokes/datetime_spoke.glade b/pyanaconda/ui/gui/spokes/datetime_spoke.glade
+index 188f93b..aa468d9 100644
+--- a/pyanaconda/ui/gui/spokes/datetime_spoke.glade
++++ b/pyanaconda/ui/gui/spokes/datetime_spoke.glade
+@@ -3,7 +3,6 @@
+ <interface>
+ <requires lib="gtk+" version="3.12"/>
+ <requires lib="AnacondaWidgets" version="1.0"/>
+- <requires lib="TimezoneMap" version="0.4"/>
+ <object class="GtkListStore" id="cities">
+ <columns>
+ <!-- column-name name -->
+@@ -314,19 +313,6 @@
+ <property name="position">0</property>
+ </packing>
+ </child>
+- <child>
+- <object class="CcTimezoneMap" id="tzmap">
+- <property name="visible">True</property>
+- <property name="can_focus">False</property>
+- <signal name="location-changed" handler="on_location_changed" swapped="no"/>
+- </object>
+- <packing>
+- <property name="expand">True</property>
+- <property name="fill">True</property>
+- <property name="padding">6</property>
+- <property name="position">1</property>
+- </packing>
+- </child>
+ <child>
+ <object class="GtkAlignment" id="footerAlignment">
+ <property name="visible">True</property>
+diff --git a/pyanaconda/ui/gui/spokes/datetime_spoke.py b/pyanaconda/ui/gui/spokes/datetime_spoke.py
+index b21bbc3..c8416b4 100644
+--- a/pyanaconda/ui/gui/spokes/datetime_spoke.py
++++ b/pyanaconda/ui/gui/spokes/datetime_spoke.py
+@@ -50,15 +50,14 @@ from pyanaconda.threading import threadMgr, AnacondaThread
+ import gi
+ gi.require_version("Gdk", "3.0")
+ gi.require_version("Gtk", "3.0")
+-gi.require_version("TimezoneMap", "1.0")
+
+-from gi.repository import Gdk, Gtk, TimezoneMap
++from gi.repository import Gdk, Gtk
+
+ log = get_module_logger(__name__)
+
+ __all__ = ["DatetimeSpoke"]
+
+-DEFAULT_TZ = "America/New_York"
++DEFAULT_TZ = "Asia/Shanghai"
+
+ SPLIT_NUMBER_SUFFIX_RE = re.compile(r'([^0-9]*)([-+])([0-9]+)')
+
+@@ -168,11 +167,6 @@ class DatetimeSpoke(FirstbootSpokeMixIn, NormalSpoke):
+ icon = "preferences-system-time-symbolic"
+ title = CN_("GUI|Spoke", "_Time & Date")
+
+- # Hack to get libtimezonemap loaded for GtkBuilder
+- # see https://bugzilla.gnome.org/show_bug.cgi?id=712184
+- _hack = TimezoneMap.TimezoneMap()
+- del(_hack)
+-
+ @staticmethod
+ def get_screen_id():
+ """Return a unique id of this UI screen."""
+@@ -211,7 +205,6 @@ class DatetimeSpoke(FirstbootSpokeMixIn, NormalSpoke):
+ self._yearsStore = self.builder.get_object("years")
+ self._regionsStore = self.builder.get_object("regions")
+ self._citiesStore = self.builder.get_object("cities")
+- self._tzmap = self.builder.get_object("tzmap")
+ self._dateBox = self.builder.get_object("dateBox")
+
+ # we need to know it the new value is the same as previous or not
+@@ -334,10 +327,6 @@ class DatetimeSpoke(FirstbootSpokeMixIn, NormalSpoke):
+ else:
+ return _("Invalid timezone")
+ else:
+- location = self._tzmap.get_location()
+- if location and location.get_property("zone"):
+- return _("%s timezone") % get_xlated_timezone(location.get_property("zone"))
+- else:
+ return _("Nothing selected")
+
+ def apply(self):
+@@ -389,7 +378,6 @@ class DatetimeSpoke(FirstbootSpokeMixIn, NormalSpoke):
+ kickstart_timezone = self._timezone_module.Timezone
+
+ if is_valid_timezone(kickstart_timezone):
+- self._tzmap.set_timezone(kickstart_timezone)
+ time.tzset()
+
+ self._update_datetime()
+@@ -766,7 +754,6 @@ class DatetimeSpoke(FirstbootSpokeMixIn, NormalSpoke):
+ if region == "Etc":
+ # Etc timezones cannot be displayed on the map, so let's reset the
+ # location and manually set a highlight with no location pin.
+- self._tzmap.clear_location()
+ # Some time zones are just the same default.
+ if city in ("GMT", "UTC", "UCT", "Greenwich", "Universal", "Zulu"):
+ offset = 0.0
+@@ -780,13 +767,14 @@ class DatetimeSpoke(FirstbootSpokeMixIn, NormalSpoke):
+ else:
+ log.warning("Unknown time zone selected in GUI: Etc/%s", city)
+
+- self._tzmap.set_selected_offset(offset)
+ time.tzset()
+ else:
+ # we don't want the timezone-changed signal to be emitted
+- self._tzmap.set_timezone(timezone)
+ time.tzset()
+
++ self._tz = get_timezone(timezone)
++ self._update_datetime()
++
+ # update "old" values
+ self._old_city = city
+
+@@ -836,22 +824,6 @@ class DatetimeSpoke(FirstbootSpokeMixIn, NormalSpoke):
+ self._stop_and_maybe_start_time_updating(interval=5)
+ self._daysFilter.refilter()
+
+- def on_location_changed(self, tz_map, location):
+- if not location:
+- return
+-
+- timezone = location.get_property('zone')
+-
+- # Updating the timezone will update the region/city combo boxes to match.
+- # The on_city_changed handler will attempt to convert the timezone back
+- # to a location and set it in the map, which we don't want, since we
+- # already have a location. That's why we're here.
+- with blockedHandler(self._cityCombo, self.on_city_changed):
+- if self._set_timezone(timezone):
+- # timezone successfully set
+- self._tz = get_timezone(timezone)
+- self._update_datetime()
+-
+ def on_timeformat_changed(self, button24h, *args):
+ hours = int(self._hoursLabel.get_text())
+ amPm = self._amPmLabel.get_text()
+--
+2.23.0
+
diff --git a/openeuler.conf b/openeuler.conf
new file mode 100644
index 0000000..0e356ef
--- /dev/null
+++ b/openeuler.conf
@@ -0,0 +1,37 @@
+# Anaconda configuration file for openEuler.
+
+[Profile]
+# Define the profile.
+profile_id = openEuler
+
+[Profile Detection]
+# Match os-release values.
+os_id = openEuler
+
+[Installation System]
+can_detect_enabled_smt = False
+
+[Network]
+default_on_boot = FIRST_WIRED_WITH_LINK
+
+[Bootloader]
+efi_dir = openEuler
+additional_arguments = cgroup_disable=files apparmor=0
+
+[Payload]
+enable_closest_mirror = True
+
+[Storage]
+default_partitioning =
+ / (min 1 GiB, max 70 GiB)
+ /home (min 500 MiB, free 50 GiB)
+ swap
+
+[Storage Constraints]
+swap_is_recommended = False
+
+[User Interface]
+blivet_gui_supported = False
+
+[License]
+eula = /usr/share/openEuler-release/EULA
diff --git a/remove-vender-issue-in-netdev.patch b/remove-vender-issue-in-netdev.patch
new file mode 100644
index 0000000..5582da0
--- /dev/null
+++ b/remove-vender-issue-in-netdev.patch
@@ -0,0 +1,28 @@
+From b896b694238389a85539f60cab6ee41ab04c4f29 Mon Sep 17 00:00:00 2001
+From: t_feng <fengtao40@huawei.com>
+Date: Fri, 19 Jun 2020 10:25:20 +0800
+Subject: [PATCH] remove vender issue in netdev
+
+---
+ pyanaconda/ui/gui/spokes/network.py | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+diff --git a/pyanaconda/ui/gui/spokes/network.py b/pyanaconda/ui/gui/spokes/network.py
+index 1318e17..e906f9e 100644
+--- a/pyanaconda/ui/gui/spokes/network.py
++++ b/pyanaconda/ui/gui/spokes/network.py
+@@ -782,9 +782,8 @@ class NetworkControlBox(GObject.GObject):
+ unplugged)
+
+ if device:
+- title += '\n<span size="small">%s %s</span>' % \
+- (escape_markup(device.get_vendor() or ""),
+- escape_markup(device.get_product() or ""))
++ title += '\n<span size="small">%s</span>' % \
++ (escape_markup(device.get_product() or ""))
+ return title
+
+ def refresh_ui(self, state=None):
+--
+2.23.0
+
diff --git a/sources b/sources
new file mode 100644
index 0000000..5d40c41
--- /dev/null
+++ b/sources
@@ -0,0 +1 @@
+7b6594170d6ccbccebe40449eed5837b anaconda-36.16.5.tar.bz2
diff --git a/summer-ospp-replace-isomd5sum-with-isosm3sum.patch b/summer-ospp-replace-isomd5sum-with-isosm3sum.patch
new file mode 100644
index 0000000..ccdbd8d
--- /dev/null
+++ b/summer-ospp-replace-isomd5sum-with-isosm3sum.patch
@@ -0,0 +1,60 @@
+diff --git a/dracut/anaconda-diskroot b/dracut/anaconda-diskroot
+index 295b0b5..3eee5a9 100755
+--- a/dracut/anaconda-diskroot
++++ b/dracut/anaconda-diskroot
+@@ -5,8 +5,8 @@
+ . /lib/anaconda-lib.sh
+ command -v getargbool >/dev/null || . /lib/dracut-lib.sh
+
+-# Run checkisomd5 on a device
+-run_checkisomd5() {
++# Run checkisosm3 on a device
++run_checkisosm3() {
+ livedev=$1
+ if getargbool 0 rd.live.check -d check; then
+ [ -b "$livedev" ] && fs=$(blkid -s TYPE -o value "$livedev")
+@@ -14,13 +14,13 @@ run_checkisomd5() {
+ [ -x /bin/plymouth ] && /bin/plymouth --hide-splash
+ if [ -n "$DRACUT_SYSTEMD" ]; then
+ p=$(dev_unit_name "$livedev")
+- systemctl start "checkisomd5@${p}.service"
+- retcode=$(systemctl -p ExecMainStatus show "checkisomd5@${p}.service")
+- status=$(systemctl -p ActiveState show "checkisomd5@${p}.service")
++ systemctl start "checkisosm3@${p}.service"
++ retcode=$(systemctl -p ExecMainStatus show "checkisosm3@${p}.service")
++ status=$(systemctl -p ActiveState show "checkisosm3@${p}.service")
+ splitsep "=" "$retcode" ignore rc
+ splitsep "=" "$status" ignore state
+ else
+- checkisomd5 --verbose "$livedev"
++ checkisosm3 --verbose "$livedev"
+ rc=$?
+ state="inactive"
+ fi
+@@ -81,4 +81,4 @@ fi
+ info "anaconda using disk root at $dev"
+ mount -o ro "$dev" "$repodir" || warn "Couldn't mount $dev"
+ anaconda_live_root_dir "$repodir" "$path"
+-run_checkisomd5 "$dev"
++run_checkisosm3 "$dev"
+diff --git a/pyanaconda/ui/gui/spokes/installation_source.py b/pyanaconda/ui/gui/spokes/installation_source.py
+index 5b55792..935c24b 100644
+--- a/pyanaconda/ui/gui/spokes/installation_source.py
++++ b/pyanaconda/ui/gui/spokes/installation_source.py
+@@ -292,14 +292,14 @@ class MediaCheckDialog(GUIObject):
+
+ def run(self, device_path):
+ (retval, self._pid, _stdin, stdout, _stderr) = \
+- glib.spawn_async_with_pipes(None, ["checkisomd5", "--gauge", device_path], [],
++ glib.spawn_async_with_pipes(None, ["checkisosm3", "--gauge", device_path], [],
+ glib.SpawnFlags.DO_NOT_REAP_CHILD |
+ glib.SpawnFlags.SEARCH_PATH,
+ None, None)
+ if not retval:
+ return
+
+- # This function waits for checkisomd5 to end and then cleans up after it.
++ # This function waits for checkisosm3 to end and then cleans up after it.
+ PidWatcher().watch_process(self._pid, self._check_iso_ends_cb)
+
+ # This function watches the process's stdout.
diff --git a/support-use-sm3-crypt-user-password.patch b/support-use-sm3-crypt-user-password.patch
new file mode 100644
index 0000000..9fc3cbe
--- /dev/null
+++ b/support-use-sm3-crypt-user-password.patch
@@ -0,0 +1,234 @@
+From b311b645f9447f7e765b0e418d3f37c32e2702e1 Mon Sep 17 00:00:00 2001
+From: liuxin <liuxin264@huawei.com>
+Date: Mon, 7 Nov 2022 19:07:50 +0800
+Subject: [PATCH] support use sm3 crypt user password
+
+---
+ po/zh_CN.po | 5 ++++
+ pyanaconda/core/users.py | 5 +++-
+ pyanaconda/ui/gui/spokes/root_password.glade | 15 ++++++++++++
+ pyanaconda/ui/gui/spokes/root_password.py | 16 ++++++++++++-
+ pyanaconda/ui/gui/spokes/user.glade | 16 ++++++++++++-
+ pyanaconda/ui/gui/spokes/user.py | 14 ++++++++++-
+ .../pyanaconda_tests/test_crypt_password.py | 23 +++++++++++++++++++
+ 7 files changed, 90 insertions(+), 4 deletions(-)
+ create mode 100644 tests/unit_tests/pyanaconda_tests/test_crypt_password.py
+
+diff --git a/po/zh_CN.po b/po/zh_CN.po
+index e31f0b2..8f48aad 100644
+--- a/po/zh_CN.po
++++ b/po/zh_CN.po
+@@ -7640,3 +7640,8 @@ msgstr "开始安装到硬盘"
+ #~ msgstr[0] ""
+ #~ "<b>%(count)d 个磁盘;容量 %(size)s;空闲空间 %(free)s</b> (包括未分区及文"
+ #~ "件系统内的部分)"
++
++#: pyanaconda/ui/gui/spokes/root_password.glade:215
++#: pyanaconda/ui/gui/spokes/user.glade:278
++msgid "Use SM3 to encrypt the password"
++msgstr "使用SM3算法加密密码"
+diff --git a/pyanaconda/core/users.py b/pyanaconda/core/users.py
+index c2d14e2..649fad6 100644
+--- a/pyanaconda/core/users.py
++++ b/pyanaconda/core/users.py
+@@ -38,7 +38,7 @@ from pyanaconda.anaconda_loggers import get_module_logger
+ log = get_module_logger(__name__)
+
+
+-def crypt_password(password):
++def crypt_password(password, algo=None):
+ """Crypt a password.
+
+ Process a password with appropriate salted one-way algorithm.
+@@ -51,6 +51,9 @@ def crypt_password(password):
+ # so we need to generate the setting ourselves
+ b64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
+ setting = "$y$j9T$" + "".join(sr().choice(b64) for _sc in range(24))
++
++ if algo == "sm3":
++ setting = crypt.METHOD_SM3
+
+ # and try to compute the password hash using our yescrypt setting
+ try:
+diff --git a/pyanaconda/ui/gui/spokes/root_password.glade b/pyanaconda/ui/gui/spokes/root_password.glade
+index f710439..53bc90c 100644
+--- a/pyanaconda/ui/gui/spokes/root_password.glade
++++ b/pyanaconda/ui/gui/spokes/root_password.glade
+@@ -328,6 +328,21 @@ The root user (also known as super user) has complete access to the entire syste
+ <property name="position">1</property>
+ </packing>
+ </child>
++ <child>
++ <object class="GtkCheckButton" id="passwd_sm3">
++ <property name="label" translatable="yes">Use SM3 to encrypt the password</property>
++ <property name="can_focus">True</property>
++ <property name="receives_default">False</property>
++ <property name="halign">start</property>
++ <property name="draw_indicator">True</property>
++ <signal name="clicked" handler="on_sm3_clicked" swapped="no"/>
++ </object>
++ <packing>
++ <property name="expand">False</property>
++ <property name="fill">True</property>
++ <property name="position">3</property>
++ </packing>
++ </child>
+ </object>
+ </child>
+ </object>
+diff --git a/pyanaconda/ui/gui/spokes/root_password.py b/pyanaconda/ui/gui/spokes/root_password.py
+index f2e389d..062f59d 100644
+--- a/pyanaconda/ui/gui/spokes/root_password.py
++++ b/pyanaconda/ui/gui/spokes/root_password.py
+@@ -68,6 +68,8 @@ class PasswordSpoke(FirstbootSpokeMixIn, NormalSpoke, GUISpokeInputCheckHandler)
+ NormalSpoke.__init__(self, *args)
+ GUISpokeInputCheckHandler.__init__(self)
+ self._users_module = USERS.get_proxy()
++ # sm3 password method
++ self._passwd_method_sm3 = False
+
+ def initialize(self):
+ NormalSpoke.initialize(self)
+@@ -83,6 +85,9 @@ class PasswordSpoke(FirstbootSpokeMixIn, NormalSpoke, GUISpokeInputCheckHandler)
+ self._root_password_ssh_login_override.set_no_show_all(True)
+ self._revealer = self.builder.get_object("password_revealer")
+
++ # sm3 object
++ self._passwd_method_button = self.builder.get_object("passwd_sm3")
++
+ # Install the password checks:
+ # - Has a password been specified?
+ # - If a password has been specified and there is data in the confirm box, do they match?
+@@ -179,9 +184,15 @@ class PasswordSpoke(FirstbootSpokeMixIn, NormalSpoke, GUISpokeInputCheckHandler)
+ return not self._users_module.CheckAdminUserExists()
+
+ def apply(self):
++
++ if self._passwd_method_sm3 is True:
++ algo = "sm3"
++ else:
++ algo = None
++
+ if self.root_enabled and self.password:
+ # Set the root password.
+- self._users_module.SetCryptedRootPassword(crypt_password(self.password))
++ self._users_module.SetCryptedRootPassword(crypt_password(self.password, algo))
+
+ # Unlock the root account.
+ self._users_module.SetRootAccountLocked(False)
+@@ -330,3 +341,6 @@ class PasswordSpoke(FirstbootSpokeMixIn, NormalSpoke, GUISpokeInputCheckHandler)
+ self._revealer.set_reveal_child(unlocked)
+ if unlocked:
+ self.password_entry.grab_focus()
++
++ def on_sm3_clicked(self, button):
++ self._passwd_method_sm3 = self._passwd_method_button.get_active()
+diff --git a/pyanaconda/ui/gui/spokes/user.glade b/pyanaconda/ui/gui/spokes/user.glade
+index 4783a9f..2e844fa 100644
+--- a/pyanaconda/ui/gui/spokes/user.glade
++++ b/pyanaconda/ui/gui/spokes/user.glade
+@@ -277,6 +277,20 @@
+ <property name="top-attach">3</property>
+ </packing>
+ </child>
++ <child>
++ <object class="GtkCheckButton" id="passwd_sm3">
++ <property name="label" translatable="yes">Use SM3 to encrypt the password</property>
++ <property name="can_focus">True</property>
++ <property name="receives_default">False</property>
++ <property name="halign">start</property>
++ <property name="draw_indicator">True</property>
++ <signal name="clicked" handler="on_sm3_clicked" swapped="no"/>
++ </object>
++ <packing>
++ <property name="left_attach">1</property>
++ <property name="top_attach">8</property>
++ </packing>
++ </child>
+ <child>
+ <!-- n-columns=3 n-rows=3 -->
+ <object class="GtkGrid" id="grid2">
+@@ -324,7 +338,7 @@
+ </object>
+ <packing>
+ <property name="left-attach">1</property>
+- <property name="top-attach">8</property>
++ <property name="top-attach">9</property>
+ </packing>
+ </child>
+ <child>
+diff --git a/pyanaconda/ui/gui/spokes/user.py b/pyanaconda/ui/gui/spokes/user.py
+index 5b16443..cb62873 100644
+--- a/pyanaconda/ui/gui/spokes/user.py
++++ b/pyanaconda/ui/gui/spokes/user.py
+@@ -261,6 +261,8 @@ class UserSpoke(FirstbootSpokeMixIn, NormalSpoke, GUISpokeInputCheckHandler):
+
+ self._users_module = USERS.get_proxy()
+ self._password_is_required = True
++ # sm3 password method
++ self._passwd_method_sm3 = False
+
+ def initialize(self):
+ NormalSpoke.initialize(self)
+@@ -294,6 +296,9 @@ class UserSpoke(FirstbootSpokeMixIn, NormalSpoke, GUISpokeInputCheckHandler):
+ self._password_bar = self.builder.get_object("password_bar")
+ self._password_label = self.builder.get_object("password_label")
+
++ # sm3 object
++ self._passwd_method_button = self.builder.get_object("passwd_sm3")
++
+ # Install the password checks:
+ # - Has a password been specified?
+ # - If a password has been specified and there is data in the confirm box, do they match?
+@@ -470,7 +475,11 @@ class UserSpoke(FirstbootSpokeMixIn, NormalSpoke, GUISpokeInputCheckHandler):
+ if self.password_required:
+ if self.password:
+ self.password_kickstarted = False
+- self.user.password = crypt_password(self.password)
++ if self._passwd_method_sm3 is True:
++ algo = "sm3"
++ else:
++ algo = None
++ self.user.password = crypt_password(self.password, algo)
+ self.user.is_crypted = True
+ self.remove_placeholder_texts()
+
+@@ -696,3 +705,6 @@ class UserSpoke(FirstbootSpokeMixIn, NormalSpoke, GUISpokeInputCheckHandler):
+ NormalSpoke.on_back_clicked(self, button)
+ else:
+ log.info("Return to hub prevented by password checking rules.")
++
++ def on_sm3_clicked(self, button):
++ self._passwd_method_sm3 = self._passwd_method_button.get_active()
+diff --git a/tests/unit_tests/pyanaconda_tests/test_crypt_password.py b/tests/unit_tests/pyanaconda_tests/test_crypt_password.py
+new file mode 100644
+index 0000000..c2e1e4c
+--- /dev/null
++++ b/tests/unit_tests/pyanaconda_tests/test_crypt_password.py
+@@ -0,0 +1,23 @@
++from pyanaconda.core.users import crypt_password
++import unittest
++import crypt
++import os
++
++@unittest.skipIf(os.geteuid() != 0, "user creation must be run as root")
++class CryptPasswordTest(unittest.TestCase):
++ def setUp(self):
++ pass
++
++ def tearDown(self):
++ pass
++
++ def test_crypt_password(self):
++ origin_password = "password"
++ encrypted = crypt_password(origin_password, "sm3")
++ self.assertTrue(encrypted.startswith("$sm3$"))
++
++ encrypted = crypt_password(origin_password)
++ self.assertTrue(encrypted.startswith("$6$"))
++
++if __name__ == '__main__':
++ unittest.main()
+--
+2.27.0
+