diff options
34 files changed, 3763 insertions, 0 deletions
@@ -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 + @@ -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 + |