[oe] [PATCH 13/15] meta-installer: add recipe anaconda 26.21.11
Hongxu Jia
hongxu.jia at windriver.com
Thu Nov 23 12:09:13 UTC 2017
The anaconda is from fedora 26 and customized based
on OE platform.
Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
---
.../anaconda/files/0001-do-not-support-po.patch | 41 ++
...02-widgets-Makefile.am-do-not-compile-doc.patch | 28 +
...t-Use-system-Python-when-running-Anaconda.patch | 42 ++
...4-pyanaconda-flags.py-drop-selinux-module.patch | 48 ++
...ckage-site-dir-for-installclass-searching.patch | 38 ++
...06-do-not-load-the-system-wide-Xresources.patch | 53 ++
.../0007-tweak-iso-mount-dir-and-kernel-name.patch | 95 ++++
.../0008-dnfpayload.py-customize-for-WRLinux.patch | 597 +++++++++++++++++++++
...cessary-noverifyssl-for-http-ftp-protocol.patch | 32 ++
.../0010-dynamic-detect-workable-locale.patch | 77 +++
.../files/0011-improve-thread-monitor.patch | 55 ++
.../anaconda/files/0012-disable-audit.patch | 64 +++
...py-Change-grub2-settings-to-match-oe-core.patch | 137 +++++
.../files/0014-tweak-detect-kernel-version.patch | 96 ++++
.../0015-tweak-grub-config-file-for-WRLinux.patch | 28 +
...time.tzset-to-apply-timezone-changes-when.patch | 66 +++
...rt-Authconfig-Firewall-Firstboot-Timezone.patch | 216 ++++++++
.../files/0018-invisible-help-button.patch | 32 ++
.../0019-disable-non-implemented-functions.patch | 41 ++
.../files/0020-disable-geoloc-by-default.patch | 30 ++
.../anaconda/files/0021-support-UEFI-boot.patch | 38 ++
...o-not-verify-ssl-certification-by-default.patch | 44 ++
.../files/0023-tweak-default-nfs-mount-point.patch | 30 ++
.../0024-fix-quoted-empty-string-failed.patch | 46 ++
...support-ISO-hold-by-hard-drive-partitions.patch | 31 ++
...x-cannot-stat-usr-share-gettext-gettext.h.patch | 27 +
.../0027-fix-Wind-River-boot-menu-not-work.patch | 35 ++
.../files/0028-tweak-bootloader-fs-type.patch | 31 ++
.../files/0029-support-timezone-setting.patch | 95 ++++
.../anaconda/files/0030-disable-ntp-support.patch | 230 ++++++++
.../0031-do-not-support-manually-set-time.patch | 32 ++
.../files/0032-support-user-account-creation.patch | 73 +++
.../files/0033-detect-existence-of-Xorg.patch | 45 ++
...-write-network-conf-failed-while-liveinst.patch | 40 ++
...mmits-to-support-reboot-for-live-installs.patch | 72 +++
...tory-setting-do-not-support-local-ISO-fil.patch | 72 +++
...ext-repository-setting-support-http-proxy.patch | 95 ++++
...-set-keyboard-xlayouts-with-us-by-default.patch | 50 ++
...xt-do-not-support-network-setting-for-now.patch | 33 ++
.../0040-tweak-boot-storage-sanity-check.patch | 31 ++
...tart-do-not-support-network-configuration.patch | 29 +
...042-support-to-get-kickstart-from-network.patch | 48 ++
...0043-support-authentication-for-kickstart.patch | 133 +++++
...nloading-file-from-http-ftp-server-to-tar.patch | 175 ++++++
.../0045-live-install-supports-kickstart.patch | 47 ++
.../files/0046-support-initramfs-boot.patch | 48 ++
...47-fix-hang-while-installed-system-reboot.patch | 30 ++
...talled-system-boot-from-encrypt-fs-failed.patch | 48 ++
...n-destination-disable-iSCSI-network-disks.patch | 29 +
.../0050-update-region-while-city-changes.patch | 32 ++
.../0051-timezone-fix-set-US-Alaska-failed.patch | 38 ++
...remove-incorrect-prefix-of-addon-repo-url.patch | 42 ++
.../0053-fix-write-sysconfig-network-failed.patch | 32 ++
...naconda-ui-gui-utils.py-tweak-mouse-arrow.patch | 31 ++
...5-tweak-search-location-of-new-kernel-pkg.patch | 30 ++
.../0056-always-write-fstab-after-install.patch | 31 ++
...e-grub-install-to-generate-efi-filesystem.patch | 60 +++
.../files/0058-do-not-support-closest-mirror.patch | 96 ++++
.../0059-tweak-MAX_TREEINFO_DOWNLOAD_RETRIES.patch | 42 ++
.../anaconda/files/0060-tweak-time-setting.patch | 106 ++++
...62-Add-dracut-args-for-home-to-bootloader.patch | 35 ++
.../files/0063-do-not-customize-window-theme.patch | 55 ++
.../files/0064-tweak-product-short-name.patch | 33 ++
.../anaconda/files/0065-disable-dmraid.patch | 57 ++
.../files/0066-tweak-shebang-of-bash.patch | 25 +
.../anaconda/files/0067-Tweak-label-name.patch | 56 ++
...068-livepayload.py-copy-grub-from-host-os.patch | 51 ++
.../files/0069-test-existence-of-noverifyssl.patch | 31 ++
.../anaconda/files/81-edit-sudoers.ks | 3 +
.../recipes-installer/anaconda/files/wrlinux.py | 112 ++++
.../anaconda/python3-anaconda_26.21.11.bb | 161 ++++++
71 files changed, 4712 insertions(+)
create mode 100644 meta-installer/recipes-installer/anaconda/files/0001-do-not-support-po.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0002-widgets-Makefile.am-do-not-compile-doc.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0003-Revert-Use-system-Python-when-running-Anaconda.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0004-pyanaconda-flags.py-drop-selinux-module.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0005-add-package-site-dir-for-installclass-searching.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0006-do-not-load-the-system-wide-Xresources.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0007-tweak-iso-mount-dir-and-kernel-name.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0008-dnfpayload.py-customize-for-WRLinux.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0009-Remove-unnecessary-noverifyssl-for-http-ftp-protocol.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0010-dynamic-detect-workable-locale.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0011-improve-thread-monitor.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0012-disable-audit.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0013-bootloader.py-Change-grub2-settings-to-match-oe-core.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0014-tweak-detect-kernel-version.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0015-tweak-grub-config-file-for-WRLinux.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0016-Revert-Use-time.tzset-to-apply-timezone-changes-when.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0017-kickstart-Authconfig-Firewall-Firstboot-Timezone.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0018-invisible-help-button.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0019-disable-non-implemented-functions.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0020-disable-geoloc-by-default.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0021-support-UEFI-boot.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0022-do-not-verify-ssl-certification-by-default.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0023-tweak-default-nfs-mount-point.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0024-fix-quoted-empty-string-failed.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0025-do-not-support-ISO-hold-by-hard-drive-partitions.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0026-fix-cannot-stat-usr-share-gettext-gettext.h.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0027-fix-Wind-River-boot-menu-not-work.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0028-tweak-bootloader-fs-type.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0029-support-timezone-setting.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0030-disable-ntp-support.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0031-do-not-support-manually-set-time.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0032-support-user-account-creation.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0033-detect-existence-of-Xorg.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0034-fix-write-network-conf-failed-while-liveinst.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0035-revert-commits-to-support-reboot-for-live-installs.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0036-text-repository-setting-do-not-support-local-ISO-fil.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0037-text-repository-setting-support-http-proxy.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0038-set-keyboard-xlayouts-with-us-by-default.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0039-text-do-not-support-network-setting-for-now.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0040-tweak-boot-storage-sanity-check.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0041-kickstart-do-not-support-network-configuration.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0042-support-to-get-kickstart-from-network.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0043-support-authentication-for-kickstart.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0044-support-downloading-file-from-http-ftp-server-to-tar.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0045-live-install-supports-kickstart.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0046-support-initramfs-boot.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0047-fix-hang-while-installed-system-reboot.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0048-fix-installed-system-boot-from-encrypt-fs-failed.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0049-installation-destination-disable-iSCSI-network-disks.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0050-update-region-while-city-changes.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0051-timezone-fix-set-US-Alaska-failed.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0052-remove-incorrect-prefix-of-addon-repo-url.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0053-fix-write-sysconfig-network-failed.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0054-pyanaconda-ui-gui-utils.py-tweak-mouse-arrow.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0055-tweak-search-location-of-new-kernel-pkg.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0056-always-write-fstab-after-install.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0057-invoke-grub-install-to-generate-efi-filesystem.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0058-do-not-support-closest-mirror.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0059-tweak-MAX_TREEINFO_DOWNLOAD_RETRIES.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0060-tweak-time-setting.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0062-Add-dracut-args-for-home-to-bootloader.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0063-do-not-customize-window-theme.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0064-tweak-product-short-name.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0065-disable-dmraid.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0066-tweak-shebang-of-bash.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0067-Tweak-label-name.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0068-livepayload.py-copy-grub-from-host-os.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/0069-test-existence-of-noverifyssl.patch
create mode 100644 meta-installer/recipes-installer/anaconda/files/81-edit-sudoers.ks
create mode 100644 meta-installer/recipes-installer/anaconda/files/wrlinux.py
create mode 100755 meta-installer/recipes-installer/anaconda/python3-anaconda_26.21.11.bb
diff --git a/meta-installer/recipes-installer/anaconda/files/0001-do-not-support-po.patch b/meta-installer/recipes-installer/anaconda/files/0001-do-not-support-po.patch
new file mode 100644
index 0000000..7bde9f3
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0001-do-not-support-po.patch
@@ -0,0 +1,41 @@
+From 063bb9bc5a21564c2935e94ca21c71d54a27fdae Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Tue, 9 May 2017 04:10:03 -0400
+Subject: [PATCH 01/65] do not support po
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ Makefile.am | 2 +-
+ configure.ac | 1 -
+ 2 files changed, 1 insertion(+), 2 deletions(-)
+
+diff --git a/Makefile.am b/Makefile.am
+index 552afd1..387614b 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -17,7 +17,7 @@
+
+ ACLOCAL_AMFLAGS = -I m4
+
+-SUBDIRS = data docs dracut po pyanaconda scripts tests widgets utils
++SUBDIRS = data docs dracut pyanaconda scripts tests widgets utils
+
+ EXTRA_DIST = COPYING .coveragerc
+
+diff --git a/configure.ac b/configure.ac
+index 9a9955d..1237f76 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -128,7 +128,6 @@ AC_CONFIG_FILES([Makefile
+ data/window-manager/Makefile
+ data/window-manager/config/Makefile
+ data/window-manager/theme/Makefile
+- po/Makefile
+ scripts/Makefile
+ pyanaconda/Makefile
+ pyanaconda/version.py
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0002-widgets-Makefile.am-do-not-compile-doc.patch b/meta-installer/recipes-installer/anaconda/files/0002-widgets-Makefile.am-do-not-compile-doc.patch
new file mode 100644
index 0000000..8c4224f
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0002-widgets-Makefile.am-do-not-compile-doc.patch
@@ -0,0 +1,28 @@
+From a1787c64202305aa374e287572ba2c855a35b378 Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Tue, 9 May 2017 04:36:48 -0400
+Subject: [PATCH 02/65] widgets/Makefile.am: do not compile doc
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ widgets/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/widgets/Makefile.am b/widgets/Makefile.am
+index 6478ce8..222aeaa 100644
+--- a/widgets/Makefile.am
++++ b/widgets/Makefile.am
+@@ -19,7 +19,7 @@
+
+ ACLOCAL_AMFLAGS = -I m4
+
+-SUBDIRS = src python glade doc
++SUBDIRS = src python glade
+
+ MAINTAINERCLEANFILES = Makefile.in aclocal.m4 config.guess config.h.in config.sub \
+ configure depcomp install-sh ltmain.sh missing py-compile \
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0003-Revert-Use-system-Python-when-running-Anaconda.patch b/meta-installer/recipes-installer/anaconda/files/0003-Revert-Use-system-Python-when-running-Anaconda.patch
new file mode 100644
index 0000000..2d3b3a4
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0003-Revert-Use-system-Python-when-running-Anaconda.patch
@@ -0,0 +1,42 @@
+From 71baa574de0810c5698f5f749f074648e1747895 Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Wed, 10 May 2017 03:56:04 -0400
+Subject: [PATCH 03/65] Revert "Use system Python when running Anaconda"
+
+The OE does not support it.
+
+This reverts commit b23760dcac91fcc77cc629d3e87757a8b4b6aae0.
+
+Upstream-Status: Inappropriate [OE specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ anaconda.py | 2 +-
+ anaconda.spec.in | 1 -
+ 2 files changed, 1 insertion(+), 2 deletions(-)
+
+diff --git a/anaconda.py b/anaconda.py
+index 4c9fef6..25f227c 100755
+--- a/anaconda.py
++++ b/anaconda.py
+@@ -1,4 +1,4 @@
+-#!/usr/libexec/system-python
++#!/usr/bin/python3
+ #
+ # anaconda: The Red Hat Linux Installation program
+ #
+diff --git a/anaconda.spec.in b/anaconda.spec.in
+index e92d82c..776150d 100644
+--- a/anaconda.spec.in
++++ b/anaconda.spec.in
+@@ -83,7 +83,6 @@ The anaconda package is a metapackage for the Anaconda installer.
+
+ %package core
+ Summary: Core of the Anaconda installer
+-Requires: python3-libs
+ Requires: python3-dnf >= %{dnfver}
+ Requires: python3-blivet >= 1:2.1.9-1
+ Requires: python3-blockdev >= %{libblockdevver}
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0004-pyanaconda-flags.py-drop-selinux-module.patch b/meta-installer/recipes-installer/anaconda/files/0004-pyanaconda-flags.py-drop-selinux-module.patch
new file mode 100644
index 0000000..d3e187a
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0004-pyanaconda-flags.py-drop-selinux-module.patch
@@ -0,0 +1,48 @@
+From 4cb2dba790b7f4ef274b43fb8cdd516c36ca32b8 Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Thu, 11 May 2017 14:19:06 +0800
+Subject: [PATCH 04/65] pyanaconda/flags.py: drop selinux module
+
+And we do not use selinux module for wrlinux, so drop it.
+
+The fix is to revert upstream commit
+...
+commit b359e1a011ca71e5431969ae4f12bb847017eaa9
+Author: Chris Lumens <clumens at redhat.com>
+Date: Wed Aug 10 13:08:26 2011 -0400
+
+ Remove as many of the /selinux path hardcodings as possible (#729563).
+...
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/flags.py | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/pyanaconda/flags.py b/pyanaconda/flags.py
+index 63c2f37..7374a39 100644
+--- a/pyanaconda/flags.py
++++ b/pyanaconda/flags.py
+@@ -17,7 +17,7 @@
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
+ #
+
+-import selinux
++import os
+ import shlex
+ import glob
+ from pyanaconda.constants import SELINUX_DEFAULT, CMDLINE_APPEND, ANACONDA_ENVIRON
+@@ -91,7 +91,7 @@ class Flags(object):
+ "nombr", "gpt", "noefi"):
+ self.set_cmdline_bool(f)
+
+- if not selinux.is_selinux_enabled():
++ if not os.path.exists("/selinux/load"):
+ self.selinux = 0
+
+ cmdline_files = ['/proc/cmdline', '/run/install/cmdline',
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0005-add-package-site-dir-for-installclass-searching.patch b/meta-installer/recipes-installer/anaconda/files/0005-add-package-site-dir-for-installclass-searching.patch
new file mode 100644
index 0000000..f2423e6
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0005-add-package-site-dir-for-installclass-searching.patch
@@ -0,0 +1,38 @@
+From c23cb67a0bf9960357c66651527e959ccb754076 Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Mon, 15 May 2017 13:47:30 +0800
+Subject: [PATCH 05/65] add package site dir for installclass searching
+
+The default dir searching is incorrect.
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/installclass.py | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/pyanaconda/installclass.py b/pyanaconda/installclass.py
+index 4bb7dff..0311ca7 100644
+--- a/pyanaconda/installclass.py
++++ b/pyanaconda/installclass.py
+@@ -22,6 +22,7 @@
+ #
+
+ from distutils.sysconfig import get_python_lib
++from site import getsitepackages
+ import os, sys
+ import imp
+
+@@ -192,7 +193,7 @@ def availableClasses(showHidden=False):
+
+ path = []
+
+- env_path = []
++ env_path = ["%s/pyanaconda/installclasses" % p for p in getsitepackages()]
+ if "ANACONDA_INSTALL_CLASSES" in os.environ:
+ env_path += os.environ["ANACONDA_INSTALL_CLASSES"].split(":")
+
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0006-do-not-load-the-system-wide-Xresources.patch b/meta-installer/recipes-installer/anaconda/files/0006-do-not-load-the-system-wide-Xresources.patch
new file mode 100644
index 0000000..d20f5d0
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0006-do-not-load-the-system-wide-Xresources.patch
@@ -0,0 +1,53 @@
+From 68fe87ef2ff8b79dc17a35afcdce95f87f9da022 Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Mon, 15 May 2017 11:07:19 +0800
+Subject: [PATCH 06/65] do not load the system-wide Xresources
+
+- In https://github.com/rhinstaller/anaconda, revert the
+ following commit:
+-----------------------------------------------
+commit ef85e16c80609efc6bdd50c3a5aa6333fcdf0a57
+Author: David Shea <dshea at redhat.com>
+Date: Wed Mar 9 14:43:03 2016 -0500
+
+ Load the system-wide Xresources (#1241724)
+-----------------------------------------------
+
+The reason is OE does not have spice-vdagent.
+
+- Use terminal vt7 to display X
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/display.py | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/pyanaconda/display.py b/pyanaconda/display.py
+index 91c9a83..fd255a4 100644
+--- a/pyanaconda/display.py
++++ b/pyanaconda/display.py
+@@ -130,7 +130,7 @@ def start_x11():
+
+ # Start Xorg and wait for it become ready
+ iutil.startX(["Xorg", "-br", "-logfile", "/tmp/X.log",
+- ":%s" % constants.X_DISPLAY_NUMBER, "vt6", "-s", "1440", "-ac",
++ ":%s" % constants.X_DISPLAY_NUMBER, "vt7", "-s", "1440", "-ac",
+ "-nolisten", "tcp", "-dpi", "96",
+ "-noreset"], output_redirect=subprocess.DEVNULL)
+
+@@ -306,8 +306,8 @@ def setup_display(anaconda, options, addon_paths=None):
+ anaconda.gui_startup_failed = True
+ time.sleep(2)
+
+- if not anaconda.gui_startup_failed:
+- do_extra_x11_actions(options.runres, gui_mode=anaconda.gui_mode)
++ #if not anaconda.gui_startup_failed:
++ # do_extra_x11_actions(options.runres, gui_mode=anaconda.gui_mode)
+
+ if anaconda.tui_mode and anaconda.gui_startup_failed and flags.vncquestion and not anaconda.ksdata.vnc.enabled:
+ message = _("X was unable to start on your machine. Would you like to start VNC to connect to "
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0007-tweak-iso-mount-dir-and-kernel-name.patch b/meta-installer/recipes-installer/anaconda/files/0007-tweak-iso-mount-dir-and-kernel-name.patch
new file mode 100644
index 0000000..b67e273
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0007-tweak-iso-mount-dir-and-kernel-name.patch
@@ -0,0 +1,95 @@
+From 7576c994c1af5d6f4302e6393e407beded480514 Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Thu, 18 May 2017 13:41:01 +0800
+Subject: [PATCH] tweak iso mount dir and kernel name
+
+- Tweak iso mount dir based on WRLinux
+
+- Tweak kernel name based on OE
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/constants.py | 4 ++--
+ pyanaconda/payload/__init__.py | 20 ++++++++++++--------
+ 2 files changed, 14 insertions(+), 10 deletions(-)
+
+diff --git a/pyanaconda/constants.py b/pyanaconda/constants.py
+index f2b62d0..b514bf5 100644
+--- a/pyanaconda/constants.py
++++ b/pyanaconda/constants.py
+@@ -52,8 +52,8 @@ DD_RPMS = "/tmp/DD-*"
+ TRANSLATIONS_UPDATE_DIR = "/tmp/updates/po"
+
+ ANACONDA_CLEANUP = "anaconda-cleanup"
+-MOUNT_DIR = "/run/install"
+-DRACUT_REPODIR = "/run/install/repo"
++MOUNT_DIR = "/media/realroot"
++DRACUT_REPODIR = MOUNT_DIR + "/Packages"
+ DRACUT_ISODIR = "/run/install/source"
+ ISO_DIR = MOUNT_DIR + "/isodir"
+ IMAGE_DIR = MOUNT_DIR + "/image"
+diff --git a/pyanaconda/payload/__init__.py b/pyanaconda/payload/__init__.py
+index 7e78145..87b88d8 100644
+--- a/pyanaconda/payload/__init__.py
++++ b/pyanaconda/payload/__init__.py
+@@ -42,7 +42,7 @@ if __name__ == "__main__":
+ from pyanaconda import anaconda_log
+ anaconda_log.init()
+
+-from pyanaconda.constants import DRACUT_ISODIR, DRACUT_REPODIR, DD_ALL, DD_FIRMWARE, DD_RPMS, INSTALL_TREE, ISO_DIR
++from pyanaconda.constants import DRACUT_ISODIR, DRACUT_REPODIR, DD_ALL, DD_FIRMWARE, DD_RPMS, INSTALL_TREE, ISO_DIR, MOUNT_DIR
+ from pyanaconda.constants import THREAD_STORAGE, THREAD_WAIT_FOR_CONNECTING_NM, THREAD_PAYLOAD
+ from pyanaconda.constants import THREAD_PAYLOAD_RESTART
+ from pykickstart.constants import GROUP_ALL, GROUP_DEFAULT, GROUP_REQUIRED
+@@ -859,7 +859,7 @@ class PackagePayload(Payload):
+ if "kernel" in self.data.packages.excludedList:
+ return []
+
+- kernels = ["kernel"]
++ kernels = ["kernel-image"]
+
+ if blivet.arch.is_x86(32) and isys.isPaeAvailable():
+ kernels.insert(0, "kernel-PAE")
+@@ -887,14 +887,17 @@ class PackagePayload(Payload):
+ files = []
+
+ ts = rpm.TransactionSet(iutil.getSysroot())
+- mi = ts.dbMatch('providename', 'kernel')
++ mi = ts.dbMatch()
++ mi.pattern('name', rpm.RPMMIRE_GLOB, 'kernel-image*')
+ for hdr in mi:
++ log.info("hdr.filenames %s" % hdr.filenames)
+ unicode_fnames = (f.decode("utf-8") for f in hdr.filenames)
+- # Find all /boot/vmlinuz- files and strip off vmlinuz-
++ # Find all /boot/* files and strip off *-
+ files.extend((f.split("/")[-1][8:] for f in unicode_fnames
+- if fnmatch(f, "/boot/vmlinuz-*") or
+- fnmatch(f, "/boot/efi/EFI/%s/vmlinuz-*" % self.instclass.efi_dir)))
++ if(fnmatch(f, "/boot/*") or fnmatch(f, "/boot/efi/EFI/%s/*" % self.instclass.efi_dir))
++ and len(f.split("/")[-1]) > 7))
+
++ log.info("kernelVersionList %s" % files)
+ return sorted(files, key=functools.cmp_to_key(versionCmp))
+
+ @property
+@@ -1097,12 +1100,13 @@ class PackagePayload(Payload):
+ sslverify = not (method.noverifyssl or flags.noverifyssl)
+ elif method.method == "cdrom" or (checkmount and not method.method):
+ # Did dracut leave the DVD or NFS mounted for us?
+- device = blivet.util.get_mount_device(DRACUT_REPODIR)
++ device = blivet.util.get_mount_device(MOUNT_DIR)
+
+ # Check for valid optical media if we didn't boot from one
+- if not verifyMedia(DRACUT_REPODIR):
++ if not verifyMedia(MOUNT_DIR):
+ self.install_device = opticalInstallMedia(storage.devicetree)
+
++ log.info("device %s, install_device %s" % (device, self.install_device))
+ # Only look at the dracut mount if we don't already have a cdrom
+ if device and not self.install_device:
+ self.install_device = storage.devicetree.get_device_by_path(device)
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0008-dnfpayload.py-customize-for-WRLinux.patch b/meta-installer/recipes-installer/anaconda/files/0008-dnfpayload.py-customize-for-WRLinux.patch
new file mode 100644
index 0000000..cccc2c5
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0008-dnfpayload.py-customize-for-WRLinux.patch
@@ -0,0 +1,597 @@
+From b975f1e037d87f068fcf21517a74665b02ad3988 Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Thu, 18 May 2017 15:23:24 +0800
+Subject: [PATCH 08/65] dnfpayload.py: customize for WRLinux
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/payload/dnfpayload.py | 366 ++++++++++++++++++++++++++++++---------
+ 1 file changed, 285 insertions(+), 81 deletions(-)
+
+diff --git a/pyanaconda/payload/dnfpayload.py b/pyanaconda/payload/dnfpayload.py
+index 6d196e2..8cad37b 100644
+--- a/pyanaconda/payload/dnfpayload.py
++++ b/pyanaconda/payload/dnfpayload.py
+@@ -18,6 +18,7 @@
+ # Red Hat, Inc.
+ #
+ import os
++import os.path
+
+ from blivet.size import Size
+ from pykickstart.constants import GROUP_ALL, GROUP_DEFAULT, KS_MISSING_IGNORE
+@@ -44,7 +45,13 @@ import sys
+ import time
+ import threading
+ from requests.exceptions import RequestException
++import inspect
++import collections
+
++if __name__ == "__main__":
++ from pyanaconda import anaconda_log
++ anaconda_log.init()
++ anaconda_log.logger.setupVirtio()
+ log = logging.getLogger("packaging")
+
+ import dnf
+@@ -54,6 +61,7 @@ import dnf.repo
+ import dnf.callback
+ import dnf.conf.parser
+ import dnf.conf.substitutions
++import dnf.const
+ import rpm
+ import librepo
+
+@@ -225,7 +233,18 @@ class PayloadRPMDisplay(dnf.callback.TransactionProgress):
+ """Report an error that occurred during the transaction. Message is a
+ string which describes the error.
+ """
+- self._queue.put(('error', message))
++ token = "error"
++ if message.startswith("Non-fatal"):
++ token = "warn"
++ self._queue.put((token, message))
++ log.info("error: %s" % message)
++
++ def scriptout(self, msgs):
++ if msgs is None:
++ return
++
++ log.info("scriptout: %s" % msgs)
++
+
+
+ class DownloadProgress(dnf.callback.DownloadProgress):
+@@ -294,6 +313,14 @@ class DNFPayload(payload.PackagePayload):
+ self._updates_enabled = True
+ self._configure()
+
++ self.requiredPackages += ['base-files', 'base-passwd', 'shadow']
++ # Support grub-mkconfig
++ self.requiredPackages += ['sed', 'coreutils', 'busybox']
++ # The extra packages make sure lvm initramfs generation
++ #self.requiredPackages += ['ldd', 'gzip', 'iputils']
++ # Support create new user
++ self.requiredPackages += ['shadow']
++
+ # Protect access to _base.repos to ensure that the dictionary is not
+ # modified while another thread is attempting to iterate over it. The
+ # lock only needs to be held during operations that change the number
+@@ -303,12 +330,26 @@ class DNFPayload(payload.PackagePayload):
+ # save repomd metadata
+ self._repoMD_list = []
+
++ # WRlinux specific
++ self.image = {}
++ self.tasks = {}
++
++ def setup(self, storage, instClass):
++ log.info("%s %s" % (self.__class__.__name__, inspect.stack()[0][3]))
++
++ self.image, self.tasks = instClass.read_buildstamp()
++ super(DNFPayload, self).setup(storage, instClass)
++
+ def unsetup(self):
+ super(DNFPayload, self).unsetup()
+ self._base = None
+ self._configure()
+ self._repoMD_list = []
+
++ # WRlinux specific
++ self.image = {}
++ self.tasks = {}
++
+ def _replace_vars(self, url):
+ """Replace url variables with their values.
+
+@@ -405,21 +446,12 @@ class DNFPayload(payload.PackagePayload):
+ super(DNFPayload, self).addRepo(ksrepo)
+
+ def _apply_selections(self):
+- if self.data.packages.nocore:
+- log.info("skipping core group due to %%packages --nocore; system may not be complete")
+- else:
+- try:
+- self._select_group('core', required=True)
+- log.info("selected group: core")
+- except payload.NoSuchGroup as e:
+- self._miss(e)
+-
+ env = None
+
+- if self.data.packages.default and self.environments:
+- env = self.environments[0]
+- elif self.data.packages.environment:
++ if self.data.packages.environment:
+ env = self.data.packages.environment
++ elif self.environments:
++ env = self.environments[0]
+
+ excludedGroups = [group.name for group in self.data.packages.excludedGroupList]
+
+@@ -461,7 +493,7 @@ class DNFPayload(payload.PackagePayload):
+ except payload.NoSuchPackage as e:
+ self._miss(e)
+
+- for group in self.requiredGroups:
++ for group in self.requiredGroups or []:
+ try:
+ self._select_group(group, required=True)
+ log.debug("selected required group: %s", group)
+@@ -497,6 +529,33 @@ class DNFPayload(payload.PackagePayload):
+ conf.proxy_username = None
+ conf.proxy_password = None
+
++ def _oe_configure(self, dnf_conf):
++ # Refers oe-core's recipes of dnf and rpm
++ os.environ['RPM_NO_CHROOT_FOR_SCRIPTS'] = "1"
++
++ # Refers oe-core's meta/lib/oe/package_manager.py
++ # def _prepare_pkg_transaction(self) in class RpmPM(PackageManager)
++ target_rootfs = pyanaconda.iutil.getSysroot()
++ os.environ['D'] = target_rootfs
++ os.environ['OFFLINE_ROOT'] = target_rootfs
++ os.environ['IPKG_OFFLINE_ROOT'] = target_rootfs
++ os.environ['OPKG_OFFLINE_ROOT'] = target_rootfs
++
++ # Refer oe-core's meta/lib/oe/package_manager.py
++ # def _configure_dnf(self) in class RpmPM(PackageManager)
++ # directly read its result from installer system
++ dnf_conf.substitutions['arch'] = open("/etc/dnf/vars/arch", "r").readline()
++
++ def _oe_configure_post(self):
++ # Refers oe-core's meta/lib/oe/package_manager.py
++ # def _configure_rpm(self) and def _configure_dnf(self)
++ # in class RpmPM(PackageManager)
++ # directly copy its result from installer system
++ target_sysconf = "%s/etc" % pyanaconda.iutil.getSysroot()
++ pyanaconda.iutil.execWithRedirect("cp", ["-fr", "/etc/rpmrc", target_sysconf])
++ pyanaconda.iutil.execWithRedirect("cp", ["-rf", "/etc/dnf", target_sysconf])
++ pyanaconda.iutil.execWithRedirect("cp", ["-rf", "/etc/rpm", target_sysconf])
++
+ def _configure(self):
+ self._base = dnf.Base()
+ conf = self._base.conf
+@@ -508,12 +567,17 @@ class DNFPayload(payload.PackagePayload):
+ conf.installroot = pyanaconda.iutil.getSysroot()
+ conf.prepend_installroot('persistdir')
+
++ self._oe_configure(conf)
++
+ self._base.conf.substitutions.update_from_etc(conf.installroot)
+
+ # NSS won't survive the forking we do to shield out chroot during
+ # transaction, disable it in RPM:
+ conf.tsflags.append('nocrypto')
+
++ conf.errorlevel = dnf.const.VERBOSE_LEVEL
++ conf.debuglevel = dnf.const.VERBOSE_LEVEL
++
+ if self.data.packages.multiLib:
+ conf.multilib_policy = "all"
+
+@@ -551,9 +615,9 @@ class DNFPayload(payload.PackagePayload):
+ # reserve extra
+ return Size(size) + Size("150 MB")
+
+- def _install_package(self, pkg_name, required=False):
++ def _install_package(self, pkg_name, required=False, strict=True):
+ try:
+- return self._base.install(pkg_name)
++ return self._base.install(pkg_name, strict=strict)
+ except dnf.exceptions.MarkingError:
+ raise payload.NoSuchPackage(pkg_name, required=required)
+
+@@ -589,25 +653,47 @@ class DNFPayload(payload.PackagePayload):
+ return pkgdir
+
+ def _select_group(self, group_id, default=True, optional=False, required=False):
+- grp = self._base.comps.group_by_pattern(group_id)
+- if grp is None:
+- raise payload.NoSuchGroup(group_id, required=required)
+- types = {'mandatory'}
+- if default:
+- types.add('default')
+- if optional:
+- types.add('optional')
+- exclude = self.data.packages.excludedList
+- try:
+- self._base.group_install(grp.id, types, exclude=exclude)
+- except dnf.exceptions.MarkingError as e:
+- # dnf-1.1.9 raises this error when a package is missing from a group
+- raise payload.NoSuchPackage(str(e), required=True)
+- except dnf.exceptions.CompsError as e:
+- # DNF raises this when it is already selected
+- log.debug(e)
++ log.info("_select_group %s" % group_id)
++ if not group_id:
++ return
++
++ glob = self._complementary_glob(group_id)
++
++ # get all available languages in repos
++ available_packs = self._base.sack.query().available() \
++ .filter(name__glob = "*-%s"%glob)
++ allpkgnames = [p.name for p in available_packs]
++ log.info("allpkgnames %d" % len(allpkgnames))
++ for pkgname in allpkgnames:
++ self._install_package(pkgname, strict=False)
++
++ def _select_linguas(self, image_linguas):
++ lc_globs = []
++ for ling in image_linguas.split():
++ if ling not in lc_globs:
++ lc_globs.append(ling)
++
++ baselang = ling.split('-')[0]
++ if ling != baselang and baselang not in lc_globs:
++ lc_globs.append(baselang)
++
++ log.info("lc_globs: %s" % lc_globs)
++ for glob in lc_globs:
++ self._select_group("locale-%s" % glob)
+
+ def _select_environment(self, env_id, excluded):
++ (image_name, description) = self.environmentDescription(env_id)
++ log.info("image_name %s, des %s" % (image_name, description))
++ image_id = image_name.split()[0]
++ (image_summary, image_description, package_install, package_install_attemptonly, image_linguas) = self.image[image_id]
++ log.info("package_install %s, attempt %s, linguas %s" %
++ (package_install, package_install_attemptonly, image_linguas))
++
++ for pkg in package_install.split():
++ self.requiredPackages.append(pkg)
++
++ self._select_linguas(image_linguas)
++
+ # dnf.base.environment_install excludes on packages instead of groups,
+ # which is unhelpful. Instead, use group_install for each group in
+ # the environment so we can skip the ones that are excluded.
+@@ -655,20 +741,25 @@ class DNFPayload(payload.PackagePayload):
+ def baseRepo(self):
+ # is any locking needed here?
+ repo_names = [constants.BASE_REPO_NAME] + self.DEFAULT_REPOS
++ log.info("repo_names %s" % repo_names)
+ with self._repos_lock:
+ for repo in self._base.repos.iter_enabled():
++ log.info("repo.id %s" % repo.id)
+ if repo.id in repo_names:
+ return repo.id
+ return None
+
+ @property
+ def environments(self):
+- return [env.id for env in self._base.comps.environments]
++ """ List of environment ids. """
++ log.info("%s %s: %s" % (self.__class__.__name__, inspect.stack()[0][3], self.tasks.keys()))
++ return sorted(self.tasks.keys())
+
+ @property
+ def groups(self):
+- groups = self._base.comps.groups_iter()
+- return [g.id for g in groups]
++ """ List of group ids. """
++ log.info("%s %s" % (self.__class__.__name__, inspect.stack()[0][3]))
++ return sorted(self.tasks.keys())
+
+ @property
+ def mirrorEnabled(self):
+@@ -738,7 +829,7 @@ class DNFPayload(payload.PackagePayload):
+ return grp.visible
+
+ def _groupHasInstallableMembers(self, grpid):
+- return True
++ return False
+
+ def checkSoftwareSelection(self):
+ log.info("checking software selection")
+@@ -792,50 +883,49 @@ class DNFPayload(payload.PackagePayload):
+ super(DNFPayload, self).enableRepo(repo_id)
+
+ def environmentDescription(self, environmentid):
+- env = self._base.comps.environment_by_pattern(environmentid)
+- if env is None:
+- raise payload.NoSuchGroup(environmentid)
+- return (env.ui_name, env.ui_description)
++ log.info("%s %s, %s" % (self.__class__.__name__, inspect.stack()[0][3], environmentid))
++
++ if environmentid not in self.tasks:
++ raise NoSuchGroup(environmentid)
++
++ if environmentid in self.tasks:
++ log.info("environmentDescription %s" % self.tasks)
++ (name, description, group) = self.tasks[environmentid]
++
++ return (name, description)
++ return (environmentid, environmentid)
+
+ def environmentId(self, environment):
+ """Return environment id for the environment specified by id or name."""
+- env = self._base.comps.environment_by_pattern(environment)
+- if env is None:
+- raise payload.NoSuchGroup(environment)
+- return env.id
++ log.info("%s %s, environment %s" % (self.__class__.__name__, inspect.stack()[0][3], environment))
++ # TODO
++ return environment
+
+ def environmentGroups(self, environmentid, optional=True):
+- env = self._base.comps.environment_by_pattern(environmentid)
+- if env is None:
+- raise payload.NoSuchGroup(environmentid)
+- group_ids = (id_.name for id_ in env.group_ids)
+- option_ids = (id_.name for id_ in env.option_ids)
+- if optional:
+- return list(itertools.chain(group_ids, option_ids))
+- else:
+- return list(group_ids)
++ log.info("%s %s, %s" % (self.__class__.__name__, inspect.stack()[0][3], environmentid))
++
++ if environmentid in self.tasks:
++ log.info("environmentDescription %s" % self.tasks)
++ (name, description, groups) = self.tasks[environmentid]
++
++ return groups.split()
++ return [environmentid]
+
+ def environmentHasOption(self, environmentid, grpid):
+- env = self._base.comps.environment_by_pattern(environmentid)
+- if env is None:
+- raise payload.NoSuchGroup(environmentid)
+- return grpid in (id_.name for id_ in env.option_ids)
++ log.info("%s %s, %s, %s" % (self.__class__.__name__, inspect.stack()[0][3], environmentid, grpid))
++ # TODO
++ return True
+
+ def environmentOptionIsDefault(self, environmentid, grpid):
+- env = self._base.comps.environment_by_pattern(environmentid)
+- if env is None:
+- raise payload.NoSuchGroup(environmentid)
+-
+- # Look for a group in the optionlist that matches the group_id and has
+- # default set
+- return any(grp for grp in env.option_ids if grp.name == grpid and grp.default)
++ log.info("%s %s, %s, %s" % (self.__class__.__name__, inspect.stack()[0][3], environmentid, grpid))
++ # TODO
++ return True
+
+ def groupDescription(self, grpid):
+ """Return name/description tuple for the group specified by id."""
+- grp = self._base.comps.group_by_pattern(grpid)
+- if grp is None:
+- raise payload.NoSuchGroup(grpid)
+- return (grp.ui_name, grp.ui_description)
++ log.info("%s %s, %s" % (self.__class__.__name__, inspect.stack()[0][3], grpid))
++ (name, description, group) = self.tasks[grpid]
++ return (name, description)
+
+ def groupId(self, group_name):
+ """Translate group name to group ID.
+@@ -858,6 +948,31 @@ class DNFPayload(payload.PackagePayload):
+ self._base.read_comps()
+ self._refreshEnvironmentAddons()
+
++ # Refer upstream oe-core meta/lib/oe/package_manager.py
++ def _save_rpmpostinst(self, pkg):
++ def _script_num_prefix(path):
++ files = os.listdir(path)
++ numbers = set()
++ numbers.add(99)
++ for f in files:
++ numbers.add(int(f.split("-")[0]))
++ return max(numbers) + 1
++
++ log.info("Saving postinstall script of %s" % (pkg))
++
++ target_rootfs = pyanaconda.iutil.getSysroot()
++ args = ["-q", "--root=%s" % target_rootfs, "--queryformat", "%{postin}", pkg]
++
++ output = pyanaconda.iutil.execWithCapture('rpm', args, log_output=False)
++ log.info(output)
++
++ target_path = "%s/etc/rpm-postinsts" % target_rootfs
++ pyanaconda.iutil.execWithRedirect("mkdir", ["-p", target_path])
++ num = _script_num_prefix(target_path)
++ saved_script_name = os.path.join(target_path, "%d-%s" % (num, pkg))
++ open(saved_script_name, 'w').write(output)
++ os.chmod(saved_script_name, 0o755)
++
+ def install(self):
+ progress_message(N_('Starting package installation process'))
+
+@@ -889,6 +1004,7 @@ class DNFPayload(payload.PackagePayload):
+ _failure_limbo()
+
+ log.info('Downloading packages finished.')
++ failed_scriptlets_pkgnames = collections.OrderedDict()
+
+ pre_msg = (N_("Preparing transaction from installation source"))
+ progress_message(pre_msg)
+@@ -921,6 +1037,9 @@ class DNFPayload(payload.PackagePayload):
+ elif token == 'quit':
+ msg = ("Payload error - DNF installation has ended up abruptly: %s" % msg)
+ raise payload.PayloadError(msg)
++ elif token == 'warn':
++ if msg.startswith("Non-fatal POSTIN scriptlet failure in rpm package"):
++ failed_scriptlets_pkgnames[msg.split()[-1]] = True
+ elif token == 'error':
+ exc = payload.PayloadInstallError("DNF error: %s" % msg)
+ if errors.errorHandler.cb(exc) == errors.ERROR_RAISE:
+@@ -929,7 +1048,12 @@ class DNFPayload(payload.PackagePayload):
+ (token, msg) = queue_instance.get()
+
+ process.join()
++
+ self._base.close()
++
++ for pkg in failed_scriptlets_pkgnames.keys():
++ self._save_rpmpostinst(pkg)
++
+ if os.path.exists(self._download_location):
+ log.info("Cleaning up downloaded packages: %s", self._download_location)
+ shutil.rmtree(self._download_location)
+@@ -940,6 +1064,39 @@ class DNFPayload(payload.PackagePayload):
+ # we don't have to care about clearing the download location ourselves.
+ log.warning("Can't delete nonexistent download location: %s", self._download_location)
+
++ def _list_installed(self):
++ output = pyanaconda.iutil.execWithCapture(
++ 'dnf',
++ [
++ 'repoquery',
++ '--installed',
++ '--installroot='+pyanaconda.iutil.getSysroot(),
++ '--queryformat=Package:%{name}'
++ ],
++ log_output=False
++ )
++ output = output.rstrip()
++ lines = output.splitlines()
++ installed = []
++ for line in lines:
++ if not line.startswith("Package:"):
++ continue
++ installed.append(line.replace("Package:", ""))
++ return installed
++
++ def _complementary_glob(self, group):
++ complementary_glob = {}
++ complementary_glob['dev-pkgs'] = 'dev'
++ complementary_glob['staticdev-pkgs'] = 'staticdev'
++ complementary_glob['doc-pkgs'] = 'doc'
++ complementary_glob['dbg-pkgs'] = 'dbg'
++ complementary_glob['ptest-pkgs'] = 'ptest'
++
++ if group in complementary_glob:
++ return complementary_glob[group]
++
++ return group
++
+ def getRepo(self, repo_id):
+ """Return the yum repo object."""
+ return self._base.repos[repo_id]
+@@ -959,16 +1116,7 @@ class DNFPayload(payload.PackagePayload):
+ return True
+
+ def languageGroups(self):
+- locales = [self.data.lang.lang] + self.data.lang.addsupport
+- match_fn = pyanaconda.localization.langcode_matches_locale
+- gids = set()
+- gl_tuples = ((g.id, g.lang_only) for g in self._base.comps.groups_iter())
+- for (gid, lang) in gl_tuples:
+- for locale in locales:
+- if match_fn(lang, locale):
+- gids.add(gid)
+- log.info('languageGroups: %s', gids)
+- return list(gids)
++ return []
+
+ def preInstall(self, packages=None, groups=None):
+ super(DNFPayload, self).preInstall(packages, groups)
+@@ -986,12 +1134,12 @@ class DNFPayload(payload.PackagePayload):
+ self._repoMD_list = []
+
+ def updateBaseRepo(self, fallback=True, checkmount=True):
+- log.info('configuring base repo')
+ self.reset()
+ url, mirrorlist, sslverify = self._setupInstallDevice(self.storage,
+ checkmount)
+ method = self.data.method
+-
++ log.info('configuring base repo: url %s, mirrorlist %s, sslverify %s, method %s'
++ % (url, mirrorlist, sslverify, method.method))
+ # Read in all the repos from the installation environment, make a note of which
+ # are enabled, and then disable them all. If the user gave us a method, we want
+ # to use that instead of the default repos.
+@@ -1161,6 +1309,17 @@ class DNFPayload(payload.PackagePayload):
+
+ super(DNFPayload, self).postInstall()
+
++ self._oe_configure_post()
++
++ # For the generation of anaconda-ks.cfg
++ for pkg in self._list_installed():
++ if pkg not in self.data.packages.packageList:
++ self.data.packages.packageList.append(pkg)
++
++ pyanaconda.iutil.execWithRedirect("depmod",
++ ["-a"],
++ root=pyanaconda.iutil.getSysroot())
++
+ def writeStorageLate(self):
+ pass
+
+@@ -1234,3 +1393,48 @@ class RepoMDMetaHash(object):
+ log.debug("Can't download new repomd.xml from %s. Error: %s", url, e)
+
+ return repomd
++
++
++# For testing
++if __name__ == "__main__":
++ log.info("God bless us")
++
++ from pykickstart.version import makeVersion
++
++ # set up ksdata
++ ksdata = makeVersion()
++
++ ksdata.method.method = "cdrom"
++
++ from pyanaconda.installclass import DefaultInstall
++ instClass = DefaultInstall()
++
++ import blivet
++ storage = blivet.Blivet(ksdata=ksdata)
++ storage.set_default_fstype("ext4")
++
++ _payload = DNFPayload(ksdata)
++
++ _payload.setup(storage, instClass)
++
++ # Keep setting up package-based repositories
++ # Download package metadata
++ try:
++ _payload.updateBaseRepo(fallback=False, checkmount=True)
++ except payload.PayloadError as e:
++ log.error("PayloadError: %s", e)
++ _payload.unsetup()
++ exit(0)
++
++ # Gather the group data
++ _payload.gatherRepoMetadata()
++ _payload.release()
++ _payload.addDriverRepos()
++
++ log.info("baseRepo %s" % _payload.baseRepo)
++
++ _payload.preInstall()
++
++ _payload.install()
++
++ _payload.postInstall()
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0009-Remove-unnecessary-noverifyssl-for-http-ftp-protocol.patch b/meta-installer/recipes-installer/anaconda/files/0009-Remove-unnecessary-noverifyssl-for-http-ftp-protocol.patch
new file mode 100644
index 0000000..72c92d9
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0009-Remove-unnecessary-noverifyssl-for-http-ftp-protocol.patch
@@ -0,0 +1,32 @@
+From cb5140f12ba1dbe2f67f5f47eddaecc1b54790ed Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Fri, 19 May 2017 14:03:54 +0800
+Subject: [PATCH 09/65] Remove unnecessary --noverifyssl for http/ftp protocol
+
+We set --noverifyssl by default, but it makes sense for https only
+
+Upstream-Status: Pending
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/install.py | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/pyanaconda/install.py b/pyanaconda/install.py
+index 224ef8f..929b89d 100644
+--- a/pyanaconda/install.py
++++ b/pyanaconda/install.py
+@@ -68,6 +68,10 @@ def _writeKS(ksdata):
+ ksdata.partition.dataList() + ksdata.raid.dataList():
+ obj.passphrase = ""
+
++ # The true of '--noverifyssl' makes sense for https only
++ if ksdata.method.method == "url" and not ksdata.method.url.startswith("https://"):
++ ksdata.method.noverifyssl = False
++
+ # Make it so only root can read - could have passwords
+ with iutil.open_with_perm(path, "w", 0o600) as f:
+ f.write(str(ksdata))
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0010-dynamic-detect-workable-locale.patch b/meta-installer/recipes-installer/anaconda/files/0010-dynamic-detect-workable-locale.patch
new file mode 100644
index 0000000..52bfbd0
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0010-dynamic-detect-workable-locale.patch
@@ -0,0 +1,77 @@
+From 7cd183175a63c48fcdc6c3f87a3aa18d4f925460 Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Fri, 19 May 2017 14:36:30 +0800
+Subject: [PATCH 10/65] dynamic detect workable locale
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/localization.py | 18 +++++++++++++++++-
+ pyanaconda/ui/gui/spokes/lib/lang_locale_handler.py | 3 +++
+ pyanaconda/ui/tui/spokes/langsupport.py | 2 +-
+ 3 files changed, 21 insertions(+), 2 deletions(-)
+
+diff --git a/pyanaconda/localization.py b/pyanaconda/localization.py
+index 5c9054c..3fa1a91 100644
+--- a/pyanaconda/localization.py
++++ b/pyanaconda/localization.py
+@@ -28,7 +28,7 @@ import sys
+ import io
+
+ from pyanaconda import constants
+-from pyanaconda.iutil import upcase_first_letter, setenv, execWithRedirect
++from pyanaconda.iutil import upcase_first_letter, setenv, execWithRedirect, execReadlines
+
+ import logging
+ log = logging.getLogger("anaconda")
+@@ -770,3 +770,19 @@ def setup_locale_environment(locale=None, text_mode=False, prefer_environment=Fa
+ for varname in ("LANGUAGE", "LC_ALL", "LC_MESSAGES"):
+ if varname in os.environ:
+ del os.environ[varname]
++
++_all_locales = []
++def list_all_locales():
++ global _all_locales
++
++ if _all_locales == []:
++ for lang in execReadlines("locale", ["-a"]):
++ parts= parse_langcode(lang)
++ locales = langtable.list_locales(languageId=parts["language"],
++ territoryId=parts.get("territory", ""),
++ scriptId=parts.get("script", ""))
++ _all_locales += locales
++
++ log.info("all locales: %s" % _all_locales)
++
++ return _all_locales
+diff --git a/pyanaconda/ui/gui/spokes/lib/lang_locale_handler.py b/pyanaconda/ui/gui/spokes/lib/lang_locale_handler.py
+index 9061350..2903b9b 100644
+--- a/pyanaconda/ui/gui/spokes/lib/lang_locale_handler.py
++++ b/pyanaconda/ui/gui/spokes/lib/lang_locale_handler.py
+@@ -154,6 +154,9 @@ class LangLocaleHandler(object):
+ self._localeStore.clear()
+ locales = localization.get_language_locales(lang)
+ for locale in locales:
++ if locale not in localization.list_all_locales():
++ continue
++
+ self._add_locale(self._localeStore,
+ localization.get_native_name(locale),
+ locale)
+diff --git a/pyanaconda/ui/tui/spokes/langsupport.py b/pyanaconda/ui/tui/spokes/langsupport.py
+index 96c02ea..abfe25a 100644
+--- a/pyanaconda/ui/tui/spokes/langsupport.py
++++ b/pyanaconda/ui/tui/spokes/langsupport.py
+@@ -83,7 +83,7 @@ class LangSpoke(FirstbootSpokeMixIn, NormalTUISpoke):
+
+ if args:
+ self._window += [TextWidget(_("Available locales"))]
+- displayed = [TextWidget(localization.get_english_name(z)) for z in args]
++ displayed = [TextWidget(localization.get_english_name(z)) for z in args if z in localization.list_all_locales()]
+ else:
+ self._window += [TextWidget(_("Available languages"))]
+ displayed = [TextWidget(z) for z in self._langs]
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0011-improve-thread-monitor.patch b/meta-installer/recipes-installer/anaconda/files/0011-improve-thread-monitor.patch
new file mode 100644
index 0000000..db79cc8
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0011-improve-thread-monitor.patch
@@ -0,0 +1,55 @@
+From 3ea4a87110523bea46212590b2875f8f0683687d Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Fri, 19 May 2017 14:43:24 +0800
+Subject: [PATCH 11/65] improve thread monitor
+
+Set thread name, it is easy to monitor thread status by ps
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/threads.py | 13 +++++++++++++
+ 1 file changed, 13 insertions(+)
+
+diff --git a/pyanaconda/threads.py b/pyanaconda/threads.py
+index b3fe610..bce389c 100644
+--- a/pyanaconda/threads.py
++++ b/pyanaconda/threads.py
+@@ -21,6 +21,8 @@ import logging
+ log = logging.getLogger("anaconda")
+
+ import threading
++import prctl
++from functools import wraps
+
+ _WORKER_THREAD_PREFIX = "AnaWorkerThread"
+
+@@ -223,6 +225,14 @@ class AnacondaThread(threading.Thread):
+ _prefix_thread_counts = dict()
+
+ def __init__(self, *args, **kwargs):
++ def set_thread_name(target):
++ @wraps(target)
++ def inner_target(*args, **kwargs):
++ prctl.set_name(self.name)
++ return target(*args, **kwargs)
++
++ return inner_target
++
+ # if neither name nor prefix is given, use the worker prefix
+ if "name" not in kwargs and "prefix" not in kwargs:
+ kwargs["prefix"] = _WORKER_THREAD_PREFIX
+@@ -234,6 +244,9 @@ class AnacondaThread(threading.Thread):
+ self._prefix_thread_counts[prefix] = thread_num
+ kwargs["name"] = prefix + str(thread_num)
+
++ if "target" in kwargs:
++ kwargs["target"] = set_thread_name(kwargs["target"])
++
+ if "fatal" in kwargs:
+ self._fatal = kwargs.pop("fatal")
+ else:
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0012-disable-audit.patch b/meta-installer/recipes-installer/anaconda/files/0012-disable-audit.patch
new file mode 100644
index 0000000..8c0b704
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0012-disable-audit.patch
@@ -0,0 +1,64 @@
+From b9b8bae1021093b9593367a1672fc54a2eb23d2d Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Tue, 18 Jul 2017 02:39:14 -0400
+Subject: [PATCH 12/65] disable audit
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ anaconda.py | 7 -------
+ configure.ac | 3 ---
+ pyanaconda/isys/Makefile.am | 6 ------
+ 3 files changed, 16 deletions(-)
+
+diff --git a/anaconda.py b/anaconda.py
+index 25f227c..ad7bf6b 100755
+--- a/anaconda.py
++++ b/anaconda.py
+@@ -467,13 +467,6 @@ if __name__ == "__main__":
+
+ sys.excepthook = _earlyExceptionHandler
+
+- if can_touch_runtime_system("start audit daemon"):
+- # auditd will turn into a daemon and exit. Ignore startup errors
+- try:
+- iutil.execWithRedirect("/sbin/auditd", [])
+- except OSError:
+- pass
+-
+ log.info("anaconda called with cmdline = %s", sys.argv)
+ log.info("Default encoding = %s ", sys.getdefaultencoding())
+
+diff --git a/configure.ac b/configure.ac
+index 1237f76..a946770 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -68,9 +68,6 @@ AC_CHECK_FUNCS([getcwd memset mkdir strchr strdup],
+ [],
+ [ANACONDA_SOFT_FAILURE([Function $ac_func not found.])])
+
+-AC_CHECK_LIB([audit], [audit_open], [:],
+- [ANACONDA_SOFT_FAILURE([libaudit not found])])
+-
+ AM_PATH_PYTHON(python_required_version)
+
+ # Check for the python extension paths
+diff --git a/pyanaconda/isys/Makefile.am b/pyanaconda/isys/Makefile.am
+index 3318eb8..227deda 100644
+--- a/pyanaconda/isys/Makefile.am
++++ b/pyanaconda/isys/Makefile.am
+@@ -28,10 +28,4 @@ _isys_la_LDFLAGS = -module -avoid-version
+ _isys_la_LIBADD = $(PYTHON3_LIBS)
+ _isys_la_SOURCES = isys.c
+
+-auditddir = $(libexecdir)/$(PACKAGE_NAME)
+-auditd_PROGRAMS = auditd
+-auditd_SOURCES = auditd.c
+-auditd_CFLAGS = $(SELINUX_CFLAGS)
+-auditd_LDFLAGS = -laudit
+-
+ MAINTAINERCLEANFILES = Makefile.in
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0013-bootloader.py-Change-grub2-settings-to-match-oe-core.patch b/meta-installer/recipes-installer/anaconda/files/0013-bootloader.py-Change-grub2-settings-to-match-oe-core.patch
new file mode 100644
index 0000000..7f4142d
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0013-bootloader.py-Change-grub2-settings-to-match-oe-core.patch
@@ -0,0 +1,137 @@
+From 80f24da9a6a564f642ce2e4badd8d78515f4914e Mon Sep 17 00:00:00 2001
+From: Mark Hatle <mark.hatle at windriver.com>
+Date: Fri, 19 May 2017 15:30:43 +0800
+Subject: [PATCH 13/65] bootloader.py: Change 'grub2' settings to match oe-core
+
+There is no 'grub2' package in oe-core, it's called 'grub'. Adjust settings
+to match this naming. Also before writing out a variety of configuration
+files, as necessary -- create the directories required.
+
+Signed-off-by: Mark Hatle <mark.hatle at windriver.com>
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/bootloader.py | 39 +++++++++++++++++++++++++++++++++------
+ 1 file changed, 33 insertions(+), 6 deletions(-)
+
+diff --git a/pyanaconda/bootloader.py b/pyanaconda/bootloader.py
+index 339cc2f..3c8ae40 100644
+--- a/pyanaconda/bootloader.py
++++ b/pyanaconda/bootloader.py
+@@ -944,6 +944,10 @@ class BootLoader(object):
+ raise BootLoaderError("no config file defined for this boot loader")
+
+ config_path = os.path.normpath(iutil.getSysroot() + self.config_file)
++ config_dir = os.path.dirname(config_path)
++ if not os.path.isdir(config_dir):
++ os.mkdir(config_dir, 755)
++
+ if os.access(config_path, os.R_OK):
+ os.rename(config_path, config_path + ".anacbak")
+
+@@ -1214,6 +1218,11 @@ class GRUB(BootLoader):
+ def write_device_map(self):
+ """ Write out a device map containing all supported devices. """
+ map_path = os.path.normpath(iutil.getSysroot() + self.device_map_file)
++
++ map_dir = os.path.dirname(map_path)
++ if not os.path.isdir(map_dir):
++ os.mkdir(map_dir, 755)
++
+ if os.access(map_path, os.R_OK):
+ os.rename(map_path, map_path + ".anacbak")
+
+@@ -1399,9 +1408,9 @@ class GRUB2(GRUB):
+
+ """
+ name = "GRUB2"
+- packages = ["grub2"]
++ packages = ["grub"]
+ _config_file = "grub.cfg"
+- _config_dir = "grub2"
++ _config_dir = "grub"
+ defaults_file = "/etc/default/grub"
+ terminal_type = "console"
+ stage2_max_end = None
+@@ -1460,6 +1469,11 @@ class GRUB2(GRUB):
+ def write_device_map(self):
+ """ Write out a device map containing all supported devices. """
+ map_path = os.path.normpath(iutil.getSysroot() + self.device_map_file)
++
++ map_dir = os.path.dirname(map_path)
++ if not os.path.isdir(map_dir):
++ os.mkdir(map_dir, 755)
++
+ if os.access(map_path, os.R_OK):
+ os.rename(map_path, map_path + ".anacbak")
+
+@@ -1485,6 +1499,11 @@ class GRUB2(GRUB):
+
+ def write_defaults(self):
+ defaults_file = "%s%s" % (iutil.getSysroot(), self.defaults_file)
++
++ defaults_dir = os.path.dirname(defaults_file)
++ if not os.path.isdir(defaults_dir):
++ os.mkdir(defaults_dir, 755)
++
+ defaults = open(defaults_file, "w+")
+ defaults.write("GRUB_TIMEOUT=%d\n" % self.timeout)
+ defaults.write("GRUB_DISTRIBUTOR=\"$(sed 's, release .*$,,g' /etc/system-release)\"\n")
+@@ -1517,7 +1536,7 @@ class GRUB2(GRUB):
+ passwords = "%s\n%s\n" % (self.password, self.password)
+ os.write(pwrite, passwords.encode("utf-8"))
+ os.close(pwrite)
+- buf = iutil.execWithCapture("grub2-mkpasswd-pbkdf2", [],
++ buf = iutil.execWithCapture("grub-mkpasswd-pbkdf2", [],
+ stdin=pread,
+ root=iutil.getSysroot())
+ os.close(pread)
+@@ -1530,6 +1549,11 @@ class GRUB2(GRUB):
+ return
+
+ users_file = iutil.getSysroot() + "/etc/grub.d/01_users"
++
++ users_dir = os.path.dirname(users_file)
++ if not os.path.isdir(users_dir):
++ os.mkdir(users_dir, 755)
++
+ header = iutil.open_with_perm(users_file, "w", 0o700)
+ header.write("#!/bin/sh -e\n\n")
+ header.write("cat << \"EOF\"\n")
+@@ -1567,12 +1591,12 @@ class GRUB2(GRUB):
+ log.warning("Failed to find default image (%s), defaulting to 0", self.default.label)
+ default_index = 0
+
+- rc = iutil.execInSysroot("grub2-set-default", [str(default_index)])
++ rc = iutil.execInSysroot("grub-set-default", [str(default_index)])
+ if rc:
+ log.error("failed to set default menu entry to %s", productName)
+
+ # now tell grub2 to generate the main configuration file
+- rc = iutil.execInSysroot("grub2-mkconfig",
++ rc = iutil.execInSysroot("grub-mkconfig",
+ ["-o", self.config_file])
+ if rc:
+ raise BootLoaderError("failed to write boot loader configuration")
+@@ -1599,7 +1623,7 @@ class GRUB2(GRUB):
+ else:
+ log.info("bootloader.py: mbr will be updated for grub2")
+
+- rc = iutil.execWithRedirect("grub2-install", grub_args,
++ rc = iutil.execWithRedirect("grub-install", grub_args,
+ root=iutil.getSysroot(),
+ env_prune=['MALLOC_PERTURB_'])
+ if rc:
+@@ -2407,6 +2431,9 @@ def writeSysconfigKernel(storage, version, instClass):
+
+ kernel = h.name.decode()
+
++ if not os.path.isdir(iutil.getSysroot() + "/etc/sysconfig"):
++ os.mkdir(iutil.getSysroot() + "/etc/sysconfig", 755)
++
+ f = open(iutil.getSysroot() + "/etc/sysconfig/kernel", "w+")
+ f.write("# UPDATEDEFAULT specifies if new-kernel-pkg should make\n"
+ "# new kernels the default\n")
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0014-tweak-detect-kernel-version.patch b/meta-installer/recipes-installer/anaconda/files/0014-tweak-detect-kernel-version.patch
new file mode 100644
index 0000000..ce2adef
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0014-tweak-detect-kernel-version.patch
@@ -0,0 +1,96 @@
+From 08cdf7e69a40c16e16b927ea1b58cbf33ab64d3d Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Fri, 19 May 2017 16:14:01 +0800
+Subject: [PATCH 14/65] tweak detect kernel version
+
+According kernel layout in oe-core, tweak the detection
+rather than using redhat's.
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/bootloader.py | 32 ++++++++++++++++++--------------
+ pyanaconda/payload/livepayload.py | 9 +++++++--
+ 2 files changed, 25 insertions(+), 16 deletions(-)
+
+diff --git a/pyanaconda/bootloader.py b/pyanaconda/bootloader.py
+index 3c8ae40..a8fc01f 100644
+--- a/pyanaconda/bootloader.py
++++ b/pyanaconda/bootloader.py
+@@ -2404,16 +2404,23 @@ def get_bootloader():
+
+ def writeSysconfigKernel(storage, version, instClass):
+ # get the name of the default kernel package based on the version
+- kernel_basename = "vmlinuz-" + version
+- kernel_file = "/boot/%s" % kernel_basename
+- if not os.path.isfile(iutil.getSysroot() + kernel_file):
+- efi_dir = instClass.efi_dir
+- if flags.cmdline.get("force_efi_dir") is not None:
+- efi_dir = flags.cmdline.get("force_efi_dir")
+- kernel_file = "/boot/efi/EFI/%s/%s" % (efi_dir, kernel_basename)
+- if not os.path.isfile(iutil.getSysroot() + kernel_file):
+- log.error("failed to recreate path to default kernel image")
+- return
++ for kernel_basename in ["vmlinux", "bzImage"]:
++ kernel_file = "/boot/%s" % kernel_basename
++ if os.path.isfile(iutil.getSysroot() + kernel_file):
++ break
++ else:
++ efi_dir = instClass.efi_dir
++ if flags.cmdline.get("force_efi_dir") is not None:
++ efi_dir = flags.cmdline.get("force_efi_dir")
++ kernel_file = "/boot/efi/EFI/%s/%s" % (efi_dir, kernel_basename)
++ if not os.path.isfile(iutil.getSysroot() + kernel_file):
++ break
++
++ kernel_file = None
++
++ if kernel_file is None:
++ log.error("failed to recreate path to default kernel image")
++ return
+
+ try:
+ import rpm
+@@ -2421,6 +2428,7 @@ def writeSysconfigKernel(storage, version, instClass):
+ log.error("failed to import rpm python module")
+ return
+
++ log.debug("kernel_file %s" % kernel_file)
+ ts = rpm.TransactionSet(iutil.getSysroot())
+ mi = ts.dbMatch('basenames', kernel_file)
+ try:
+@@ -2493,10 +2501,6 @@ def writeBootLoader(storage, payload, instClass, ksdata):
+ # add whatever rescue kernels we can find to the end
+ kernel_versions = list(payload.kernelVersionList)
+
+- rescue_versions = glob(iutil.getSysroot() + "/boot/vmlinuz-*-rescue-*")
+- rescue_versions += glob(iutil.getSysroot() + "/boot/efi/EFI/%s/vmlinuz-*-rescue-*" % instClass.efi_dir)
+- kernel_versions += (f.split("/")[-1][8:] for f in rescue_versions)
+-
+ if not kernel_versions:
+ log.warning("no kernel was installed -- boot loader config unchanged")
+ return
+diff --git a/pyanaconda/payload/livepayload.py b/pyanaconda/payload/livepayload.py
+index 632c798..1c41402 100644
+--- a/pyanaconda/payload/livepayload.py
++++ b/pyanaconda/payload/livepayload.py
+@@ -191,8 +191,13 @@ class LiveImagePayload(ImagePayload):
+ return Size(iutil.getDirSize("/") * 1024)
+
+ def _updateKernelVersionList(self):
+- files = glob.glob(INSTALL_TREE + "/boot/vmlinuz-*")
+- files.extend(glob.glob(INSTALL_TREE + "/boot/efi/EFI/%s/vmlinuz-*" % self.instclass.efi_dir))
++ for kernel in ["vmlinux", "bzImage"]:
++ files = glob.glob(INSTALL_TREE + "/boot/%s-*" % kernel)
++ files.extend(glob.glob(INSTALL_TREE + "/boot/efi/EFI/%s/%s-*" % (self.instclass.efi_dir, kernel)))
++ versions = sorted((f.split("/")[-1][8:] for f in files if os.path.isfile(f)))
++ if versions:
++ log.info("kernel versions: %s", versions)
++ break
+
+ self._kernelVersionList = sorted((f.split("/")[-1][8:] for f in files
+ if os.path.isfile(f) and "-rescue-" not in f), key=functools.cmp_to_key(versionCmp))
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0015-tweak-grub-config-file-for-WRLinux.patch b/meta-installer/recipes-installer/anaconda/files/0015-tweak-grub-config-file-for-WRLinux.patch
new file mode 100644
index 0000000..16a7c27
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0015-tweak-grub-config-file-for-WRLinux.patch
@@ -0,0 +1,28 @@
+From 9f516ae49d4ce95dc9054934733ee63eb8ba37bc Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Fri, 19 May 2017 16:22:20 +0800
+Subject: [PATCH 15/65] tweak grub config file for WRLinux
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/bootloader.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/pyanaconda/bootloader.py b/pyanaconda/bootloader.py
+index a8fc01f..2a91759 100644
+--- a/pyanaconda/bootloader.py
++++ b/pyanaconda/bootloader.py
+@@ -1506,7 +1506,7 @@ class GRUB2(GRUB):
+
+ defaults = open(defaults_file, "w+")
+ defaults.write("GRUB_TIMEOUT=%d\n" % self.timeout)
+- defaults.write("GRUB_DISTRIBUTOR=\"$(sed 's, release .*$,,g' /etc/system-release)\"\n")
++ defaults.write("GRUB_DISTRIBUTOR=\"%s\"\n" % productName)
+ defaults.write("GRUB_DEFAULT=saved\n")
+ defaults.write("GRUB_DISABLE_SUBMENU=true\n")
+ if self.console and self.has_serial_console:
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0016-Revert-Use-time.tzset-to-apply-timezone-changes-when.patch b/meta-installer/recipes-installer/anaconda/files/0016-Revert-Use-time.tzset-to-apply-timezone-changes-when.patch
new file mode 100644
index 0000000..21173b0
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0016-Revert-Use-time.tzset-to-apply-timezone-changes-when.patch
@@ -0,0 +1,66 @@
+From b61aa798c2ad66862f00fb185441d2595faa3149 Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Fri, 19 May 2017 16:43:39 +0800
+Subject: [PATCH 16/65] Revert "Use `time.tzset()` to apply timezone changes
+ when we can"
+
+This reverts commit 40adf6e3f8ce842c953f3376440dbd9bf8d8b303.
+
+The python3 in oe-core does not support time.tzset().
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/isys/__init__.py | 2 --
+ pyanaconda/ui/gui/spokes/datetime_spoke.py | 4 ----
+ 2 files changed, 6 deletions(-)
+
+diff --git a/pyanaconda/isys/__init__.py b/pyanaconda/isys/__init__.py
+index fe2a9ae..391a067 100644
+--- a/pyanaconda/isys/__init__.py
++++ b/pyanaconda/isys/__init__.py
+@@ -119,8 +119,6 @@ def set_system_date_time(year=None, month=None, day=None, hour=None, minute=None
+ if not tz:
+ tz = utc
+
+- time.tzset()
+-
+ # get the right values
+ now = datetime.datetime.now(tz)
+ year = year if year is not None else now.year
+diff --git a/pyanaconda/ui/gui/spokes/datetime_spoke.py b/pyanaconda/ui/gui/spokes/datetime_spoke.py
+index 9a63d65..c3eedbc 100644
+--- a/pyanaconda/ui/gui/spokes/datetime_spoke.py
++++ b/pyanaconda/ui/gui/spokes/datetime_spoke.py
+@@ -53,7 +53,6 @@ from pyanaconda.threads import threadMgr, AnacondaThread
+ import datetime
+ import re
+ import threading
+-import time
+ import locale as locale_mod
+ import functools
+
+@@ -621,7 +620,6 @@ class DatetimeSpoke(FirstbootSpokeMixIn, NormalSpoke):
+
+ if is_valid_timezone(self.data.timezone.timezone):
+ self._tzmap.set_timezone(self.data.timezone.timezone)
+- time.tzset()
+
+ self._update_datetime()
+
+@@ -1003,11 +1001,9 @@ class DatetimeSpoke(FirstbootSpokeMixIn, NormalSpoke):
+ offset = -float(city[3:])
+
+ 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()
+
+ # update "old" values
+ self._old_city = city
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0017-kickstart-Authconfig-Firewall-Firstboot-Timezone.patch b/meta-installer/recipes-installer/anaconda/files/0017-kickstart-Authconfig-Firewall-Firstboot-Timezone.patch
new file mode 100644
index 0000000..3554064
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0017-kickstart-Authconfig-Firewall-Firstboot-Timezone.patch
@@ -0,0 +1,216 @@
+From 471899dfb432b452566b1c7cd032a840597059fb Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Fri, 26 May 2017 14:09:17 +0800
+Subject: [PATCH 17/65] kickstart: Authconfig/Firewall/Firstboot/Timezone
+
+We do not support kickstart for now
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/kickstart.py | 162 +++---------------------------------------------
+ 1 file changed, 8 insertions(+), 154 deletions(-)
+
+diff --git a/pyanaconda/kickstart.py b/pyanaconda/kickstart.py
+index 470a12e..2210845 100644
+--- a/pyanaconda/kickstart.py
++++ b/pyanaconda/kickstart.py
+@@ -249,29 +249,10 @@ class Authconfig(commands.authconfig.FC3_Authconfig):
+ self.packages = []
+
+ def setup(self):
+- if self.seen:
+- self.packages = ["authconfig"]
++ pass
+
+ def execute(self, *args):
+- cmd = "/usr/sbin/authconfig"
+- if not os.path.lexists(iutil.getSysroot()+cmd):
+- if flags.automatedInstall and self.seen:
+- msg = _("%s is missing. Cannot setup authentication.") % cmd
+- raise KickstartError(msg)
+- else:
+- return
+-
+- args = ["--update", "--nostart"] + shlex.split(self.authconfig)
+-
+- if not flags.automatedInstall and \
+- (os.path.exists(iutil.getSysroot() + "/lib64/security/pam_fprintd.so") or
+- os.path.exists(iutil.getSysroot() + "/lib/security/pam_fprintd.so")):
+- args += ["--enablefingerprint"]
+-
+- try:
+- iutil.execInSysroot(cmd, args)
+- except RuntimeError as msg:
+- log.error("Error running %s %s: %s", cmd, args, msg)
++ pass
+
+ class AutoPart(commands.autopart.F26_AutoPart):
+ def parse(self, args):
+@@ -692,71 +673,17 @@ class Firewall(commands.firewall.F20_Firewall):
+ self.packages = []
+
+ def setup(self):
+- if self.seen:
+- self.packages = ["firewalld"]
++ pass
+
+ def execute(self, storage, ksdata, instClass):
+- args = []
+- # enabled is None if neither --enable or --disable is passed
+- # default to enabled if nothing has been set.
+- if self.enabled == False:
+- args += ["--disabled"]
+- else:
+- args += ["--enabled"]
+-
+- if "ssh" not in self.services and "ssh" not in self.remove_services and "22:tcp" not in self.ports:
+- args += ["--service=ssh"]
+-
+- for dev in self.trusts:
+- args += ["--trust=%s" % (dev,)]
+-
+- for port in self.ports:
+- args += ["--port=%s" % (port,)]
+-
+- for remove_service in self.remove_services:
+- args += ["--remove-service=%s" % (remove_service,)]
+-
+- for service in self.services:
+- args += ["--service=%s" % (service,)]
+-
+- cmd = "/usr/bin/firewall-offline-cmd"
+- if not os.path.exists(iutil.getSysroot() + cmd):
+- if self.enabled:
+- msg = _("%s is missing. Cannot setup firewall.") % (cmd,)
+- raise KickstartError(msg)
+- else:
+- iutil.execInSysroot(cmd, args)
++ pass
+
+ class Firstboot(commands.firstboot.FC3_Firstboot):
+ def setup(self, ksdata, instClass):
+- if not self.seen:
+- if flags.automatedInstall:
+- # firstboot should be disabled by default after kickstart installations
+- self.firstboot = FIRSTBOOT_SKIP
+- elif instClass.firstboot and not self.firstboot:
+- # if nothing is specified, use the installclass default for firstboot
+- self.firstboot = instClass.firstboot
++ pass
+
+ def execute(self, *args):
+- action = iutil.enable_service
+- unit_name = "initial-setup.service"
+-
+- # find if the unit file for the Initial Setup service is installed
+- unit_exists = os.path.exists(os.path.join(iutil.getSysroot(), "lib/systemd/system/", unit_name))
+- if unit_exists and self.firstboot == FIRSTBOOT_RECONFIG:
+- # write the reconfig trigger file
+- f = open(os.path.join(iutil.getSysroot(), "etc/reconfigSys"), "w+")
+- f.close()
+-
+- if self.firstboot == FIRSTBOOT_SKIP:
+- action = iutil.disable_service
+- # Also tell the screen access manager, so that the fact that post installation tools
+- # should be disabled propagates to the user interaction config file.
+- screen_access.sam.post_install_tools_disabled = True
+-
+- # enable/disable the Initial Setup service (if its unit is installed)
+- if unit_exists:
+- action(unit_name)
++ pass
+
+ class Group(commands.group.F12_Group):
+ def execute(self, storage, ksdata, instClass, users):
+@@ -1729,84 +1656,11 @@ class Timezone(commands.timezone.F25_Timezone):
+ def __init__(self, *args):
+ commands.timezone.F25_Timezone.__init__(self, *args)
+
+- self._added_chrony = False
+- self._enabled_chrony = False
+- self._disabled_chrony = False
+-
+ def setup(self, ksdata):
+- # do not install and use NTP package
+- if self.nontp or NTP_PACKAGE in ksdata.packages.excludedList:
+- if iutil.service_running(NTP_SERVICE) and \
+- can_touch_runtime_system("stop NTP service"):
+- ret = iutil.stop_service(NTP_SERVICE)
+- if ret != 0:
+- log.error("Failed to stop NTP service")
+-
+- if self._added_chrony and NTP_PACKAGE in ksdata.packages.packageList:
+- ksdata.packages.packageList.remove(NTP_PACKAGE)
+- self._added_chrony = False
+-
+- # Both un-enable and disable chrony, because sometimes it's installed
+- # off by default (packages) and sometimes not (liveimg).
+- if self._enabled_chrony and NTP_SERVICE in ksdata.services.enabled:
+- ksdata.services.enabled.remove(NTP_SERVICE)
+- self._enabled_chrony = False
+-
+- if NTP_SERVICE not in ksdata.services.disabled:
+- ksdata.services.disabled.append(NTP_SERVICE)
+- self._disabled_chrony = True
+- # install and use NTP package
+- else:
+- if not iutil.service_running(NTP_SERVICE) and \
+- can_touch_runtime_system("start NTP service"):
+- ret = iutil.start_service(NTP_SERVICE)
+- if ret != 0:
+- log.error("Failed to start NTP service")
+-
+- if not NTP_PACKAGE in ksdata.packages.packageList:
+- ksdata.packages.packageList.append(NTP_PACKAGE)
+- self._added_chrony = True
+-
+- if self._disabled_chrony and NTP_SERVICE in ksdata.services.disabled:
+- ksdata.services.disabled.remove(NTP_SERVICE)
+- self._disabled_chrony = False
+-
+- if not NTP_SERVICE in ksdata.services.enabled and \
+- not NTP_SERVICE in ksdata.services.disabled:
+- ksdata.services.enabled.append(NTP_SERVICE)
+- self._enabled_chrony = True
++ pass
+
+ def execute(self, *args):
+- # write out timezone configuration
+- if not timezone.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"
+-
+- timezone.write_timezone_config(self, iutil.getSysroot())
+-
+- # write out NTP configuration (if set) and --nontp is not used
+- if not self.nontp and self.ntpservers:
+- chronyd_conf_path = os.path.normpath(iutil.getSysroot() + ntp.NTP_CONFIG_FILE)
+- pools, servers = ntp.internal_to_pools_and_servers(self.ntpservers)
+- if os.path.exists(chronyd_conf_path):
+- log.debug("Modifying installed chrony configuration")
+- try:
+- ntp.save_servers_to_config(pools, servers, conf_file_path=chronyd_conf_path)
+- except ntp.NTPconfigError as ntperr:
+- log.warning("Failed to save NTP configuration: %s", ntperr)
+- # use chrony conf file from installation environment when
+- # chrony is not installed (chrony conf file is missing)
+- else:
+- log.debug("Creating chrony configuration based on the "
+- "configuration from installation environment")
+- try:
+- ntp.save_servers_to_config(pools, servers,
+- conf_file_path=ntp.NTP_CONFIG_FILE,
+- out_file_path=chronyd_conf_path)
+- except ntp.NTPconfigError as ntperr:
+- log.warning("Failed to save NTP configuration without chrony package: %s", ntperr)
++ pass
+
+ class User(commands.user.F19_User):
+ def execute(self, storage, ksdata, instClass, users):
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0018-invisible-help-button.patch b/meta-installer/recipes-installer/anaconda/files/0018-invisible-help-button.patch
new file mode 100644
index 0000000..6015dbf
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0018-invisible-help-button.patch
@@ -0,0 +1,32 @@
+From 2ff2e7147f3dc618c6dfda298acc0a57874fdc8a Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Fri, 26 May 2017 14:10:54 +0800
+Subject: [PATCH 18/65] invisible help button
+
+WRLinux do not support help button, so we should not display it.
+
+Do not display layout indicator neither.
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ widgets/src/BaseWindow.c | 2 --
+ 1 file changed, 2 deletions(-)
+
+diff --git a/widgets/src/BaseWindow.c b/widgets/src/BaseWindow.c
+index 6a1e372..8d86cd9 100644
+--- a/widgets/src/BaseWindow.c
++++ b/widgets/src/BaseWindow.c
+@@ -415,8 +415,6 @@ G_GNUC_END_IGNORE_DEPRECATIONS
+ 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();
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0019-disable-non-implemented-functions.patch b/meta-installer/recipes-installer/anaconda/files/0019-disable-non-implemented-functions.patch
new file mode 100644
index 0000000..c5bb0b2
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0019-disable-non-implemented-functions.patch
@@ -0,0 +1,41 @@
+From f1767915e3a993d2cdaa0be089bdfa93731a496a Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Fri, 26 May 2017 14:16:48 +0800
+Subject: [PATCH 19/65] disable non-implemented functions
+
+Only enable implemented gui pages
+- support dnf repository setting
+- support software selection setting
+- support timezone setting
+- support user creation setting
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/ui/gui/hubs/__init__.py | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+diff --git a/pyanaconda/ui/gui/hubs/__init__.py b/pyanaconda/ui/gui/hubs/__init__.py
+index 4982ae7..1822161 100644
+--- a/pyanaconda/ui/gui/hubs/__init__.py
++++ b/pyanaconda/ui/gui/hubs/__init__.py
+@@ -227,7 +227,14 @@ class Hub(GUIObject, common.Hub):
+ self._updateContinue()
+
+ def _updateCompleteness(self, spoke, update_continue=True):
+- spoke.selector.set_sensitive(spoke.sensitive and spoke.ready)
++ log.info("_updateCompleteness %s" % (spoke.mainWidgetName))
++ # It is minimal installation for now, the non-implemented
++ # functions will be disabled.
++ if spoke.mainWidgetName not in ["storageWindow", "passwordWindow", "sourceWindow", "softwareWindow", "datetimeWindow", "userCreationWindow"]:
++ spoke.selector.set_sensitive(False)
++ else:
++ spoke.selector.set_sensitive(spoke.sensitive and spoke.ready)
++
+ spoke.selector.set_property("status", spoke.status)
+ spoke.selector.set_tooltip_markup(escape_markup(spoke.status))
+ spoke.selector.set_incomplete(not spoke.completed and spoke.mandatory)
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0020-disable-geoloc-by-default.patch b/meta-installer/recipes-installer/anaconda/files/0020-disable-geoloc-by-default.patch
new file mode 100644
index 0000000..6baf839
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0020-disable-geoloc-by-default.patch
@@ -0,0 +1,30 @@
+From 23bbe43b72154be12f23523258fd918704ccd570 Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Fri, 26 May 2017 14:19:58 +0800
+Subject: [PATCH 20/65] disable geoloc by default
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ anaconda.py | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/anaconda.py b/anaconda.py
+index ad7bf6b..5163fb3 100755
+--- a/anaconda.py
++++ b/anaconda.py
+@@ -695,8 +695,8 @@ if __name__ == "__main__":
+ else:
+ # flags.cmdline.getbool is used as it handles values such as
+ # 0, no, off and also nogeoloc as False
+- # and other values or geoloc not being present as True
+- use_geolocation = flags.cmdline.getbool('geoloc', True)
++ # and other values or geoloc not being present as False
++ use_geolocation = flags.cmdline.getbool('geoloc', False)
+
+ if use_geolocation:
+ startup_utils.start_geolocation(provider_id=opts.geoloc)
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0021-support-UEFI-boot.patch b/meta-installer/recipes-installer/anaconda/files/0021-support-UEFI-boot.patch
new file mode 100644
index 0000000..4324374
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0021-support-UEFI-boot.patch
@@ -0,0 +1,38 @@
+From ec8da5a284de623253687fbe3d36a8cabcf94696 Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Fri, 26 May 2017 14:24:37 +0800
+Subject: [PATCH 21/65] support UEFI boot
+
+- tweak grub efi package name based on oe-core
+
+- tweak efi_dir according to oe-core's EFI layout
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/bootloader.py | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/pyanaconda/bootloader.py b/pyanaconda/bootloader.py
+index 2a91759..50fdac1 100644
+--- a/pyanaconda/bootloader.py
++++ b/pyanaconda/bootloader.py
+@@ -1846,12 +1846,12 @@ class EFIGRUB1(EFIBase, GRUB):
+
+
+ class EFIGRUB(EFIBase, GRUB2):
+- packages = ["grub2-efi", "efibootmgr", "shim"]
++ packages = ["grub-efi", "efibootmgr"]
+ can_dual_boot = False
+ stage2_is_valid_stage1 = False
+ stage2_bootable = False
+
+- _efi_binary = "\\shim.efi"
++ _efi_binary = "\\boot*.efi"
+
+ def __init__(self):
+ super(EFIGRUB, self).__init__()
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0022-do-not-verify-ssl-certification-by-default.patch b/meta-installer/recipes-installer/anaconda/files/0022-do-not-verify-ssl-certification-by-default.patch
new file mode 100644
index 0000000..d4e76eb
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0022-do-not-verify-ssl-certification-by-default.patch
@@ -0,0 +1,44 @@
+From 74c2f194cc9599a61fcda50d80b1f611ed9d335c Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Fri, 26 May 2017 14:28:03 +0800
+Subject: [PATCH 22/65] do not verify ssl certification by default
+
+It is helpful for development that use private certification.
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/anaconda_argparse.py | 2 +-
+ pyanaconda/flags.py | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/pyanaconda/anaconda_argparse.py b/pyanaconda/anaconda_argparse.py
+index a694021..35c4ed2 100644
+--- a/pyanaconda/anaconda_argparse.py
++++ b/pyanaconda/anaconda_argparse.py
+@@ -446,7 +446,7 @@ def getArgumentParser(version_string, boot_cmdline=None):
+ help=help_parser.help_text("repo"))
+ ap.add_argument("--stage2", dest="stage2", default=None, metavar="STAGE2_URL",
+ help=help_parser.help_text("stage2"))
+- ap.add_argument("--noverifyssl", action="store_true", default=False,
++ ap.add_argument("--noverifyssl", action="store_true", default=True,
+ help=help_parser.help_text("noverifyssl"))
+ ap.add_argument("--liveinst", action="store_true", default=False,
+ help=help_parser.help_text("liveinst"))
+diff --git a/pyanaconda/flags.py b/pyanaconda/flags.py
+index 7374a39..37206d0 100644
+--- a/pyanaconda/flags.py
++++ b/pyanaconda/flags.py
+@@ -54,7 +54,7 @@ class Flags(object):
+ self.debug = False
+ self.armPlatform = None
+ self.preexisting_x11 = False
+- self.noverifyssl = False
++ self.noverifyssl = True
+ self.imageInstall = False
+ self.automatedInstall = False
+ self.dirInstall = False
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0023-tweak-default-nfs-mount-point.patch b/meta-installer/recipes-installer/anaconda/files/0023-tweak-default-nfs-mount-point.patch
new file mode 100644
index 0000000..60b62b2
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0023-tweak-default-nfs-mount-point.patch
@@ -0,0 +1,30 @@
+From b9f0d13df1a467c4eedf11820ffb0e0e3f04feba Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Thu, 19 May 2016 22:28:14 -0400
+Subject: [PATCH 23/65] tweak default nfs mount point
+
+Tweak nfs mount point of base repository to "/media/source".
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/constants.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/pyanaconda/constants.py b/pyanaconda/constants.py
+index b514bf5..d15767b 100644
+--- a/pyanaconda/constants.py
++++ b/pyanaconda/constants.py
+@@ -57,7 +57,7 @@ DRACUT_REPODIR = MOUNT_DIR + "/Packages"
+ DRACUT_ISODIR = "/run/install/source"
+ ISO_DIR = MOUNT_DIR + "/isodir"
+ IMAGE_DIR = MOUNT_DIR + "/image"
+-INSTALL_TREE = MOUNT_DIR + "/source"
++INSTALL_TREE = "/media/source"
+ BASE_REPO_NAME = "anaconda"
+
+ # NOTE: this should be LANG_TERRITORY.CODESET, e.g. en_US.UTF-8
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0024-fix-quoted-empty-string-failed.patch b/meta-installer/recipes-installer/anaconda/files/0024-fix-quoted-empty-string-failed.patch
new file mode 100644
index 0000000..4f48f21
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0024-fix-quoted-empty-string-failed.patch
@@ -0,0 +1,46 @@
+From 7d33e72c8b29e9faf7a3c197431e8b92219b44eb Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Fri, 26 May 2017 14:34:46 +0800
+Subject: [PATCH 24/65] fix quoted empty string failed
+
+While password or username is a empty string, it failed to
+invoke quote:
+...
+| File "/usr/lib64/python2.7/site-packages/pyanaconda/iutil.py",
+line 823, in parse_components
+| quote(self.password) or "")
+| File "/usr/lib64/python2.7/urllib.py", line 1290, in quote
+| raise TypeError('None object cannot be quoted')
+...
+
+Upstream-Status: Pending
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/iutil.py | 10 +++++++---
+ 1 file changed, 7 insertions(+), 3 deletions(-)
+
+diff --git a/pyanaconda/iutil.py b/pyanaconda/iutil.py
+index beaf2b2..cb5ad27 100644
+--- a/pyanaconda/iutil.py
++++ b/pyanaconda/iutil.py
+@@ -925,9 +925,13 @@ class ProxyString(object):
+ def parse_components(self):
+ """ Parse the components of a proxy url into url and noauth_url
+ """
+- if self.username or self.password:
+- self.proxy_auth = "%s:%s@" % (quote(self.username or ""),
+- quote(self.password or ""))
++ if self.username and self.password:
++ self.proxy_auth = "%s:%s@" % (quote(self.username) or "",
++ quote(self.password) or "")
++ elif self.username and not self.password:
++ self.proxy_auth = "%s:@" % (quote(self.username) or "")
++ elif not self.username and self.password:
++ self.proxy_auth = ":%s@" % (quote(self.password) or "")
+
+ self.url = self.protocol + self.proxy_auth + self.host + ":" + self.port
+ self.noauth_url = self.protocol + self.host + ":" + self.port
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0025-do-not-support-ISO-hold-by-hard-drive-partitions.patch b/meta-installer/recipes-installer/anaconda/files/0025-do-not-support-ISO-hold-by-hard-drive-partitions.patch
new file mode 100644
index 0000000..dbce135
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0025-do-not-support-ISO-hold-by-hard-drive-partitions.patch
@@ -0,0 +1,31 @@
+From b40eb535b039d39623b775a483df9cfa8eecdbc4 Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Tue, 24 May 2016 22:40:21 -0400
+Subject: [PATCH 25/65] do not support ISO hold by hard drive partitions
+
+We do not plan to have hard drive partitions to hold an ISO.
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/ui/gui/spokes/source.py | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/pyanaconda/ui/gui/spokes/source.py b/pyanaconda/ui/gui/spokes/source.py
+index 61033a3..b8bd739 100644
+--- a/pyanaconda/ui/gui/spokes/source.py
++++ b/pyanaconda/ui/gui/spokes/source.py
+@@ -810,7 +810,8 @@ class SourceSpoke(NormalSpoke, GUISpokeInputCheckHandler):
+ added = True
+ idx += 1
+
+- # Again, only display these widgets if an HDISO source was found.
++ # Do not support an HDISO source.
++ added = False
+ self._isoBox.set_no_show_all(not added)
+ self._isoBox.set_visible(added)
+ self._isoButton.set_no_show_all(not added)
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0026-fix-cannot-stat-usr-share-gettext-gettext.h.patch b/meta-installer/recipes-installer/anaconda/files/0026-fix-cannot-stat-usr-share-gettext-gettext.h.patch
new file mode 100644
index 0000000..4adbff8
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0026-fix-cannot-stat-usr-share-gettext-gettext.h.patch
@@ -0,0 +1,27 @@
+From fc969fc3eec744fc9a1fbcb3c1b13d7fc1bfb410 Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Sat, 11 Jun 2016 23:25:30 -0400
+Subject: [PATCH 26/65] fix cannot stat '/usr/share/gettext/gettext.h'
+
+Tweak location of gettext.h, use sysroots dir to replace host dir.
+
+Upstream-Status: Inappropriate <oe-core specific>
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ widgets/autogen.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/widgets/autogen.sh b/widgets/autogen.sh
+index 55ed5de..eb70eb6 100755
+--- a/widgets/autogen.sh
++++ b/widgets/autogen.sh
+@@ -9,4 +9,4 @@ rm -rf autom4te.cache
+
+ # Remove the old symlink if present
+ if [ -h src/gettext.h ] ; then rm src/gettext.h ; fi
+-cp -f /usr/share/gettext/gettext.h src
++cp -f ${STAGING_DATADIR_NATIVE}/gettext/gettext.h src
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0027-fix-Wind-River-boot-menu-not-work.patch b/meta-installer/recipes-installer/anaconda/files/0027-fix-Wind-River-boot-menu-not-work.patch
new file mode 100644
index 0000000..0646dac
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0027-fix-Wind-River-boot-menu-not-work.patch
@@ -0,0 +1,35 @@
+From 5f37502599b7a7fdbb5d49725bd1a5da71b79298 Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Fri, 26 May 2017 14:48:43 +0800
+Subject: [PATCH 27/65] fix "Wind River" boot menu not work
+
+While efi installation finished, and reboot target.
+There is a "Wind River Linux" in bios boot menu
+(not grub menu), this patch to make it work.
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/bootloader.py | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/pyanaconda/bootloader.py b/pyanaconda/bootloader.py
+index 50fdac1..8ad2926 100644
+--- a/pyanaconda/bootloader.py
++++ b/pyanaconda/bootloader.py
+@@ -1851,7 +1851,10 @@ class EFIGRUB(EFIBase, GRUB2):
+ stage2_is_valid_stage1 = False
+ stage2_bootable = False
+
+- _efi_binary = "\\boot*.efi"
++ if os.uname()[4] == "x86_64":
++ _efi_binary = "\\bootx64.efi"
++ else:
++ _efi_binary = "\\bootia32.efi"
+
+ def __init__(self):
+ super(EFIGRUB, self).__init__()
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0028-tweak-bootloader-fs-type.patch b/meta-installer/recipes-installer/anaconda/files/0028-tweak-bootloader-fs-type.patch
new file mode 100644
index 0000000..df77f4b
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0028-tweak-bootloader-fs-type.patch
@@ -0,0 +1,31 @@
+From dd105dcf13c6351a0a35208030ab23ecde07fa95 Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Fri, 26 May 2017 14:51:26 +0800
+Subject: [PATCH 28/65] tweak bootloader fs type
+
+Use ext2 as default fs of bootloader to workaround grub-probe
+failure while e2fsprogs upgraded to 1.43
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/bootloader.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/pyanaconda/bootloader.py b/pyanaconda/bootloader.py
+index 8ad2926..2c86603 100644
+--- a/pyanaconda/bootloader.py
++++ b/pyanaconda/bootloader.py
+@@ -1429,7 +1429,7 @@ class GRUB2(GRUB):
+ if productName.startswith("Red Hat "): # pylint: disable=no-member
+ return ["xfs", "ext4", "ext3", "ext2", "btrfs"]
+ else:
+- return ["ext4", "ext3", "ext2", "btrfs", "xfs"]
++ return ["ext2", "ext3", "ext4", "btrfs", "xfs"]
+
+ #
+ # grub-related conveniences
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0029-support-timezone-setting.patch b/meta-installer/recipes-installer/anaconda/files/0029-support-timezone-setting.patch
new file mode 100644
index 0000000..ebaf8fb
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0029-support-timezone-setting.patch
@@ -0,0 +1,95 @@
+From e172d303503c66502156fcb95236d1eef637de3e Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Fri, 26 May 2017 14:55:11 +0800
+Subject: [PATCH] support timezone setting
+
+- If selected timezone does not exist in target,
+ try to make a copy from host
+
+- Drop unused /etc/adjtime (redhat specific),
+ use /etc/localtime to replace (oe-core specific).
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/kickstart.py | 9 ++++++++-
+ pyanaconda/timezone.py | 28 ++++++----------------------
+ 2 files changed, 14 insertions(+), 23 deletions(-)
+
+diff --git a/pyanaconda/kickstart.py b/pyanaconda/kickstart.py
+index 2210845..eb150c4 100644
+--- a/pyanaconda/kickstart.py
++++ b/pyanaconda/kickstart.py
+@@ -1660,7 +1660,14 @@ class Timezone(commands.timezone.F25_Timezone):
+ pass
+
+ def execute(self, *args):
+- pass
++ # write out timezone configuration
++ if not timezone.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"
++
++ timezone.write_timezone_config(self, iutil.getSysroot())
+
+ class User(commands.user.F19_User):
+ def execute(self, storage, ksdata, instClass, users):
+diff --git a/pyanaconda/timezone.py b/pyanaconda/timezone.py
+index c9990d2..21b1ec1 100644
+--- a/pyanaconda/timezone.py
++++ b/pyanaconda/timezone.py
+@@ -23,6 +23,7 @@ configuration, valid timezones recognition etc.
+ """
+
+ import os
++import shutil
+ import pytz
+ import langtable
+ from collections import OrderedDict
+@@ -101,6 +102,9 @@ def write_timezone_config(timezone, root):
+ relative_path = os.path.normpath("../" + tz_file)
+ link_path = os.path.normpath(root + "/etc/localtime")
+
++ if not os.access(rooted_tz_file, os.R_OK) and os.access(tz_file, os.R_OK):
++ shutil.copyfile(tz_file, rooted_tz_file)
++
+ if not os.access(rooted_tz_file, os.R_OK):
+ log.error("Timezone to be linked (%s) doesn't exist", rooted_tz_file)
+ else:
+@@ -116,28 +120,8 @@ def write_timezone_config(timezone, root):
+ log.error("Error when symlinking timezone (from %s): %s",
+ rooted_tz_file, oserr.strerror)
+
+- if arch.is_s390():
+- # there is no HW clock on s390(x)
+- return
+-
+- try:
+- fobj = open(os.path.normpath(root + "/etc/adjtime"), "r")
+- lines = fobj.readlines()
+- fobj.close()
+- except IOError:
+- lines = ["0.0 0 0.0\n", "0\n"]
+-
+- try:
+- with open(os.path.normpath(root + "/etc/adjtime"), "w") as fobj:
+- fobj.write(lines[0])
+- fobj.write(lines[1])
+- if timezone.isUtc:
+- fobj.write("UTC\n")
+- else:
+- fobj.write("LOCAL\n")
+- except IOError as ioerr:
+- msg = "Error while writing /etc/adjtime file: %s" % ioerr.strerror
+- raise TimezoneConfigError(msg)
++ with open(root + "/etc/timezone", "w") as fobj:
++ fobj.write('%s\n' % timezone.timezone)
+
+ def save_hw_clock(timezone):
+ """
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0030-disable-ntp-support.patch b/meta-installer/recipes-installer/anaconda/files/0030-disable-ntp-support.patch
new file mode 100644
index 0000000..be476b7
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0030-disable-ntp-support.patch
@@ -0,0 +1,230 @@
+From 2b0891fd926e9284bd3fed3968ec8efbc7b36cc4 Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Fri, 26 May 2017 15:01:21 +0800
+Subject: [PATCH 30/65] disable ntp support
+
+The upstream RHEL7 use chrony.service to support ntp,
+it did not exist in oe-core, so remove it.
+
+Do not support NTP, here are the reasons:
+- For systemd based, it already had NTP supported,
+ another ntp will cause confliction.
+
+- We also need to consider the situation of sysvinit
+ based system, it requires a ntp package to be
+ installed.
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/ui/gui/spokes/datetime_spoke.glade | 74 ------------------------
+ pyanaconda/ui/gui/spokes/datetime_spoke.py | 82 ---------------------------
+ 2 files changed, 156 deletions(-)
+
+diff --git a/pyanaconda/ui/gui/spokes/datetime_spoke.glade b/pyanaconda/ui/gui/spokes/datetime_spoke.glade
+index 37c7c6e..875cfea 100644
+--- a/pyanaconda/ui/gui/spokes/datetime_spoke.glade
++++ b/pyanaconda/ui/gui/spokes/datetime_spoke.glade
+@@ -460,80 +460,6 @@
+ <property name="position">3</property>
+ </packing>
+ </child>
+- <child>
+- <object class="GtkAlignment" id="alignment4">
+- <property name="visible">True</property>
+- <property name="can_focus">False</property>
+- <property name="xalign">1</property>
+- <property name="xscale">0.20000000298023224</property>
+- <property name="right_padding">24</property>
+- <child>
+- <object class="GtkBox" id="box6">
+- <property name="visible">True</property>
+- <property name="can_focus">False</property>
+- <property name="halign">end</property>
+- <child>
+- <object class="GtkLabel" id="networkTimeLabel">
+- <property name="visible">True</property>
+- <property name="can_focus">False</property>
+- <property name="label" translatable="yes" context="GUI|Date and Time">_Network Time</property>
+- <property name="use_underline">True</property>
+- <property name="mnemonic_widget">networkTimeSwitch</property>
+- </object>
+- <packing>
+- <property name="expand">False</property>
+- <property name="fill">True</property>
+- <property name="padding">3</property>
+- <property name="position">0</property>
+- </packing>
+- </child>
+- <child>
+- <object class="GtkSwitch" id="networkTimeSwitch">
+- <property name="visible">True</property>
+- <property name="can_focus">True</property>
+- <signal name="notify::active" handler="on_ntp_switched" swapped="no"/>
+- <child internal-child="accessible">
+- <object class="AtkObject" id="networkTimeSwitch-atkobject">
+- <property name="AtkObject::accessible-name" translatable="yes">Use Network Time</property>
+- </object>
+- </child>
+- </object>
+- <packing>
+- <property name="expand">False</property>
+- <property name="fill">True</property>
+- <property name="padding">1</property>
+- <property name="position">1</property>
+- </packing>
+- </child>
+- <child>
+- <object class="GtkButton" id="ntpConfigButton">
+- <property name="visible">True</property>
+- <property name="can_focus">True</property>
+- <property name="receives_default">True</property>
+- <property name="image">configImage</property>
+- <signal name="clicked" handler="on_ntp_config_clicked" swapped="no"/>
+- <child internal-child="accessible">
+- <object class="AtkObject" id="ntpConfigButton-atkobject">
+- <property name="AtkObject::accessible-name" translatable="yes">Configure NTP</property>
+- </object>
+- </child>
+- </object>
+- <packing>
+- <property name="expand">False</property>
+- <property name="fill">True</property>
+- <property name="padding">1</property>
+- <property name="position">2</property>
+- </packing>
+- </child>
+- </object>
+- </child>
+- </object>
+- <packing>
+- <property name="expand">True</property>
+- <property name="fill">True</property>
+- <property name="position">4</property>
+- </packing>
+- </child>
+ </object>
+ </child>
+ </object>
+diff --git a/pyanaconda/ui/gui/spokes/datetime_spoke.py b/pyanaconda/ui/gui/spokes/datetime_spoke.py
+index c3eedbc..ecf32f7 100644
+--- a/pyanaconda/ui/gui/spokes/datetime_spoke.py
++++ b/pyanaconda/ui/gui/spokes/datetime_spoke.py
+@@ -490,8 +490,6 @@ class DatetimeSpoke(FirstbootSpokeMixIn, NormalSpoke):
+ self._year_format, suffix = formats[widgets.index(year_box)]
+ year_label.set_text(suffix)
+
+- self._ntpSwitch = self.builder.get_object("networkTimeSwitch")
+-
+ self._regions_zones = get_all_regions_and_timezones()
+
+ # Set the initial sensitivity of the AM/PM toggle based on the time-type selected
+@@ -500,9 +498,6 @@ class DatetimeSpoke(FirstbootSpokeMixIn, NormalSpoke):
+ if not flags.can_touch_runtime_system("modify system time and date"):
+ self._set_date_time_setting_sensitive(False)
+
+- self._config_dialog = NTPconfigDialog(self.data)
+- self._config_dialog.initialize()
+-
+ threadMgr.add(AnacondaThread(name=constants.THREAD_DATE_TIME,
+ target=self._initialize))
+
+@@ -587,8 +582,6 @@ class DatetimeSpoke(FirstbootSpokeMixIn, NormalSpoke):
+ self.data.timezone.seen = False
+ self._kickstarted = False
+
+- self.data.timezone.nontp = not self._ntpSwitch.get_active()
+-
+ def execute(self):
+ if self._update_datetime_timer_id is not None:
+ GLib.source_remove(self._update_datetime_timer_id)
+@@ -623,20 +616,6 @@ class DatetimeSpoke(FirstbootSpokeMixIn, NormalSpoke):
+
+ self._update_datetime()
+
+- has_active_network = nm.nm_is_connected()
+- if not has_active_network:
+- self._show_no_network_warning()
+- else:
+- self.clear_info()
+- gtk_call_once(self._config_dialog.refresh_servers_state)
+-
+- if flags.can_touch_runtime_system("get NTP service state"):
+- ntp_working = has_active_network and iutil.service_running(NTP_SERVICE)
+- else:
+- ntp_working = not self.data.timezone.nontp
+-
+- self._ntpSwitch.set_active(ntp_working)
+-
+ @gtk_action_wait
+ def _set_timezone(self, timezone):
+ """
+@@ -1099,64 +1078,3 @@ class DatetimeSpoke(FirstbootSpokeMixIn, NormalSpoke):
+ def _show_no_ntp_server_warning(self):
+ self.set_warning(_("You have no working NTP server configured"))
+
+- def on_ntp_switched(self, switch, *args):
+- if switch.get_active():
+- #turned ON
+- if not flags.can_touch_runtime_system("start NTP service"):
+- #cannot touch runtime system, not much to do here
+- return
+-
+- if not nm.nm_is_connected():
+- self._show_no_network_warning()
+- switch.set_active(False)
+- return
+- else:
+- self.clear_info()
+-
+- working_server = self._config_dialog.working_server
+- if working_server is None:
+- self._show_no_ntp_server_warning()
+- else:
+- #we need a one-time sync here, because chronyd would not change
+- #the time as drastically as we need
+- ntp.one_time_sync_async(working_server)
+-
+- ret = iutil.start_service(NTP_SERVICE)
+- self._set_date_time_setting_sensitive(False)
+-
+- #if starting chronyd failed and chronyd is not running,
+- #set switch back to OFF
+- if (ret != 0) and not iutil.service_running(NTP_SERVICE):
+- switch.set_active(False)
+-
+- else:
+- #turned OFF
+- if not flags.can_touch_runtime_system("stop NTP service"):
+- #cannot touch runtime system, nothing to do here
+- return
+-
+- self._set_date_time_setting_sensitive(True)
+- ret = iutil.stop_service(NTP_SERVICE)
+-
+- #if stopping chronyd failed and chronyd is running,
+- #set switch back to ON
+- if (ret != 0) and iutil.service_running(NTP_SERVICE):
+- switch.set_active(True)
+-
+- self.clear_info()
+-
+- def on_ntp_config_clicked(self, *args):
+- self._config_dialog.refresh()
+-
+- with self.main_window.enlightbox(self._config_dialog.window):
+- response = self._config_dialog.run()
+-
+- if response == 1:
+- pools, servers = self._config_dialog.pools_servers
+- self.data.timezone.ntpservers = ntp.pools_servers_to_internal(pools, servers)
+-
+- if self._config_dialog.working_server is None:
+- self._show_no_ntp_server_warning()
+- else:
+- self.clear_info()
+-
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0031-do-not-support-manually-set-time.patch b/meta-installer/recipes-installer/anaconda/files/0031-do-not-support-manually-set-time.patch
new file mode 100644
index 0000000..2f8a29f
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0031-do-not-support-manually-set-time.patch
@@ -0,0 +1,32 @@
+From 265adffc84235b9cbc0ea68e576e4e8afe2e3d3f Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Fri, 31 Mar 2017 13:40:00 +0800
+Subject: [PATCH 31/65] do not support manually set time
+
+Since NTP setting is not supported in anaconda, it does not
+support set time manually neither.
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/ui/gui/spokes/datetime_spoke.py | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/pyanaconda/ui/gui/spokes/datetime_spoke.py b/pyanaconda/ui/gui/spokes/datetime_spoke.py
+index ecf32f7..4cc9f60 100644
+--- a/pyanaconda/ui/gui/spokes/datetime_spoke.py
++++ b/pyanaconda/ui/gui/spokes/datetime_spoke.py
+@@ -541,6 +541,9 @@ class DatetimeSpoke(FirstbootSpokeMixIn, NormalSpoke):
+ _("Restoring hardware time..."))
+ threadMgr.wait(constants.THREAD_TIME_INIT)
+
++ # Do not support manually set time
++ self._set_date_time_setting_sensitive(False)
++
+ hubQ.send_ready(self.__class__.__name__, False)
+
+ # report that we are done
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0032-support-user-account-creation.patch b/meta-installer/recipes-installer/anaconda/files/0032-support-user-account-creation.patch
new file mode 100644
index 0000000..af46b58
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0032-support-user-account-creation.patch
@@ -0,0 +1,73 @@
+From fdad67788ebc18fcf27e33504c4bcaa0e6cd59fc Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Fri, 26 May 2017 16:08:04 +0800
+Subject: [PATCH 32/65] support user account creation
+
+- Do not support user accout advanced setting
+
+- Add main for debugging test
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/ui/gui/spokes/user.py | 7 +------
+ pyanaconda/users.py | 13 +++++++++++++
+ 2 files changed, 14 insertions(+), 6 deletions(-)
+
+diff --git a/pyanaconda/ui/gui/spokes/user.py b/pyanaconda/ui/gui/spokes/user.py
+index 1dae92b..85c3a16 100644
+--- a/pyanaconda/ui/gui/spokes/user.py
++++ b/pyanaconda/ui/gui/spokes/user.py
+@@ -263,6 +263,7 @@ class UserSpoke(FirstbootSpokeMixIn, NormalSpoke, GUISpokeInputCheckHandler):
+ self.admin = self.builder.get_object("c_admin")
+ self.usepassword = self.builder.get_object("c_usepassword")
+ self.b_advanced = self.builder.get_object("b_advanced")
++ self.b_advanced.set_sensitive(False)
+
+ # set initial state of the input field
+ self.input_enabled = self.usepassword.get_active()
+@@ -458,12 +459,6 @@ class UserSpoke(FirstbootSpokeMixIn, NormalSpoke, GUISpokeInputCheckHandler):
+ def username_changed(self, editable, data=None):
+ """Called by Gtk on all username changes."""
+
+- # Disable the advanced user dialog button when no username is set
+- if editable.get_text():
+- self.b_advanced.set_sensitive(True)
+- else:
+- self.b_advanced.set_sensitive(False)
+-
+ # Re-run the password checks against the new username
+ self.pw.emit("changed")
+ self.confirm.emit("changed")
+diff --git a/pyanaconda/users.py b/pyanaconda/users.py
+index 554507e..e25536f 100644
+--- a/pyanaconda/users.py
++++ b/pyanaconda/users.py
+@@ -260,6 +260,7 @@ class Users(object):
+ homedir will be interpreted relative to this. Defaults
+ to iutil.getSysroot().
+ """
++ log.info("kwargs %s" % kwargs)
+ root = kwargs.get("root", iutil.getSysroot())
+
+ if self._getgrnam(group_name, root):
+@@ -491,3 +492,15 @@ class Users(object):
+ if not authfile_existed:
+ os.chown(authfile, int(uid), int(gid))
+ iutil.execWithRedirect("restorecon", ["-r", sshdir])
++
++# For testing
++if __name__ == "__main__":
++ import logging
++ from pyanaconda import anaconda_log
++ anaconda_log.init()
++ anaconda_log.logger.setupVirtio()
++
++ log = logging.getLogger("anaconda")
++
++ users = Users()
++ users.createUser("test", password="123456", shell="/bin/bash", groups=["wheel"])
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0033-detect-existence-of-Xorg.patch b/meta-installer/recipes-installer/anaconda/files/0033-detect-existence-of-Xorg.patch
new file mode 100644
index 0000000..88bf33b
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0033-detect-existence-of-Xorg.patch
@@ -0,0 +1,45 @@
+From 7d54039da9bb6001a1effbb5b0892448d9397949 Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Fri, 26 May 2017 16:15:02 +0800
+Subject: [PATCH 33/65] detect existence of Xorg
+
+Detect the existence of Xorg before start it.
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/display.py | 14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
+
+diff --git a/pyanaconda/display.py b/pyanaconda/display.py
+index fd255a4..d3e599b 100644
+--- a/pyanaconda/display.py
++++ b/pyanaconda/display.py
+@@ -125,9 +125,23 @@ def check_vnc_can_be_started(anaconda):
+
+ # X11
+
++def has_x11():
++ exist = True
++
++ try:
++ subprocess.check_output("ps -A | grep Xorg -q", shell=True)
++ except subprocess.CalledProcessError as e:
++ exist = False
++
++ return exist
++
+ def start_x11():
+ """Start the X server for the Anaconda GUI."""
+
++ if has_x11():
++ log.info("Xorg already existed, no need to start another one")
++ return
++
+ # Start Xorg and wait for it become ready
+ iutil.startX(["Xorg", "-br", "-logfile", "/tmp/X.log",
+ ":%s" % constants.X_DISPLAY_NUMBER, "vt7", "-s", "1440", "-ac",
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0034-fix-write-network-conf-failed-while-liveinst.patch b/meta-installer/recipes-installer/anaconda/files/0034-fix-write-network-conf-failed-while-liveinst.patch
new file mode 100644
index 0000000..465829a
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0034-fix-write-network-conf-failed-while-liveinst.patch
@@ -0,0 +1,40 @@
+From 16940d79490ef191cbabf0bbfc8ff7e9416e7425 Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Tue, 19 Jul 2016 04:36:06 -0400
+Subject: [PATCH 34/65] fix write network conf failed while liveinst
+
+While liveinst, the network conf writing will overwrite copy
+"/etc/resolv.conf" to "/mnt/sysimage/etc/resolv.conf". But in
+wrlinux, the "/etc/resolv.conf" and "/mnt/sysimage/etc/resolv.conf"
+are the same file which is a symlink to /run/resolve.conf.
+
+Test same file before copy.
+
+Upstream-Status: Pending
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/network.py | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/pyanaconda/network.py b/pyanaconda/network.py
+index c3f0dd1..36676ad 100644
+--- a/pyanaconda/network.py
++++ b/pyanaconda/network.py
+@@ -1198,6 +1198,13 @@ def copyFileToPath(fileName, destPath='', overwrite=False):
+ return False
+ if not os.path.isdir(os.path.dirname(destfile)):
+ iutil.mkdirChain(os.path.dirname(destfile))
++
++ # Same file test
++ if os.path.exists(fileName) and os.path.exists(destfile) and \
++ os.stat(fileName).st_ino == os.stat(destfile).st_ino:
++ log.info("%s and %s are the same file" % (fileName, destfile))
++ return False
++
+ shutil.copy(fileName, destfile)
+ return True
+
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0035-revert-commits-to-support-reboot-for-live-installs.patch b/meta-installer/recipes-installer/anaconda/files/0035-revert-commits-to-support-reboot-for-live-installs.patch
new file mode 100644
index 0000000..4d34e7f
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0035-revert-commits-to-support-reboot-for-live-installs.patch
@@ -0,0 +1,72 @@
+From 8c62794da3c3703a0712676c7961ac1686253360 Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Fri, 26 May 2017 16:31:46 +0800
+Subject: [PATCH 35/65] revert commits to support reboot for live installs
+
+This reverts commit ab9d579a27cb9f102b5ea9e215c70334dc5e88fc.
+
+The upstream use a separate way to reboot for live install,
+because they need eject live CD after installation finished.
+(They add a simple wrapper around anaconda to kick off an install
+from a live CD)
+
+But wrlinux do not need it, and could not eject installation live CD
+neither. We mount rootfs to live CD (/dev/sr0), and it is hard to umount
+rootfs before eject.
+
+And we could not use upstream's wrapper, it is gnome desktop related
+and not proper for wrlinux.
+
+It also partly revert the following commit to let reboot work for live
+installs.
+-------------
+commit 346181e9f82f6efb01e545394c2850d3bb657662
+Author: Chris Lumens <clumens at redhat.com>
+Date: Thu Sep 6 11:25:44 2012 -0400
+
+ Quitting the live installer shouldn't reboot the system (#854904).
+-------------
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ anaconda.py | 3 +--
+ pyanaconda/ui/gui/hubs/progress.py | 7 -------
+ 2 files changed, 1 insertion(+), 9 deletions(-)
+
+diff --git a/anaconda.py b/anaconda.py
+index 5163fb3..91d3fc0 100755
+--- a/anaconda.py
++++ b/anaconda.py
+@@ -92,8 +92,7 @@ def exitHandler(rebootData, storage):
+ if pidfile:
+ pidfile.close()
+
+- if not flags.imageInstall and not flags.livecdInstall \
+- and not flags.dirInstall:
++ if not flags.imageInstall and not flags.dirInstall:
+ from pykickstart.constants import KS_SHUTDOWN, KS_WAIT
+
+ if flags.eject or rebootData.eject:
+diff --git a/pyanaconda/ui/gui/hubs/progress.py b/pyanaconda/ui/gui/hubs/progress.py
+index 34f1e53..75e8f18 100644
+--- a/pyanaconda/ui/gui/hubs/progress.py
++++ b/pyanaconda/ui/gui/hubs/progress.py
+@@ -209,13 +209,6 @@ class ProgressHub(Hub):
+ def initialize(self):
+ Hub.initialize(self)
+
+- if flags.livecdInstall:
+- continueText = self.builder.get_object("rebootLabel")
+- continueText.set_text(_("%s is now successfully installed on your system and ready "
+- "for you to use! When you are ready, reboot your system to start using it!"))
+- continueText.set_line_wrap(True)
+- self.window.get_continue_button().set_label(C_("GUI|Progress", "_Quit"))
+-
+ self._progressBar = self.builder.get_object("progressBar")
+ self._progressLabel = self.builder.get_object("progressLabel")
+ self._progressNotebook = self.builder.get_object("progressNotebook")
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0036-text-repository-setting-do-not-support-local-ISO-fil.patch b/meta-installer/recipes-installer/anaconda/files/0036-text-repository-setting-do-not-support-local-ISO-fil.patch
new file mode 100644
index 0000000..34d037f
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0036-text-repository-setting-do-not-support-local-ISO-fil.patch
@@ -0,0 +1,72 @@
+From d6ecdb270fc89995fde6f0035bff0396806f6673 Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Fri, 26 May 2017 16:36:37 +0800
+Subject: [PATCH 36/65] text repository setting: do not support local ISO file
+
+WRLinux does not support repository in local ISO file
+(an ISO in HDD), so remove it.
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/ui/tui/spokes/source.py | 18 +++++-------------
+ 1 file changed, 5 insertions(+), 13 deletions(-)
+
+diff --git a/pyanaconda/ui/tui/spokes/source.py b/pyanaconda/ui/tui/spokes/source.py
+index f1037f7..d794150 100644
+--- a/pyanaconda/ui/tui/spokes/source.py
++++ b/pyanaconda/ui/tui/spokes/source.py
+@@ -136,11 +136,12 @@ class SourceSpoke(EditTUISpoke, SourceSwitchHandler):
+ return not self._error and self.ready and (self.data.method.method or self.payload.baseRepo)
+
+ def refresh(self, args=None):
++ log.info("refresh args %s" % (args))
+ EditTUISpoke.refresh(self, args)
+
+ threadMgr.wait(THREAD_PAYLOAD)
+
+- _methods = [_("CD/DVD"), _("local ISO file"), _("Network")]
++ _methods = [_("CD/DVD"), _("Network")]
+
+ if self.data.method.method == "harddrive" and \
+ get_mount_device(DRACUT_ISODIR) == get_mount_device(DRACUT_REPODIR):
+@@ -148,7 +149,7 @@ class SourceSpoke(EditTUISpoke, SourceSwitchHandler):
+ self._window += [TextWidget(message), ""]
+ return True
+
+- if args == 3:
++ if args == 2:
+ text = [TextWidget(_(p)) for p in self._protocols]
+ else:
+ self._window += [TextWidget(_("Choose an installation source type."))]
+@@ -174,7 +175,8 @@ class SourceSpoke(EditTUISpoke, SourceSwitchHandler):
+ except ValueError:
+ return super(SourceSpoke, self).input(args, key)
+
+- if args == 3:
++ log.info("input args %s, key %s" % (args, key))
++ if args == 2:
+ # network install
+ self._selection = num
+ if self._selection == 1:
+@@ -202,16 +204,6 @@ class SourceSpoke(EditTUISpoke, SourceSwitchHandler):
+ self.apply()
+ self.close()
+ return INPUT_PROCESSED
+- elif num == 2:
+- # local ISO file (HDD ISO)
+- self._selection = num
+- newspoke = SelectDeviceSpoke(self.app, self.data,
+- self.storage, self.payload,
+- self.instclass)
+- self.app.switch_screen_modal(newspoke)
+- self.apply()
+- self.close()
+- return INPUT_PROCESSED
+ else:
+ # mounted ISO
+ if num == 1:
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0037-text-repository-setting-support-http-proxy.patch b/meta-installer/recipes-installer/anaconda/files/0037-text-repository-setting-support-http-proxy.patch
new file mode 100644
index 0000000..7efeff8
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0037-text-repository-setting-support-http-proxy.patch
@@ -0,0 +1,95 @@
+From e943c724b32390b14bd353e53a0539527180ee75 Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Fri, 26 May 2017 16:45:48 +0800
+Subject: [PATCH 37/65] text repository setting: support http proxy
+
+For text mode, it supports:
+- http repo + http proxy;
+- https repo + http proxy;
+- ftp repo + http proxy;
+
+Upstream-Status: Pending
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/ui/helpers.py | 9 ++++++++-
+ pyanaconda/ui/tui/spokes/source.py | 15 +++++++++++++--
+ 2 files changed, 21 insertions(+), 3 deletions(-)
+
+diff --git a/pyanaconda/ui/helpers.py b/pyanaconda/ui/helpers.py
+index ee94f63..e3f5e3a 100644
+--- a/pyanaconda/ui/helpers.py
++++ b/pyanaconda/ui/helpers.py
+@@ -104,6 +104,8 @@ class SourceSwitchHandler(object, metaclass=ABCMeta):
+ and cleanup any previous method set.
+ """
+
++ log = logging.getLogger("anaconda")
++
+ @abstractproperty
+ def data(self):
+ pass
+@@ -171,7 +173,7 @@ class SourceSwitchHandler(object, metaclass=ABCMeta):
+ # as we already made the device protected when
+ # switching to it, we don't need to protect it here
+
+- def set_source_url(self, url=None):
++ def set_source_url(self, url=None, proxy=None):
+ """ Switch to install source specified by URL """
+ # clean any old HDD ISO sources
+ self._clean_hdd_iso()
+@@ -179,6 +181,11 @@ class SourceSwitchHandler(object, metaclass=ABCMeta):
+ self.data.method.method = "url"
+ if url is not None:
+ self.data.method.url = url
++ self.log.info("url: %s" % url)
++
++ if proxy is not None:
++ self.data.method.proxy = proxy
++ self.log.info("proxy: %s" % proxy)
+
+ def set_source_nfs(self, opts=None):
+ """ Switch to NFS install source """
+diff --git a/pyanaconda/ui/tui/spokes/source.py b/pyanaconda/ui/tui/spokes/source.py
+index d794150..9e51147 100644
+--- a/pyanaconda/ui/tui/spokes/source.py
++++ b/pyanaconda/ui/tui/spokes/source.py
+@@ -244,7 +244,8 @@ class SpecifyRepoSpoke(EditTUISpoke, SourceSwitchHandler):
+ category = SoftwareCategory
+
+ edit_fields = [
+- Entry(N_("Repo URL"), "url", re.compile(".*$"), True)
++ Entry(N_("Repo URL"), "url", re.compile(".*$"), True),
++ Entry(N_("Repo Proxy"), "proxy", re.compile(".*$"), True)
+ ]
+
+ def __init__(self, app, data, storage, payload, instclass, selection):
+@@ -263,6 +264,7 @@ class SpecifyRepoSpoke(EditTUISpoke, SourceSwitchHandler):
+
+ def apply(self):
+ """ Apply all of our changes. """
++ log.info("apply args %s" % self.args)
+ url = None
+ if self.selection == 2 and not self.args.url.startswith("http://"):
+ url = "http://" + self.args.url
+@@ -274,7 +276,16 @@ class SpecifyRepoSpoke(EditTUISpoke, SourceSwitchHandler):
+ # protocol either unknown or entry already starts with a protocol
+ # specification
+ url = self.args.url
+- self.set_source_url(url)
++
++ # Proxy only support http protocal
++ proxy = None
++ if self.args.proxy.strip() != '':
++ if not self.args.proxy.startswith("http://"):
++ proxy = "http://" + self.args.proxy
++ else:
++ proxy = self.args.proxy
++
++ self.set_source_url(url, proxy)
+
+ class SpecifyNFSRepoSpoke(EditTUISpoke, SourceSwitchHandler):
+ """ Specify server and mount opts here if NFS selected. """
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0038-set-keyboard-xlayouts-with-us-by-default.patch b/meta-installer/recipes-installer/anaconda/files/0038-set-keyboard-xlayouts-with-us-by-default.patch
new file mode 100644
index 0000000..4acc174
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0038-set-keyboard-xlayouts-with-us-by-default.patch
@@ -0,0 +1,50 @@
+From 3008184173cf6fb063f4c2bee3443728477517a6 Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Fri, 26 May 2017 16:49:11 +0800
+Subject: [PATCH 38/65] set keyboard xlayouts with 'us' by default
+
+Previously only graphic set keyboard xlayouts with 'us' by default,
+and text mode did not have the setting and it caused 100% cpu when
+loadkey invoked. The hung of loadkey also caused reboot failed.
+
+The setting in default ks works on both of graphic and text.
+
+Revert the following fix:
+---------
+commit ec53ff6e4a7a06d190925a482371031a2f48509d
+Author: Martin Kolman <mkolman at redhat.com>
+Date: Thu Jan 19 18:37:29 2017 +0100
+
+ Use correct default password quality value
+---------
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ data/interactive-defaults.ks | 11 +----------
+ 1 file changed, 1 insertion(+), 10 deletions(-)
+
+diff --git a/data/interactive-defaults.ks b/data/interactive-defaults.ks
+index a5f89c2..b6a5e76 100644
+--- a/data/interactive-defaults.ks
++++ b/data/interactive-defaults.ks
+@@ -2,14 +2,5 @@
+ # This is not loaded if a kickstart file is provided on the command line.
+ auth --enableshadow --passalgo=sha512
+ firstboot --enable
++keyboard --xlayouts='us'
+
+-%anaconda
+-# Default password policies
+-pwpolicy root --notstrict --minlen=6 --minquality=1 --nochanges --emptyok
+-pwpolicy user --notstrict --minlen=6 --minquality=1 --nochanges --emptyok
+-pwpolicy luks --notstrict --minlen=6 --minquality=1 --nochanges --emptyok
+-# NOTE: This applies only to *fully* interactive installations, partial kickstart
+-# installations use defaults specified in pyanaconda/pwpolicy.py.
+-# Automated kickstart installs simply ignore the password policy as the policy
+-# only applies to the UI, not for passwords specified in kickstart.
+-%end
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0039-text-do-not-support-network-setting-for-now.patch b/meta-installer/recipes-installer/anaconda/files/0039-text-do-not-support-network-setting-for-now.patch
new file mode 100644
index 0000000..b223e1b
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0039-text-do-not-support-network-setting-for-now.patch
@@ -0,0 +1,33 @@
+From f282390815a67d876044ba6ec9803bcc4d413f22 Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Thu, 1 Jun 2017 13:34:20 +0800
+Subject: [PATCH 39/65] text: do not support network setting for now
+
+We have a long term plan to support it, but not now.
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/ui/tui/spokes/network.py | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+diff --git a/pyanaconda/ui/tui/spokes/network.py b/pyanaconda/ui/tui/spokes/network.py
+index 0bdee5d..7af5da3 100644
+--- a/pyanaconda/ui/tui/spokes/network.py
++++ b/pyanaconda/ui/tui/spokes/network.py
+@@ -58,6 +58,11 @@ class NetworkSpoke(FirstbootSpokeMixIn, EditTUISpoke):
+ self.errors = []
+ self._apply = False
+
++ @classmethod
++ def should_run(cls, environment, data):
++ # Do not support network config for now
++ return False
++
+ def initialize(self):
+ self.initialize_start()
+ self._load_new_devices()
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0040-tweak-boot-storage-sanity-check.patch b/meta-installer/recipes-installer/anaconda/files/0040-tweak-boot-storage-sanity-check.patch
new file mode 100644
index 0000000..4b6abb0
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0040-tweak-boot-storage-sanity-check.patch
@@ -0,0 +1,31 @@
+From f72aa915e7a7c510587447725af40ed1050422a2 Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Thu, 1 Jun 2017 13:48:00 +0800
+Subject: [PATCH 40/65] tweak /boot storage sanity check
+
+Since kernel-vmlinux (200MB+) was installed to /boot,
+tweak /boot storage sanity check from 200MB to 300MB.
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/storage_utils.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/pyanaconda/storage_utils.py b/pyanaconda/storage_utils.py
+index ca49f86..23160bc 100644
+--- a/pyanaconda/storage_utils.py
++++ b/pyanaconda/storage_utils.py
+@@ -642,7 +642,7 @@ class StorageChecker(object):
+ '/tmp': Size("50 MiB"),
+ '/var': Size("384 MiB"),
+ '/home': Size("100 MiB"),
+- '/boot': Size("200 MiB")
++ '/boot': Size("300 MiB")
+ })
+
+ self.add_new_constraint(STORAGE_MUST_BE_ON_LINUXFS, {
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0041-kickstart-do-not-support-network-configuration.patch b/meta-installer/recipes-installer/anaconda/files/0041-kickstart-do-not-support-network-configuration.patch
new file mode 100644
index 0000000..d4c73d8
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0041-kickstart-do-not-support-network-configuration.patch
@@ -0,0 +1,29 @@
+From a3bf304f1016a39249d0882644d0365be93bd18b Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Thu, 1 Jun 2017 13:50:15 +0800
+Subject: [PATCH 41/65] kickstart do not support network configuration
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/install.py | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/pyanaconda/install.py b/pyanaconda/install.py
+index 929b89d..555d7b0 100644
+--- a/pyanaconda/install.py
++++ b/pyanaconda/install.py
+@@ -72,6 +72,9 @@ def _writeKS(ksdata):
+ if ksdata.method.method == "url" and not ksdata.method.url.startswith("https://"):
+ ksdata.method.noverifyssl = False
+
++ # Do not support network configuration
++ ksdata.network.network = []
++
+ # Make it so only root can read - could have passwords
+ with iutil.open_with_perm(path, "w", 0o600) as f:
+ f.write(str(ksdata))
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0042-support-to-get-kickstart-from-network.patch b/meta-installer/recipes-installer/anaconda/files/0042-support-to-get-kickstart-from-network.patch
new file mode 100644
index 0000000..bc9bca7
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0042-support-to-get-kickstart-from-network.patch
@@ -0,0 +1,48 @@
+From 17e60df24fcf518fd9701e45ad675ce915644a10 Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Thu, 1 Jun 2017 13:55:50 +0800
+Subject: [PATCH 42/65] support to get kickstart from network
+
+We support http/https/ftp protocol to get kickstart file
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/startup_utils.py | 12 ++++++++++--
+ 1 file changed, 10 insertions(+), 2 deletions(-)
+
+diff --git a/pyanaconda/startup_utils.py b/pyanaconda/startup_utils.py
+index cf60aeb..a54d1e2 100644
+--- a/pyanaconda/startup_utils.py
++++ b/pyanaconda/startup_utils.py
+@@ -420,7 +420,11 @@ def parse_kickstart(options, addon_paths):
+ """
+ ksdata = None
+ if options.ksfile and not options.liveinst:
+- if not os.path.exists(options.ksfile):
++ if not os.path.exists(options.ksfile) and \
++ not options.ksfile.startswith("http://") and \
++ not options.ksfile.startswith("https://") and \
++ not options.ksfile.startswith("ftp://"):
++
+ stdout_log.error("Kickstart file %s is missing.", options.ksfile)
+ iutil.ipmi_report(constants.IPMI_ABORTED)
+ sys.exit(1)
+@@ -438,8 +442,12 @@ def parse_kickstart(options, addon_paths):
+ ks_files = ["/tmp/updates/interactive-defaults.ks",
+ "/usr/share/anaconda/interactive-defaults.ks"]
+
++ log.info("ks_files: %s" % ks_files)
+ for ks in ks_files:
+- if not os.path.exists(ks):
++ if not os.path.exists(ks) and \
++ not ks.startswith("http://") and \
++ not ks.startswith("https://") and \
++ not ks.startswith("ftp://"):
+ continue
+
+ kickstart.preScriptPass(ks)
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0043-support-authentication-for-kickstart.patch b/meta-installer/recipes-installer/anaconda/files/0043-support-authentication-for-kickstart.patch
new file mode 100644
index 0000000..a300feb
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0043-support-authentication-for-kickstart.patch
@@ -0,0 +1,133 @@
+From 0a325766f56c70f7f1513b0b9f06d1faa769688d Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Thu, 1 Jun 2017 14:09:36 +0800
+Subject: [PATCH 43/65] support authentication for kickstart
+
+We add option 'ksuser' and 'kspasswd' in /proc/cmdline to support
+authentication while downloading kickstart from web server.
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+
+Rebase from WRL8 to WRL9.
+
+Compared with old installer, we do not support to pop a prompt page
+while authentication failed, because the new installer do not support
+snack module (The python snack is used for text display).
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/flags.py | 11 +++++++++++
+ pyanaconda/kickstart.py | 41 ++++++++++++++++++++++++++++++++++-------
+ 2 files changed, 45 insertions(+), 7 deletions(-)
+
+diff --git a/pyanaconda/flags.py b/pyanaconda/flags.py
+index 37206d0..7c5f3b4 100644
+--- a/pyanaconda/flags.py
++++ b/pyanaconda/flags.py
+@@ -71,6 +71,11 @@ class Flags(object):
+ self.rescue_mode = False
+ self.noefi = False
+ self.kexec = False
++
++ # Authentication for downloading kickstart file through http
++ self.ksuser = None
++ self.kspasswd = None
++
+ # nosave options
+ self.nosave_input_ks = False
+ self.nosave_output_ks = False
+@@ -91,6 +96,12 @@ class Flags(object):
+ "nombr", "gpt", "noefi"):
+ self.set_cmdline_bool(f)
+
++ if "ksuser" in self.cmdline:
++ self.ksuser = self.cmdline['ksuser']
++
++ if "kspasswd" in self.cmdline:
++ self.kspasswd = self.cmdline['kspasswd']
++
+ if not os.path.exists("/selinux/load"):
+ self.selinux = 0
+
+diff --git a/pyanaconda/kickstart.py b/pyanaconda/kickstart.py
+index 2210845..d858ed1 100644
+--- a/pyanaconda/kickstart.py
++++ b/pyanaconda/kickstart.py
+@@ -76,7 +76,7 @@ from pykickstart.constants import CLEARPART_TYPE_NONE, CLEARPART_TYPE_ALL, \
+ SELINUX_DISABLED, SELINUX_ENFORCING, SELINUX_PERMISSIVE, \
+ SNAPSHOT_WHEN_POST_INSTALL, SNAPSHOT_WHEN_PRE_INSTALL
+ from pykickstart.base import BaseHandler
+-from pykickstart.errors import formatErrorMsg, KickstartError, KickstartParseError
++from pykickstart.errors import formatErrorMsg, KickstartError, KickstartParseError, KickstartAuthError
+ from pykickstart.parser import KickstartParser
+ from pykickstart.parser import Script as KSScript
+ from pykickstart.sections import Section
+@@ -2086,12 +2086,39 @@ class AnacondaKSHandler(superclass):
+ def __str__(self):
+ return superclass.__str__(self) + "\n" + str(self.addons) + str(self.anaconda)
+
+-class AnacondaPreParser(KickstartParser):
+- # A subclass of KickstartParser that only looks for %pre scripts and
++class WRKickstartParser(KickstartParser):
++ # A subclass of KickstartParser that parse the authentication failure
++ # while downloading kickstart file from web server
++ def __init__(self, handler, followIncludes=True, errorsAreFatal=True,
++ missingIncludeIsFatal=True):
++ KickstartParser.__init__(self, handler, missingIncludeIsFatal=False)
++ self.username = flags.ksuser
++ self.password = flags.kspasswd
++
++ def readKickstart(self, f, reset=True):
++ while True:
++ try:
++ KickstartParser.readKickstart(self, f, reset=reset,
++ username=self.username,
++ password=self.password)
++
++ # Make sure the following readKickstart invoking will success
++ flags.ksuser = self.username
++ flags.kspasswd = self.password
++ break
++ except KickstartAuthError as e:
++ msg = 'Append "ksuser=<username> kspasswd=<password>" to boot command'
++ raise KickstartError(msg)
++ except:
++ raise
++
++
++class AnacondaPreParser(WRKickstartParser):
++ # A subclass of WRKickstartParser that only looks for %pre scripts and
+ # sets them up to be run. All other scripts and commands are ignored.
+ def __init__(self, handler, followIncludes=True, errorsAreFatal=True,
+ missingIncludeIsFatal=True):
+- KickstartParser.__init__(self, handler, missingIncludeIsFatal=False)
++ WRKickstartParser.__init__(self, handler, missingIncludeIsFatal=False)
+
+ def handleCommand(self, lineno, args):
+ pass
+@@ -2107,17 +2134,17 @@ class AnacondaPreParser(KickstartParser):
+ self.registerSection(NullSection(self.handler.anaconda, sectionOpen="%anaconda"))
+
+
+-class AnacondaKSParser(KickstartParser):
++class AnacondaKSParser(WRKickstartParser):
+ def __init__(self, handler, followIncludes=True, errorsAreFatal=True,
+ missingIncludeIsFatal=True, scriptClass=AnacondaKSScript):
+ self.scriptClass = scriptClass
+- KickstartParser.__init__(self, handler)
++ WRKickstartParser.__init__(self, handler)
+
+ def handleCommand(self, lineno, args):
+ if not self.handler:
+ return
+
+- return KickstartParser.handleCommand(self, lineno, args)
++ return WRKickstartParser.handleCommand(self, lineno, args)
+
+ def setupSections(self):
+ self.registerSection(PreScriptSection(self.handler, dataObj=self.scriptClass))
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0044-support-downloading-file-from-http-ftp-server-to-tar.patch b/meta-installer/recipes-installer/anaconda/files/0044-support-downloading-file-from-http-ftp-server-to-tar.patch
new file mode 100644
index 0000000..740c2b0
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0044-support-downloading-file-from-http-ftp-server-to-tar.patch
@@ -0,0 +1,175 @@
+From 97f0ca901d8d8c623c3e5397a5150a09685e8036 Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Thu, 1 Jun 2017 14:15:27 +0800
+Subject: [PATCH] support downloading file from http/ftp server to target image
+
+Add key in kickstart to support downloading file from http/ftp server to target image,
+'download --dest=[file://dir/filename|/dir/filename] --src=[http url| ftp url]'
+
+Here is the example in kickstart file:
+---start---
+download --dest=/etc/rpm/keys/0x100001 --src=http://128.224.162.159/testkey
+download --dest=file://etc/rpm/keys/0x100002 --src=http://128.224.162.159/testkey2
+---end---
+
+The file be download to target image (/mnt/image/****). For host image,
+we could make use of "%pre" section with invoking shell to do that)
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+
+Rebase from WRL8 to WRL9
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+
+Rebase from WRL9 to WRL10
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/install.py | 2 ++
+ pyanaconda/kickstart.py | 94 +++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 96 insertions(+)
+
+diff --git a/pyanaconda/install.py b/pyanaconda/install.py
+index 555d7b0..0bb0722 100644
+--- a/pyanaconda/install.py
++++ b/pyanaconda/install.py
+@@ -99,6 +99,8 @@ def doConfiguration(storage, payload, ksdata, instClass):
+ os_config.append(Task("Configure firewall", ksdata.firewall.execute, (storage, ksdata, instClass)))
+ os_config.append(Task("Configure X", ksdata.xconfig.execute, (storage, ksdata, instClass)))
+ os_config.append(Task("Configure skip-X", ksdata.skipx.execute, (storage, ksdata, instClass)))
++ os_config.append(Task("Configure download", ksdata.download.execute, (storage, ksdata, instClass)))
++
+ configuration_queue.append(os_config)
+
+ # schedule network configuration (if required)
+diff --git a/pyanaconda/kickstart.py b/pyanaconda/kickstart.py
+index 3b877f7..af26c21 100644
+--- a/pyanaconda/kickstart.py
++++ b/pyanaconda/kickstart.py
+@@ -78,6 +78,8 @@ from pykickstart.constants import CLEARPART_TYPE_NONE, CLEARPART_TYPE_ALL, \
+ from pykickstart.base import BaseHandler
+ from pykickstart.errors import formatErrorMsg, KickstartError, KickstartParseError, KickstartAuthError
+ from pykickstart.parser import KickstartParser
++from pykickstart.base import KickstartCommand, BaseData
++from pykickstart.options import KSOptionParser
+ from pykickstart.parser import Script as KSScript
+ from pykickstart.sections import Section
+ from pykickstart.sections import NullSection, PackageSection, PostScriptSection, PreScriptSection, PreInstallScriptSection, \
+@@ -1937,6 +1939,96 @@ class Upgrade(commands.upgrade.F20_Upgrade):
+ iutil.ipmi_report(IPMI_ABORTED)
+ sys.exit(1)
+
++class DownloadData(BaseData):
++ removedKeywords = BaseData.removedKeywords
++ removedAttrs = BaseData.removedAttrs
++
++ def __init__(self, *args, **kwargs):
++ BaseData.__init__(self, *args, **kwargs)
++ self.dest = kwargs.get("dest", None)
++ self.src = kwargs.get("src", None)
++
++ def __eq__(self, y):
++ return self.dest == y.dest
++
++ def _getArgsAsStr(self):
++ retval = "--dest=%s --src=%s" % (self.dest, self.src)
++ return retval
++
++ def __str__(self):
++ retval = BaseData.__str__(self)
++ retval += "download %s\n" % self._getArgsAsStr()
++ return retval
++
++class Download(KickstartCommand):
++ removedKeywords = KickstartCommand.removedKeywords
++ removedAttrs = KickstartCommand.removedAttrs
++
++ def __init__(self, writePriority=0, *args, **kwargs):
++ KickstartCommand.__init__(self, writePriority, *args, **kwargs)
++ self.op = self._getParser()
++ self.downloadList = kwargs.get("downloadList", [])
++
++ def __str__(self):
++ retval = "# Download file from http/ftp server to target image\n"
++ retval += "# download --dest=[file://dir/filename|/dir/filename] --src=[http url| ftp url]\n"
++ for d in self.downloadList:
++ retval += d.__str__()
++ retval += "\n"
++ return retval
++
++ def _getParser(self):
++ op = KSOptionParser()
++ op.add_option("--dest", dest="dest", required=True)
++ op.add_option("--src", dest="src", required=True)
++ return op
++
++ def parse(self, args):
++ (opts, extra) = self.op.parse_args(args=args, lineno=self.lineno)
++ dd = self.handler.DownloadData()
++ self._setToObj(self.op, opts, dd)
++ dd.lineno = self.lineno
++
++ # Check for duplicates in the data list.
++ if dd in self.dataList():
++ log.warn(_("A source %s has already been defined.") % dd.src)
++
++ log.info("kickstart downloading %s to %s" % (opts.src, opts.dest))
++ return dd
++
++ def dataList(self):
++ return self.downloadList
++
++ def execute(self, storage, ksdata, instClass):
++ if not ksdata.download:
++ return
++
++ for dd in ksdata.download.downloadList:
++ if dd.dest.startswith("file:"):
++ dd.dest = dd.dest[len("file:"):]
++
++ if not dd.dest.startswith("/"):
++ msg = _("The dest %s is not on filesystem" % (dd.dest))
++ stderrLog.critical(msg)
++ sys.exit(1)
++
++ dest = iutil.getSysroot() + dd.dest
++ log.info("downloading %s to %s" % (dd.src, dest))
++ dest_dir = os.path.dirname(dest)
++ if not os.path.exists(dest_dir):
++ os.makedirs(dest_dir)
++
++ try:
++ request = iutil.requests_session().get(dd.src)
++ except requests.exceptions.RequestException as e:
++ msg = _("The following error was encountered while downloading %s:\n\n%s" % (dd.src, e))
++ stderrLog.critical(msg)
++ sys.exit(1)
++
++ with open(dest, "wb") as dest_f:
++ dest_f.write(request.content)
++
++
+ ###
+ ### %anaconda Section
+ ###
+@@ -2037,6 +2129,7 @@ commandMap = {
+ "volgroup": VolGroup,
+ "xconfig": XConfig,
+ "zfcp": ZFCP,
++ "download": Download,
+ }
+
+ dataMap = {
+@@ -2047,6 +2140,7 @@ dataMap = {
+ "RepoData": RepoData,
+ "SnapshotData": SnapshotData,
+ "VolGroupData": VolGroupData,
++ "DownloadData": DownloadData,
+ }
+
+ superclass = returnClassForVersion()
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0045-live-install-supports-kickstart.patch b/meta-installer/recipes-installer/anaconda/files/0045-live-install-supports-kickstart.patch
new file mode 100644
index 0000000..dd22f8b
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0045-live-install-supports-kickstart.patch
@@ -0,0 +1,47 @@
+From 7bae228f66d6598e053352a24d0f0a05242e2342 Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Thu, 1 Jun 2017 14:19:41 +0800
+Subject: [PATCH 45/65] live install supports kickstart
+
+While live install, WRLinux does not support harddrive,
+use cdrom to replace
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/install.py | 4 ++++
+ pyanaconda/startup_utils.py | 2 +-
+ 2 files changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/pyanaconda/install.py b/pyanaconda/install.py
+index 0bb0722..38e10fd 100644
+--- a/pyanaconda/install.py
++++ b/pyanaconda/install.py
+@@ -75,6 +75,10 @@ def _writeKS(ksdata):
+ # Do not support network configuration
+ ksdata.network.network = []
+
++ # Correct method of live install, use cdrom to replace
++ if ksdata.method.method == "harddrive":
++ ksdata.method.method = "cdrom"
++
+ # Make it so only root can read - could have passwords
+ with iutil.open_with_perm(path, "w", 0o600) as f:
+ f.write(str(ksdata))
+diff --git a/pyanaconda/startup_utils.py b/pyanaconda/startup_utils.py
+index a54d1e2..ae45c5e 100644
+--- a/pyanaconda/startup_utils.py
++++ b/pyanaconda/startup_utils.py
+@@ -419,7 +419,7 @@ def parse_kickstart(options, addon_paths):
+ :returns: kickstart parsed to a data model
+ """
+ ksdata = None
+- if options.ksfile and not options.liveinst:
++ if options.ksfile:
+ if not os.path.exists(options.ksfile) and \
+ not options.ksfile.startswith("http://") and \
+ not options.ksfile.startswith("https://") and \
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0046-support-initramfs-boot.patch b/meta-installer/recipes-installer/anaconda/files/0046-support-initramfs-boot.patch
new file mode 100644
index 0000000..dc76245
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0046-support-initramfs-boot.patch
@@ -0,0 +1,48 @@
+From f5fa369d6ac990e54899eb1cd28488abfd5d4b2a Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Thu, 1 Jun 2017 14:27:48 +0800
+Subject: [PATCH 46/65] support initramfs boot
+
+- Create fake initramfs to cheat grub-mkconfig which
+ could generate grub.cfg that have initrd setting.
+
+- Make sure temp dir existed which required by dracut while live install.
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/bootloader.py | 3 +++
+ pyanaconda/payload/__init__.py | 4 ++++
+ 2 files changed, 7 insertions(+)
+
+diff --git a/pyanaconda/bootloader.py b/pyanaconda/bootloader.py
+index 2c86603..7e3fce1 100644
+--- a/pyanaconda/bootloader.py
++++ b/pyanaconda/bootloader.py
+@@ -2465,6 +2465,9 @@ def writeSysconfigKernel(storage, version, instClass):
+ def writeBootLoaderFinal(storage, payload, instClass, ksdata):
+ """ Do the final write of the bootloader. """
+
++ for kernel in payload.kernelVersionList:
++ open(iutil.getSysroot()+"/boot/initramfs-%s.img" % kernel, "w").write("\n")
++
+ # set up dracut/fips boot args
+ # XXX FIXME: do this from elsewhere?
+ storage.bootloader.set_boot_args(storage=storage,
+diff --git a/pyanaconda/payload/__init__.py b/pyanaconda/payload/__init__.py
+index 22af097..d29fa62 100644
+--- a/pyanaconda/payload/__init__.py
++++ b/pyanaconda/payload/__init__.py
+@@ -668,6 +668,10 @@ class Payload(object):
+ log.error("new-kernel-pkg does not exist - grubby wasn't installed? skipping")
+ return
+
++ # Make sure temp dir existed, dracut requires it while live install
++ for subdir in ["log", "tmp"]:
++ iutil.mkdirChain(iutil.getSysroot() + "/var/volatile/%s" % subdir)
++
+ for kernel in self.kernelVersionList:
+ log.info("recreating initrd for %s", kernel)
+ if not flags.imageInstall:
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0047-fix-hang-while-installed-system-reboot.patch b/meta-installer/recipes-installer/anaconda/files/0047-fix-hang-while-installed-system-reboot.patch
new file mode 100644
index 0000000..68171ad
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0047-fix-hang-while-installed-system-reboot.patch
@@ -0,0 +1,30 @@
+From 0a1349dc0fda0324725a996ff6e3b3470599e0e9 Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Fri, 31 Mar 2017 14:06:06 +0800
+Subject: [PATCH 47/65] fix hang while installed system reboot
+
+The lvm2 installed to target system, and it disabled by
+default which caused target system reboot hang.
+
+Enable service lvm2-monitor.service could fix the issue.
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ data/interactive-defaults.ks | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/data/interactive-defaults.ks b/data/interactive-defaults.ks
+index b6a5e76..b9a926f 100644
+--- a/data/interactive-defaults.ks
++++ b/data/interactive-defaults.ks
+@@ -4,3 +4,5 @@ auth --enableshadow --passalgo=sha512
+ firstboot --enable
+ keyboard --xlayouts='us'
+
++# Fix hang while installed system reboot
++services --enabled lvm2-monitor.service
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0048-fix-installed-system-boot-from-encrypt-fs-failed.patch b/meta-installer/recipes-installer/anaconda/files/0048-fix-installed-system-boot-from-encrypt-fs-failed.patch
new file mode 100644
index 0000000..3c9d4c2
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0048-fix-installed-system-boot-from-encrypt-fs-failed.patch
@@ -0,0 +1,48 @@
+From dec014cd019ce4ccf6b1e7579ff4d58ec54e33f8 Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Thu, 1 Jun 2017 14:34:10 +0800
+Subject: [PATCH 48/65] fix installed system boot from encrypt fs failed
+
+While using cryptsetup to encrypt filesystem, it failed to boot
+installed system.
+-----------------
+dracut: luksOpen /dev/sda3 luks-9cf2d2d9-849e-4ecb-a7f8-5918259306d6
+Enter passphrase for /dev/sda3: Switched to clocksource tsc
+
+device-mapper: table: 253:0: crypt: Error allocating crypto tfm
+device-mapper: ioctl: error adding target to table
+device-mapper: reload ioctl on failed: No such file or directory
+Failed to setup dm-crypt key mapping for device /dev/sda3.
+Check that kernel supports aes-xts-plain64 cipher (check syslog for more info).
+Wrong password
+-----------------
+
+The reason is the initramfs (generated by dracut) missed kernel module.
+
+Config dracut to let initramfs has the kernel driver.
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/payload/__init__.py | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/pyanaconda/payload/__init__.py b/pyanaconda/payload/__init__.py
+index d29fa62..00ff79f 100644
+--- a/pyanaconda/payload/__init__.py
++++ b/pyanaconda/payload/__init__.py
+@@ -672,6 +672,10 @@ class Payload(object):
+ for subdir in ["log", "tmp"]:
+ iutil.mkdirChain(iutil.getSysroot() + "/var/volatile/%s" % subdir)
+
++ with open(iutil.getSysroot() + "/etc/dracut.conf.d/cryptsetup.conf", "w") as f:
++ f.write('add_drivers+=" aesni_intel"\n')
++ f.write('add_drivers+=" aes_x86_64"\n')
++
+ for kernel in self.kernelVersionList:
+ log.info("recreating initrd for %s", kernel)
+ if not flags.imageInstall:
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0049-installation-destination-disable-iSCSI-network-disks.patch b/meta-installer/recipes-installer/anaconda/files/0049-installation-destination-disable-iSCSI-network-disks.patch
new file mode 100644
index 0000000..e38d37e
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0049-installation-destination-disable-iSCSI-network-disks.patch
@@ -0,0 +1,29 @@
+From bf5a4298d1f8eae33a70210808c0fd26ec056287 Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Thu, 1 Jun 2017 14:35:52 +0800
+Subject: [PATCH 49/65] installation destination: disable iSCSI network disks
+
+WRLinux does not support it.
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/ui/gui/spokes/storage.py | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/pyanaconda/ui/gui/spokes/storage.py b/pyanaconda/ui/gui/spokes/storage.py
+index 4871667..2945c9e 100644
+--- a/pyanaconda/ui/gui/spokes/storage.py
++++ b/pyanaconda/ui/gui/spokes/storage.py
+@@ -806,6 +806,7 @@ class StorageSpoke(NormalSpoke, StorageCheckHandler):
+ self.builder.get_object("local_untouched_label_revealer").set_reveal_child(anySelected)
+ self.builder.get_object("special_untouched_label_revealer").set_reveal_child(anySelected)
+ self.builder.get_object("other_options_grid").set_sensitive(anySelected)
++ self.builder.get_object("addSpecializedButton").set_sensitive(False)
+
+ if len(self.disks) == 0:
+ self.set_warning(_("No disks detected. Please shut down the computer, connect at least one disk, and restart to complete installation."))
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0050-update-region-while-city-changes.patch b/meta-installer/recipes-installer/anaconda/files/0050-update-region-while-city-changes.patch
new file mode 100644
index 0000000..e6a6622
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0050-update-region-while-city-changes.patch
@@ -0,0 +1,32 @@
+From f97cc9915bf4e2931476ddfcb50b2103768339f7 Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Fri, 9 Sep 2016 13:23:48 -0400
+Subject: [PATCH 50/65] update region while city changes
+
+While user select US/Alaska from combobox at first time, the libtimezonemap
+convert it to America/Anchorage, and anaconda gui page recognize it as
+America/Alaska, the fix make sure region/city could be correctly updated.
+
+Upstream-Status: Pending
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/ui/gui/spokes/datetime_spoke.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/pyanaconda/ui/gui/spokes/datetime_spoke.py b/pyanaconda/ui/gui/spokes/datetime_spoke.py
+index 4cc9f60..996aed0 100644
+--- a/pyanaconda/ui/gui/spokes/datetime_spoke.py
++++ b/pyanaconda/ui/gui/spokes/datetime_spoke.py
+@@ -926,7 +926,7 @@ class DatetimeSpoke(FirstbootSpokeMixIn, NormalSpoke):
+
+ region = self._get_active_region()
+
+- if not region or region == self._old_region:
++ if not region:
+ # region entry being edited or old_value chosen, no action needed
+ # @see: on_city_changed
+ return
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0051-timezone-fix-set-US-Alaska-failed.patch b/meta-installer/recipes-installer/anaconda/files/0051-timezone-fix-set-US-Alaska-failed.patch
new file mode 100644
index 0000000..dc9845d
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0051-timezone-fix-set-US-Alaska-failed.patch
@@ -0,0 +1,38 @@
+From 403cc7187dfcaae7257579bdd891ba42fb3f2ab1 Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Sun, 11 Sep 2016 21:52:30 -0400
+Subject: [PATCH 51/65] timezone: fix set US/Alaska failed
+
+Make sure the existence of dir.
+------
+ File "/usr/lib64/python2.7/site-packages/pyanaconda/timezone.py", line 108, in write_timezone_config
+ shutil.copyfile(tz_file, rooted_tz_file)
+
+ File "/usr/lib64/python2.7/shutil.py", line 83, in copyfile
+ with open(dst, 'wb') as fdst:
+
+IOError: [Errno 2] No such file or directory: '/mnt/sysimage/usr/share/zoneinfo/US/Alaska'
+------
+
+Upstream-Status: Pending
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/timezone.py | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/pyanaconda/timezone.py b/pyanaconda/timezone.py
+index 21b1ec1..f84100b 100644
+--- a/pyanaconda/timezone.py
++++ b/pyanaconda/timezone.py
+@@ -103,6 +103,7 @@ def write_timezone_config(timezone, root):
+ link_path = os.path.normpath(root + "/etc/localtime")
+
+ if not os.access(rooted_tz_file, os.R_OK) and os.access(tz_file, os.R_OK):
++ iutil.mkdirChain(os.path.dirname(rooted_tz_file))
+ shutil.copyfile(tz_file, rooted_tz_file)
+
+ if not os.access(rooted_tz_file, os.R_OK):
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0052-remove-incorrect-prefix-of-addon-repo-url.patch b/meta-installer/recipes-installer/anaconda/files/0052-remove-incorrect-prefix-of-addon-repo-url.patch
new file mode 100644
index 0000000..79f6719
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0052-remove-incorrect-prefix-of-addon-repo-url.patch
@@ -0,0 +1,42 @@
+From aba7e051a98c33da3b168222a2cd9325963c5601 Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Thu, 1 Jun 2017 14:39:13 +0800
+Subject: [PATCH 52/65] remove incorrect prefix of addon repo url
+
+While user set addon repo url with "http://128.224.162.227/intel_x86_64/",
+it has incorrect prefix "http://http://128.224.162.227/intel_x86_64/".
+
+So remove incorrect prefix of addon repo url.
+
+Upstream-Status: Pending
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/ui/gui/spokes/source.py | 10 ++++++++--
+ 1 file changed, 8 insertions(+), 2 deletions(-)
+
+diff --git a/pyanaconda/ui/gui/spokes/source.py b/pyanaconda/ui/gui/spokes/source.py
+index b8bd739..34fa04d 100644
+--- a/pyanaconda/ui/gui/spokes/source.py
++++ b/pyanaconda/ui/gui/spokes/source.py
+@@ -1521,9 +1521,15 @@ class SourceSpoke(NormalSpoke, GUISpokeInputCheckHandler):
+ proto = REPO_PROTO[idx]
+ url = self._repoUrlEntry.get_text().strip()
+ if self._repoMirrorlistCheckbox.get_active():
+- repo.mirorlist = proto + url
++ if not url.startswith(proto):
++ repo.mirorlist = proto + url
++ else:
++ repo.mirorlist = url
+ else:
+- repo.baseurl = proto + url
++ if not url.startswith(proto):
++ repo.baseurl = proto + url
++ else:
++ repo.baseurl = url
+
+ # do not update check status if check are not yet set up
+ # (populationg/refreshing the spoke)
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0053-fix-write-sysconfig-network-failed.patch b/meta-installer/recipes-installer/anaconda/files/0053-fix-write-sysconfig-network-failed.patch
new file mode 100644
index 0000000..627dda2
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0053-fix-write-sysconfig-network-failed.patch
@@ -0,0 +1,32 @@
+From 1575c801c627ae652c159ab6c1f34f02de9acffe Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Mon, 24 Oct 2016 05:28:01 -0400
+Subject: [PATCH 53/65] fix write sysconfig network failed
+
+While target does not have sysconfig, the anaconda should not
+write sysconfig network.
+
+Upstream-Status: Pending
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/network.py | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/pyanaconda/network.py b/pyanaconda/network.py
+index 36676ad..953dfb3 100644
+--- a/pyanaconda/network.py
++++ b/pyanaconda/network.py
+@@ -1338,6 +1338,9 @@ def usedByFCoE(iface, storage):
+
+ def write_sysconfig_network(rootpath, overwrite=False):
+
++ if (not os.path.isdir(rootpath + sysconfigDir)):
++ return False
++
+ cfgfile = os.path.normpath(rootpath + networkConfFile)
+ if (os.path.isfile(cfgfile) and not overwrite):
+ return False
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0054-pyanaconda-ui-gui-utils.py-tweak-mouse-arrow.patch b/meta-installer/recipes-installer/anaconda/files/0054-pyanaconda-ui-gui-utils.py-tweak-mouse-arrow.patch
new file mode 100644
index 0000000..24484e5
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0054-pyanaconda-ui-gui-utils.py-tweak-mouse-arrow.patch
@@ -0,0 +1,31 @@
+From 35670268636a6dd87c74cd67dcc6fb7b10530ea0 Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Tue, 15 Nov 2016 01:23:50 -0500
+Subject: [PATCH 54/65] pyanaconda/ui/gui/utils.py: tweak mouse arrow
+
+The arrow of Gdk.CursorType.ARROW points to right, use
+Gdk.CursorType.LEFT_PTR to replace.
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/ui/gui/utils.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/pyanaconda/ui/gui/utils.py b/pyanaconda/ui/gui/utils.py
+index 8394eac..8e4c395 100644
+--- a/pyanaconda/ui/gui/utils.py
++++ b/pyanaconda/ui/gui/utils.py
+@@ -345,7 +345,7 @@ def unbusyCursor():
+ if not window:
+ return
+
+- window.set_cursor(Gdk.Cursor(Gdk.CursorType.ARROW))
++ window.set_cursor(Gdk.Cursor(Gdk.CursorType.LEFT_PTR))
+
+ def ignoreEscape(dlg):
+ """Prevent a dialog from accepting the escape keybinding, which emits a
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0055-tweak-search-location-of-new-kernel-pkg.patch b/meta-installer/recipes-installer/anaconda/files/0055-tweak-search-location-of-new-kernel-pkg.patch
new file mode 100644
index 0000000..6414976
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0055-tweak-search-location-of-new-kernel-pkg.patch
@@ -0,0 +1,30 @@
+From e4355aa23df3856846db139674bb8f7feeae984b Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Thu, 1 Jun 2017 17:01:39 +0800
+Subject: [PATCH 55/65] tweak search location of new-kernel-pkg
+
+In OE, it locates /sbin rather than /usr/sbin
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/payload/__init__.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/pyanaconda/payload/__init__.py b/pyanaconda/payload/__init__.py
+index 00ff79f..24a234e 100644
+--- a/pyanaconda/payload/__init__.py
++++ b/pyanaconda/payload/__init__.py
+@@ -664,7 +664,7 @@ class Payload(object):
+
+ :returns: None
+ """
+- if not os.path.exists(iutil.getSysroot() + "/usr/sbin/new-kernel-pkg"):
++ if not os.path.exists(iutil.getSysroot() + "/sbin/new-kernel-pkg"):
+ log.error("new-kernel-pkg does not exist - grubby wasn't installed? skipping")
+ return
+
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0056-always-write-fstab-after-install.patch b/meta-installer/recipes-installer/anaconda/files/0056-always-write-fstab-after-install.patch
new file mode 100644
index 0000000..488539c
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0056-always-write-fstab-after-install.patch
@@ -0,0 +1,31 @@
+From bb47aa267bdb3accd52f5d695286980e5ddf6e9f Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Fri, 2 Jun 2017 17:20:27 +0800
+Subject: [PATCH 56/65] always write fstab after install
+
+Always write fstab after instal, make sure the generated
+/etc/fstab not overwritten by the one from package install.
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/payload/dnfpayload.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/pyanaconda/payload/dnfpayload.py b/pyanaconda/payload/dnfpayload.py
+index 8cad37b..73eaff3 100644
+--- a/pyanaconda/payload/dnfpayload.py
++++ b/pyanaconda/payload/dnfpayload.py
+@@ -1320,7 +1320,7 @@ class DNFPayload(payload.PackagePayload):
+ ["-a"],
+ root=pyanaconda.iutil.getSysroot())
+
+- def writeStorageLate(self):
++ def writeStorageEarly(self):
+ pass
+
+
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0057-invoke-grub-install-to-generate-efi-filesystem.patch b/meta-installer/recipes-installer/anaconda/files/0057-invoke-grub-install-to-generate-efi-filesystem.patch
new file mode 100644
index 0000000..4b47bd4
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0057-invoke-grub-install-to-generate-efi-filesystem.patch
@@ -0,0 +1,60 @@
+From b44a5d91f984c6dbb46ace1a8c46c5b517440577 Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Tue, 6 Jun 2017 15:40:55 +0800
+Subject: [PATCH 57/65] invoke grub-install to generate efi filesystem
+
+Previously, the efi filesystem was from package grub-efi
+which generated at build time.
+
+Add a wraper to generate efi filesystem with fs_uuid located.
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/bootloader.py | 22 ++++++++++++++++++++++
+ 1 file changed, 22 insertions(+)
+
+diff --git a/pyanaconda/bootloader.py b/pyanaconda/bootloader.py
+index 7e3fce1..ace90b0 100644
+--- a/pyanaconda/bootloader.py
++++ b/pyanaconda/bootloader.py
+@@ -1711,6 +1711,11 @@ class EFIBase(object):
+ efi_dir = flags.cmdline.get("force_efi_dir")
+ return "efi/EFI/%s" % (efi_dir,)
+
++ @property
++ def config_file(self):
++ """ Full path to configuration file. """
++ return "%s/grub/%s" % (self.config_dir, self._config_file)
++
+ def efibootmgr(self, *args, **kwargs):
+ if flags.imageInstall or flags.dirInstall:
+ log.info("Skipping efibootmgr for image/directory install.")
+@@ -1800,6 +1805,23 @@ class EFIBase(object):
+ self.remove_efi_boot_target()
+ self.add_efi_boot_target()
+
++ with open(iutil.getSysroot() + "/tmp/grub-mkimage-wrapper.sh", "w") as f:
++ f.write('#!/bin/sh\n')
++ f.write('uuid=`grub-probe --target=fs_uuid /boot/efi/`\n')
++ f.write('echo "search.fs_uuid ${uuid} root" > /tmp/load.cfg\n')
++ f.write('echo "grub-mkimage -c /tmp/load.cfg $@ search_fs_uuid"\n')
++ f.write('grub-mkimage -c /tmp/load.cfg $@ search_fs_uuid\n')
++ os.chmod(iutil.getSysroot() + "/tmp/grub-mkimage-wrapper.sh", 0o755)
++
++ rc = iutil.execInSysroot("grub-install", ["--removable",
++ "--efi-directory=/boot/efi/",
++ "--boot-directory=%s" % self.config_dir,
++ "--grub-mkimage=/tmp/grub-mkimage-wrapper.sh",
++ "/boot/efi/"
++ ])
++ if rc:
++ raise BootLoaderError("boot loader install failed")
++
+
+ class EFIGRUB1(EFIBase, GRUB):
+ packages = ["efibootmgr"]
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0058-do-not-support-closest-mirror.patch b/meta-installer/recipes-installer/anaconda/files/0058-do-not-support-closest-mirror.patch
new file mode 100644
index 0000000..97ee22a
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0058-do-not-support-closest-mirror.patch
@@ -0,0 +1,96 @@
+From e3c49a4ed129e6719e87f792915dc6c2d1ddc915 Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Fri, 9 Jun 2017 10:58:07 +0800
+Subject: [PATCH 58/65] do not support closest mirror
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/ui/gui/spokes/source.glade | 1 -
+ pyanaconda/ui/gui/spokes/source.py | 4 ----
+ pyanaconda/ui/tui/spokes/source.py | 18 ++++++------------
+ 3 files changed, 6 insertions(+), 17 deletions(-)
+
+diff --git a/pyanaconda/ui/gui/spokes/source.glade b/pyanaconda/ui/gui/spokes/source.glade
+index 089838c..ba0ee10 100644
+--- a/pyanaconda/ui/gui/spokes/source.glade
++++ b/pyanaconda/ui/gui/spokes/source.glade
+@@ -755,7 +755,6 @@
+ <item id="https">https://</item>
+ <item id="ftp">ftp://</item>
+ <item id="nfs">nfs</item>
+- <item id="Closest mirror" translatable="yes">Closest mirror</item>
+ </items>
+ <signal name="changed" handler="on_protocol_changed" swapped="no"/>
+ </object>
+diff --git a/pyanaconda/ui/gui/spokes/source.py b/pyanaconda/ui/gui/spokes/source.py
+index 34fa04d..86eaa9b 100644
+--- a/pyanaconda/ui/gui/spokes/source.py
++++ b/pyanaconda/ui/gui/spokes/source.py
+@@ -821,10 +821,6 @@ class SourceSpoke(NormalSpoke, GUISpokeInputCheckHandler):
+ combo = self.builder.get_object("isoPartitionCombo")
+ combo.set_active(active)
+
+- # We default to the mirror list, and then if the method tells us
+- # something different later, we can change it.
+- self._protocolComboBox.set_active_id(PROTOCOL_MIRROR)
+-
+ if self.data.method.method == "url":
+ self._networkButton.set_active(True)
+
+diff --git a/pyanaconda/ui/tui/spokes/source.py b/pyanaconda/ui/tui/spokes/source.py
+index 9e51147..3b3fe71 100644
+--- a/pyanaconda/ui/tui/spokes/source.py
++++ b/pyanaconda/ui/tui/spokes/source.py
+@@ -58,7 +58,7 @@ class SourceSpoke(EditTUISpoke, SourceSwitchHandler):
+ helpFile = "SourceSpoke.txt"
+ category = SoftwareCategory
+
+- _protocols = (N_("Closest mirror"), "http://", "https://", "ftp://", "nfs")
++ _protocols = ("http://", "https://", "ftp://", "nfs")
+
+ # default to 'closest mirror', as done in the GUI
+ _selection = 1
+@@ -179,13 +179,7 @@ class SourceSpoke(EditTUISpoke, SourceSwitchHandler):
+ if args == 2:
+ # network install
+ self._selection = num
+- if self._selection == 1:
+- # closest mirror
+- self.set_source_closest_mirror()
+- self.apply()
+- self.close()
+- return INPUT_PROCESSED
+- elif self._selection in range(2, 5):
++ if self._selection in range(1, 4):
+ # preliminary URL source switch
+ self.set_source_url()
+ newspoke = SpecifyRepoSpoke(self.app, self.data, self.storage,
+@@ -194,7 +188,7 @@ class SourceSpoke(EditTUISpoke, SourceSwitchHandler):
+ self.apply()
+ self.close()
+ return INPUT_PROCESSED
+- elif self._selection == 5:
++ elif self._selection == 4:
+ # nfs
+ # preliminary NFS source switch
+ self.set_source_nfs()
+@@ -266,11 +260,11 @@ class SpecifyRepoSpoke(EditTUISpoke, SourceSwitchHandler):
+ """ Apply all of our changes. """
+ log.info("apply args %s" % self.args)
+ url = None
+- if self.selection == 2 and not self.args.url.startswith("http://"):
++ if self.selection == 1 and not self.args.url.startswith("http://"):
+ url = "http://" + self.args.url
+- elif self.selection == 3 and not self.args.url.startswith("https://"):
++ elif self.selection == 2 and not self.args.url.startswith("https://"):
+ url = "https://" + self.args.url
+- elif self.selection == 4 and not self.args.url.startswith("ftp://"):
++ elif self.selection == 3 and not self.args.url.startswith("ftp://"):
+ url = "ftp://" + self.args.url
+ else:
+ # protocol either unknown or entry already starts with a protocol
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0059-tweak-MAX_TREEINFO_DOWNLOAD_RETRIES.patch b/meta-installer/recipes-installer/anaconda/files/0059-tweak-MAX_TREEINFO_DOWNLOAD_RETRIES.patch
new file mode 100644
index 0000000..60c96f1
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0059-tweak-MAX_TREEINFO_DOWNLOAD_RETRIES.patch
@@ -0,0 +1,42 @@
+From 35d7ac6f653b42099f4e5e6126cc44f5d918d10b Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Fri, 9 Jun 2017 11:15:40 +0800
+Subject: [PATCH 59/65] tweak MAX_TREEINFO_DOWNLOAD_RETRIES
+
+Do not need to retry so many times.
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/payload/__init__.py | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/pyanaconda/payload/__init__.py b/pyanaconda/payload/__init__.py
+index 24a234e..1311a2b 100644
+--- a/pyanaconda/payload/__init__.py
++++ b/pyanaconda/payload/__init__.py
+@@ -75,7 +75,7 @@ USER_AGENT = "%s (anaconda)/%s" % (productName, productVersion)
+ from distutils.version import LooseVersion
+
+ REPO_NOT_SET = False
+-MAX_TREEINFO_DOWNLOAD_RETRIES = 6
++MAX_TREEINFO_DOWNLOAD_RETRIES = 1
+
+
+ def versionCmp(v1, v2):
+@@ -536,9 +536,9 @@ class Payload(object):
+ version = "rawhide"
+ except configparser.Error:
+ pass
+- log.debug("using treeinfo release version of %s", version)
++ log.info("using treeinfo release version of %s", version)
+ else:
+- log.debug("using default release version of %s", version)
++ log.info("using default release version of %s", version)
+
+ return version
+
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0060-tweak-time-setting.patch b/meta-installer/recipes-installer/anaconda/files/0060-tweak-time-setting.patch
new file mode 100644
index 0000000..031ee35
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0060-tweak-time-setting.patch
@@ -0,0 +1,106 @@
+From 5cbdfd4b80c56825716bf035041c19052777d413 Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Fri, 9 Jun 2017 14:55:45 +0800
+Subject: [PATCH 60/65] tweak time setting
+
+- Unify the gui and tui with the same default timezone setting
+
+- The tui not support NTP server setting
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/constants.py | 2 ++
+ pyanaconda/ui/gui/spokes/datetime_spoke.py | 3 +--
+ pyanaconda/ui/tui/spokes/time_spoke.py | 18 +++++-------------
+ 3 files changed, 8 insertions(+), 15 deletions(-)
+
+diff --git a/pyanaconda/constants.py b/pyanaconda/constants.py
+index d15767b..af421e1 100644
+--- a/pyanaconda/constants.py
++++ b/pyanaconda/constants.py
+@@ -69,6 +69,8 @@ DEFAULT_KEYBOARD = "us"
+
+ DRACUT_SHUTDOWN_EJECT = "/run/initramfs/usr/lib/dracut/hooks/shutdown/99anaconda-eject.sh"
+
++DEFAULT_TZ = "America/New_York"
++
+ # VNC questions
+ USEVNC = N_("Start VNC")
+ USETEXT = N_("Use text mode")
+diff --git a/pyanaconda/ui/gui/spokes/datetime_spoke.py b/pyanaconda/ui/gui/spokes/datetime_spoke.py
+index 996aed0..fe12fad 100644
+--- a/pyanaconda/ui/gui/spokes/datetime_spoke.py
++++ b/pyanaconda/ui/gui/spokes/datetime_spoke.py
+@@ -48,6 +48,7 @@ from pyanaconda import nm
+ from pyanaconda import ntp
+ from pyanaconda import flags
+ from pyanaconda import constants
++from pyanaconda.constants import DEFAULT_TZ
+ from pyanaconda.threads import threadMgr, AnacondaThread
+
+ import datetime
+@@ -63,8 +64,6 @@ SERVER_POOL = 1
+ SERVER_WORKING = 2
+ SERVER_USE = 3
+
+-DEFAULT_TZ = "America/New_York"
+-
+ SPLIT_NUMBER_SUFFIX_RE = re.compile(r'([^0-9]*)([-+])([0-9]+)')
+
+ def _compare_regions(reg_xlated1, reg_xlated2):
+diff --git a/pyanaconda/ui/tui/spokes/time_spoke.py b/pyanaconda/ui/tui/spokes/time_spoke.py
+index f2a62ea..693283d 100644
+--- a/pyanaconda/ui/tui/spokes/time_spoke.py
++++ b/pyanaconda/ui/tui/spokes/time_spoke.py
+@@ -28,6 +28,7 @@ from pyanaconda import ntp
+ from pyanaconda import constants
+ from pyanaconda.i18n import N_, _, C_
+ from pyanaconda.constants_text import INPUT_PROCESSED
++from pyanaconda.constants_text import DEFAULT_TZ
+ from pyanaconda.threads import threadMgr, AnacondaThread
+ from pyanaconda.flags import flags
+
+@@ -184,11 +185,10 @@ class TimeSpoke(FirstbootSpokeMixIn, NormalTUISpoke):
+
+ @property
+ def status(self):
+- if self.data.timezone.timezone:
+- return _("%s timezone") % self.data.timezone.timezone
+- else:
+- return _("Timezone is not set.")
++ if not self.data.timezone.timezone:
++ self.data.timezone.timezone = DEFAULT_TZ
+
++ return _("%s timezone") % self.data.timezone.timezone
+ def _summary_text(self):
+ """Return summary of current timezone & NTP configuration.
+
+@@ -227,7 +227,7 @@ class TimeSpoke(FirstbootSpokeMixIn, NormalTUISpoke):
+ else:
+ timezone_option = _("Set timezone")
+
+- _options = [timezone_option, _("Configure NTP servers")]
++ _options = [timezone_option]
+ text = [TextWidget(m) for m in _options]
+
+ def _prep(i, w):
+@@ -255,14 +255,6 @@ class TimeSpoke(FirstbootSpokeMixIn, NormalTUISpoke):
+ self.app.switch_screen_modal(self.timezone_spoke)
+ self.close()
+ return INPUT_PROCESSED
+- elif num == 2:
+- # configure NTP servers
+- newspoke = NTPServersSpoke(self.app, self.data, self.storage,
+- self.payload, self.instclass, self)
+- self.app.switch_screen_modal(newspoke)
+- self.apply()
+- self.close()
+- return INPUT_PROCESSED
+ else:
+ # the user provided an invalid option number, just stay in the spoke
+ return INPUT_PROCESSED
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0062-Add-dracut-args-for-home-to-bootloader.patch b/meta-installer/recipes-installer/anaconda/files/0062-Add-dracut-args-for-home-to-bootloader.patch
new file mode 100644
index 0000000..f65e567
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0062-Add-dracut-args-for-home-to-bootloader.patch
@@ -0,0 +1,35 @@
+From d6995821a402071cde412b563ff7ff2fcd7b26b8 Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Mon, 19 Jun 2017 14:55:45 +0800
+Subject: [PATCH 62/65] Add dracut args for /home to bootloader
+
+When /home is on a separate device like LVM or RAID dracut needs
+to know about this so add the needed rd.* parameters to the cmdline.
+This also works when upgrading.
+
+Upstream-Status: Pending
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/bootloader.py | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+diff --git a/pyanaconda/bootloader.py b/pyanaconda/bootloader.py
+index ace90b0..1ebc451 100644
+--- a/pyanaconda/bootloader.py
++++ b/pyanaconda/bootloader.py
+@@ -798,6 +798,11 @@ class BootLoader(object):
+ if usr_device:
+ dracut_devices.extend([usr_device])
+
++ # Does /home have its own device? If so, we need to tell dracut
++ home_device = storage.mountpoints.get("/home")
++ if home_device:
++ dracut_devices.extend([home_device])
++
+ netdevs = [d for d in storage.devices if (getattr(d, "complete", True) and
+ isinstance(d, NetworkStorageDevice))]
+ rootdev = storage.root_device
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0063-do-not-customize-window-theme.patch b/meta-installer/recipes-installer/anaconda/files/0063-do-not-customize-window-theme.patch
new file mode 100644
index 0000000..d2656d0
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0063-do-not-customize-window-theme.patch
@@ -0,0 +1,55 @@
+From 40530a0ca40763c92fffd0a0670bf1eb7b87e47e Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Wed, 21 Jun 2017 22:42:15 +0800
+Subject: [PATCH 63/65] do not customize window theme
+
+The customized window theme may broke metacity.
+...
+|(metacity:2675): metacity-WARNING **: "(null)" found in configuration
+database is not a valid value for mouse button modifier
+...
+
+Also remove install-data-hook, which caused host contamination
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ data/window-manager/config/Makefile.am | 7 +------
+ pyanaconda/display.py | 2 +-
+ 2 files changed, 2 insertions(+), 7 deletions(-)
+
+diff --git a/data/window-manager/config/Makefile.am b/data/window-manager/config/Makefile.am
+index 6d78347..f17ab6a 100644
+--- a/data/window-manager/config/Makefile.am
++++ b/data/window-manager/config/Makefile.am
+@@ -27,12 +27,7 @@ dist_schema_DATA = org.gnome.desktop.wm.keybindings.gschema.override \
+ # schemas they modify, so pretend that this is the case with symlinks and
+ # create the compiled schema.
+ install-data-hook:
+- $(MKDIR_P) $(DESTDIR)$(schemadir)
+- $(LN_S) -f /usr/share/glib-2.0/schemas/org.gnome.desktop.wm.keybindings.gschema.xml $(DESTDIR)$(schemadir)
+- $(LN_S) -f /usr/share/glib-2.0/schemas/org.gnome.desktop.wm.preferences.gschema.xml $(DESTDIR)$(schemadir)
+- $(LN_S) -f /usr/share/glib-2.0/schemas/org.gnome.metacity.gschema.xml $(DESTDIR)$(schemadir)
+- $(LN_S) -f /usr/share/glib-2.0/schemas/org.gnome.desktop.enums.xml $(DESTDIR)$(schemadir)
+- glib-compile-schemas --strict $(DESTDIR)$(schemadir)
++ echo "pass"
+
+ uninstall-local:
+ rm -f $(DESTDIR)$(schemadir)/*.xml
+diff --git a/pyanaconda/display.py b/pyanaconda/display.py
+index d3e599b..7f360df 100644
+--- a/pyanaconda/display.py
++++ b/pyanaconda/display.py
+@@ -164,7 +164,7 @@ def do_startup_x11_actions():
+ if 'XDG_DATA_DIRS' in os.environ:
+ xdg_data_dirs = datadir + '/window-manager:' + os.environ['XDG_DATA_DIRS']
+ else:
+- xdg_data_dirs = datadir + '/window-manager:/usr/share'
++ xdg_data_dirs = '/usr/share'
+
+ childproc = iutil.startProgram(["metacity", "--display", ":1", "--sm-disable"],
+ env_add={'XDG_DATA_DIRS': xdg_data_dirs})
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0064-tweak-product-short-name.patch b/meta-installer/recipes-installer/anaconda/files/0064-tweak-product-short-name.patch
new file mode 100644
index 0000000..c7773c3
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0064-tweak-product-short-name.patch
@@ -0,0 +1,33 @@
+From d240618cb08b977bdadb365a61e9324804827780 Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Mon, 10 Jul 2017 10:52:51 +0800
+Subject: [PATCH 64/65] tweak product short name
+
+The yocto named its production with braces which caused short name
+with illegal character that broke lvm partition.
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/constants.py | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/pyanaconda/constants.py b/pyanaconda/constants.py
+index af421e1..af42791 100644
+--- a/pyanaconda/constants.py
++++ b/pyanaconda/constants.py
+@@ -41,7 +41,9 @@ isFinal = product.isFinal
+
+ # for use in device names, eg: "fedora", "rhel"
+ shortProductName = productName.lower() # pylint: disable=no-member
+-if productName.count(" "): # pylint: disable=no-member
++if '(' in shortProductName and ')' in shortProductName:
++ shortProductName = shortProductName.split()[0]
++elif productName.count(" "): # pylint: disable=no-member
+ shortProductName = ''.join(s[0] for s in shortProductName.split())
+
+ # DriverDisc Paths
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0065-disable-dmraid.patch b/meta-installer/recipes-installer/anaconda/files/0065-disable-dmraid.patch
new file mode 100644
index 0000000..baa17d8
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0065-disable-dmraid.patch
@@ -0,0 +1,57 @@
+From be87c929e914a50e332cd3649159e8e504ff62f9 Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Wed, 19 Jul 2017 10:33:07 +0800
+Subject: [PATCH 65/65] disable dmraid
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ anaconda.py | 1 -
+ pyanaconda/anaconda_argparse.py | 4 ----
+ pyanaconda/flags.py | 2 +-
+ 3 files changed, 1 insertion(+), 6 deletions(-)
+
+diff --git a/anaconda.py b/anaconda.py
+index 91d3fc0..3d2be2d 100755
+--- a/anaconda.py
++++ b/anaconda.py
+@@ -445,7 +445,6 @@ if __name__ == "__main__":
+ flags.mpathFriendlyNames = opts.mpathfriendlynames
+ flags.debug = opts.debug
+ flags.askmethod = opts.askmethod
+- flags.dmraid = opts.dmraid
+ flags.mpath = opts.mpath
+ flags.ibft = opts.ibft
+ flags.selinux = opts.selinux
+diff --git a/pyanaconda/anaconda_argparse.py b/pyanaconda/anaconda_argparse.py
+index 35c4ed2..8d0c21a 100644
+--- a/pyanaconda/anaconda_argparse.py
++++ b/pyanaconda/anaconda_argparse.py
+@@ -496,10 +496,6 @@ def getArgumentParser(version_string, boot_cmdline=None):
+ help=help_parser.help_text("nompath"))
+ ap.add_argument("--mpath", action="store_true", help=help_parser.help_text("mpath"))
+
+- ap.add_argument("--nodmraid", dest="dmraid", action="store_false", default=True,
+- help=help_parser.help_text("nodmraid"))
+- ap.add_argument("--dmraid", action="store_true", help=help_parser.help_text("dmraid"))
+-
+ ap.add_argument("--noibft", dest="ibft", action="store_false", default=True,
+ help=help_parser.help_text("noibft"))
+ ap.add_argument("--ibft", action="store_true", help=help_parser.help_text("ibft"))
+diff --git a/pyanaconda/flags.py b/pyanaconda/flags.py
+index 7c5f3b4..4c5928e 100644
+--- a/pyanaconda/flags.py
++++ b/pyanaconda/flags.py
+@@ -49,7 +49,7 @@ class Flags(object):
+ self.usevnc = False
+ self.vncquestion = True
+ self.mpath = True
+- self.dmraid = True
++ self.dmraid = False
+ self.selinux = SELINUX_DEFAULT
+ self.debug = False
+ self.armPlatform = None
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0066-tweak-shebang-of-bash.patch b/meta-installer/recipes-installer/anaconda/files/0066-tweak-shebang-of-bash.patch
new file mode 100644
index 0000000..ec1f223
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0066-tweak-shebang-of-bash.patch
@@ -0,0 +1,25 @@
+From 304202b2400fb6f4d6b507703121d31f4446e773 Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Mon, 21 Aug 2017 11:29:29 +0800
+Subject: [PATCH] tweak shebang of bash
+
+Upstream-Status: Pending
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ scripts/run-anaconda | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/scripts/run-anaconda b/scripts/run-anaconda
+index d31f70c..a774d45 100755
+--- a/scripts/run-anaconda
++++ b/scripts/run-anaconda
+@@ -1,4 +1,4 @@
+-#!/usr/bin/bash
++#!/bin/bash
+ #
+ # Quick script to attach to tmux where anaconda is running
+ #
+--
+1.8.3.1
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0067-Tweak-label-name.patch b/meta-installer/recipes-installer/anaconda/files/0067-Tweak-label-name.patch
new file mode 100644
index 0000000..4aec96d
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0067-Tweak-label-name.patch
@@ -0,0 +1,56 @@
+From fbd17b0820e3309dd07281885fc3e9a5a2524cb5 Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Tue, 5 Sep 2017 14:01:20 +0800
+Subject: [PATCH] Tweak label name
+
+In yocto, the product name is too long, which enlarge
+the gui window, short them.
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/product.py | 4 ++++
+ pyanaconda/ui/gui/spokes/welcome.py | 4 ++--
+ 2 files changed, 6 insertions(+), 2 deletions(-)
+
+diff --git a/pyanaconda/product.py b/pyanaconda/product.py
+index b968129..b95563a 100644
+--- a/pyanaconda/product.py
++++ b/pyanaconda/product.py
+@@ -50,6 +50,10 @@ if productVersion == "development":
+ productVersion = "rawhide"
+
+ def distributionText():
++ if '(' in productName and ')' in productName:
++ return _("%(productName)s %(productVersion)s INSTALLATION") % \
++ {"productName": productName.split()[0], "productVersion": productVersion}
++
+ return _("%(productName)s %(productVersion)s INSTALLATION") % \
+ {"productName": productName, "productVersion": productVersion}
+
+diff --git a/pyanaconda/ui/gui/spokes/welcome.py b/pyanaconda/ui/gui/spokes/welcome.py
+index d67cacd..25c3b76 100644
+--- a/pyanaconda/ui/gui/spokes/welcome.py
++++ b/pyanaconda/ui/gui/spokes/welcome.py
+@@ -37,7 +37,7 @@ from pyanaconda import flags
+ from pyanaconda import geoloc
+ from pyanaconda.i18n import _, C_
+ from pyanaconda.iutil import is_unsupported_hw, ipmi_abort
+-from pyanaconda.constants import DEFAULT_LANG, WINDOW_TITLE_TEXT
++from pyanaconda.constants import DEFAULT_LANG, WINDOW_TITLE_TEXT, shortProductName
+
+ import logging
+ log = logging.getLogger("anaconda")
+@@ -216,7 +216,7 @@ class WelcomeLanguageSpoke(LangLocaleHandler, StandaloneSpoke):
+ 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" : shortProductName.upper(), "version" : productVersion}) # pylint: disable=no-member
+
+ # Retranslate the language (filtering) entry's placeholder text
+ languageEntry = self.builder.get_object("languageEntry")
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0068-livepayload.py-copy-grub-from-host-os.patch b/meta-installer/recipes-installer/anaconda/files/0068-livepayload.py-copy-grub-from-host-os.patch
new file mode 100644
index 0000000..a2f1f81
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0068-livepayload.py-copy-grub-from-host-os.patch
@@ -0,0 +1,51 @@
+From 1ae76a832f560356ce5802a16020dff432f6c128 Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Fri, 15 Sep 2017 10:49:18 +0800
+Subject: [PATCH] livepayload.py: copy grub from host os
+
+The image install require both of grub and grub-efi to be
+installed, but oe-core has a file confliction error while
+install both of them (I have sent a fix to oe-core, but not reply)
+
+The temporary workaround is to copy it from host os
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ pyanaconda/payload/livepayload.py | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+diff --git a/pyanaconda/payload/livepayload.py b/pyanaconda/payload/livepayload.py
+index 1c41402..cc41d1e 100644
+--- a/pyanaconda/payload/livepayload.py
++++ b/pyanaconda/payload/livepayload.py
+@@ -36,6 +36,7 @@ from pyanaconda.iutil import ProxyString, ProxyStringError, lowerASCII
+ import hashlib
+ import glob
+ import functools
++import shutil
+
+ from pyanaconda.payload import ImagePayload, PayloadSetupError, PayloadInstallError
+
+@@ -160,6 +161,17 @@ class LiveImagePayload(ImagePayload):
+ if errorHandler.cb(exn) == ERROR_RAISE:
+ raise exn
+
++ # Live needs grub-install, grub-set-default and grub-mkconf
++ # Copy it from host os
++ iutil.execWithRedirect("cp", ["-fr", "/etc/grub.d", iutil.getSysroot()+"/etc"])
++ iutil.execWithRedirect("cp", ["-fr", "/usr/share/grub", iutil.getSysroot()+"/usr/share"])
++ for pat in ["/usr/bin/grub-*", "/usr/sbin/grub-*"]:
++ for f in glob.glob(pat):
++ try:
++ shutil.copy(f, iutil.getSysroot()+os.path.dirname(f))
++ except IOError as e:
++ log.info("Could not copy file %s: %s", f, e.strerror)
++
+ # Wait for progress thread to finish
+ with self.pct_lock:
+ self.pct = 100
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/0069-test-existence-of-noverifyssl.patch b/meta-installer/recipes-installer/anaconda/files/0069-test-existence-of-noverifyssl.patch
new file mode 100644
index 0000000..43ac959
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/0069-test-existence-of-noverifyssl.patch
@@ -0,0 +1,31 @@
+From 277bfa0cf941ea58b9765805d88729080c2d3a70 Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia at windriver.com>
+Date: Wed, 27 Sep 2017 10:46:55 +0800
+Subject: [PATCH] test existence of noverifyssl
+
+While CDROM, the noverifyssl does not exist,
+the setting triger a failure.
+
+Upstream-Status: Inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia at windriver.com>
+---
+ anaconda.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/anaconda.py b/anaconda.py
+index 3d2be2d..feb9b3b 100755
+--- a/anaconda.py
++++ b/anaconda.py
+@@ -531,7 +531,7 @@ if __name__ == "__main__":
+ iutil.setenv("ftp_proxy", proxy.url)
+ iutil.setenv("HTTPS_PROXY", proxy.url)
+
+- if flags.noverifyssl:
++ if flags.noverifyssl and hasattr(ksdata.method, "noverifyssl"):
+ ksdata.method.noverifyssl = flags.noverifyssl
+ if opts.multiLib:
+ # sets dnf's multilib_policy to "all" (as opposed to "best")
+--
+2.7.4
+
diff --git a/meta-installer/recipes-installer/anaconda/files/81-edit-sudoers.ks b/meta-installer/recipes-installer/anaconda/files/81-edit-sudoers.ks
new file mode 100644
index 0000000..b1a7980
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/81-edit-sudoers.ks
@@ -0,0 +1,3 @@
+%post
+echo "%wheel ALL=(ALL) ALL" > /etc/sudoers.d/wheel
+%end
diff --git a/meta-installer/recipes-installer/anaconda/files/wrlinux.py b/meta-installer/recipes-installer/anaconda/files/wrlinux.py
new file mode 100644
index 0000000..31abdae
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/files/wrlinux.py
@@ -0,0 +1,112 @@
+#
+# wrlinux.py
+#
+# Copyright (C) 2010 Red Hat, Inc. All rights reserved.
+# Copyright (C) 2016 Wind River Systems, All rights reserved.
+# Copyright (C) 2017 Wind River Systems, All rights reserved.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+from pyanaconda.installclass import BaseInstallClass
+from pyanaconda.product import productName
+from pyanaconda import network
+from pyanaconda import nm
+from pyanaconda.flags import flags
+
+import configparser
+import os
+
+class WRLinuxBaseInstallClass(BaseInstallClass):
+ id = "wrlinux"
+ name = productName
+ sortPriority = 100000
+ defaultFS = "ext4"
+
+ bootloaderTimeoutDefault = 5
+
+ installUpdates = False
+
+ _l10n_domain = "comps"
+
+ efi_dir = "BOOT"
+
+ def setNetworkOnbootDefault(self, ksdata):
+ if any(nd.onboot for nd in ksdata.network.network if nd.device):
+ return
+ # choose first wired device having link
+ for dev in nm.nm_devices():
+ if nm.nm_device_type_is_wifi(dev):
+ continue
+ try:
+ link_up = nm.nm_device_carrier(dev)
+ except (nm.UnknownDeviceError, nm.PropertyNotFoundError):
+ continue
+ if link_up:
+ network.update_onboot_value(dev, True, ksdata=ksdata)
+ break
+
+ def __init__(self):
+ BaseInstallClass.__init__(self)
+
+ def read_buildstamp(self):
+ image = {}
+ tasks = {}
+
+ if not flags.livecdInstall:
+ config = configparser.ConfigParser()
+ config.read(["/tmp/product/.buildstamp", "/.buildstamp", os.environ.get("PRODBUILDPATH", "")])
+
+ image_list = (config.get("Rootfs", "LIST") or "").split()
+ for image_name in image_list:
+ image_summary = config.get(image_name, "SUMMARY")
+ image_description = config.get(image_name, "DESCRIPTION")
+ package_install = config.get(image_name, "PACKAGE_INSTALL")
+ package_install_attemptonly = config.get(image_name,
+ "PACKAGE_INSTALL_ATTEMPTONLY")
+ image_linguas = config.get(image_name, "IMAGE_LINGUAS")
+ image[image_name] = (image_summary,
+ image_description,
+ package_install,
+ package_install_attemptonly,
+ image_linguas)
+
+ short_image = image_name.replace("%s-image-" % self.id, "")
+
+ taskid = short_image
+ name = image_name
+ description = "%s" % image_summary
+ group = ""
+ tasks[taskid] = (name, description, group)
+
+ taskid = "%s-dev" % short_image
+ name = "%s dev-pkgs staticdev-pkgs" % image_name
+ description = "%s with development files" % image_summary
+ group = "dev-pkgs staticdev-pkgs"
+ tasks[taskid] = (name, description, group)
+
+ taskid = "%s-dbg" % short_image
+ name = "%s dbg-pkgs" % image_name
+ description = "%s with debug symbols" % image_summary
+ group = "dbg-pkgs"
+ tasks[taskid] = (name, description, group)
+
+ taskid = "%s-dev-dbg" % short_image
+ name = "%s dev-pkgs staticdev-pkgs dbg-pkgs" % image_name
+ description = "%s with development files and debug symbols" % image_summary
+ group = "dev-pkgs staticdev-pkgs dbg-pkgs"
+ tasks[taskid] = (name, description, group)
+
+ return image, tasks
+
diff --git a/meta-installer/recipes-installer/anaconda/python3-anaconda_26.21.11.bb b/meta-installer/recipes-installer/anaconda/python3-anaconda_26.21.11.bb
new file mode 100755
index 0000000..36cbaa0
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda/python3-anaconda_26.21.11.bb
@@ -0,0 +1,161 @@
+SUMMARY = "The anaconda package"
+DESCRIPTION = "The anaconda package"
+HOMEPAGE = "http://fedoraproject.org/wiki/Anaconda"
+LICENSE = "GPLv2"
+SECTION = "devel"
+
+LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263"
+
+DEPENDS = "e2fsprogs gettext libarchive \
+ pango python3 rpm \
+ "
+
+DEPENDS += "libxklavier glade libxml2-native \
+ gdk-pixbuf-native \
+ "
+
+S = "${WORKDIR}/git"
+
+RDEPENDS_${PN} = "e2fsprogs e2fsprogs-e2fsck e2fsprogs-mke2fs \
+ e2fsprogs-tune2fs e2fsprogs-resize2fs \
+ ntfsprogs xfsprogs btrfs-tools nfs-utils-client \
+ parted dosfstools gzip libarchive lvm2 \
+ squashfs-tools openssh python3 python3-misc \
+ python3-modules python3-dbus python3-pyparted \
+ python3-pykickstart \
+ dmidecode python3-meh python3-libreport localedef \
+ python3-pygobject python3-rpm grub usermode tigervnc \
+ tzdata tzdata-misc tzdata-posix tzdata-right tzdata-africa \
+ tzdata-americas tzdata-antarctica tzdata-arctic tzdata-asia \
+ tzdata-atlantic tzdata-australia tzdata-europe tzdata-pacific \
+ keybinder module-init-tools dnf util-linux efibootmgr \
+ ca-certificates isomd5sum \
+ btrfs-tools ntfs-3g iproute2 mdadm shadow chkconfig \
+ util-linux-swaponoff util-linux-uuidgen python3-blivet \
+ xrandr glibc-charmaps glibc-localedatas \
+ python3-pytz python3-langtable python3-libpwquality \
+ python3-ntplib libgnomekbd libtimezonemap \
+ procps python3-prctl rsync glibc-utils python3-pid \
+ python3-ordered-set python3-wrapt python3-coverage \
+ python3-requests-file python3-requests-ftp \
+ python3-blivetgui librsvg librsvg-gtk bash \
+ "
+
+RDEPENDS_${PN} += "networkmanager libnmutil libnmglib libnmglib-vpn \
+ network-manager-applet \
+"
+
+SRC_URI = "git://github.com/rhinstaller/anaconda;protocol=https;branch=f26-release \
+ file://wrlinux.py \
+ file://81-edit-sudoers.ks \
+ file://0001-do-not-support-po.patch \
+ file://0002-widgets-Makefile.am-do-not-compile-doc.patch \
+ file://0003-Revert-Use-system-Python-when-running-Anaconda.patch \
+ file://0004-pyanaconda-flags.py-drop-selinux-module.patch \
+ file://0005-add-package-site-dir-for-installclass-searching.patch \
+ file://0006-do-not-load-the-system-wide-Xresources.patch \
+ file://0007-tweak-iso-mount-dir-and-kernel-name.patch \
+ file://0008-dnfpayload.py-customize-for-WRLinux.patch \
+ file://0009-Remove-unnecessary-noverifyssl-for-http-ftp-protocol.patch \
+ file://0010-dynamic-detect-workable-locale.patch \
+ file://0011-improve-thread-monitor.patch \
+ file://0012-disable-audit.patch \
+ file://0013-bootloader.py-Change-grub2-settings-to-match-oe-core.patch \
+ file://0014-tweak-detect-kernel-version.patch \
+ file://0015-tweak-grub-config-file-for-WRLinux.patch \
+ file://0016-Revert-Use-time.tzset-to-apply-timezone-changes-when.patch \
+ file://0017-kickstart-Authconfig-Firewall-Firstboot-Timezone.patch \
+ file://0018-invisible-help-button.patch \
+ file://0019-disable-non-implemented-functions.patch \
+ file://0020-disable-geoloc-by-default.patch \
+ file://0021-support-UEFI-boot.patch \
+ file://0022-do-not-verify-ssl-certification-by-default.patch \
+ file://0023-tweak-default-nfs-mount-point.patch \
+ file://0024-fix-quoted-empty-string-failed.patch \
+ file://0025-do-not-support-ISO-hold-by-hard-drive-partitions.patch \
+ file://0026-fix-cannot-stat-usr-share-gettext-gettext.h.patch \
+ file://0027-fix-Wind-River-boot-menu-not-work.patch \
+ file://0028-tweak-bootloader-fs-type.patch \
+ file://0029-support-timezone-setting.patch \
+ file://0030-disable-ntp-support.patch \
+ file://0031-do-not-support-manually-set-time.patch \
+ file://0032-support-user-account-creation.patch \
+ file://0033-detect-existence-of-Xorg.patch \
+ file://0034-fix-write-network-conf-failed-while-liveinst.patch \
+ file://0035-revert-commits-to-support-reboot-for-live-installs.patch \
+ file://0036-text-repository-setting-do-not-support-local-ISO-fil.patch \
+ file://0037-text-repository-setting-support-http-proxy.patch \
+ file://0038-set-keyboard-xlayouts-with-us-by-default.patch \
+ file://0039-text-do-not-support-network-setting-for-now.patch \
+ file://0040-tweak-boot-storage-sanity-check.patch \
+ file://0041-kickstart-do-not-support-network-configuration.patch \
+ file://0042-support-to-get-kickstart-from-network.patch \
+ file://0043-support-authentication-for-kickstart.patch \
+ file://0044-support-downloading-file-from-http-ftp-server-to-tar.patch \
+ file://0045-live-install-supports-kickstart.patch \
+ file://0046-support-initramfs-boot.patch \
+ file://0047-fix-hang-while-installed-system-reboot.patch \
+ file://0048-fix-installed-system-boot-from-encrypt-fs-failed.patch \
+ file://0049-installation-destination-disable-iSCSI-network-disks.patch \
+ file://0050-update-region-while-city-changes.patch \
+ file://0051-timezone-fix-set-US-Alaska-failed.patch \
+ file://0052-remove-incorrect-prefix-of-addon-repo-url.patch \
+ file://0053-fix-write-sysconfig-network-failed.patch \
+ file://0054-pyanaconda-ui-gui-utils.py-tweak-mouse-arrow.patch \
+ file://0055-tweak-search-location-of-new-kernel-pkg.patch \
+ file://0056-always-write-fstab-after-install.patch \
+ file://0057-invoke-grub-install-to-generate-efi-filesystem.patch \
+ file://0058-do-not-support-closest-mirror.patch \
+ file://0059-tweak-MAX_TREEINFO_DOWNLOAD_RETRIES.patch \
+ file://0060-tweak-time-setting.patch \
+ file://0062-Add-dracut-args-for-home-to-bootloader.patch \
+ file://0063-do-not-customize-window-theme.patch \
+ file://0064-tweak-product-short-name.patch \
+ file://0065-disable-dmraid.patch \
+ file://0066-tweak-shebang-of-bash.patch \
+ file://0067-Tweak-label-name.patch \
+ file://0068-livepayload.py-copy-grub-from-host-os.patch \
+ file://0069-test-existence-of-noverifyssl.patch \
+ "
+
+SRCREV = "3007d202469f90ef9bb7580ff4068a345ba1e588"
+
+FILES_${PN}-dbg += "${libexecdir}/anaconda/.debug ${PYTHON_SITEPACKAGES_DIR}/pyanaconda/.debug"
+FILES_${PN}-staticdev += "${PYTHON_SITEPACKAGES_DIR}/pyanaconda/_isys.a"
+FILES_${PN} = "/lib ${libdir} ${sysconfdir} ${bindir} ${sbindir} ${libexecdir} \
+ ${datadir}/anaconda ${datadir}/applications ${datadir}/glade \
+ ${PYTHON_SITEPACKAGES_DIR}/pyanaconda ${PYTHON_SITEPACKAGES_DIR}/log_picker \
+ ${datadir}/themes \
+"
+FILES_${PN}-misc = "/usr/lib"
+PACKAGES += "${PN}-misc"
+RDEPENDS_${PN}-misc += "bash python3-core"
+
+EXTRA_OECONF += "--disable-selinux \
+ --with-sysroot=${PKG_CONFIG_SYSROOT_DIR} \
+"
+
+inherit distro_features_check
+REQUIRED_DISTRO_FEATURES = "systemd x11"
+
+inherit autotools-brokensep gettext python3native pkgconfig gobject-introspection
+
+do_configure_prepend() {
+ ( cd ${S}; STAGING_DATADIR_NATIVE=${STAGING_DATADIR_NATIVE} ${S}/autogen.sh --noconfigure)
+}
+
+do_install_append() {
+ install -m 644 ${WORKDIR}/81-edit-sudoers.ks ${D}${datadir}/anaconda/post-scripts
+ install -m 644 ${S}/widgets/src/resources/*.svg ${D}${datadir}/anaconda/pixmaps
+ install -m 644 ${S}/widgets/src/resources/*.png ${D}${datadir}/anaconda/pixmaps
+}
+
+addtask do_setupdistro after do_patch before do_configure
+do_setupdistro() {
+ cp ${WORKDIR}/wrlinux.py ${S}/pyanaconda/installclasses/
+}
+
+python __anonymous () {
+ if not bb.utils.contains("PACKAGE_CLASSES", "package_rpm", True, False, d):
+ raise bb.parse.SkipPackage('Anaconda requires RPM packages to be the default in PACKAGE_CLASSES.')
+}
--
2.8.1
More information about the Openembedded-devel
mailing list