All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 00/15] create meta-installer layer
@ 2017-11-23 12:09 Hongxu Jia
  2017-11-23 12:09 ` [PATCH 01/15] meta-installer: create layer Hongxu Jia
                   ` (16 more replies)
  0 siblings, 17 replies; 27+ messages in thread
From: Hongxu Jia @ 2017-11-23 12:09 UTC (permalink / raw)
  To: Martin.Jansa, akuster808, raj.khem; +Cc: openembedded-devel

The meta-installer layer provides a collection of installation
programs based on OE platform.

One implementation is the target installer 'anaconda', the version
is 26.21.11 which is based on Fedora 26.

The anacoda requires:
- systemd as init manager
- python3
- dnf2/rpm4
- gobject-introspection which requires qemu-usermode
  in MACHINE_FEATURES

The anaconda provides:
- graphic install and text install.

- package based (dnf/rpm) install and image (copy)
  based install.

- package based (dnf/rpm) install from local and
  remote rpm sources such as CDs and DVDs, images
  stored on a hard drive, NFS, HTTP, and FTP.

- kickstart install which provides a fully unattended
  installation that can be duplicated on scores of machines.

- install over VNC on headless machines.

- timezone setting.

- root password setting.

- user account creation.

- a variety of advanced storage devices including
  LVM, Btrfs, Ext4, and filesystem encryption. 

TODO (currently not support):
- keyboard setting

- language support setting

- network & host name setting

//Hongxu

The following changes since commit 34aa4c3202b427f59f843dc43a4e1afda4f81d13:

  usb-modeswitch: add usb-modeswitch@.service (2017-11-19 13:45:38 -0800)

are available in the git repository at:

  git://git.openembedded.org/openembedded-core-contrib hongxu/meta-installer
  http://cgit.openembedded.org/openembedded-core-contrib/log/?h=hongxu/meta-installer

Hongxu Jia (15):
  meta-installer: create layer
  meta-installer: add kernel config
  meta-installer: add anaconda support for target build
  meta-installer: add distro anaconda for host build
  meta-installer: add systemd/systemd-serialgetty bbappend
  meta-installer: add gtk+3 bbappend
  meta-installer: add initramfs-live-boot bbappend
  meta-installer: add xserver-xf86-config bbappend
  meta-installer: add multipath-tools bbappend
  meta-installer: add recipe packagegroup-installer-x11-anaconda
  meta-installer: add recipe yocto-compat-logos
  meta-installer: add recipe anaconda-init
  meta-installer: add recipe anaconda 26.21.11
  meta-installer: add recipe core-image-anaconda
  meta-installer: add recipe core-image-anaconda-initramfs

 meta-installer/COPYING.MIT                         |  17 +
 meta-installer/README                              |  47 ++
 meta-installer/README.anaconda                     | 341 ++++++++++++
 meta-installer/classes/anaconda_image.bbclass      | 321 +++++++++++
 meta-installer/classes/anaconda_kernel.bbclass     |  14 +
 .../classes/anaconda_support_image.bbclass         |  40 ++
 .../classes/anaconda_support_kernel.bbclass        |   8 +
 meta-installer/conf/distro/anaconda.conf           |  33 ++
 meta-installer/conf/layer.conf                     |  31 ++
 meta-installer/licenses/FLTK                       | 530 ++++++++++++++++++
 .../systemd/files/serial-getty@.service            |  40 ++
 .../systemd/files/serial-screen-anaconda.sh        |   5 +
 .../systemd/systemd-serialgetty.bbappend           |  12 +
 .../recipes-core/systemd/systemd_%.bbappend        |   6 +
 ...for-anaconda-installer-while-loading-libA.patch |  84 +++
 .../recipes-gnome/gtk+/gtk+3_%.%.%.bbappend        |   3 +
 .../xorg-xserver/xserver-xf86-config_0.1.bbappend  |  12 +
 .../anaconda-init/anaconda-init.bb                 |  77 +++
 .../anaconda-init/anaconda-init/COPYING            | 339 ++++++++++++
 .../anaconda-init/anaconda-init/Xusername          |   1 +
 .../anaconda-init/anaconda-init/anaconda-init      | 362 +++++++++++++
 .../anaconda-init/anaconda-init-screen@.service    |  22 +
 .../anaconda-init/anaconda-init.service            |  13 +
 .../anaconda-init/anaconda-init.target             |   6 +
 .../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 ++++++
 .../images/core-image-anaconda-initramfs.bb        |  33 ++
 .../images/core-image-anaconda.bb                  |  34 ++
 .../initrdscripts/files/init-live.sh               | 249 +++++++++
 .../initrdscripts/initramfs-live-boot_1.0.bbappend |   5 +
 .../recipes-installer/logos/yocto-compat-logos.bb  |  24 +
 .../logos/yocto-compat-logos/COPYING               | 339 ++++++++++++
 .../logos/yocto-compat-logos/banner_yocto1.png     | Bin 0 -> 44650 bytes
 .../logos/yocto-compat-logos/banner_yocto2.png     | Bin 0 -> 39223 bytes
 .../logos/yocto-compat-logos/sidebar-logo.png      | Bin 0 -> 17651 bytes
 .../logos/yocto-compat-logos/topbar-bg.png         | Bin 0 -> 77956 bytes
 .../packagegroup-installer-x11-anaconda.bb         |  28 +
 .../packagegroups/packagegroup-anaconda-support.bb |  26 +
 .../recipes-kernel/linux/files/crypt.cfg           |   2 +
 .../recipes-kernel/linux/files/crypt.scc           |   1 +
 .../recipes-kernel/linux/files/dmthin.cfg          |   1 +
 .../recipes-kernel/linux/files/dmthin.scc          |   1 +
 .../recipes-kernel/linux/files/efivars.cfg         |   1 +
 .../recipes-kernel/linux/files/efivars.scc         |   1 +
 meta-installer/recipes-kernel/linux/files/ide.cfg  |   5 +
 meta-installer/recipes-kernel/linux/files/ide.scc  |   1 +
 .../recipes-kernel/linux/files/liveinstall.cfg     |   5 +
 .../recipes-kernel/linux/files/liveinstall.scc     |   1 +
 .../recipes-kernel/linux/files/multipath.cfg       |   3 +
 .../recipes-kernel/linux/files/multipath.scc       |   1 +
 .../multipath-tools/multipath-tools_%.bbappend     |   8 +
 120 files changed, 7845 insertions(+)
 create mode 100644 meta-installer/COPYING.MIT
 create mode 100644 meta-installer/README
 create mode 100644 meta-installer/README.anaconda
 create mode 100644 meta-installer/classes/anaconda_image.bbclass
 create mode 100644 meta-installer/classes/anaconda_kernel.bbclass
 create mode 100644 meta-installer/classes/anaconda_support_image.bbclass
 create mode 100644 meta-installer/classes/anaconda_support_kernel.bbclass
 create mode 100644 meta-installer/conf/distro/anaconda.conf
 create mode 100644 meta-installer/conf/layer.conf
 create mode 100644 meta-installer/licenses/FLTK
 create mode 100644 meta-installer/recipes-core/systemd/files/serial-getty@.service
 create mode 100644 meta-installer/recipes-core/systemd/files/serial-screen-anaconda.sh
 create mode 100644 meta-installer/recipes-core/systemd/systemd-serialgetty.bbappend
 create mode 100644 meta-installer/recipes-core/systemd/systemd_%.bbappend
 create mode 100644 meta-installer/recipes-gnome/gtk+/files/workaround-for-anaconda-installer-while-loading-libA.patch
 create mode 100644 meta-installer/recipes-gnome/gtk+/gtk+3_%.%.%.bbappend
 create mode 100644 meta-installer/recipes-graphics/xorg-xserver/xserver-xf86-config_0.1.bbappend
 create mode 100644 meta-installer/recipes-installer/anaconda-init/anaconda-init.bb
 create mode 100644 meta-installer/recipes-installer/anaconda-init/anaconda-init/COPYING
 create mode 100644 meta-installer/recipes-installer/anaconda-init/anaconda-init/Xusername
 create mode 100644 meta-installer/recipes-installer/anaconda-init/anaconda-init/anaconda-init
 create mode 100644 meta-installer/recipes-installer/anaconda-init/anaconda-init/anaconda-init-screen@.service
 create mode 100644 meta-installer/recipes-installer/anaconda-init/anaconda-init/anaconda-init.service
 create mode 100644 meta-installer/recipes-installer/anaconda-init/anaconda-init/anaconda-init.target
 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
 create mode 100644 meta-installer/recipes-installer/images/core-image-anaconda-initramfs.bb
 create mode 100644 meta-installer/recipes-installer/images/core-image-anaconda.bb
 create mode 100644 meta-installer/recipes-installer/initrdscripts/files/init-live.sh
 create mode 100644 meta-installer/recipes-installer/initrdscripts/initramfs-live-boot_1.0.bbappend
 create mode 100644 meta-installer/recipes-installer/logos/yocto-compat-logos.bb
 create mode 100644 meta-installer/recipes-installer/logos/yocto-compat-logos/COPYING
 create mode 100644 meta-installer/recipes-installer/logos/yocto-compat-logos/banner_yocto1.png
 create mode 100644 meta-installer/recipes-installer/logos/yocto-compat-logos/banner_yocto2.png
 create mode 100644 meta-installer/recipes-installer/logos/yocto-compat-logos/sidebar-logo.png
 create mode 100644 meta-installer/recipes-installer/logos/yocto-compat-logos/topbar-bg.png
 create mode 100644 meta-installer/recipes-installer/packagegroups/packagegroup-installer-x11-anaconda.bb
 create mode 100644 meta-installer/recipes-installersupport/packagegroups/packagegroup-anaconda-support.bb
 create mode 100644 meta-installer/recipes-kernel/linux/files/crypt.cfg
 create mode 100644 meta-installer/recipes-kernel/linux/files/crypt.scc
 create mode 100644 meta-installer/recipes-kernel/linux/files/dmthin.cfg
 create mode 100644 meta-installer/recipes-kernel/linux/files/dmthin.scc
 create mode 100644 meta-installer/recipes-kernel/linux/files/efivars.cfg
 create mode 100644 meta-installer/recipes-kernel/linux/files/efivars.scc
 create mode 100644 meta-installer/recipes-kernel/linux/files/ide.cfg
 create mode 100644 meta-installer/recipes-kernel/linux/files/ide.scc
 create mode 100644 meta-installer/recipes-kernel/linux/files/liveinstall.cfg
 create mode 100644 meta-installer/recipes-kernel/linux/files/liveinstall.scc
 create mode 100644 meta-installer/recipes-kernel/linux/files/multipath.cfg
 create mode 100644 meta-installer/recipes-kernel/linux/files/multipath.scc
 create mode 100644 meta-installer/recipes-support/multipath-tools/multipath-tools_%.bbappend

-- 
2.8.1



^ permalink raw reply	[flat|nested] 27+ messages in thread

* [PATCH 01/15] meta-installer: create layer
  2017-11-23 12:09 [PATCH 00/15] create meta-installer layer Hongxu Jia
@ 2017-11-23 12:09 ` Hongxu Jia
  2017-11-23 12:09 ` [PATCH 02/15] meta-installer: add kernel config Hongxu Jia
                   ` (15 subsequent siblings)
  16 siblings, 0 replies; 27+ messages in thread
From: Hongxu Jia @ 2017-11-23 12:09 UTC (permalink / raw)
  To: Martin.Jansa, akuster808, raj.khem; +Cc: openembedded-devel

Create meta-installer as a collection of installation
programs based on OE platform.

The target installer 'anaconda' has been maintained by
Wind River for several years, and now we want to contribute
it to OE community.

There are two images in target installer, one is target
image which to be installed to target, another is installer
image which to do the installation. Each image requires a
standalone build.

For target build, enable it by DISTRO_FEATURES_append = "
anaconda-support";

For host build, enable it by DISTRO = "anaconda"

Without above setting, the anaconda installer does not work even
though including meta-installer, and the other installer programs
in this layer will not be influenced by anaconda.

Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
---
 meta-installer/COPYING.MIT     |  17 ++
 meta-installer/README          |  47 ++++
 meta-installer/README.anaconda | 341 ++++++++++++++++++++++++++
 meta-installer/conf/layer.conf |  29 +++
 meta-installer/licenses/FLTK   | 530 +++++++++++++++++++++++++++++++++++++++++
 5 files changed, 964 insertions(+)
 create mode 100644 meta-installer/COPYING.MIT
 create mode 100644 meta-installer/README
 create mode 100644 meta-installer/README.anaconda
 create mode 100644 meta-installer/conf/layer.conf
 create mode 100644 meta-installer/licenses/FLTK

diff --git a/meta-installer/COPYING.MIT b/meta-installer/COPYING.MIT
new file mode 100644
index 0000000..89de354
--- /dev/null
+++ b/meta-installer/COPYING.MIT
@@ -0,0 +1,17 @@
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/meta-installer/README b/meta-installer/README
new file mode 100644
index 0000000..9b2f5d0
--- /dev/null
+++ b/meta-installer/README
@@ -0,0 +1,47 @@
+meat-installer
+============
+This layer provides a collection of installation programs
+based on OE platform.
+
+One implementation is the target installer 'anaconda', see
+README.anaconda for details
+
+Dependencies
+------------
+URI: git://github.com/openembedded/openembedded-core.git
+branch: master
+revision: HEAD
+
+URI: git://github.com/openembedded/bitbake.git
+branch: master
+revision: HEAD
+
+URI: git://github.com/openembedded/meta-openembedded.git
+layers: meta-filesystems, meta-gnome, meta-python,
+        meta-oe, meta-networking, and meta-initramfs
+branch: master
+revision: HEAD
+
+Maintenance
+-----------
+anaconda: See README.anaconda for details
+
+Contributing
+-----------
+The meta-openembedded mailinglist
+(openembedded-devel@lists.openembedded.org) is used for questions,
+comments and patch review. It is subscriber only, so please register
+before posting.
+
+Send pull requests to openembedded-devel@lists.openembedded.org with
+'[meta-installer]' in the subject.
+
+When sending single patches, please use something like:
+'git send-email -M -1 --to=openembedded-devel@lists.openembedded.org --subject-prefix=meta-installer][PATCH'
+
+License
+-------
+
+All metadata is MIT licensed unless otherwise stated. Source code included
+in tree for individual recipes is under the LICENSE stated in each recipe
+(.bb file) unless otherwise stated.
diff --git a/meta-installer/README.anaconda b/meta-installer/README.anaconda
new file mode 100644
index 0000000..22f24d3
--- /dev/null
+++ b/meta-installer/README.anaconda
@@ -0,0 +1,341 @@
+Introduction
+-----------
+The anaconda is from fedora, which is the installer of
+distribution Fedora, RedHat and Centos.
+(https://fedoraproject.org/wiki/Anaconda)
+
+There are two builds required, one is target build,
+another is host build.
+
+The image/packages of target build is installed on the
+target hard disk as user requirements.
+
+The image of host build is to run a installer program (anaconda)
+and install image/packages of target build to hard disk.
+
+Maintenance
+-----------
+Maintainers: Hongxu Jia <jiahongxujia@163.com> | <hongxu.jia@windriver.com>
+             Robert Yang <liezhi.yang@windriver.com>
+             Mark Hatle <mark.hatle@windriver.com>
+
+Limitation
+-----------
+1) Since OE use grub-efi to generate live image, the compatible host
+   is i.86|x86_64
+   (Set MACHINE = "qemux86-64|qemux86" in default build)
+
+2) The target installer based on fedora 26, so it requires:
+   - systemd as init manager
+   - python3
+   - dnf2/rpm4
+   - gobject-introspection which requires qemu-usermode
+     in MACHINE_FEATURES
+
+Building the target installer
+-----------
+1. Summary
+   The target installer is enabled by including this layer.
+   There are two images in target installer, one is target
+   image which to be installed to target, another is installer image
+   which to do the installation.
+
+   A target image requires specific components to be compatible with
+   the installer. To install these components set
+   DISTRO_FEATURES_append = " anaconda-support" in local.conf
+
+   For installer image, you are not supposed to change the 'DISTRO'
+   setting in target build directory. It may work, but it's not
+   recommended. Instead we should recommend the user run a
+   oe-init-build-env and create a new build directory for the installer.
+   Set DISTRO = 'anaconda' in local.conf file.
+
+   There are two kinds of installer builds: "Image Based Install" and
+   "Package Based Install". The former is to install a prebuilt image,
+   the latter is to install RPM packages.
+
+   For Image Based Install, set INSTALLER_TARGET_BUILD =
+   '<target-build-image>' in local.conf to specify an .ext2, .ext3,
+   or ext4 image file, then the installer will copy this image to the
+   target.
+
+   For Package Based Install,  set INSTALLER_TARGET_BUILD =
+   '<target-build-topdir>' to specify the path to target build directory
+   that will supply RPMs, and INSTALLER_TARGET_IMAGE = '<target-image-pn>'
+   to specify the image recipe name, then the installer will install its
+   RPMs to the target;
+
+2. Two main use cases
+   2.1 Installer image with ext2, ext3 or ext4 image from the target
+       build to be copied to local disk.
+
+   2.2 Installer image with RPMs from the target build to be installed
+       to local disk.
+
+   Note: Each option requires two builds, one is for the target build,
+         the other one is for the installer itself. The build and installer
+         board (BSP) configuration should be the same.
+
+3. Examples for the use cases
+   The following example is to install a target image core-image-minimal
+   by host image core-image-install.
+
+   3.1 Image Based Install
+       3.1.1 Clone away
+
+           $ mkdir <installer-project>
+           $ cd <installer-project>
+           $ git clone git://git.openembedded.org/meta-openembedded
+           $ git clone git://git.openembedded.org/openembedded-core oe-core
+           $ cd oe-core
+           $ git clone git://git.openembedded.org/bitbake
+
+       3.1.2 Prepare target build
+
+           $ . <installer-project>/oe-core/oe-init-build-env <target_build>
+
+           The build requires 'anaconda-support' in DISTRO_FEATURES to
+           help installation. It also requires RPM packages and systemd
+           init manager. Edit conf/local.conf to use:
+           $ echo 'DISTRO_FEATURES_append = " anaconda-support"' >> conf/local.conf
+           $ echo 'PACKAGE_CLASSES = "package_rpm"' >> conf/local.conf
+           $ echo 'VIRTUAL-RUNTIME_init_manager = "systemd"' >> conf/local.conf
+           $ echo 'DISTRO_FEATURES_append = " systemd"' >> conf/local.conf
+           $ echo 'DISTRO_FEATURES_BACKFILL_CONSIDERED_append = " sysvinit"' >> conf/local.conf
+
+           Edit conf/bblayers.conf to include other layers
+           BBLAYERS ?= " \
+               <installer-project>/oe-core/meta \
+               <installer-project>/meta-openembedded/meta-python \
+               <installer-project>/meta-openembedded/meta-gnome \
+               <installer-project>/meta-openembedded/meta-filesystems \
+               <installer-project>/meta-openembedded/meta-oe \
+               <installer-project>/meta-openembedded/meta-networking \
+               <installer-project>/meta-openembedded/meta-initramfs \
+               <installer-project>/meta-openembedded/meta-installer \
+           "
+
+       3.1.3 Build target image in <target_build>.
+
+           $ bitbake core-image-minimal
+
+       3.1.4 Prepare installer build.
+           $ . <installer-project>/oe-core/oe-init-build-env <installer_build>
+
+           The build requires DISTRO = "anaconda", location of target image.
+           Edit conf/local.conf to use:
+           $ echo 'PACKAGE_CLASSES = "package_rpm"' >> conf/local.conf
+           $ echo 'DISTRO = "anaconda"' >> conf/local.conf
+           $ echo 'INSTALLER_TARGET_BUILD = "<target_build>/tmp-glibc/deploy/images/qemux86/core-image-minimal-qemux86.ext4"' >> conf/local.conf
+
+           Edit conf/bblayers.conf to include other layers
+           BBLAYERS ?= " \
+               <installer-project>/oe-core/meta \
+               <installer-project>/meta-openembedded/meta-python \
+               <installer-project>/meta-openembedded/meta-gnome \
+               <installer-project>/meta-openembedded/meta-filesystems \
+               <installer-project>/meta-openembedded/meta-oe \
+               <installer-project>/meta-openembedded/meta-networking \
+               <installer-project>/meta-openembedded/meta-initramfs \
+               <installer-project>/meta-openembedded/meta-installer \
+           "
+
+       3.1.5 Build installer image in installer_build.
+
+           $ bitbake core-image-anaconda
+
+   3.2 Package Based Install
+       3.2.1 Clone away
+             The same with 3.1.1
+
+       3.2.2 Prepare target build
+             The same with 3.1.2
+
+       3.2.3 Build target image in <target_build>.
+             The same with 3.1.3
+
+       3.2.4 Prepare installer build.
+           $ . <installer-project>/oe-core/oe-init-build-env <installer_build>
+
+           The build requires DISTRO = "anaconda", location of target build
+           and recipe name of target image.
+           Edit conf/local.conf to use:
+           $ echo 'PACKAGE_CLASSES = "package_rpm"' >> conf/local.conf
+           $ echo 'DISTRO = "anaconda"' >> conf/local.conf
+           $ echo 'INSTALLER_TARGET_BUILD = "<target_build>"' >> conf/local.conf
+           $ echo 'INSTALLER_TARGET_IMAGE = "core-image-minimal"' >> conf/local.conf
+
+           Edit conf/bblayers.conf to include other layers
+           BBLAYERS ?= " \
+               <installer-project>/oe-core/meta \
+               <installer-project>/meta-openembedded/meta-python \
+               <installer-project>/meta-openembedded/meta-gnome \
+               <installer-project>/meta-openembedded/meta-filesystems \
+               <installer-project>/meta-openembedded/meta-oe \
+               <installer-project>/meta-openembedded/meta-networking \
+               <installer-project>/meta-openembedded/meta-initramfs \
+               <installer-project>/meta-openembedded/meta-installer \
+           "
+
+       3.2.4 Build installer image in installer_build.
+             The same with 3.1.4
+
+4. Install
+   4.1 Burn the output ISO to a DVD or dd it to a USB disk, and use it to
+       boot the target board and start the install.
+
+   4.2 Use qemu for testing
+       Build target installer with machine of qemux86
+
+       Create the qemu disk:
+       $ <installer_build>/tmp-glibc/sysroots-components/x86_64/qemu-native/usr/bin/qemu-img create -f qcow hd0.vdisk 5000M
+
+       Start qemu with installer image:
+       $ runqemu qemux86 core-image-anaconda iso slirp kvm qemuparams="-drive file=hd0.vdisk,if=virtio,format=qcow"
+
+       Add "-vnc :4" to qemuparams to start a VNC capable session.
+       Add "-m 1024" to qemuparams to allocate enough memory.
+
+       Start qemu with installed target:
+       $ runqemu qemux86 core-image-anaconda iso slirp kvm qemuparams="-drive file=hd0.vdisk,if=virtio,format=qcow -boot menu=on"
+
+       Run vncviewer to connect VNC capable session.
+       $ vncviewer <host-ip-address>:4
+
+       Add "-boot menu=on" to qemuparams and run vncviewer to connect,
+       press ESC key, manually choose "2. Virtio disk" "to boot from hard disk.
+
+   4.3 Use virtualbox for testing
+       4.3.1 Prepare virtualbox
+             Take Ubuntu 16.04 for example, the virtualbox is 5.0.40
+             sudo apt-get install virtualbox
+
+       4.3.2 Create virtual machine
+             'New'-> Name:***
+                     Type:Linux
+                     Version:Linux 2.6/3.x/4.x(32 bit)
+                     Memory size: 1024MB
+                     Hard disk: Create a virtual hard disk now
+             'Create'-> VDI(Virtualbox Disk Image)
+
+       4.3.3 Add ISO storage to virtual machine
+             Select newly created virtual machine
+             'Setting'-> 'Storage'-> 'Controller:SATA'->
+             'Adds optical drive' -> 'Choose disk' ->
+             'core-image-anaconda-qemux86.iso'
+
+             Remove IDE Empty optical
+             'Setting'-> 'Storage'-> 'Controller:IDE'->
+             'Empyt' -> Removes selected storage attachment
+
+       4.3.4 Config net for virtual machine
+             Select newly created virtual machine
+             'Setting'-> 'Network'-> 'Enable Network Adapter'->
+             'Attached to: Bridged Adapter'-> 'Name: eno1'
+
+       4.3.5 Add serial port to virtual machine
+             Select newly created virtual machine
+             'Setting'-> 'Serial Ports'-> 'Port 1'->
+             'Enable Serial Port'-> Port Number: COM1
+                                    Port Mode: Host Pipe
+                                    Unselect 'Connect to existing pipe/socket'
+                                    Path/Address: /tmp/pipe
+
+       4.3.6 Use minicom to connect virtual machine's serial port
+             sudo minicom -s
+             'Serial port setup'->
+             'A -    Serial Device      : unix#/tmp/pipe'->
+             'Exit'
+
+       4.3.7 Start virtual machine
+             Select newly created virtual machine-> 'Start'
+
+             After the installation finished, delete ISO storage and
+             start virtual machine again to check the installed target.
+
+   4.4 Need 1G memory size at least
+       While starting qemu/virtualbox/vmware for testing, please make
+       sure virtual machine has 1G memory at least.
+
+5. Use custom installer.conf
+   The second build can use installer.conf to help speed up the build
+   process when package based installs, the user can set WRL_INSTALLER_CONF
+   in the conf file, for example:
+
+   edit local.conf
+   WRL_INSTALLER_CONF = "/my/installer.conf"
+
+   You can customize the contents of installer.conf when needed, for example,
+   add packages that you will like to install, but if you do, you must ensure
+   that the added packages are in the target build (target_build).
+
+   To do this, use the file /.buildstamp after the installation and edit it
+   for later installs.
+
+6. Perform the kickstart installation
+   The installer can support kickstart installs. To do this, use the ks file
+   from /root/anaconda-ks.cfg after the installation and edit it for later
+   installs. You can specify the ks file by setting KICKSTART_FILE in the conf
+   file, for example:
+
+   KICKSTART_FILE = "/my/anaconda-ks.cfg"
+
+   Then the second build will take it and start the kickstart installs
+   by default when you start the target with installer image.
+
+7. About Grub version
+   The current installer only supports grub 2.
+
+8. How to create RPM metadata in build
+   bitbake package-index
+
+   There is a repodata in deploy dir:
+   $ find tmp-glibc/deploy/rpm/ -name repodata
+   tmp-glibc/deploy/rpm/repodata
+
+9. Put multiple target builds into one installer image
+   9.1 Create and build multiple target build projects.
+       Refer to section 3.1.1 on how to setup and build each target project.
+       In this example, the projects are named target_build1, target_build2 and
+       target_build3. The target_build1 and target_build2 are build dirs,
+       target_build3 is ext4 file. Build 'core-image-sato' in
+       target_build1 and build 'core-image-minimal' in target_build2.
+
+   9.2 Edit local.conf, use variable INSTALLER_TARGET_BUILD to point to
+       "<target_build1> <target_build2> <target_build3>", and set
+       INSTALLER_TARGET_IMAGE = "core-image-sato core-image-minimal",
+       the space is the separator:
+
+       $ bitbake core-image-anaconda
+
+       Then the installer image will contain all target builds specified,
+       including target_build1, target_build2 and target_build3.
+
+       When you boot the installer image, you will get a selection menu:
+       NOTE: target_buildX is the basename of project
+
+       =============== Found the following products ===============
+       1) DISTRO1    target_build1    DISTRO_NAME1    DISTRO_VERION1
+       2) DISTRO2    target_build2    DISTRO_NAME2    DISTRO_VERION2
+       3) <target_build3-ext4-file>-3
+
+       Please enter your choice (0 to quit):
+
+       NOTE: You need to use a proper name for the target build project
+             since its basename will be used in the selection menus.
+
+       NOTE: The number of the entries in WRL_INSTALLER_CONF or
+             KICKSTART_FILE must be the same as the number of target build
+             projects.
+             For example, if you want to use WRL_INSTALLER_CONF or
+             KICKSTART_FILE for target_build1, target_build2 and
+             target_build3, set each of the three in the conf file.
+
+             WRL_INSTALLER_CONF = "/my/target1.conf /my/target2.conf \
+                                    /my/target3.conf"
+             KICKSTART_FILE = "/my/target1.ks /my/target2.ks \
+                               /my/target3.ks"
+
+             Then target_build1 will use /my/target1.conf and /my/target1.ks,
+             target_build2 and target_build3 will work similarly.
+
diff --git a/meta-installer/conf/layer.conf b/meta-installer/conf/layer.conf
new file mode 100644
index 0000000..2788d1c
--- /dev/null
+++ b/meta-installer/conf/layer.conf
@@ -0,0 +1,29 @@
+# We have a conf and classes directory, add to BBPATH
+BBPATH =. "${LAYERDIR}:"
+
+# We have a packages directory, add to BBFILES
+BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \
+            ${LAYERDIR}/recipes-*/*/*.bbappend"
+
+BBFILE_COLLECTIONS += "meta-installer"
+BBFILE_PATTERN_meta-installer = "^${LAYERDIR}/"
+BBFILE_PRIORITY_meta-installer = "10"
+
+LAYERVERSION_meta-installer = "2"
+
+LAYERDEPENDS_meta-installer = " \
+    core \
+    openembedded-layer \
+    filesystems-layer \
+    gnome-layer \
+    meta-python \
+    networking-layer \
+    meta-initramfs \
+"
+
+LICENSE_PATH += "${LAYERDIR}/licenses"
+SRC_DISTRIBUTE_LICENSES += "X11"
+SRC_DISTRIBUTE_LICENSES += "FLTK"
+
+LAYER_PATH_meta-installer = "${LAYERDIR}"
+
diff --git a/meta-installer/licenses/FLTK b/meta-installer/licenses/FLTK
new file mode 100644
index 0000000..9542075
--- /dev/null
+++ b/meta-installer/licenses/FLTK
@@ -0,0 +1,530 @@
+                             FLTK License
+                           December 11, 2001
+
+The FLTK library and included programs are provided under the terms
+of the GNU Library General Public License (LGPL) with the following
+exceptions:
+
+    1. Modifications to the FLTK configure script, config
+       header file, and makefiles by themselves to support
+       a specific platform do not constitute a modified or
+       derivative work.
+
+      The authors do request that such modifications be
+      contributed to the FLTK project - send all contributions
+      through the "Software Trouble Report" on the following page:
+ 
+           http://www.fltk.org/str.php
+
+    2. Widgets that are subclassed from FLTK widgets do not
+       constitute a derivative work.
+
+    3. Static linking of applications and widgets to the
+       FLTK library does not constitute a derivative work
+       and does not require the author to provide source
+       code for the application or widget, use the shared
+       FLTK libraries, or link their applications or
+       widgets against a user-supplied version of FLTK.
+
+       If you link the application or widget to a modified
+       version of FLTK, then the changes to FLTK must be
+       provided under the terms of the LGPL in sections
+       1, 2, and 4.
+
+    4. You do not have to provide a copy of the FLTK license
+       with programs that are linked to the FLTK library, nor
+       do you have to identify the FLTK license in your
+       program or documentation as required by section 6
+       of the LGPL.
+
+       However, programs must still identify their use of FLTK.
+       The following example statement can be included in user
+       documentation to satisfy this requirement:
+
+           [program/widget] is based in part on the work of
+           the FLTK project (http://www.fltk.org).
+
+-----------------------------------------------------------------------
+
+		  GNU LIBRARY GENERAL PUBLIC LICENSE
+			 Version 2, June 1991
+
+	  Copyright (C) 1991 Free Software Foundation, Inc.
+       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+     Everyone is permitted to copy and distribute verbatim copies
+      of this license document, but changing it is not allowed.
+
+    [This is the first released version of the library GPL.  It is
+   numbered 2 because it goes with version 2 of the ordinary GPL.]
+
+			       Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Library General Public License, applies to some
+specially designated Free Software Foundation software, and to any
+other libraries whose authors decide to use it.  You can use it for
+your libraries, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if
+you distribute copies of the library, or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link a program with the library, you must provide
+complete object files to the recipients so that they can relink them
+with the library, after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  Our method of protecting your rights has two steps: (1) copyright
+the library, and (2) offer you this license which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  Also, for each distributor's protection, we want to make certain
+that everyone understands that there is no warranty for this free
+library.  If the library is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original
+version, so that any problems introduced by others will not reflect on
+the original authors' reputations.
+\f
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that companies distributing free
+software will individually obtain patent licenses, thus in effect
+transforming the program into proprietary software.  To prevent this,
+we have made it clear that any patent must be licensed for everyone's
+free use or not licensed at all.
+
+  Most GNU software, including some libraries, is covered by the ordinary
+GNU General Public License, which was designed for utility programs.  This
+license, the GNU Library General Public License, applies to certain
+designated libraries.  This license is quite different from the ordinary
+one; be sure to read it in full, and don't assume that anything in it is
+the same as in the ordinary license.
+
+  The reason we have a separate public license for some libraries is that
+they blur the distinction we usually make between modifying or adding to a
+program and simply using it.  Linking a program with a library, without
+changing the library, is in some sense simply using the library, and is
+analogous to running a utility program or application program.  However, in
+a textual and legal sense, the linked executable is a combined work, a
+derivative of the original library, and the ordinary General Public License
+treats it as such.
+
+  Because of this blurred distinction, using the ordinary General
+Public License for libraries did not effectively promote software
+sharing, because most developers did not use the libraries.  We
+concluded that weaker conditions might promote sharing better.
+
+  However, unrestricted linking of non-free programs would deprive the
+users of those programs of all benefit from the free status of the
+libraries themselves.  This Library General Public License is intended to
+permit developers of non-free programs to use free libraries, while
+preserving your freedom as a user of such programs to change the free
+libraries that are incorporated in them.  (We have not seen how to achieve
+this as regards changes in header files, but we have achieved it as regards
+changes in the actual functions of the Library.)  The hope is that this
+will lead to faster development of free libraries.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, while the latter only
+works together with the library.
+
+  Note that it is possible for a library to be covered by the ordinary
+General Public License rather than by this special one.
+\f
+		  GNU LIBRARY GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library which
+contains a notice placed by the copyright holder or other authorized
+party saying it may be distributed under the terms of this Library
+General Public License (also called "this License").  Each licensee is
+addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+\f
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+\f
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+\f
+  6. As an exception to the Sections above, you may also compile or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    c) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    d) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the source code distributed need not include anything that is normally
+distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+\f
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+\f
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Library General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+\f
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+			    NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+\f
+     Appendix: How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Library General Public
+    License as published by the Free Software Foundation; either
+    version 2 of the License, or (at your option) any later version.
+
+    This library 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
+    Library General Public License for more details.
+
+    You should have received a copy of the GNU Library General Public
+    License along with this library; if not, write to the Free
+    Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
-- 
2.8.1



^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH 02/15] meta-installer: add kernel config
  2017-11-23 12:09 [PATCH 00/15] create meta-installer layer Hongxu Jia
  2017-11-23 12:09 ` [PATCH 01/15] meta-installer: create layer Hongxu Jia
@ 2017-11-23 12:09 ` Hongxu Jia
  2017-11-23 12:09 ` [PATCH 03/15] meta-installer: add anaconda support for target build Hongxu Jia
                   ` (14 subsequent siblings)
  16 siblings, 0 replies; 27+ messages in thread
From: Hongxu Jia @ 2017-11-23 12:09 UTC (permalink / raw)
  To: Martin.Jansa, akuster808, raj.khem; +Cc: openembedded-devel

The set of kernel scc/cfg are required by target build and host build.

- For target build, add anaconda_support_kernel to KERNEL_CLASSES

- For host build, add anaconda_kernel to KERNEL_CLASSES

Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
---
 meta-installer/classes/anaconda_kernel.bbclass            | 14 ++++++++++++++
 meta-installer/classes/anaconda_support_kernel.bbclass    |  8 ++++++++
 meta-installer/recipes-kernel/linux/files/crypt.cfg       |  2 ++
 meta-installer/recipes-kernel/linux/files/crypt.scc       |  1 +
 meta-installer/recipes-kernel/linux/files/dmthin.cfg      |  1 +
 meta-installer/recipes-kernel/linux/files/dmthin.scc      |  1 +
 meta-installer/recipes-kernel/linux/files/efivars.cfg     |  1 +
 meta-installer/recipes-kernel/linux/files/efivars.scc     |  1 +
 meta-installer/recipes-kernel/linux/files/ide.cfg         |  5 +++++
 meta-installer/recipes-kernel/linux/files/ide.scc         |  1 +
 meta-installer/recipes-kernel/linux/files/liveinstall.cfg |  5 +++++
 meta-installer/recipes-kernel/linux/files/liveinstall.scc |  1 +
 meta-installer/recipes-kernel/linux/files/multipath.cfg   |  3 +++
 meta-installer/recipes-kernel/linux/files/multipath.scc   |  1 +
 14 files changed, 45 insertions(+)
 create mode 100644 meta-installer/classes/anaconda_kernel.bbclass
 create mode 100644 meta-installer/classes/anaconda_support_kernel.bbclass
 create mode 100644 meta-installer/recipes-kernel/linux/files/crypt.cfg
 create mode 100644 meta-installer/recipes-kernel/linux/files/crypt.scc
 create mode 100644 meta-installer/recipes-kernel/linux/files/dmthin.cfg
 create mode 100644 meta-installer/recipes-kernel/linux/files/dmthin.scc
 create mode 100644 meta-installer/recipes-kernel/linux/files/efivars.cfg
 create mode 100644 meta-installer/recipes-kernel/linux/files/efivars.scc
 create mode 100644 meta-installer/recipes-kernel/linux/files/ide.cfg
 create mode 100644 meta-installer/recipes-kernel/linux/files/ide.scc
 create mode 100644 meta-installer/recipes-kernel/linux/files/liveinstall.cfg
 create mode 100644 meta-installer/recipes-kernel/linux/files/liveinstall.scc
 create mode 100644 meta-installer/recipes-kernel/linux/files/multipath.cfg
 create mode 100644 meta-installer/recipes-kernel/linux/files/multipath.scc

diff --git a/meta-installer/classes/anaconda_kernel.bbclass b/meta-installer/classes/anaconda_kernel.bbclass
new file mode 100644
index 0000000..bc73210
--- /dev/null
+++ b/meta-installer/classes/anaconda_kernel.bbclass
@@ -0,0 +1,14 @@
+FILESEXTRAPATHS_prepend := "${LAYER_PATH_meta-installer}/recipes-kernel/linux/files/:"
+SRC_URI_append = " \
+    file://dmthin.scc \
+    file://crypt.scc \
+    file://liveinstall.scc \
+    file://efivars.scc \
+    file://multipath.scc \
+    file://ide.scc \
+"
+
+KERNEL_FEATURES_append = " \
+    features/overlayfs/overlayfs.scc \
+    cfg/systemd.scc \
+"
diff --git a/meta-installer/classes/anaconda_support_kernel.bbclass b/meta-installer/classes/anaconda_support_kernel.bbclass
new file mode 100644
index 0000000..ee37106
--- /dev/null
+++ b/meta-installer/classes/anaconda_support_kernel.bbclass
@@ -0,0 +1,8 @@
+FILESEXTRAPATHS_prepend := "${LAYER_PATH_meta-installer}/recipes-kernel/linux/files/:"
+SRC_URI_append = " \
+    file://dmthin.scc \
+    file://crypt.scc \
+"
+
+KERNEL_FEATURES_append = " cfg/systemd.scc"
+
diff --git a/meta-installer/recipes-kernel/linux/files/crypt.cfg b/meta-installer/recipes-kernel/linux/files/crypt.cfg
new file mode 100644
index 0000000..2594462
--- /dev/null
+++ b/meta-installer/recipes-kernel/linux/files/crypt.cfg
@@ -0,0 +1,2 @@
+CONFIG_CRYPTO_AES_NI_INTEL=m
+CONFIG_CRYPTO_AES_X86_64=m
diff --git a/meta-installer/recipes-kernel/linux/files/crypt.scc b/meta-installer/recipes-kernel/linux/files/crypt.scc
new file mode 100644
index 0000000..daeab36
--- /dev/null
+++ b/meta-installer/recipes-kernel/linux/files/crypt.scc
@@ -0,0 +1 @@
+kconf non-hardware crypt.cfg
diff --git a/meta-installer/recipes-kernel/linux/files/dmthin.cfg b/meta-installer/recipes-kernel/linux/files/dmthin.cfg
new file mode 100644
index 0000000..1ac07c0
--- /dev/null
+++ b/meta-installer/recipes-kernel/linux/files/dmthin.cfg
@@ -0,0 +1 @@
+CONFIG_DM_THIN_PROVISIONING=y
diff --git a/meta-installer/recipes-kernel/linux/files/dmthin.scc b/meta-installer/recipes-kernel/linux/files/dmthin.scc
new file mode 100644
index 0000000..38cfac7
--- /dev/null
+++ b/meta-installer/recipes-kernel/linux/files/dmthin.scc
@@ -0,0 +1 @@
+kconf non-hardware dmthin.cfg
diff --git a/meta-installer/recipes-kernel/linux/files/efivars.cfg b/meta-installer/recipes-kernel/linux/files/efivars.cfg
new file mode 100644
index 0000000..b9206d9
--- /dev/null
+++ b/meta-installer/recipes-kernel/linux/files/efivars.cfg
@@ -0,0 +1 @@
+CONFIG_EFI_VARS=y
diff --git a/meta-installer/recipes-kernel/linux/files/efivars.scc b/meta-installer/recipes-kernel/linux/files/efivars.scc
new file mode 100644
index 0000000..25bd34d
--- /dev/null
+++ b/meta-installer/recipes-kernel/linux/files/efivars.scc
@@ -0,0 +1 @@
+kconf non-hardware efivars.cfg
diff --git a/meta-installer/recipes-kernel/linux/files/ide.cfg b/meta-installer/recipes-kernel/linux/files/ide.cfg
new file mode 100644
index 0000000..9d973ce
--- /dev/null
+++ b/meta-installer/recipes-kernel/linux/files/ide.cfg
@@ -0,0 +1,5 @@
+CONFIG_BLK_DEV_IDEDMA_SFF=y
+CONFIG_BLK_DEV_IDEPCI=y
+CONFIG_IDEPCI_PCIBUS_ORDER=y
+CONFIG_BLK_DEV_PIIX=y
+CONFIG_BLK_DEV_IDEDMA=y
diff --git a/meta-installer/recipes-kernel/linux/files/ide.scc b/meta-installer/recipes-kernel/linux/files/ide.scc
new file mode 100644
index 0000000..81e57f5
--- /dev/null
+++ b/meta-installer/recipes-kernel/linux/files/ide.scc
@@ -0,0 +1 @@
+kconf non-hardware ide.cfg
diff --git a/meta-installer/recipes-kernel/linux/files/liveinstall.cfg b/meta-installer/recipes-kernel/linux/files/liveinstall.cfg
new file mode 100644
index 0000000..37c9f47
--- /dev/null
+++ b/meta-installer/recipes-kernel/linux/files/liveinstall.cfg
@@ -0,0 +1,5 @@
+CONFIG_ISO9660_FS=y
+CONFIG_BLK_DEV_LOOP=y
+CONFIG_SQUASHFS=y
+CONFIG_SQUASHFS_XATTR=y
+# CONFIG_BLK_DEV_PIIX is not set
diff --git a/meta-installer/recipes-kernel/linux/files/liveinstall.scc b/meta-installer/recipes-kernel/linux/files/liveinstall.scc
new file mode 100644
index 0000000..042e047
--- /dev/null
+++ b/meta-installer/recipes-kernel/linux/files/liveinstall.scc
@@ -0,0 +1 @@
+kconf non-hardware liveinstall.cfg
\ No newline at end of file
diff --git a/meta-installer/recipes-kernel/linux/files/multipath.cfg b/meta-installer/recipes-kernel/linux/files/multipath.cfg
new file mode 100644
index 0000000..39cf942
--- /dev/null
+++ b/meta-installer/recipes-kernel/linux/files/multipath.cfg
@@ -0,0 +1,3 @@
+CONFIG_DM_MULTIPATH=y
+CONFIG_DM_MULTIPATH_QL=y
+CONFIG_DM_MULTIPATH_ST=y
diff --git a/meta-installer/recipes-kernel/linux/files/multipath.scc b/meta-installer/recipes-kernel/linux/files/multipath.scc
new file mode 100644
index 0000000..36a4cdd
--- /dev/null
+++ b/meta-installer/recipes-kernel/linux/files/multipath.scc
@@ -0,0 +1 @@
+kconf non-hardware multipath.cfg
-- 
2.8.1



^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH 03/15] meta-installer: add anaconda support for target build
  2017-11-23 12:09 [PATCH 00/15] create meta-installer layer Hongxu Jia
  2017-11-23 12:09 ` [PATCH 01/15] meta-installer: create layer Hongxu Jia
  2017-11-23 12:09 ` [PATCH 02/15] meta-installer: add kernel config Hongxu Jia
@ 2017-11-23 12:09 ` Hongxu Jia
  2017-11-23 12:09 ` [PATCH 04/15] meta-installer: add distro anaconda for host build Hongxu Jia
                   ` (13 subsequent siblings)
  16 siblings, 0 replies; 27+ messages in thread
From: Hongxu Jia @ 2017-11-23 12:09 UTC (permalink / raw)
  To: Martin.Jansa, akuster808, raj.khem; +Cc: openembedded-devel

While "anaconda-support" in DISTRO_FEATURES, it enable
features of target build.

The target build requires:
- packages to help installation

- append anaconda_support_kernel to KERNEL_CLASSES which
  add dmthin.scc and crypt.scc to kernel config

- manually install grub/grub-efi for image install to workaround
  grub/grub-efi confliction

- add distro feature check of systemd and ldconfig

- add init manager checking

- add rpm packages check

- emit target image env to help installation

Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
---
 .../classes/anaconda_support_image.bbclass         | 40 ++++++++++++++++++++++
 meta-installer/conf/layer.conf                     |  2 ++
 .../packagegroups/packagegroup-anaconda-support.bb | 26 ++++++++++++++
 3 files changed, 68 insertions(+)
 create mode 100644 meta-installer/classes/anaconda_support_image.bbclass
 create mode 100644 meta-installer/recipes-installersupport/packagegroups/packagegroup-anaconda-support.bb

diff --git a/meta-installer/classes/anaconda_support_image.bbclass b/meta-installer/classes/anaconda_support_image.bbclass
new file mode 100644
index 0000000..d11e85b
--- /dev/null
+++ b/meta-installer/classes/anaconda_support_image.bbclass
@@ -0,0 +1,40 @@
+FEATURE_PACKAGES_anaconda-support = "packagegroup-anaconda-support"
+IMAGE_FEATURES_append = " anaconda-support"
+
+# Generate filesystem images for image copy install
+IMAGE_FSTYPES += "ext4"
+
+ROOTFS_POSTPROCESS_COMMAND_append = " copy_grub_lib;"
+IMAGE_POSTPROCESS_COMMAND_append = " emit_image_env;"
+
+inherit distro_features_check
+REQUIRED_DISTRO_FEATURES = "systemd ldconfig"
+
+DEPENDS += "grub grub-efi"
+
+copy_grub_lib() {
+    if [ -d ${STAGING_DIR_HOST}${libdir}/grub ]; then
+        echo "Copy grub & grub-efi lib"
+        mkdir -p ${IMAGE_ROOTFS}${libdir}/grub
+        cp -rf ${STAGING_DIR_HOST}${libdir}/grub/* ${IMAGE_ROOTFS}${libdir}/grub
+    fi
+}
+
+python emit_image_env () {
+    localdata = bb.data.createCopy(d)
+
+    # Export DISTRO for installer build
+    localdata.setVarFlag("DISTRO", "unexport", "")
+
+    dumpfile = d.expand("${TOPDIR}/installersupport_${PN}")
+    with open(dumpfile , "w") as f:
+        bb.data.emit_env(f, localdata, True)
+}
+
+python __anonymous () {
+    if not bb.utils.contains("PACKAGE_CLASSES", "package_rpm", True, False, d):
+        raise bb.parse.SkipPackage('Target build requires RPM packages to be the default in PACKAGE_CLASSES.')
+
+    if d.getVar("VIRTUAL-RUNTIME_init_manager", True) != "systemd":
+        raise bb.parse.SkipPackage('Target build requires systemd, set VIRTUAL-RUNTIME_init_manager = "systemd" in local.conf')
+}
diff --git a/meta-installer/conf/layer.conf b/meta-installer/conf/layer.conf
index 2788d1c..95b5004 100644
--- a/meta-installer/conf/layer.conf
+++ b/meta-installer/conf/layer.conf
@@ -27,3 +27,5 @@ SRC_DISTRIBUTE_LICENSES += "FLTK"
 
 LAYER_PATH_meta-installer = "${LAYERDIR}"
 
+KERNEL_CLASSES_append = " ${@bb.utils.contains('DISTRO_FEATURES', 'anaconda-support', 'anaconda_support_kernel', '', d)}"
+IMAGE_CLASSES_append = " ${@bb.utils.contains('DISTRO_FEATURES', 'anaconda-support', 'anaconda_support_image', '', d)}"
diff --git a/meta-installer/recipes-installersupport/packagegroups/packagegroup-anaconda-support.bb b/meta-installer/recipes-installersupport/packagegroups/packagegroup-anaconda-support.bb
new file mode 100644
index 0000000..0617d90
--- /dev/null
+++ b/meta-installer/recipes-installersupport/packagegroups/packagegroup-anaconda-support.bb
@@ -0,0 +1,26 @@
+DESCRIPTION = "Packages required by target build to help the installation"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
+
+inherit packagegroup
+
+RDEPENDS_${PN} = " \
+    sudo \
+    kernel-image \
+    grubby \
+    shadow \
+    efibootmgr \
+    kmod \
+    lvm2 \
+    util-linux-mount \
+    init-ifupdown \
+    libuser \
+    dracut \
+    cryptsetup \
+    sed \
+    grep \
+    dosfstools \
+    e2fsprogs \
+    btrfs-tools \
+"
+
-- 
2.8.1



^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH 04/15] meta-installer: add distro anaconda for host build
  2017-11-23 12:09 [PATCH 00/15] create meta-installer layer Hongxu Jia
                   ` (2 preceding siblings ...)
  2017-11-23 12:09 ` [PATCH 03/15] meta-installer: add anaconda support for target build Hongxu Jia
@ 2017-11-23 12:09 ` Hongxu Jia
  2017-11-23 12:09 ` [PATCH 05/15] meta-installer: add systemd/systemd-serialgetty bbappend Hongxu Jia
                   ` (12 subsequent siblings)
  16 siblings, 0 replies; 27+ messages in thread
From: Hongxu Jia @ 2017-11-23 12:09 UTC (permalink / raw)
  To: Martin.Jansa, akuster808, raj.khem; +Cc: openembedded-devel

While DISTRO = "anaconda", it enable features of host build.

The host build requires:

- append anaconda_kernel to KERNEL_CLASSES to add kernel configs

- misc setting in conf/distro/anaconda.conf for host build

- copy package/image from target build to host image

- add rpm packages check

Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
---
 meta-installer/classes/anaconda_image.bbclass | 321 ++++++++++++++++++++++++++
 meta-installer/conf/distro/anaconda.conf      |  33 +++
 2 files changed, 354 insertions(+)
 create mode 100644 meta-installer/classes/anaconda_image.bbclass
 create mode 100644 meta-installer/conf/distro/anaconda.conf

diff --git a/meta-installer/classes/anaconda_image.bbclass b/meta-installer/classes/anaconda_image.bbclass
new file mode 100644
index 0000000..be37a09
--- /dev/null
+++ b/meta-installer/classes/anaconda_image.bbclass
@@ -0,0 +1,321 @@
+RPM_POSTPROCESS_COMMANDS_append = "wrl_installer;"
+
+INSTPRODUCT ?= "${DISTRO_NAME}"
+INSTVER     ?= "${DISTRO_VERSION}"
+INSTBUGURL  ?= "http://www.windriver.com/"
+
+# NOTE: Please update anaconda-init when you change INSTALLER_CONFDIR, use "="
+#       but not "?=" since this is not configurable.
+INSTALLER_CONFDIR = "${IMAGE_ROOTFS}/installer-config"
+KICKSTART_FILE ?= ""
+WRL_INSTALLER_CONF ?= ""
+
+build_iso_prepend() {
+	install -d ${ISODIR}
+	ln -snf /.discinfo ${ISODIR}/.discinfo
+	ln -snf /.buildstamp ${ISODIR}/.buildstamp
+	ln -snf /Packages ${ISODIR}/Packages
+}
+
+build_iso_append() {
+	implantisomd5 ${IMGDEPLOYDIR}/${IMAGE_NAME}.iso
+}
+
+# Check WRL_INSTALLER_CONF and copy it to
+# ${IMAGE_ROOTFS}/.buildstamp.$prj_name when exists
+wrl_installer_copy_buildstamp() {
+    prj_name=$1
+    buildstamp=$2
+    if [ -f $buildstamp ]; then
+        bbnote "Using $buildstamp as the buildstamp"
+        cp $buildstamp ${IMAGE_ROOTFS}/.buildstamp.$prj_name
+    else
+        bbfatal "Can't find WRL_INSTALLER_CONF: $buildstamp"
+    fi
+}
+
+# Hardlink when possible, otherwise copy.
+# $1: src
+# $2: target
+wrl_installer_hardlinktree() {
+    src_dev="`stat -c %d $1`"
+    if [ -e "$2" ]; then
+        tgt_dev="`stat -c %d $2`"
+    else
+        tgt_dev="`stat -c %d $(dirname $2)`"
+    fi
+    hdlink=""
+    if [ "$src_dev" = "$tgt_dev" ]; then
+        hdlink="--link"
+    fi
+    cp -rvf $hdlink $1 $2
+}
+
+wrl_installer_copy_local_repos() {
+    deploy_dir_rpm=$1
+
+    if [ -d "$deploy_dir_rpm" ]; then
+        echo "Copy rpms from target build to installer image."
+        mkdir -p ${IMAGE_ROOTFS}/Packages.$prj_name
+
+        : > ${IMAGE_ROOTFS}/Packages.$prj_name/.treeinfo
+        echo "[general]" >> ${IMAGE_ROOTFS}/Packages.$prj_name/.treeinfo
+        echo "version = ${DISTRO_VERSION}" >> ${IMAGE_ROOTFS}/Packages.$prj_name/.treeinfo
+
+        # Determine the max channel priority
+        channel_priority=5
+        for pt in $installer_target_archs ; do
+            channel_priority=$(expr $channel_priority + 5)
+        done
+
+        : > ${IMAGE_ROOTFS}/Packages.$prj_name/.feedpriority
+        for arch in $installer_target_archs; do
+            if [ -d "$deploy_dir_rpm/"$arch -a ! -d "${IMAGE_ROOTFS}/Packages.$prj_name/"$arch ]; then
+                channel_priority=$(expr $channel_priority - 5)
+                echo "$channel_priority $arch" >> ${IMAGE_ROOTFS}/Packages.$prj_name/.feedpriority
+                wrl_installer_hardlinktree "$deploy_dir_rpm/"$arch "${IMAGE_ROOTFS}/Packages.$prj_name/."
+            fi
+        done
+        createrepo_c --update -q ${IMAGE_ROOTFS}/Packages.$prj_name/
+    fi
+}
+
+# Update .buildstamp and copy rpm packages to IMAGE_ROOTFS
+wrl_installer_copy_pkgs() {
+
+    target_build="$1"
+    target_image="$2"
+    prj_name="$3"
+    if [ -n "$4" ]; then
+        installer_conf="$4"
+    else
+        installer_conf=""
+    fi
+
+    common_grep="-e '^ALL_MULTILIB_PACKAGE_ARCHS=.*' \
+            -e '^MULTILIB_VARIANTS=.*' -e '^PACKAGE_ARCHS=.*'\
+            -e '^PACKAGE_ARCH=.*' -e '^PACKAGE_INSTALL_ATTEMPTONLY=.*' \
+            -e '^DISTRO=.*' -e '^DISTRO_NAME=.*' -e '^DISTRO_VERSION=.*' \
+            "
+
+    if [ -f "$installer_conf" ]; then
+        eval "grep -e \"^PACKAGE_INSTALL=.*\" $common_grep $installer_conf \
+            | sed -e 's/=/=\"/' -e 's/$/\"/' > ${BB_LOGFILE}.distro_vals"
+
+        eval "cat $target_build/installersupport_$target_image | \
+            grep -e 'DEPLOY_DIR_RPM=.*' >> ${BB_LOGFILE}.distro_vals"
+
+        eval `cat ${BB_LOGFILE}.distro_vals`
+        if [ $? -ne 0 ]; then
+            bbfatal "Something is wrong in $installer_conf, please correct it"
+        fi
+        if [ -z "$PACKAGE_ARCHS" -o -z "$PACKAGE_INSTALL" ]; then
+            bbfatal "PACKAGE_ARCHS or PACKAGE_INSTALL is null, please check $installer_conf"
+        fi
+    else
+        eval "cat $target_build/installersupport_$target_image | \
+            grep $common_grep -e '^PN=.*' -e '^SUMMARY=.*' -e 'DEPLOY_DIR_RPM=.*'\
+            -e '^DESCRIPTION=.*' -e '^export PACKAGE_INSTALL=.*' > ${BB_LOGFILE}.distro_vals"
+
+        eval `cat ${BB_LOGFILE}.distro_vals`
+    fi
+
+    export installer_default_arch="$PACKAGE_ARCH"
+    # Reverse it for priority
+    export installer_default_archs="`for arch in $PACKAGE_ARCHS; do echo $arch; done | tac | tr - _`"
+    installer_target_archs="$installer_default_archs"
+    if [ -n "$MULTILIB_VARIANTS" ]; then
+        export MULTILIB_VARIANTS
+        mlarchs_reversed="`for mlarch in $ALL_MULTILIB_PACKAGE_ARCHS; do echo $mlarch; \
+            done | tac | tr - _`"
+        for arch in $mlarchs_reversed; do
+            if [ "$arch" != "noarch" -a "$arch" != "all" -a "$arch" != "any" ]; then
+                installer_target_archs="$installer_target_archs $arch"
+            fi
+        done
+    fi
+    export installer_target_archs
+
+    # Save the vars to .buildstamp when no installer_conf
+    if [ ! -f "$installer_conf" ]; then
+        cat >> ${IMAGE_ROOTFS}/.buildstamp.$prj_name <<_EOF
+DISTRO=$DISTRO
+DISTRO_NAME=$DISTRO_NAME
+DISTRO_VERSION=$DISTRO_VERSION
+
+[Rootfs]
+LIST=$PN
+
+[$PN]
+SUMMARY=$SUMMARY
+DESCRIPTION=$DESCRIPTION
+
+PACKAGE_INSTALL=$PACKAGE_INSTALL
+PACKAGE_INSTALL_ATTEMPTONLY=$PACKAGE_INSTALL_ATTEMPTONLY
+ALL_MULTILIB_PACKAGE_ARCHS=$ALL_MULTILIB_PACKAGE_ARCHS
+MULTILIB_VARIANTS=$MULTILIB_VARIANTS
+PACKAGE_ARCHS=$PACKAGE_ARCHS
+PACKAGE_ARCH=$PACKAGE_ARCH
+IMAGE_LINGUAS=${IMAGE_LINGUAS}
+_EOF
+    fi
+
+    if [ -d "$DEPLOY_DIR_RPM" ]; then
+        # Copy local repos while the image is not initramfs
+        bpn=${BPN}
+        if [ "${bpn##*initramfs}" = "${bpn%%initramfs*}" ]; then
+            wrl_installer_copy_local_repos $DEPLOY_DIR_RPM
+        fi
+        echo "$DISTRO::$prj_name::$DISTRO_NAME::$DISTRO_VERSION" >> ${IMAGE_ROOTFS}/.target_build_list
+    fi
+}
+
+wrl_installer_get_count() {
+    sum=0
+    for i in $*; do
+        sum=$(expr $sum + 1)
+    done
+    echo $sum
+}
+
+wrl_installer[vardepsexclude] = "DATETIME"
+wrl_installer() {
+    cat >${IMAGE_ROOTFS}/.discinfo <<_EOF
+${DATETIME}
+${DISTRO_NAME} ${DISTRO_VERSION}
+${TARGET_ARCH}
+_EOF
+
+    : > ${IMAGE_ROOTFS}/.target_build_list
+    counter=0
+    targetimage_counter=0
+    for target_build in ${INSTALLER_TARGET_BUILD}; do
+        target_build="`readlink -f $target_build`"
+        echo "Installer Target Build: $target_build"
+        counter=$(expr $counter + 1)
+        prj_name="`echo $target_build | sed -e 's#/ *$##g' -e 's#.*/##'`"
+        prj_name="$prj_name-$counter"
+
+	    # Generate .buildstamp
+	    if [ -n "${WRL_INSTALLER_CONF}" ]; then
+	        installer_conf="`echo ${WRL_INSTALLER_CONF} | awk '{print $'"$counter"'}'`"
+	        wrl_installer_copy_buildstamp $prj_name $installer_conf
+	    else
+	        cat >${IMAGE_ROOTFS}/.buildstamp.$prj_name <<_EOF
+[Main]
+Product=${INSTPRODUCT}
+Version=${INSTVER}
+BugURL=${INSTBUGURL}
+IsFinal=True
+UUID=${DATETIME}.${TARGET_ARCH}
+_EOF
+	    fi
+
+	    if [ -f "$target_build" ]; then
+	        filename=$(basename "$target_build")
+	        extension="${filename##*.}"
+	        bpn=${BPN}
+	        # Do not copy image for initramfs
+	        if [ "${bpn##*initramfs}" != "${bpn%%initramfs*}" ]; then
+	            continue
+	        elif [ "x$extension" = "xext2" -o "x$extension" = "xext3" -o "x$extension" = "xext4" ]; then
+	            echo "Image based target install selected."
+	            mkdir -p "${IMAGE_ROOTFS}/LiveOS.$prj_name"
+	            wrl_installer_hardlinktree "$target_build" "${IMAGE_ROOTFS}/LiveOS.$prj_name/rootfs.img"
+	            echo "::$prj_name::" >> ${IMAGE_ROOTFS}/.target_build_list
+	        else
+	            bberror "Unsupported image: $target_build."
+	            bberror "The image must be ext2, ext3 or ext4"
+	            exit 1
+	        fi
+	    elif [ -d "$target_build" ]; then
+	        targetimage_counter=$(expr $targetimage_counter + 1)
+	        target_image="`echo ${INSTALLER_TARGET_IMAGE} | awk '{print $'"$targetimage_counter"'}'`"
+	        echo "Target Image: $target_image"
+	        wrl_installer_copy_pkgs $target_build $target_image $prj_name $installer_conf
+	    else
+	        bberror "Invalid configuration of INSTALLER_TARGET_BUILD: $target_build."
+	        bberror "It must either point to an image (ext2, ext3 or ext4) or to the root of another build directory"
+	        exit 1
+	    fi
+
+	    ks_cfg="${INSTALLER_CONFDIR}/ks.cfg.$prj_name"
+	    if [ -n "${KICKSTART_FILE}" ]; then
+	        ks_file="`echo ${KICKSTART_FILE} | awk '{print $'"$counter"'}'`"
+	        bbnote "Copying kickstart file $ks_file to $ks_cfg ..."
+	        mkdir -p ${INSTALLER_CONFDIR}
+	        cp $ks_file $ks_cfg
+	    fi
+    done
+
+    # Setup the symlink if only one target build dir.
+    if [ "$counter" = "1" ]; then
+        prj_name="`awk -F:: '{print $2}' ${IMAGE_ROOTFS}/.target_build_list`"
+        entries=".buildstamp LiveOS Packages installer-config/ks.cfg"
+        for i in $entries; do
+            if [ -e ${IMAGE_ROOTFS}/$i.$prj_name ]; then
+                ln -sf `basename $i.$prj_name` ${IMAGE_ROOTFS}/$i
+            fi
+        done
+    fi
+}
+
+python __anonymous() {
+    if "selinux" in d.getVar("DISTRO_FEATURES", True).split():
+        raise bb.parse.SkipPackage("Unable to build the installer when selinux is enabled.")
+
+    if bb.data.inherits_class('image', d):
+        if d.getVar("DISTRO", True) != "anaconda":
+            raise bb.parse.SkipPackage("Set DISTRO = 'anaconda' in local.conf")
+
+        target_builds = d.getVar('INSTALLER_TARGET_BUILD', True)
+        if not target_builds:
+            errmsg = "No INSTALLER_TARGET_BUILD is found,\n"
+            errmsg += "set INSTALLER_TARGET_BUILD = '<target-build-topdir>' and\n"
+            errmsg += "INSTALLER_TARGET_IMAGE = '<target-image-pn>' to do RPMs\n"
+            errmsg += "install, or\n"
+            errmsg += "set INSTALLER_TARGET_BUILD = '<target-build-image>' to do\n"
+            errmsg += "image copy install"
+            raise bb.parse.SkipPackage(errmsg)
+
+        count = 0
+        for target_build in target_builds.split():
+            if not os.path.exists(target_build):
+                raise bb.parse.SkipPackage("The %s of INSTALLER_TARGET_BUILD does not exist" % target_build)
+
+            if os.path.isdir(target_build):
+                count += 1
+
+        # While do package management install
+        if count > 0:
+            target_images = d.getVar('INSTALLER_TARGET_IMAGE', True)
+            if not target_images:
+                errmsg = "The INSTALLER_TARGET_BUILD is a dir, but not found INSTALLER_TARGET_IMAGE,\n"
+                errmsg += "set INSTALLER_TARGET_IMAGE = '<target-image-pn>' to do RPMs install"
+                raise bb.parse.SkipPackage(errmsg)
+
+            elif count != len(target_images.split()):
+                errmsg = "The INSTALLER_TARGET_BUILD has %s build dirs: %s\n" % (count, target_builds)
+                errmsg += "But INSTALLER_TARGET_IMAGE has %s build images: %s\n" % (len(target_images.split()), target_images)
+                raise bb.parse.SkipPackage(errmsg)
+
+        # The count of INSTALLER_TARGET_BUILD and WRL_INSTALLER_CONF must match when set.
+        wrlinstaller_confs = d.getVar('WRL_INSTALLER_CONF', True)
+        if wrlinstaller_confs:
+            if len(wrlinstaller_confs.split()) != len(target_builds.split()):
+                raise bb.parse.SkipPackage("The count of INSTALLER_TARGET_BUILD and WRL_INSTALLER_CONF not match!")
+            for wrlinstaller_conf in wrlinstaller_confs.split():
+                if not os.path.exists(wrlinstaller_conf):
+                    raise bb.parse.SkipPackage("The installer conf %s in WRL_INSTALLER_CONF doesn't exist!" % wrlinstaller_conf)
+
+        # The count of INSTALLER_TARGET_BUILD and KICKSTART_FILE must match when set.
+        kickstart_files = d.getVar('KICKSTART_FILE', True)
+        if kickstart_files:
+            if len(kickstart_files.split()) != len(target_builds.split()):
+                raise bb.parse.SkipPackage("The count of INSTALLER_TARGET_BUILD and KICKSTART_FILE not match!")
+            for kickstart_file in kickstart_files.split():
+                if not os.path.exists(kickstart_file):
+                    raise bb.parse.SkipPackage("The kickstart file %s in KICKSTART_FILE doesn't exist!" % kickstart_file)
+
+}
+
diff --git a/meta-installer/conf/distro/anaconda.conf b/meta-installer/conf/distro/anaconda.conf
new file mode 100644
index 0000000..fc3f23d
--- /dev/null
+++ b/meta-installer/conf/distro/anaconda.conf
@@ -0,0 +1,33 @@
+# use systemd as the default init manager
+# comment the following lines to use 'sysvinit' as the init manager
+VIRTUAL-RUNTIME_init_manager = "systemd"
+DISTRO_FEATURES_BACKFILL_CONSIDERED_append = " sysvinit"
+DISTRO_FEATURES_append = " systemd"
+
+DISTRO_FEATURES_append = " \
+    x11 \
+    opengl \
+"
+
+VIRTUAL-RUNTIME_base-utils = "busybox"
+
+SYSTEMD_AUTO_ENABLE_pn-lvm2 = "enable"
+
+KERNEL_CLASSES_append = " anaconda_kernel"
+
+IMAGE_FEATURES_append = " package-management"
+
+# Want ldconfig in the output package
+# The python module require it
+DISTRO_FEATURES_append = " ldconfig"
+
+# It works for both of syslinux and grub-efi
+LABELS_LIVE = "boot"
+
+QB_MEM_qemux86-64 = "-m 2048"
+
+HOSTTOOLS_append = " tac"
+
+MACHINE_FEATURES_append = " efi pcbios"
+
+UVESA_MODE = "1024x768-32"
-- 
2.8.1



^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH 05/15] meta-installer: add systemd/systemd-serialgetty bbappend
  2017-11-23 12:09 [PATCH 00/15] create meta-installer layer Hongxu Jia
                   ` (3 preceding siblings ...)
  2017-11-23 12:09 ` [PATCH 04/15] meta-installer: add distro anaconda for host build Hongxu Jia
@ 2017-11-23 12:09 ` Hongxu Jia
  2017-11-23 12:09 ` [PATCH 06/15] meta-installer: add gtk+3 bbappend Hongxu Jia
                   ` (11 subsequent siblings)
  16 siblings, 0 replies; 27+ messages in thread
From: Hongxu Jia @ 2017-11-23 12:09 UTC (permalink / raw)
  To: Martin.Jansa, akuster808, raj.khem; +Cc: openembedded-devel

Use screen for text install, the serail console and tty1
will have the same input/output.

The bbappend works only if DISTRO = "anaconda".

Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
---
 .../systemd/files/serial-getty@.service            | 40 ++++++++++++++++++++++
 .../systemd/files/serial-screen-anaconda.sh        |  5 +++
 .../systemd/systemd-serialgetty.bbappend           | 12 +++++++
 .../recipes-core/systemd/systemd_%.bbappend        |  6 ++++
 4 files changed, 63 insertions(+)
 create mode 100644 meta-installer/recipes-core/systemd/files/serial-getty@.service
 create mode 100644 meta-installer/recipes-core/systemd/files/serial-screen-anaconda.sh
 create mode 100644 meta-installer/recipes-core/systemd/systemd-serialgetty.bbappend
 create mode 100644 meta-installer/recipes-core/systemd/systemd_%.bbappend

diff --git a/meta-installer/recipes-core/systemd/files/serial-getty@.service b/meta-installer/recipes-core/systemd/files/serial-getty@.service
new file mode 100644
index 0000000..52530a3
--- /dev/null
+++ b/meta-installer/recipes-core/systemd/files/serial-getty@.service
@@ -0,0 +1,40 @@
+#  This file is part of systemd.
+#
+#  systemd is free software; you can redistribute it and/or modify it
+#  under the terms of the GNU Lesser General Public License as published by
+#  the Free Software Foundation; either version 2.1 of the License, or
+#  (at your option) any later version.
+
+[Unit]
+Description=Serial Getty on %I
+Documentation=man:agetty(8) man:systemd-getty-generator(8)
+Documentation=http://0pointer.de/blog/projects/serial-console.html
+BindsTo=dev-%i.device
+Requires=anaconda-init.service
+After=dev-%i.device systemd-user-sessions.service plymouth-quit-wait.service
+After=rc-local.service
+After=anaconda-init.target anaconda-init.service
+
+# If additional gettys are spawned during boot then we should make
+# sure that this is synchronized before getty.target, even though
+# getty.target didn't actually pull it in.
+Before=getty.target
+IgnoreOnIsolate=yes
+
+[Service]
+Environment=TERM=xterm HOME=@ROOT_HOME@ PATH=/usr/bin:/bin:/sbin:/usr/sbin LANG=en_US.UTF-8
+ExecStart=-/sbin/agetty -8 --keep-baud  -n -l /bin/bash -o '--login' %I @BAUDRATE@ $TERM
+WorkingDirectory=@ROOT_HOME@
+Type=idle
+Restart=always
+RestartSec=0
+UtmpIdentifier=%I
+TTYPath=/dev/%I
+TTYReset=yes
+TTYVHangup=yes
+KillMode=process
+IgnoreSIGPIPE=no
+SendSIGHUP=yes
+
+[Install]
+WantedBy=getty.target
diff --git a/meta-installer/recipes-core/systemd/files/serial-screen-anaconda.sh b/meta-installer/recipes-core/systemd/files/serial-screen-anaconda.sh
new file mode 100644
index 0000000..8ab9471
--- /dev/null
+++ b/meta-installer/recipes-core/systemd/files/serial-screen-anaconda.sh
@@ -0,0 +1,5 @@
+# Detect if it is serial tty, if yes, we need to invoke
+# screen to attach anaconda
+console=`/usr/bin/tty`
+[ "${console##/dev/ttyS}" != "${console}" ] && /usr/bin/screen -x anaconda-init
+
diff --git a/meta-installer/recipes-core/systemd/systemd-serialgetty.bbappend b/meta-installer/recipes-core/systemd/systemd-serialgetty.bbappend
new file mode 100644
index 0000000..afbd9b6
--- /dev/null
+++ b/meta-installer/recipes-core/systemd/systemd-serialgetty.bbappend
@@ -0,0 +1,12 @@
+FILESEXTRAPATHS_prepend_anaconda := "${THISDIR}/files:"
+
+SRC_URI_append_anaconda = " file://serial-getty@.service \
+           file://serial-screen-anaconda.sh \
+"
+
+do_install_append_anaconda() {
+	install -d ${D}${sysconfdir}/profile.d
+	install -m 644 ${WORKDIR}/serial-screen-anaconda.sh ${D}${sysconfdir}/profile.d/
+
+	sed -i -e 's,@ROOT_HOME@,${ROOT_HOME},g' ${D}${systemd_unitdir}/system/serial-getty@.service
+}
diff --git a/meta-installer/recipes-core/systemd/systemd_%.bbappend b/meta-installer/recipes-core/systemd/systemd_%.bbappend
new file mode 100644
index 0000000..3145f68
--- /dev/null
+++ b/meta-installer/recipes-core/systemd/systemd_%.bbappend
@@ -0,0 +1,6 @@
+FILESEXTRAPATHS_prepend_anaconda := "${THISDIR}/files:"
+
+do_install_append_anaconda() {
+	ln -nsf ${systemd_unitdir}/system/anaconda-init-screen@.service \
+		${D}${sysconfdir}/systemd/system/getty.target.wants/getty@tty1.service
+}
-- 
2.8.1



^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH 06/15] meta-installer: add gtk+3 bbappend
  2017-11-23 12:09 [PATCH 00/15] create meta-installer layer Hongxu Jia
                   ` (4 preceding siblings ...)
  2017-11-23 12:09 ` [PATCH 05/15] meta-installer: add systemd/systemd-serialgetty bbappend Hongxu Jia
@ 2017-11-23 12:09 ` Hongxu Jia
  2017-11-23 12:09 ` [PATCH 07/15] meta-installer: add initramfs-live-boot bbappend Hongxu Jia
                   ` (10 subsequent siblings)
  16 siblings, 0 replies; 27+ messages in thread
From: Hongxu Jia @ 2017-11-23 12:09 UTC (permalink / raw)
  To: Martin.Jansa, akuster808, raj.khem; +Cc: openembedded-devel

Here is easy way to reproduce the failure:
...
root@localhost:~# python
>>> from gi.repository import Gtk, AnacondaWidgets
>>> builder = Gtk.Builder()
>>> builder.get_type_from_name("AnacondaStandaloneWindow")
<GType invalid (0)>
...

Which is expected:
...
root@localhost:~# python
>>> from gi.repository import Gtk, AnacondaWidgets
>>> builder = Gtk.Builder()
>>> builder.get_type_from_name("AnacondaStandaloneWindow")
<GType AnacondaStandaloneWindow (7297024)>
...

The root cause is the issue of 'g_module_open' and 'g_module_symbol' in libgmodule-2.0.so.0:
While invoking 'g_module_open("libAnacondaWidgets.so.4.0.0",G_MODULE_BIND_LAZY);',
the following invoking 'g_module_open(NULL, G_MODULE_BIND_LAZY);'
could not find its symbol by invoking g_module_symbol.

So hardcode to load the anaconda module explicitly to workaround
failure while anaconda installer loading libAnacondaWidgets.

The bbappend works only if DISTRO = "anaconda".

Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
---
 ...for-anaconda-installer-while-loading-libA.patch | 84 ++++++++++++++++++++++
 .../recipes-gnome/gtk+/gtk+3_%.%.%.bbappend        |  3 +
 2 files changed, 87 insertions(+)
 create mode 100644 meta-installer/recipes-gnome/gtk+/files/workaround-for-anaconda-installer-while-loading-libA.patch
 create mode 100644 meta-installer/recipes-gnome/gtk+/gtk+3_%.%.%.bbappend

diff --git a/meta-installer/recipes-gnome/gtk+/files/workaround-for-anaconda-installer-while-loading-libA.patch b/meta-installer/recipes-gnome/gtk+/files/workaround-for-anaconda-installer-while-loading-libA.patch
new file mode 100644
index 0000000..581618d
--- /dev/null
+++ b/meta-installer/recipes-gnome/gtk+/files/workaround-for-anaconda-installer-while-loading-libA.patch
@@ -0,0 +1,84 @@
+From a99480777c259c1ef0db3ac972abae348d930b41 Mon Sep 17 00:00:00 2001
+From: Hongxu Jia <hongxu.jia@windriver.com>
+Date: Fri, 9 Oct 2015 07:12:36 -0400
+Subject: [PATCH] workaround for anaconda installer while loading
+ libAnacondaWidgets
+
+Here is easy way to reproduce the failure:
+...
+root@localhost:~# python
+>>> from gi.repository import Gtk, AnacondaWidgets
+>>> builder = Gtk.Builder()
+>>> builder.get_type_from_name("AnacondaStandaloneWindow")
+<GType invalid (0)>
+...
+
+Which is expected:
+...
+root@localhost:~# python
+>>> from gi.repository import Gtk, AnacondaWidgets
+>>> builder = Gtk.Builder()
+>>> builder.get_type_from_name("AnacondaStandaloneWindow")
+<GType AnacondaStandaloneWindow (7297024)>
+...
+
+The root cause is the issue of 'g_module_open' and 'g_module_symbol'
+in libgmodule-2.0.so.0:
+While invoking 'g_module_open("libAnacondaWidgets.so.4.0.0", G_MODULE_BIND_LAZY);'
+, the following invoking 'g_module_open(NULL, G_MODULE_BIND_LAZY);' could not
+find its symbol by invoking g_module_symbol.
+
+So we hardcode to load the anaconda module explicitly.
+
+Upstream-Status: inappropriate [oe specific]
+
+Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
+---
+ gtk/gtkbuilder.c | 24 ++++++++++++++++++++++++
+ 1 file changed, 24 insertions(+)
+
+diff --git a/gtk/gtkbuilder.c b/gtk/gtkbuilder.c
+index f9599ab..8315638 100644
+--- a/gtk/gtkbuilder.c
++++ b/gtk/gtkbuilder.c
+@@ -398,6 +398,27 @@ type_name_mangle (const gchar *name)
+ }
+ 
+ static GType
++_gtk_builder_resolve_type_lazily_anaconda (const gchar *name)
++{
++  static GModule *module = NULL;
++  GTypeGetFunc func;
++  gchar *symbol;
++  GType gtype = G_TYPE_INVALID;
++
++  if (!module)
++  {
++    module = g_module_open ("libAnacondaWidgets.so.4", 0);
++  }
++  symbol = type_name_mangle (name);
++  if (g_module_symbol (module, symbol, (gpointer)&func))
++    gtype = func ();
++
++  g_free (symbol);
++
++  return gtype;
++}
++
++static GType
+ _gtk_builder_resolve_type_lazily (const gchar *name)
+ {
+   static GModule *module = NULL;
+@@ -405,6 +426,9 @@ _gtk_builder_resolve_type_lazily (const gchar *name)
+   gchar *symbol;
+   GType gtype = G_TYPE_INVALID;
+ 
++  if (strncmp(name, "Anaconda", strlen("Anaconda")) == 0)
++    return _gtk_builder_resolve_type_lazily_anaconda(name);
++
+   if (!module)
+     module = g_module_open (NULL, 0);
+   
+-- 
+1.9.1
+
diff --git a/meta-installer/recipes-gnome/gtk+/gtk+3_%.%.%.bbappend b/meta-installer/recipes-gnome/gtk+/gtk+3_%.%.%.bbappend
new file mode 100644
index 0000000..752b2f1
--- /dev/null
+++ b/meta-installer/recipes-gnome/gtk+/gtk+3_%.%.%.bbappend
@@ -0,0 +1,3 @@
+FILESEXTRAPATHS_prepend_anaconda := "${THISDIR}/files:"
+SRC_URI_append_anaconda = " file://workaround-for-anaconda-installer-while-loading-libA.patch \
+"
-- 
2.8.1



^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH 07/15] meta-installer: add initramfs-live-boot bbappend
  2017-11-23 12:09 [PATCH 00/15] create meta-installer layer Hongxu Jia
                   ` (5 preceding siblings ...)
  2017-11-23 12:09 ` [PATCH 06/15] meta-installer: add gtk+3 bbappend Hongxu Jia
@ 2017-11-23 12:09 ` Hongxu Jia
  2017-11-23 12:09 ` [PATCH 08/15] meta-installer: add xserver-xf86-config bbappend Hongxu Jia
                   ` (9 subsequent siblings)
  16 siblings, 0 replies; 27+ messages in thread
From: Hongxu Jia @ 2017-11-23 12:09 UTC (permalink / raw)
  To: Martin.Jansa, akuster808, raj.khem; +Cc: openembedded-devel

Customize init-live.sh to override the one in oe-core

- Add option to enter a debug shell in initrd

- Add option to run anaconda installer from initrd.
  (required by PXE install)

- Remove -c while invoking switch_root which
  is not supported by util-linux

The bbappend works only if DISTRO = "anaconda".

Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
---
 .../initrdscripts/files/init-live.sh               | 249 +++++++++++++++++++++
 .../initrdscripts/initramfs-live-boot_1.0.bbappend |   5 +
 2 files changed, 254 insertions(+)
 create mode 100644 meta-installer/recipes-installer/initrdscripts/files/init-live.sh
 create mode 100644 meta-installer/recipes-installer/initrdscripts/initramfs-live-boot_1.0.bbappend

diff --git a/meta-installer/recipes-installer/initrdscripts/files/init-live.sh b/meta-installer/recipes-installer/initrdscripts/files/init-live.sh
new file mode 100644
index 0000000..965375b
--- /dev/null
+++ b/meta-installer/recipes-installer/initrdscripts/files/init-live.sh
@@ -0,0 +1,249 @@
+#!/bin/sh
+
+PATH=/sbin:/bin:/usr/sbin:/usr/bin
+
+ROOT_MOUNT="/rootfs"
+ROOT_IMAGE="rootfs.img"
+MOUNT="/bin/mount"
+UMOUNT="/bin/umount"
+ISOLINUX=""
+
+ROOT_DISK=""
+
+# Copied from initramfs-framework. The core of this script probably should be
+# turned into initramfs-framework modules to reduce duplication.
+udev_daemon() {
+	OPTIONS="/sbin/udev/udevd /sbin/udevd /lib/udev/udevd /lib/systemd/systemd-udevd"
+
+	for o in $OPTIONS; do
+		if [ -x "$o" ]; then
+			echo $o
+			return 0
+		fi
+	done
+
+	return 1
+}
+
+_UDEV_DAEMON=`udev_daemon`
+
+early_setup() {
+    mkdir -p /proc
+    mkdir -p /sys
+    mount -t proc proc /proc
+    mount -t sysfs sysfs /sys
+    mount -t devtmpfs none /dev
+
+    # support modular kernel
+    modprobe isofs 2> /dev/null
+
+    mkdir -p /run
+    mkdir -p /var/run
+
+    $_UDEV_DAEMON --daemon
+    udevadm trigger --action=add
+}
+
+read_args() {
+    [ -z "$CMDLINE" ] && CMDLINE=`cat /proc/cmdline`
+    for arg in $CMDLINE; do
+        optarg=`expr "x$arg" : 'x[^=]*=\(.*\)'`
+        case $arg in
+            root=*)
+                ROOT_DEVICE=$optarg ;;
+            rootimage=*)
+                ROOT_IMAGE=$optarg ;;
+            rootfstype=*)
+                modprobe $optarg 2> /dev/null ;;
+            LABEL=*)
+                label=$optarg ;;
+            video=*)
+                video_mode=$arg ;;
+            vga=*)
+                vga_mode=$arg ;;
+            console=*)
+                if [ -z "${console_params}" ]; then
+                    console_params=$arg
+                else
+                    console_params="$console_params $arg"
+                fi ;;
+            shelltimeout*)
+                if [ -z "$optarg" ]; then
+                        shelltimeout=30
+                else
+                        shelltimeout=$optarg
+                fi ;;
+            debugshell)
+                debugshell=y
+        esac
+    done
+}
+
+boot_live_root() {
+    # Watches the udev event queue, and exits if all current events are handled
+    udevadm settle --timeout=3
+    killall "${_UDEV_DAEMON##*/}" 2>/dev/null
+
+    # Allow for identification of the real root even after boot
+    mkdir -p  ${ROOT_MOUNT}/media/realroot
+    mount -n --move "/run/media/${ROOT_DISK}" ${ROOT_MOUNT}/media/realroot
+
+    # Umount other media for anaconda
+    for dir in `awk '/\/dev.* \/run\/media/{print $2}' /proc/mounts`; do
+        umount $dir
+    done
+    mount -n --move /proc ${ROOT_MOUNT}/proc
+    mount -n --move /sys ${ROOT_MOUNT}/sys
+    mount -n --move /dev ${ROOT_MOUNT}/dev
+
+    cd $ROOT_MOUNT
+
+    exec switch_root $ROOT_MOUNT /sbin/init $CMDLINE ||
+        fatal "Couldn't switch_root, dropping to shell"
+}
+
+fatal() {
+    echo $1 >$CONSOLE
+    echo >$CONSOLE
+    exec sh
+}
+
+early_setup
+
+[ -z "$CONSOLE" ] && CONSOLE="/dev/console"
+
+read_args
+
+if test x$debugshell = xy ; then
+        echo "Entering debug shell..."
+        exec /bin/sh
+fi
+
+case $label in
+    initrd-install)
+    # Watches the udev event queue, and exits if all current events are handled
+    udevadm settle --timeout=3
+    killall "${_UDEV_DAEMON##*/}" 2>/dev/null
+    for dir in `awk '/\/dev.* \/run\/media/{print $2}' /proc/mounts`; do
+        umount $dir
+    done
+    echo "" > /etc/udev/scripts/mount.sh
+    echo "init_bin /sbin/init"
+    [ -x /sbin/init ] && exec /sbin/init
+    ;;
+esac
+
+
+echo "Waiting for removable media..."
+C=0
+while true
+do
+  for i in `ls /run/media 2>/dev/null`; do
+      if [ -f /run/media/$i/$ROOT_IMAGE ] ; then
+		found="yes"
+		ROOT_DISK="$i"
+		break
+	  elif [ -f /run/media/$i/isolinux/$ROOT_IMAGE ]; then
+		found="yes"
+		ISOLINUX="isolinux"
+		ROOT_DISK="$i"
+		break
+      fi
+  done
+  if [ "$found" = "yes" ]; then
+      break;
+  fi
+  # don't wait for more than $shelltimeout seconds, if it's set
+  if [ -n "$shelltimeout" ]; then
+      echo -n " " $(( $shelltimeout - $C ))
+      if [ $C -ge $shelltimeout ]; then
+           echo "..."
+	   echo "Mounted filesystems"
+           mount | grep media
+           echo "Available block devices"
+           cat /proc/partitions
+           fatal "Cannot find $ROOT_IMAGE file in /run/media/* , dropping to a shell "
+      fi
+      C=$(( C + 1 ))
+  fi
+  sleep 1
+done
+
+# Try to mount the root image read-write and then boot it up.
+# This function distinguishes between a read-only image and a read-write image.
+# In the former case (typically an iso), it tries to make a union mount if possible.
+# In the latter case, the root image could be mounted and then directly booted up.
+mount_and_boot() {
+    mkdir $ROOT_MOUNT
+    mknod /dev/loop0 b 7 0 2>/dev/null
+
+    if ! mount -o rw,loop,noatime,nodiratime /run/media/$ROOT_DISK/$ISOLINUX/$ROOT_IMAGE $ROOT_MOUNT ; then
+	fatal "Could not mount rootfs image"
+    fi
+
+    if touch $ROOT_MOUNT/bin 2>/dev/null; then
+	# The root image is read-write, directly boot it up.
+	boot_live_root
+    fi
+
+    # determine which unification filesystem to use
+    union_fs_type=""
+    if grep -q -w "overlay" /proc/filesystems; then
+	union_fs_type="overlay"
+    elif grep -q -w "aufs" /proc/filesystems; then
+	union_fs_type="aufs"
+    else
+	union_fs_type=""
+    fi
+
+    # make a union mount if possible
+    case $union_fs_type in
+	"overlay")
+	    mkdir -p /rootfs.ro /rootfs.rw
+	    if ! mount -n --move $ROOT_MOUNT /rootfs.ro; then
+		rm -rf /rootfs.ro /rootfs.rw
+		fatal "Could not move rootfs mount point"
+	    else
+		mount -t tmpfs -o rw,noatime,mode=755 tmpfs /rootfs.rw
+		mkdir -p /rootfs.rw/upperdir /rootfs.rw/work
+		mount -t overlay overlay -o "lowerdir=/rootfs.ro,upperdir=/rootfs.rw/upperdir,workdir=/rootfs.rw/work" $ROOT_MOUNT
+		mkdir -p $ROOT_MOUNT/rootfs.ro $ROOT_MOUNT/rootfs.rw
+		mount --move /rootfs.ro $ROOT_MOUNT/rootfs.ro
+		mount --move /rootfs.rw $ROOT_MOUNT/rootfs.rw
+	    fi
+	    ;;
+	"aufs")
+	    mkdir -p /rootfs.ro /rootfs.rw
+	    if ! mount -n --move $ROOT_MOUNT /rootfs.ro; then
+		rm -rf /rootfs.ro /rootfs.rw
+		fatal "Could not move rootfs mount point"
+	    else
+		mount -t tmpfs -o rw,noatime,mode=755 tmpfs /rootfs.rw
+		mount -t aufs -o "dirs=/rootfs.rw=rw:/rootfs.ro=ro" aufs $ROOT_MOUNT
+		mkdir -p $ROOT_MOUNT/rootfs.ro $ROOT_MOUNT/rootfs.rw
+		mount --move /rootfs.ro $ROOT_MOUNT/rootfs.ro
+		mount --move /rootfs.rw $ROOT_MOUNT/rootfs.rw
+	    fi
+	    ;;
+	"")
+	    mount -t tmpfs -o rw,noatime,mode=755 tmpfs $ROOT_MOUNT/media
+	    ;;
+    esac
+
+    # boot the image
+    boot_live_root
+}
+
+if [ "$label" != "boot" -a -f $label.sh ] ; then
+	if [ -f /run/media/$i/$ISOLINUX/$ROOT_IMAGE ] ; then
+	    ./$label.sh $i/$ISOLINUX $ROOT_IMAGE $video_mode $vga_mode $console_params
+	else
+	    fatal "Could not find $label script"
+	fi
+
+	# If we're getting here, we failed...
+	fatal "Target $label failed"
+fi
+
+mount_and_boot
+
diff --git a/meta-installer/recipes-installer/initrdscripts/initramfs-live-boot_1.0.bbappend b/meta-installer/recipes-installer/initrdscripts/initramfs-live-boot_1.0.bbappend
new file mode 100644
index 0000000..4a644ad
--- /dev/null
+++ b/meta-installer/recipes-installer/initrdscripts/initramfs-live-boot_1.0.bbappend
@@ -0,0 +1,5 @@
+FILESEXTRAPATHS_append_anaconda := ":${THISDIR}/files"
+
+SRC_URI_append_anaconda = " \
+    file://init-live.sh \
+"
-- 
2.8.1



^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH 08/15] meta-installer: add xserver-xf86-config bbappend
  2017-11-23 12:09 [PATCH 00/15] create meta-installer layer Hongxu Jia
                   ` (6 preceding siblings ...)
  2017-11-23 12:09 ` [PATCH 07/15] meta-installer: add initramfs-live-boot bbappend Hongxu Jia
@ 2017-11-23 12:09 ` Hongxu Jia
  2017-11-23 12:09 ` [PATCH 09/15] meta-installer: add multipath-tools bbappend Hongxu Jia
                   ` (8 subsequent siblings)
  16 siblings, 0 replies; 27+ messages in thread
From: Hongxu Jia @ 2017-11-23 12:09 UTC (permalink / raw)
  To: Martin.Jansa, akuster808, raj.khem; +Cc: openembedded-devel

Tweak display rate from "640x480" to "1024x768". The xorg.conf
is already overridden by qemux86-64 in oe-core, so we have to
use sed to do the modification.

The bbappend works only if DISTRO = "anaconda".

Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
---
 .../xorg-xserver/xserver-xf86-config_0.1.bbappend            | 12 ++++++++++++
 1 file changed, 12 insertions(+)
 create mode 100644 meta-installer/recipes-graphics/xorg-xserver/xserver-xf86-config_0.1.bbappend

diff --git a/meta-installer/recipes-graphics/xorg-xserver/xserver-xf86-config_0.1.bbappend b/meta-installer/recipes-graphics/xorg-xserver/xserver-xf86-config_0.1.bbappend
new file mode 100644
index 0000000..5447273
--- /dev/null
+++ b/meta-installer/recipes-graphics/xorg-xserver/xserver-xf86-config_0.1.bbappend
@@ -0,0 +1,12 @@
+do_install_prepend_qemux86-64_anaconda () {
+    if test -s ${WORKDIR}/xorg.conf; then
+        sed -i 's/Modes *"640x480"/Modes    "1024x768"/g' ${WORKDIR}/xorg.conf
+    fi
+}
+
+do_install_prepend_qemux86_anaconda () {
+    if test -s ${WORKDIR}/xorg.conf; then
+        sed -i 's/Modes *"640x480"/Modes    "1024x768"/g' ${WORKDIR}/xorg.conf
+    fi
+}
+
-- 
2.8.1



^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH 09/15] meta-installer: add multipath-tools bbappend
  2017-11-23 12:09 [PATCH 00/15] create meta-installer layer Hongxu Jia
                   ` (7 preceding siblings ...)
  2017-11-23 12:09 ` [PATCH 08/15] meta-installer: add xserver-xf86-config bbappend Hongxu Jia
@ 2017-11-23 12:09 ` Hongxu Jia
  2017-11-23 12:09 ` [PATCH 10/15] meta-installer: add recipe packagegroup-installer-x11-anaconda Hongxu Jia
                   ` (7 subsequent siblings)
  16 siblings, 0 replies; 27+ messages in thread
From: Hongxu Jia @ 2017-11-23 12:09 UTC (permalink / raw)
  To: Martin.Jansa, akuster808, raj.khem; +Cc: openembedded-devel

- Explicitly disable auto service to help installer work

- Copy multipath.conf from example

The bbappend works only if DISTRO = "anaconda".

Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
---
 .../recipes-support/multipath-tools/multipath-tools_%.bbappend    | 8 ++++++++
 1 file changed, 8 insertions(+)
 create mode 100644 meta-installer/recipes-support/multipath-tools/multipath-tools_%.bbappend

diff --git a/meta-installer/recipes-support/multipath-tools/multipath-tools_%.bbappend b/meta-installer/recipes-support/multipath-tools/multipath-tools_%.bbappend
new file mode 100644
index 0000000..5bd2b03
--- /dev/null
+++ b/meta-installer/recipes-support/multipath-tools/multipath-tools_%.bbappend
@@ -0,0 +1,8 @@
+SYSTEMD_AUTO_ENABLE_anaconda = "disable"
+
+do_install_append_anaconda () {
+    install -d ${D}${sysconfdir}/multipath
+    install -m 0644 ${WORKDIR}/multipath.conf.example \
+    ${D}${sysconfdir}/multipath.conf
+}
+
-- 
2.8.1



^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH 10/15] meta-installer: add recipe packagegroup-installer-x11-anaconda
  2017-11-23 12:09 [PATCH 00/15] create meta-installer layer Hongxu Jia
                   ` (8 preceding siblings ...)
  2017-11-23 12:09 ` [PATCH 09/15] meta-installer: add multipath-tools bbappend Hongxu Jia
@ 2017-11-23 12:09 ` Hongxu Jia
  2017-11-23 12:09 ` [PATCH 11/15] meta-installer: add recipe yocto-compat-logos Hongxu Jia
                   ` (6 subsequent siblings)
  16 siblings, 0 replies; 27+ messages in thread
From: Hongxu Jia @ 2017-11-23 12:09 UTC (permalink / raw)
  To: Martin.Jansa, akuster808, raj.khem; +Cc: openembedded-devel

It provides desktop X11 applications to support anaconda.

Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
---
 .../packagegroup-installer-x11-anaconda.bb         | 28 ++++++++++++++++++++++
 1 file changed, 28 insertions(+)
 create mode 100644 meta-installer/recipes-installer/packagegroups/packagegroup-installer-x11-anaconda.bb

diff --git a/meta-installer/recipes-installer/packagegroups/packagegroup-installer-x11-anaconda.bb b/meta-installer/recipes-installer/packagegroups/packagegroup-installer-x11-anaconda.bb
new file mode 100644
index 0000000..5255b3a
--- /dev/null
+++ b/meta-installer/recipes-installer/packagegroups/packagegroup-installer-x11-anaconda.bb
@@ -0,0 +1,28 @@
+DESCRIPTION = "Tasks for desktop X11 applications to support anaconda"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
+
+inherit packagegroup distro_features_check
+REQUIRED_DISTRO_FEATURES = "x11"
+
+XSERVER ??= ""
+
+RDEPENDS_packagegroup-installer-x11-anaconda = "\
+    dbus \
+    xinput-calibrator \
+    xserver-nodm-init \
+    ${XSERVER} \
+    liberation-fonts \
+    xauth \
+    xhost \
+    xset \
+    settings-daemon \
+    xrandr \
+    libsdl \
+    metacity \
+    gnome-themes \
+    adwaita-icon-theme \
+    pango \
+    pango-modules \
+    createrepo-c"
+
-- 
2.8.1



^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH 11/15] meta-installer: add recipe yocto-compat-logos
  2017-11-23 12:09 [PATCH 00/15] create meta-installer layer Hongxu Jia
                   ` (9 preceding siblings ...)
  2017-11-23 12:09 ` [PATCH 10/15] meta-installer: add recipe packagegroup-installer-x11-anaconda Hongxu Jia
@ 2017-11-23 12:09 ` Hongxu Jia
  2017-11-23 12:09 ` [PATCH 12/15] meta-installer: add recipe anaconda-init Hongxu Jia
                   ` (5 subsequent siblings)
  16 siblings, 0 replies; 27+ messages in thread
From: Hongxu Jia @ 2017-11-23 12:09 UTC (permalink / raw)
  To: Martin.Jansa, akuster808, raj.khem; +Cc: openembedded-devel

The anaconda installer program requires the pictures to display
during installation.

Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
---
 .../recipes-installer/logos/yocto-compat-logos.bb  |  24 ++
 .../logos/yocto-compat-logos/COPYING               | 339 +++++++++++++++++++++
 .../logos/yocto-compat-logos/banner_yocto1.png     | Bin 0 -> 44650 bytes
 .../logos/yocto-compat-logos/banner_yocto2.png     | Bin 0 -> 39223 bytes
 .../logos/yocto-compat-logos/sidebar-logo.png      | Bin 0 -> 17651 bytes
 .../logos/yocto-compat-logos/topbar-bg.png         | Bin 0 -> 77956 bytes
 6 files changed, 363 insertions(+)
 create mode 100644 meta-installer/recipes-installer/logos/yocto-compat-logos.bb
 create mode 100644 meta-installer/recipes-installer/logos/yocto-compat-logos/COPYING
 create mode 100644 meta-installer/recipes-installer/logos/yocto-compat-logos/banner_yocto1.png
 create mode 100644 meta-installer/recipes-installer/logos/yocto-compat-logos/banner_yocto2.png
 create mode 100644 meta-installer/recipes-installer/logos/yocto-compat-logos/sidebar-logo.png
 create mode 100644 meta-installer/recipes-installer/logos/yocto-compat-logos/topbar-bg.png

diff --git a/meta-installer/recipes-installer/logos/yocto-compat-logos.bb b/meta-installer/recipes-installer/logos/yocto-compat-logos.bb
new file mode 100644
index 0000000..16d56e6
--- /dev/null
+++ b/meta-installer/recipes-installer/logos/yocto-compat-logos.bb
@@ -0,0 +1,24 @@
+DESCRIPTION = "Yocto project compatible logos for branding"
+LICENSE = "GPLv2"
+LIC_FILES_CHKSUM = "file://COPYING;md5=751419260aa954499f7abaabaa882bbe"
+
+SRC_URI = "file://sidebar-logo.png \
+           file://topbar-bg.png \
+           file://banner_yocto1.png \
+           file://banner_yocto2.png \
+           file://COPYING"
+
+S = "${WORKDIR}"
+
+PACKAGE_ARCH = "all"
+
+FILES_${PN} = "${datadir}/anaconda"
+
+do_install() {
+    install -d ${D}/${datadir}/anaconda/boot
+    install -d ${D}/${datadir}/anaconda/pixmaps
+    install -m 0755 sidebar-logo.png ${D}${datadir}/anaconda/pixmaps
+    install -m 0755 topbar-bg.png ${D}${datadir}/anaconda/pixmaps
+    install -d ${D}/${datadir}/anaconda/pixmaps/rnotes/en
+    install -m 0755 banner_*.png ${D}/${datadir}/anaconda/pixmaps/rnotes/en
+}
diff --git a/meta-installer/recipes-installer/logos/yocto-compat-logos/COPYING b/meta-installer/recipes-installer/logos/yocto-compat-logos/COPYING
new file mode 100644
index 0000000..d511905
--- /dev/null
+++ b/meta-installer/recipes-installer/logos/yocto-compat-logos/COPYING
@@ -0,0 +1,339 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    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, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/meta-installer/recipes-installer/logos/yocto-compat-logos/banner_yocto1.png b/meta-installer/recipes-installer/logos/yocto-compat-logos/banner_yocto1.png
new file mode 100644
index 0000000000000000000000000000000000000000..fa14f48e4629cf53d9b3e2402159a9a6797903b6
GIT binary patch
literal 44650
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
JlQVn%{{TnCbHD%q

literal 0
HcmV?d00001

diff --git a/meta-installer/recipes-installer/logos/yocto-compat-logos/banner_yocto2.png b/meta-installer/recipes-installer/logos/yocto-compat-logos/banner_yocto2.png
new file mode 100644
index 0000000000000000000000000000000000000000..3e090a02358978cbb7c1da88d6e90c6f36311a95
GIT binary patch
literal 39223
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%0Ae~Gs#m*ThX
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

literal 0
HcmV?d00001

diff --git a/meta-installer/recipes-installer/logos/yocto-compat-logos/sidebar-logo.png b/meta-installer/recipes-installer/logos/yocto-compat-logos/sidebar-logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..7bb2f1eceb38ad2da3256df079b4c4f2f89ad88b
GIT binary patch
literal 17651
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

literal 0
HcmV?d00001

diff --git a/meta-installer/recipes-installer/logos/yocto-compat-logos/topbar-bg.png b/meta-installer/recipes-installer/logos/yocto-compat-logos/topbar-bg.png
new file mode 100644
index 0000000000000000000000000000000000000000..d42d39a11d0be662ea53a76145be1b5865816747
GIT binary patch
literal 77956
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%0AV7MR<N6bVdlUp36)
z7W}AsbYXfC81((N8x=nGC9NC;gRWAKlO5p8DXOKJ^XB8{m%FOMR9W1IS(30yPI=gw
zn2r#uAl=VKXv7(h9wjZ6=fp+)KJS0tPlgRqbrUPXLsXHf)rEDV(rTF$4pSTNz@)iL
zw_1f7tFCvRN5(pdh(S)b9qF}#@+_ej@7Jg#+t(Lf->;PbyVOlqn2V2Cq5qTXW7I+h
ze19i}&I<36r!<2a-mjNAdzh7%R0=io$E@QZDdQfaX{A?dT|ZLpi*X3KDoDZJy<_Eo
zLugh{#6eGHUJsVVo=v7yh~t8Zmn8fOGiFmD(Cf02;eoJ)wo)li8cwltGO6uqOp=Q~
zi`D3^{5<Q1Mp_eC|C9dh(Vf|BeP^I_HiDxH8$*im!S3~O)?5LZ&x+7o+26cp<P1mN
zwL4=>KAHFrpV4z-I5S55k~O<A6Q;G;Aj=aguDjw0@wHvcapwC{P#dCx@v+>undgmg
zF70oiUv->Ywa!-TW0+Te_Sb$1YO=BzR7rmyD}$yI3Orv9rrz|7`3U!Li8_koHbOx?
zqgT016_L#bonJ!LPIR?7goyPRc)FpFtTb2Jw29nX)^S>?eYtiy%~|7;@;k~P4Q3b2
zdk5M_(vhu?pZV-;&}pmF+%y1<HR)SzzWwX)@6dYzCug9S-B6=32pArto<~HO2Ea1)
mw^q&oi%v{a?cl>?=>G%z)o>1j$;;mW0000<MNUMnLSTaPfw+MH

literal 0
HcmV?d00001

-- 
2.8.1



^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH 12/15] meta-installer: add recipe anaconda-init
  2017-11-23 12:09 [PATCH 00/15] create meta-installer layer Hongxu Jia
                   ` (10 preceding siblings ...)
  2017-11-23 12:09 ` [PATCH 11/15] meta-installer: add recipe yocto-compat-logos Hongxu Jia
@ 2017-11-23 12:09 ` Hongxu Jia
  2017-11-23 12:09 ` [PATCH 13/15] meta-installer: add recipe anaconda 26.21.11 Hongxu Jia
                   ` (4 subsequent siblings)
  16 siblings, 0 replies; 27+ messages in thread
From: Hongxu Jia @ 2017-11-23 12:09 UTC (permalink / raw)
  To: Martin.Jansa, akuster808, raj.khem; +Cc: openembedded-devel

The init script to boot anaconda at startup.

Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
---
 .../anaconda-init/anaconda-init.bb                 |  77 +++++
 .../anaconda-init/anaconda-init/COPYING            | 339 +++++++++++++++++++
 .../anaconda-init/anaconda-init/Xusername          |   1 +
 .../anaconda-init/anaconda-init/anaconda-init      | 362 +++++++++++++++++++++
 .../anaconda-init/anaconda-init-screen@.service    |  22 ++
 .../anaconda-init/anaconda-init.service            |  13 +
 .../anaconda-init/anaconda-init.target             |   6 +
 7 files changed, 820 insertions(+)
 create mode 100644 meta-installer/recipes-installer/anaconda-init/anaconda-init.bb
 create mode 100644 meta-installer/recipes-installer/anaconda-init/anaconda-init/COPYING
 create mode 100644 meta-installer/recipes-installer/anaconda-init/anaconda-init/Xusername
 create mode 100644 meta-installer/recipes-installer/anaconda-init/anaconda-init/anaconda-init
 create mode 100644 meta-installer/recipes-installer/anaconda-init/anaconda-init/anaconda-init-screen@.service
 create mode 100644 meta-installer/recipes-installer/anaconda-init/anaconda-init/anaconda-init.service
 create mode 100644 meta-installer/recipes-installer/anaconda-init/anaconda-init/anaconda-init.target

diff --git a/meta-installer/recipes-installer/anaconda-init/anaconda-init.bb b/meta-installer/recipes-installer/anaconda-init/anaconda-init.bb
new file mode 100644
index 0000000..a7da0c5
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda-init/anaconda-init.bb
@@ -0,0 +1,77 @@
+DESCRIPTION = "Simple Init Script for Anaconda"
+LICENSE = "GPLv2"
+LIC_FILES_CHKSUM = "file://COPYING;md5=751419260aa954499f7abaabaa882bbe"
+
+SRC_URI = "file://anaconda-init \
+           file://anaconda-init.service \
+           file://anaconda-init-screen@.service \
+           file://anaconda-init.target \
+           file://Xusername \
+           file://COPYING"
+
+S = "${WORKDIR}"
+
+PACKAGE_ARCH = "${MACHINE_ARCH}"
+
+# For nm-online
+#RDEPENDS_${PN} = "networkmanager-tests"
+
+# For mount -oloop=/dev/loopX, busybox's mount doesn't support this.
+RDEPENDS_${PN} = "util-linux"
+
+# While systemd, we need screen to control anaconda-init first boot
+RDEPENDS_${PN} += " \
+    ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'screen', '', d)} \
+"
+
+inherit systemd
+
+SYSTEMD_SERVICE_${PN} = "anaconda-init.service \
+                         anaconda-init-screen@.service \
+                         anaconda-init.target \
+"
+
+CLEANBROKEN = "1"
+
+do_install() {
+    install -d ${D}/${sbindir}
+    install -m 0755 ${WORKDIR}/anaconda-init ${D}${sbindir}/anaconda-init
+    if [ -n "${EULA_DIR}" ]; then
+        sed -i "s#@EULA_DIR@#${EULA_DIR}#g" ${D}${sbindir}/anaconda-init
+    else
+        bbwarn "EULA_DIR is NULL, please set it in a local conf"
+        bbwarn "The EULA_DIR helps user to locate End User License Agreement during image installation"
+        sed -i "s#@EULA_DIR@##g" ${D}${sbindir}/anaconda-init
+    fi
+    install -d ${D}/${sysconfdir}
+    install -d ${D}/${sysconfdir}/init.d
+    ln -sf ${sbindir}/anaconda-init ${D}/${sysconfdir}/init.d/anaconda-init
+    install -d ${D}${systemd_unitdir}/system
+    install -m 0644 ${WORKDIR}/anaconda-init.service \
+                    ${WORKDIR}/anaconda-init-screen@.service \
+                    ${WORKDIR}/anaconda-init.target \
+               ${D}${systemd_unitdir}/system
+
+
+    sed -i -e 's,@SBINDIR@,${sbindir},g' -e 's,@ROOT_HOME@,${ROOT_HOME},g' ${D}${systemd_unitdir}/system/anaconda-init.service \
+                                                                           ${D}${systemd_unitdir}/system/anaconda-init-screen@.service
+    if [ "${ROOTLESS_X}" = "1" ] ; then
+        install -d ${D}/etc/X11
+        install Xusername ${D}/etc/X11
+    fi
+}
+
+inherit update-rc.d useradd
+
+INITSCRIPT_NAME = "anaconda-init"
+INITSCRIPT_PARAMS = "start 30 2 3 4 5 . stop 20 0 1 6 ."
+
+# Use fixed Xusername of xuser for now, this will need to be
+# fixed if the Xusername changes from xuser
+USERADD_PACKAGES = "${PN}"
+USERADD_PARAM_${PN} = "--create-home \
+                       --groups video,tty,audio \
+                       --user-group xuser"
+
+# Location of End User License Agreement
+EULA_DIR ??= ""
diff --git a/meta-installer/recipes-installer/anaconda-init/anaconda-init/COPYING b/meta-installer/recipes-installer/anaconda-init/anaconda-init/COPYING
new file mode 100644
index 0000000..d511905
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda-init/anaconda-init/COPYING
@@ -0,0 +1,339 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    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, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/meta-installer/recipes-installer/anaconda-init/anaconda-init/Xusername b/meta-installer/recipes-installer/anaconda-init/anaconda-init/Xusername
new file mode 100644
index 0000000..7060e5e
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda-init/anaconda-init/Xusername
@@ -0,0 +1 @@
+xuser
diff --git a/meta-installer/recipes-installer/anaconda-init/anaconda-init/anaconda-init b/meta-installer/recipes-installer/anaconda-init/anaconda-init/anaconda-init
new file mode 100644
index 0000000..f9afc44
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda-init/anaconda-init/anaconda-init
@@ -0,0 +1,362 @@
+#!/bin/sh
+#
+### BEGIN INIT INFO
+# Provides: xserver
+# Required-Start: $local_fs $remote_fs dbus
+# Required-Stop: $local_fs $remote_fs
+# Default-Start:     2 3 4 5
+# Default-Stop:      0 1 6
+### END INIT INFO
+
+# Don't reboot when failed
+stoponfail="1"
+EXTRA_ENVS="LANG=$LANG "
+EULA_DIR="@EULA_DIR@"
+EXTRA_ENVS="$EXTRA_ENVS EULA_DIR=$EULA_DIR"
+
+export PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin
+
+[ -z "$CMDLINE" ] && read CMDLINE < /proc/cmdline
+for x in $CMDLINE; do
+        case $x in
+        cmdline)
+            cmdline=1
+            ;;
+        headless)
+            headless=1
+            ;;
+        kbdtype=*)
+            kbdtype="${x#kbdtype=}"
+            ;;
+        keymap=*)
+            keymap="${x#keymap=}"
+            ;;
+        ks=*)
+            ks="${x#ks=}"
+            ;;
+        lang=*)
+            lang="${x#lang=}"
+            ;;
+        bootifonly=*)
+            bootifonly="${x#bootifonly=}"
+            ;;
+        stoponfail=*)
+            stoponfail="${x#stoponfail=}"
+            ;;
+        liveinst)
+            liveinst=1
+            ;;
+        loglevel=*)
+            loglevel="${x#loglevel=}"
+            ;;
+        mpath)
+            mpath=1
+            ;;
+        noinstall)
+            noinstall=1
+            ;;
+        nompath)
+            nompath=1
+            ;;
+        repo=*)
+            repo="${x#repo=}"
+            ;;
+        rescue)
+            rescue=1
+            ;;
+        resolution=*)
+            resolution="${x#resolution=}"
+            ;;
+        serial|console=*)
+            textinst=1
+            ;;
+        syslog=*)
+            syslog="${x#syslog=}"
+            ;;
+        textinst)
+            textinst=1
+            ;;
+        updates=*)
+            updates="${x#updates=}"
+            ;;
+        usefbx)
+            usefbx=1
+            ;;
+        vnc)
+            vnc=1
+            ;;
+        vncconnect=*)
+            vncconnect="${x#vncconnect=}"
+            ;;
+        vncpassword=*)
+            vncpassword="${x#vncpassword=}"
+            ;;
+        xdriver=*)
+            xdriver="${x#xdriver=}"
+            ;;
+        esac
+done
+
+# Check which rootfs to be installed
+blist="/.target_build_list"
+if [ -f "$blist" ]; then
+    lines=`cat $blist | wc -l`
+    if [ $lines -gt 1 ]; then
+        echo ""
+        echo "=============== Found the following products ==============="
+        for lineno in `seq $lines`; do
+            echo "  $lineno) `sed -n "${lineno}p" $blist | sed -e 's/^:://' -e 's/::/\t/g'`"
+        done
+        while true; do
+            echo ""
+            echo -n "Please enter your choice (0 to quit): "
+            read choice
+            right_choice=0
+            if [ "$choice" = "0" ]; then
+                exit 1
+            fi
+            for cnt in `seq $lines`; do
+                if [ "$cnt" = "$choice" ]; then
+                    right_choice=1
+                    break
+                fi
+            done
+            if [ $right_choice -eq 1 ]; then
+                break
+            else
+                echo "Invalid choice: $choice, it should be one of: " `seq $lines`
+            fi
+        done
+        prj_name="`sed -n "${choice}p" $blist | awk -F:: '{print $2}'`"
+        entries=".buildstamp LiveOS Packages installer-config/ks.cfg"
+        for f in $entries; do
+            if [ -e /$f.$prj_name ]; then
+                ln -sf `basename $f.$prj_name` /$f
+            fi
+        done
+    fi
+fi
+
+case "$1" in
+  start)
+       # configure X, allowing user to override xdriver
+       if [ -n "$xdriver" ]; then
+           mkdir -p /etc/X11/xorg.conf.d/
+           cat > /etc/X11/xorg.conf.d/00-xdriver.conf <<FOE
+Section "Device"
+        Identifier      "Videocard0"
+        Driver  "$xdriver"
+EndSection
+FOE
+       fi
+
+       . /etc/profile
+       username=root
+       echo "Starting Anaconda"
+       if [ -f /etc/X11/Xusername ]; then
+           username=`cat /etc/X11/Xusername`
+           # setting for rootless X
+           chmod o+w /var/log
+           chmod g+r /dev/tty[0-3]
+           chmod o+rw /dev/input/*
+           # hidraw device is probably needed
+           if [ -e /dev/hidraw0 ]; then
+               chmod o+rw /dev/hidraw*
+           fi
+       fi
+
+       if [ -n "$textinst" ]; then
+           anaconda_opts="$anaconda_opts --text"
+	   # Quiet kernel logs, this can be undone in a kickstart file
+	   echo 1 > /proc/sys/kernel/printk
+       fi
+
+       if [ -n "$vncpassword" ]; then
+           echo "$vncpassword" > /tmp/vncpassword.dat
+       fi
+
+       for OPTIONS in vnc headless usefbx mpath nompath rescue cmdline; do
+           if [ -n "${!OPTIONS}" ]; then
+               anaconda_opts="$anaconda_opts --$OPTIONS"
+           fi
+       done
+
+       for OPTIONS in resolution vncconnect xdriver syslog loglevel lang kbdtype keymap repo; do
+           if [ -n "${!OPTIONS}" ]; then
+               anaconda_opts="$anaconda_opts --$OPTIONS=${!OPTIONS}"
+           fi
+       done
+
+       KICKSTART_FILE="/installer-config/ks.cfg"
+
+       if [ -n "$ks" ]; then
+           anaconda_opts="$anaconda_opts --kickstart=$ks"
+       elif [ -e $KICKSTART_FILE ]; then
+           anaconda_opts="$anaconda_opts --kickstart=/installer-config/ks.cfg"
+       fi
+
+       ROOT_IMAGE="/LiveOS/rootfs.img"
+       ROOT_IMAGE_DEV="/dev/loop3"
+       if [ -e $ROOT_IMAGE ]; then
+           ROOT_IMAGE="`realpath $ROOT_IMAGE`"
+           losetup -a | grep -q $ROOT_IMAGE
+           if [ $? -eq 0 ]; then
+               echo "Skipping mounting $ROOT_IMAGE since it is already setup."
+           else
+               losetup -r $ROOT_IMAGE_DEV $ROOT_IMAGE
+               [ $? -eq 0 ] || exit 1
+           fi
+           anaconda_opts="$anaconda_opts --liveinst --method=livecd:$ROOT_IMAGE_DEV"
+       elif [ -n "$liveinst" ]; then
+               echo "ERROR: no $ROOT_IMAGE" >&2
+               exit 1
+       fi
+
+       BOOTIF=`cat /proc/cmdline |xargs -n1 echo |grep BOOTIF=`
+       BOOTIF=${BOOTIF#BOOTIF=01-}
+       BOOTIF=${BOOTIF//-/:}
+       FOUND_IFACE=0
+       ignore_addr=""
+
+       # Create Fedora-style network configuration files needed by anaconda
+       NETDIR=/etc/sysconfig/network-scripts
+       mkdir -p $NETDIR
+       for i in `ls /sys/class/net`
+       do
+           touch $NETDIR/ifcfg-$i
+           if [ "$bootifonly" != 1 -o "$BOOTIF" = "" -o ! -f /sys/class/net/$i/address ] ; then
+               continue
+           fi
+           hwaddr=`cat /sys/class/net/$i/address`
+           if [ "$hwaddr" != "$BOOTIF" ] ; then
+               ignore_addr="mac:$hwaddr;$ignore_addr"
+           else
+               FOUND_IFACE=1
+           fi
+       done
+       if [ $FOUND_IFACE = 1 -a "$ignore_addr" != "" ] ; then
+           echo "" >> /etc/NetworkManager/NetworkManager.conf
+           echo "[keyfile]" >> /etc/NetworkManager/NetworkManager.conf
+           echo unmanaged-devices="${ignore_addr%;}" >> /etc/NetworkManager/NetworkManager.conf
+       fi
+
+       PRODUCT_IMG_FILE="/run/initramfs/live/images/product.img"
+       PRODUCT_DISK="/tmp/product-disk"
+       PRODUCT_DIR="/tmp/product"
+
+       UPDATES_IMG_FILE="/run/initramfs/live/images/updates.img"
+       UPDATES_DISK="/tmp/update-disk"
+       UPDATES_DIR="/tmp/updates"
+
+       if [ -e "$PRODUCT_IMG_FILE" ]; then
+           mkdir $PRODUCT_DIR
+           if [ ! -z "$(file $PRODUCT_IMG_FILE | grep 'gzip compressed data')" ]; then
+               ( cd $PRODUCT_DIR ; gzip -dc $PRODUCT_IMG_FILE | cpio -id )
+           else
+               mkdir $PRODUCT_DISK
+               mount -t auto $PRODUCT_IMG_FILE $PRODUCT_DISK
+               cp -Rt $PRODUCT_DIR $PRODUCT_DISK/*
+               umount $PRODUCT_DISK
+               rmdir $PRODUCT_DISK
+           fi
+       fi
+
+       if [ -e "$UPDATES_IMG_FILE" ]; then
+           mkdir $UPDATES_DIR
+           if [ ! -z "$(file $UPDATES_IMG_FILE | grep 'gzip compressed data')" ]; then
+               ( cd $UPDATES_DIR ; gzip -dc $UPDATES_IMG_FILE | cpio -id )
+           else
+               mkdir $UPDATES_DISK
+               mount -t auto $UPDATES_IMG_FILE $UPDATES_DISK
+               cp -Rt $UPDATES_DIR $UPDATES_DISK/*
+               umount $UPDATES_DISK
+               rmdir $UPDATES_DISK
+           fi
+       fi
+
+       # Set up the updates, if provided.
+       if [ ! -z "$updates" ]; then
+           if [ -e $UPDATES_IMG_FILE -o -e $UPDATES_DIR ]; then
+               echo "The option updates= was provided, but an updates image already exists.  Please remove $UPDATES_IMG_FILE and $UPDATES_DIR and try again."
+               exit 1
+           fi
+
+           # Add a barrier to ensure that networking is up before running curl
+           #nm-online -q --timeout=30
+           #
+           #if [ $? -eq 0 ]; then
+           #    curl --retry 3 --retry-max-time 30 -o /tmp/updates.img $updates
+           #else
+           #    echo "anaconda-init: Could not detect if NetworkManager was online."
+           #    exit 1
+           #fi
+
+           mkdir $UPDATES_DIR
+           # We officially support two updates.img formats:  a filesystem image, and
+           # a compressed cpio blob.
+           if [ ! -e /tmp/updates.img ]; then
+               echo "The option updates= was provided, but an updates image could not be retrieved. Please verify the path and try again."
+               exit 1
+           elif [ ! -z "$(file /tmp/updates.img | grep 'gzip compressed data')" ]; then
+               ( cd $UPDATES_DIR ; gzip -dc /tmp/updates.img | cpio -id )
+           else
+               mkdir $UPDATES_DISK
+               mount -t auto /tmp/updates.img $UPDATES_DISK
+               cp -Rt $UPDATES_DIR $UPDATES_DISK/*
+               umount $UPDATES_DISK
+               rmdir $UPDATES_DISK
+           fi
+
+           export PYTHONPATH=/tmp/updates:$PYTHONPATH
+           export LD_LIBRARY_PATH=/tmp/updates:$LD_LIBRARY_PATH
+           export PATH=/tmp/updates:$PATH
+       fi
+
+       # Add a barrier here to ensure that networking is up before running Anaconda
+       #nm-online -q --timeout=30
+       #if [ $? -eq 2 ]; then
+       #    echo "anaconda-init: Could not detect if NetworkManager was online."
+       #    exit 1
+       #fi
+
+       # Using su rather than sudo as latest 1.8.1 cause failure [YOCTO #1211]
+       if [ -n "$noinstall" ]; then
+           echo "Bypassing installer..."
+       else
+           su -l -c "$EXTRA_ENVS /usr/sbin/anaconda $anaconda_opts 2>&1" $username
+           if [ "$stoponfail" != 1 ] ; then
+               echo "Rebooting system..."
+               /sbin/reboot -f
+           fi
+       fi
+
+       if [ "$stoponfail" = 1 ] ; then
+           killall Xorg
+           stty sane
+           echo ""
+           echo "Starting FAIL shell"
+           export HOME="/root"
+           /bin/sh
+       fi
+  ;;
+
+  stop)
+        echo "Stopping Anaconda"
+        killall anaconda
+        killall Xorg
+        killall Xvnc
+  ;;
+
+  restart)
+        $0 stop
+        sleep 1
+        $0 start
+  ;;
+
+  *)
+        echo "usage: $0 { start | stop | restart }"
+  ;;
+esac
+
+exit 0
+
diff --git a/meta-installer/recipes-installer/anaconda-init/anaconda-init/anaconda-init-screen@.service b/meta-installer/recipes-installer/anaconda-init/anaconda-init/anaconda-init-screen@.service
new file mode 100644
index 0000000..a4b3050
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda-init/anaconda-init/anaconda-init-screen@.service
@@ -0,0 +1,22 @@
+[Unit]
+Description=Anaconda Text Console
+Requires=anaconda-init.service
+After=anaconda-init.target anaconda-init.service
+
+[Service]
+Type=idle
+WorkingDirectory=@ROOT_HOME@
+Environment=LANG=en_US.UTF-8
+ExecStart=/usr/bin/screen -x anaconda-init
+StandardInput=tty
+StandardOutput=tty
+TTYPath=/dev/%I
+TTYReset=yes
+TTYVHangup=yes
+TTYVTDisallocate=yes
+Restart=always
+RestartSec=0
+
+[Install]
+WantedBy=getty.target
+DefaultInstance=tty1
diff --git a/meta-installer/recipes-installer/anaconda-init/anaconda-init/anaconda-init.service b/meta-installer/recipes-installer/anaconda-init/anaconda-init/anaconda-init.service
new file mode 100644
index 0000000..3275282
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda-init/anaconda-init/anaconda-init.service
@@ -0,0 +1,13 @@
+[Unit]
+Description=Anaconda Installer Daemon
+After=network.target
+After=anaconda-init.target
+
+[Service]
+Type=forking
+Environment=HOME=@ROOT_HOME@ MALLOC_CHECK_=2 MALLOC_PERTURB_=204 PATH=/usr/bin:/bin:/sbin:/usr/sbin:/mnt/sysimage/bin:/mnt/sysimage/usr/bin:/mnt/sysimage/usr/sbin:/mnt/sysimage/sbin LANG=en_US.UTF-8 GDK_BACKEND=x11 XDG_RUNTIME_DIR=/tmp GIO_USE_VFS=local
+WorkingDirectory=@ROOT_HOME@
+ExecStart=/usr/bin/screen -dmS anaconda-init /usr/sbin/anaconda-init start
+
+[Install]
+WantedBy=multi-user.target
diff --git a/meta-installer/recipes-installer/anaconda-init/anaconda-init/anaconda-init.target b/meta-installer/recipes-installer/anaconda-init/anaconda-init/anaconda-init.target
new file mode 100644
index 0000000..1886399
--- /dev/null
+++ b/meta-installer/recipes-installer/anaconda-init/anaconda-init/anaconda-init.target
@@ -0,0 +1,6 @@
+[Unit]
+Description=The anaconda installation program
+Requires=basic.target
+Conflicts=rescue.service rescue.target
+After=basic.target rescue.service rescue.target
+AllowIsolate=yes
-- 
2.8.1



^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH 13/15] meta-installer: add recipe anaconda 26.21.11
  2017-11-23 12:09 [PATCH 00/15] create meta-installer layer Hongxu Jia
                   ` (11 preceding siblings ...)
  2017-11-23 12:09 ` [PATCH 12/15] meta-installer: add recipe anaconda-init Hongxu Jia
@ 2017-11-23 12:09 ` Hongxu Jia
  2017-11-23 12:09 ` [PATCH 14/15] meta-installer: add recipe core-image-anaconda Hongxu Jia
                   ` (3 subsequent siblings)
  16 siblings, 0 replies; 27+ messages in thread
From: Hongxu Jia @ 2017-11-23 12:09 UTC (permalink / raw)
  To: Martin.Jansa, akuster808, raj.khem; +Cc: openembedded-devel

The anaconda is from fedora 26 and customized based
on OE platform.

Signed-off-by: Hongxu Jia <hongxu.jia@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@windriver.com>
+
+Signed-off-by: Hongxu Jia <hongxu.jia@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@windriver.com>
+
+Rebase from WRL8 to WRL9
+
+Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
+
+Rebase from WRL9 to WRL10
+
+Signed-off-by: Hongxu Jia <hongxu.jia@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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



^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH 14/15] meta-installer: add recipe core-image-anaconda
  2017-11-23 12:09 [PATCH 00/15] create meta-installer layer Hongxu Jia
                   ` (12 preceding siblings ...)
  2017-11-23 12:09 ` [PATCH 13/15] meta-installer: add recipe anaconda 26.21.11 Hongxu Jia
@ 2017-11-23 12:09 ` Hongxu Jia
  2017-11-23 12:09 ` [PATCH 15/15] meta-installer: add recipe core-image-anaconda-initramfs Hongxu Jia
                   ` (2 subsequent siblings)
  16 siblings, 0 replies; 27+ messages in thread
From: Hongxu Jia @ 2017-11-23 12:09 UTC (permalink / raw)
  To: Martin.Jansa, akuster808, raj.khem; +Cc: openembedded-devel

In the host build, it generates a live iso image which runs anaconda
to do the installation.

Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
---
 .../images/core-image-anaconda.bb                  | 34 ++++++++++++++++++++++
 1 file changed, 34 insertions(+)
 create mode 100644 meta-installer/recipes-installer/images/core-image-anaconda.bb

diff --git a/meta-installer/recipes-installer/images/core-image-anaconda.bb b/meta-installer/recipes-installer/images/core-image-anaconda.bb
new file mode 100644
index 0000000..9f50ca3
--- /dev/null
+++ b/meta-installer/recipes-installer/images/core-image-anaconda.bb
@@ -0,0 +1,34 @@
+DESCRIPTION = "An image with Anaconda to do installation."
+
+LICENSE = "MIT"
+
+# Support installation from initrd boot
+do_image_complete[depends] += "${PN}-initramfs:do_image_complete"
+
+DEPENDS += "isomd5sum-native \
+"
+
+CUSTOMIZE_LOGOS ??= "yocto-compat-logos"
+
+# We override what gets set in core-image.bbclass
+IMAGE_INSTALL = "\
+    packagegroup-core-boot \
+    packagegroup-core-ssh-openssh \
+    ${@['', 'packagegroup-installer-x11-anaconda'][bool(d.getVar('XSERVER', True))]} \
+    python3-anaconda \
+    anaconda-init \
+    kernel-modules \
+    ${CUSTOMIZE_LOGOS} \
+    dhcp-client \
+    ldd \
+    "
+IMAGE_LINGUAS = "en-us en-gb"
+
+# Generate live image
+IMAGE_FSTYPES_remove = "wic wic.bmap"
+IMAGE_FSTYPES_append = " live"
+NOHDD = "1"
+
+IMAGE_ROOTFS_EXTRA_SPACE =" + 102400"
+
+inherit core-image anaconda_image
-- 
2.8.1



^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH 15/15] meta-installer: add recipe core-image-anaconda-initramfs
  2017-11-23 12:09 [PATCH 00/15] create meta-installer layer Hongxu Jia
                   ` (13 preceding siblings ...)
  2017-11-23 12:09 ` [PATCH 14/15] meta-installer: add recipe core-image-anaconda Hongxu Jia
@ 2017-11-23 12:09 ` Hongxu Jia
  2017-11-23 12:14 ` [PATCH 00/15] create meta-installer layer Hongxu Jia
  2017-11-23 12:15 ` Burton, Ross
  16 siblings, 0 replies; 27+ messages in thread
From: Hongxu Jia @ 2017-11-23 12:09 UTC (permalink / raw)
  To: Martin.Jansa, akuster808, raj.khem; +Cc: openembedded-devel

The initramfs image is used for PXE install (net boot installation)

Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
---
 .../images/core-image-anaconda-initramfs.bb        | 33 ++++++++++++++++++++++
 1 file changed, 33 insertions(+)
 create mode 100644 meta-installer/recipes-installer/images/core-image-anaconda-initramfs.bb

diff --git a/meta-installer/recipes-installer/images/core-image-anaconda-initramfs.bb b/meta-installer/recipes-installer/images/core-image-anaconda-initramfs.bb
new file mode 100644
index 0000000..8f2dc3b
--- /dev/null
+++ b/meta-installer/recipes-installer/images/core-image-anaconda-initramfs.bb
@@ -0,0 +1,33 @@
+DESCRIPTION = "The initramfs contains anaconda installer, which supports \
+PXE install (net boot installation)"
+
+CUSTOMIZE_LOGOS ??= "yocto-compat-logos"
+
+IMAGE_INSTALL = "\
+    initramfs-live-boot \
+    initramfs-live-install \
+    initramfs-live-install-efi \
+    busybox udev ldd \
+    initscripts \
+    ${@bb.utils.contains('DISTRO_FEATURES', 'sysvinit', 'sysvinit', '', d)} \
+    sysvinit-inittab \
+    base-passwd \
+    kernel-modules \
+    ${CUSTOMIZE_LOGOS} \
+    python3-anaconda \
+    anaconda-init \
+    ${@['', 'packagegroup-installer-x11-anaconda'][bool(d.getVar('XSERVER', True))]} \
+    packagegroup-core-boot \
+    packagegroup-core-ssh-openssh \
+"
+
+IMAGE_LINGUAS = "en-us en-gb"
+
+LICENSE = "MIT"
+
+IMAGE_FSTYPES = "${INITRAMFS_FSTYPES}"
+inherit core-image anaconda_image
+
+IMAGE_ROOTFS_SIZE = "8192"
+INITRAMFS_MAXSIZE ?= "1048576"
+
-- 
2.8.1



^ permalink raw reply related	[flat|nested] 27+ messages in thread

* Re: [PATCH 00/15] create meta-installer layer
  2017-11-23 12:09 [PATCH 00/15] create meta-installer layer Hongxu Jia
                   ` (14 preceding siblings ...)
  2017-11-23 12:09 ` [PATCH 15/15] meta-installer: add recipe core-image-anaconda-initramfs Hongxu Jia
@ 2017-11-23 12:14 ` Hongxu Jia
  2017-11-23 12:15 ` Burton, Ross
  16 siblings, 0 replies; 27+ messages in thread
From: Hongxu Jia @ 2017-11-23 12:14 UTC (permalink / raw)
  To: Martin.Jansa, akuster808, raj.khem; +Cc: openembedded-devel

[-- Attachment #1: Type: text/plain, Size: 122 bytes --]

The attachments are the snapshot of image (copy) based install.

Update logo to "Yocto project compatible"

//Hongxu

[-- Attachment #2: 1_boot.png --]
[-- Type: image/png, Size: 44723 bytes --]

[-- Attachment #3: 2_welcome.png --]
[-- Type: image/png, Size: 56265 bytes --]

[-- Attachment #4: 3_summary.png --]
[-- Type: image/png, Size: 73139 bytes --]

[-- Attachment #5: 4_time.png --]
[-- Type: image/png, Size: 297554 bytes --]

[-- Attachment #6: 5_disk.png --]
[-- Type: image/png, Size: 136125 bytes --]

[-- Attachment #7: 6_begin_install.png --]
[-- Type: image/png, Size: 70967 bytes --]

[-- Attachment #8: 7_root_password.png --]
[-- Type: image/png, Size: 84419 bytes --]

[-- Attachment #9: 8_installing.png --]
[-- Type: image/png, Size: 98586 bytes --]

[-- Attachment #10: 9_done.png --]
[-- Type: image/png, Size: 54683 bytes --]

[-- Attachment #11: 10_installed_boot.png --]
[-- Type: image/png, Size: 5409 bytes --]

[-- Attachment #12: 11_installed_login.png --]
[-- Type: image/png, Size: 3741 bytes --]

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH 00/15] create meta-installer layer
  2017-11-23 12:09 [PATCH 00/15] create meta-installer layer Hongxu Jia
                   ` (15 preceding siblings ...)
  2017-11-23 12:14 ` [PATCH 00/15] create meta-installer layer Hongxu Jia
@ 2017-11-23 12:15 ` Burton, Ross
  2017-11-23 12:34   ` Hongxu Jia
  2017-11-24  0:35   ` Khem Raj
  16 siblings, 2 replies; 27+ messages in thread
From: Burton, Ross @ 2017-11-23 12:15 UTC (permalink / raw)
  To: Hongxu Jia; +Cc: OpenEmbedded Devel List

I honestly don't see why this has to belong in meta-openembedded and can't
live in a standalone repository.

Ross

On 23 November 2017 at 12:09, Hongxu Jia <hongxu.jia@windriver.com> wrote:

> The meta-installer layer provides a collection of installation
> programs based on OE platform.
>
> One implementation is the target installer 'anaconda', the version
> is 26.21.11 which is based on Fedora 26.
>
> The anacoda requires:
> - systemd as init manager
> - python3
> - dnf2/rpm4
> - gobject-introspection which requires qemu-usermode
>   in MACHINE_FEATURES
>
> The anaconda provides:
> - graphic install and text install.
>
> - package based (dnf/rpm) install and image (copy)
>   based install.
>
> - package based (dnf/rpm) install from local and
>   remote rpm sources such as CDs and DVDs, images
>   stored on a hard drive, NFS, HTTP, and FTP.
>
> - kickstart install which provides a fully unattended
>   installation that can be duplicated on scores of machines.
>
> - install over VNC on headless machines.
>
> - timezone setting.
>
> - root password setting.
>
> - user account creation.
>
> - a variety of advanced storage devices including
>   LVM, Btrfs, Ext4, and filesystem encryption.
>
> TODO (currently not support):
> - keyboard setting
>
> - language support setting
>
> - network & host name setting
>
> //Hongxu
>
> The following changes since commit 34aa4c3202b427f59f843dc43a4e1a
> fda4f81d13:
>
>   usb-modeswitch: add usb-modeswitch@.service (2017-11-19 13:45:38 -0800)
>
> are available in the git repository at:
>
>   git://git.openembedded.org/openembedded-core-contrib
> hongxu/meta-installer
>   http://cgit.openembedded.org/openembedded-core-contrib/log/
> ?h=hongxu/meta-installer
>
> Hongxu Jia (15):
>   meta-installer: create layer
>   meta-installer: add kernel config
>   meta-installer: add anaconda support for target build
>   meta-installer: add distro anaconda for host build
>   meta-installer: add systemd/systemd-serialgetty bbappend
>   meta-installer: add gtk+3 bbappend
>   meta-installer: add initramfs-live-boot bbappend
>   meta-installer: add xserver-xf86-config bbappend
>   meta-installer: add multipath-tools bbappend
>   meta-installer: add recipe packagegroup-installer-x11-anaconda
>   meta-installer: add recipe yocto-compat-logos
>   meta-installer: add recipe anaconda-init
>   meta-installer: add recipe anaconda 26.21.11
>   meta-installer: add recipe core-image-anaconda
>   meta-installer: add recipe core-image-anaconda-initramfs
>
>  meta-installer/COPYING.MIT                         |  17 +
>  meta-installer/README                              |  47 ++
>  meta-installer/README.anaconda                     | 341 ++++++++++++
>  meta-installer/classes/anaconda_image.bbclass      | 321 +++++++++++
>  meta-installer/classes/anaconda_kernel.bbclass     |  14 +
>  .../classes/anaconda_support_image.bbclass         |  40 ++
>  .../classes/anaconda_support_kernel.bbclass        |   8 +
>  meta-installer/conf/distro/anaconda.conf           |  33 ++
>  meta-installer/conf/layer.conf                     |  31 ++
>  meta-installer/licenses/FLTK                       | 530
> ++++++++++++++++++
>  .../systemd/files/serial-getty@.service            |  40 ++
>  .../systemd/files/serial-screen-anaconda.sh        |   5 +
>  .../systemd/systemd-serialgetty.bbappend           |  12 +
>  .../recipes-core/systemd/systemd_%.bbappend        |   6 +
>  ...for-anaconda-installer-while-loading-libA.patch |  84 +++
>  .../recipes-gnome/gtk+/gtk+3_%.%.%.bbappend        |   3 +
>  .../xorg-xserver/xserver-xf86-config_0.1.bbappend  |  12 +
>  .../anaconda-init/anaconda-init.bb                 |  77 +++
>  .../anaconda-init/anaconda-init/COPYING            | 339 ++++++++++++
>  .../anaconda-init/anaconda-init/Xusername          |   1 +
>  .../anaconda-init/anaconda-init/anaconda-init      | 362 +++++++++++++
>  .../anaconda-init/anaconda-init-screen@.service    |  22 +
>  .../anaconda-init/anaconda-init.service            |  13 +
>  .../anaconda-init/anaconda-init.target             |   6 +
>  .../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 ++++++
>  .../images/core-image-anaconda-initramfs.bb        |  33 ++
>  .../images/core-image-anaconda.bb                  |  34 ++
>  .../initrdscripts/files/init-live.sh               | 249 +++++++++
>  .../initrdscripts/initramfs-live-boot_1.0.bbappend |   5 +
>  .../recipes-installer/logos/yocto-compat-logos.bb  |  24 +
>  .../logos/yocto-compat-logos/COPYING               | 339 ++++++++++++
>  .../logos/yocto-compat-logos/banner_yocto1.png     | Bin 0 -> 44650 bytes
>  .../logos/yocto-compat-logos/banner_yocto2.png     | Bin 0 -> 39223 bytes
>  .../logos/yocto-compat-logos/sidebar-logo.png      | Bin 0 -> 17651 bytes
>  .../logos/yocto-compat-logos/topbar-bg.png         | Bin 0 -> 77956 bytes
>  .../packagegroup-installer-x11-anaconda.bb         |  28 +
>  .../packagegroups/packagegroup-anaconda-support.bb |  26 +
>  .../recipes-kernel/linux/files/crypt.cfg           |   2 +
>  .../recipes-kernel/linux/files/crypt.scc           |   1 +
>  .../recipes-kernel/linux/files/dmthin.cfg          |   1 +
>  .../recipes-kernel/linux/files/dmthin.scc          |   1 +
>  .../recipes-kernel/linux/files/efivars.cfg         |   1 +
>  .../recipes-kernel/linux/files/efivars.scc         |   1 +
>  meta-installer/recipes-kernel/linux/files/ide.cfg  |   5 +
>  meta-installer/recipes-kernel/linux/files/ide.scc  |   1 +
>  .../recipes-kernel/linux/files/liveinstall.cfg     |   5 +
>  .../recipes-kernel/linux/files/liveinstall.scc     |   1 +
>  .../recipes-kernel/linux/files/multipath.cfg       |   3 +
>  .../recipes-kernel/linux/files/multipath.scc       |   1 +
>  .../multipath-tools/multipath-tools_%.bbappend     |   8 +
>  120 files changed, 7845 insertions(+)
>  create mode 100644 meta-installer/COPYING.MIT
>  create mode 100644 meta-installer/README
>  create mode 100644 meta-installer/README.anaconda
>  create mode 100644 meta-installer/classes/anaconda_image.bbclass
>  create mode 100644 meta-installer/classes/anaconda_kernel.bbclass
>  create mode 100644 meta-installer/classes/anaconda_support_image.bbclass
>  create mode 100644 meta-installer/classes/anaconda_support_kernel.bbclass
>  create mode 100644 meta-installer/conf/distro/anaconda.conf
>  create mode 100644 meta-installer/conf/layer.conf
>  create mode 100644 meta-installer/licenses/FLTK
>  create mode 100644 meta-installer/recipes-core/
> systemd/files/serial-getty@.service
>  create mode 100644 meta-installer/recipes-core/
> systemd/files/serial-screen-anaconda.sh
>  create mode 100644 meta-installer/recipes-core/
> systemd/systemd-serialgetty.bbappend
>  create mode 100644 meta-installer/recipes-core/systemd/systemd_%.bbappend
>  create mode 100644 meta-installer/recipes-gnome/
> gtk+/files/workaround-for-anaconda-installer-while-loading-libA.patch
>  create mode 100644 meta-installer/recipes-gnome/gtk+/gtk+3_%.%.%.bbappend
>  create mode 100644 meta-installer/recipes-graphics/xorg-xserver/xserver-
> xf86-config_0.1.bbappend
>  create mode 100644 meta-installer/recipes-installer/anaconda-init/anacon
> da-init.bb
>  create mode 100644 meta-installer/recipes-installer/anaconda-init/
> anaconda-init/COPYING
>  create mode 100644 meta-installer/recipes-installer/anaconda-init/
> anaconda-init/Xusername
>  create mode 100644 meta-installer/recipes-installer/anaconda-init/
> anaconda-init/anaconda-init
>  create mode 100644 meta-installer/recipes-installer/anaconda-init/
> anaconda-init/anaconda-init-screen@.service
>  create mode 100644 meta-installer/recipes-installer/anaconda-init/
> anaconda-init/anaconda-init.service
>  create mode 100644 meta-installer/recipes-installer/anaconda-init/
> anaconda-init/anaconda-init.target
>  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
>  create mode 100644 meta-installer/recipes-installer/images/core-image-
> anaconda-initramfs.bb
>  create mode 100644 meta-installer/recipes-installer/images/core-image-
> anaconda.bb
>  create mode 100644 meta-installer/recipes-installer/initrdscripts/files/
> init-live.sh
>  create mode 100644 meta-installer/recipes-installer/initrdscripts/
> initramfs-live-boot_1.0.bbappend
>  create mode 100644 meta-installer/recipes-installer/logos/yocto-compat-
> logos.bb
>  create mode 100644 meta-installer/recipes-installer/logos/yocto-compat-
> logos/COPYING
>  create mode 100644 meta-installer/recipes-installer/logos/yocto-compat-
> logos/banner_yocto1.png
>  create mode 100644 meta-installer/recipes-installer/logos/yocto-compat-
> logos/banner_yocto2.png
>  create mode 100644 meta-installer/recipes-installer/logos/yocto-compat-
> logos/sidebar-logo.png
>  create mode 100644 meta-installer/recipes-installer/logos/yocto-compat-
> logos/topbar-bg.png
>  create mode 100644 meta-installer/recipes-installer/packagegroups/packag
> egroup-installer-x11-anaconda.bb
>  create mode 100644 meta-installer/recipes-installersupport/packagegroups/
> packagegroup-anaconda-support.bb
>  create mode 100644 meta-installer/recipes-kernel/linux/files/crypt.cfg
>  create mode 100644 meta-installer/recipes-kernel/linux/files/crypt.scc
>  create mode 100644 meta-installer/recipes-kernel/linux/files/dmthin.cfg
>  create mode 100644 meta-installer/recipes-kernel/linux/files/dmthin.scc
>  create mode 100644 meta-installer/recipes-kernel/linux/files/efivars.cfg
>  create mode 100644 meta-installer/recipes-kernel/linux/files/efivars.scc
>  create mode 100644 meta-installer/recipes-kernel/linux/files/ide.cfg
>  create mode 100644 meta-installer/recipes-kernel/linux/files/ide.scc
>  create mode 100644 meta-installer/recipes-kernel/
> linux/files/liveinstall.cfg
>  create mode 100644 meta-installer/recipes-kernel/
> linux/files/liveinstall.scc
>  create mode 100644 meta-installer/recipes-kernel/
> linux/files/multipath.cfg
>  create mode 100644 meta-installer/recipes-kernel/
> linux/files/multipath.scc
>  create mode 100644 meta-installer/recipes-support/multipath-tools/
> multipath-tools_%.bbappend
>
> --
> 2.8.1
>
> --
> _______________________________________________
> Openembedded-devel mailing list
> Openembedded-devel@lists.openembedded.org
> http://lists.openembedded.org/mailman/listinfo/openembedded-devel
>


^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH 00/15] create meta-installer layer
  2017-11-23 12:15 ` Burton, Ross
@ 2017-11-23 12:34   ` Hongxu Jia
  2017-11-24  0:35   ` Khem Raj
  1 sibling, 0 replies; 27+ messages in thread
From: Hongxu Jia @ 2017-11-23 12:34 UTC (permalink / raw)
  To: Burton, Ross; +Cc: OpenEmbedded Devel List

On 2017年11月23日 20:15, Burton, Ross wrote:
> I honestly don't see why this has to belong in meta-openembedded and 
> can't live in a standalone repository.
>

Yes, as a standalone repository is OK, but
previously I submitted all required recipes to OE,
with anacodna, it is complete as a whole.

It is convenience to maintain all of them in one place.

//Hongxu

> Ross
>



^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH 00/15] create meta-installer layer
  2017-11-23 12:15 ` Burton, Ross
  2017-11-23 12:34   ` Hongxu Jia
@ 2017-11-24  0:35   ` Khem Raj
  2017-11-24  1:55       ` Hongxu Jia
  1 sibling, 1 reply; 27+ messages in thread
From: Khem Raj @ 2017-11-24  0:35 UTC (permalink / raw)
  To: Burton, Ross; +Cc: OpenEmbedded Devel List

On Thu, Nov 23, 2017 at 4:15 AM Burton, Ross <ross.burton@intel.com> wrote:

> I honestly don't see why this has to belong in meta-openembedded and can't
> live in a standalone repository.
>

I share the same opinion it should probably be
 Repo of its own


> Ross
>
> On 23 November 2017 at 12:09, Hongxu Jia <hongxu.jia@windriver.com> wrote:
>
>> The meta-installer layer provides a collection of installation
>> programs based on OE platform.
>>
>> One implementation is the target installer 'anaconda', the version
>> is 26.21.11 which is based on Fedora 26.
>>
>> The anacoda requires:
>> - systemd as init manager
>> - python3
>> - dnf2/rpm4
>> - gobject-introspection which requires qemu-usermode
>>   in MACHINE_FEATURES
>>
>> The anaconda provides:
>> - graphic install and text install.
>>
>> - package based (dnf/rpm) install and image (copy)
>>   based install.
>>
>> - package based (dnf/rpm) install from local and
>>   remote rpm sources such as CDs and DVDs, images
>>   stored on a hard drive, NFS, HTTP, and FTP.
>>
>> - kickstart install which provides a fully unattended
>>   installation that can be duplicated on scores of machines.
>>
>> - install over VNC on headless machines.
>>
>> - timezone setting.
>>
>> - root password setting.
>>
>> - user account creation.
>>
>> - a variety of advanced storage devices including
>>   LVM, Btrfs, Ext4, and filesystem encryption.
>>
>> TODO (currently not support):
>> - keyboard setting
>>
>> - language support setting
>>
>> - network & host name setting
>>
>> //Hongxu
>>
>> The following changes since commit
>> 34aa4c3202b427f59f843dc43a4e1afda4f81d13:
>>
>>   usb-modeswitch: add usb-modeswitch@.service (2017-11-19 13:45:38 -0800)
>>
>> are available in the git repository at:
>>
>>   git://git.openembedded.org/openembedded-core-contrib
>> hongxu/meta-installer
>>
>> http://cgit.openembedded.org/openembedded-core-contrib/log/?h=hongxu/meta-installer
>>
>> Hongxu Jia (15):
>>   meta-installer: create layer
>>   meta-installer: add kernel config
>>   meta-installer: add anaconda support for target build
>>   meta-installer: add distro anaconda for host build
>>   meta-installer: add systemd/systemd-serialgetty bbappend
>>   meta-installer: add gtk+3 bbappend
>>   meta-installer: add initramfs-live-boot bbappend
>>   meta-installer: add xserver-xf86-config bbappend
>>   meta-installer: add multipath-tools bbappend
>>   meta-installer: add recipe packagegroup-installer-x11-anaconda
>>   meta-installer: add recipe yocto-compat-logos
>>   meta-installer: add recipe anaconda-init
>>   meta-installer: add recipe anaconda 26.21.11
>>   meta-installer: add recipe core-image-anaconda
>>   meta-installer: add recipe core-image-anaconda-initramfs
>>
>>  meta-installer/COPYING.MIT                         |  17 +
>>  meta-installer/README                              |  47 ++
>>  meta-installer/README.anaconda                     | 341 ++++++++++++
>>  meta-installer/classes/anaconda_image.bbclass      | 321 +++++++++++
>>  meta-installer/classes/anaconda_kernel.bbclass     |  14 +
>>  .../classes/anaconda_support_image.bbclass         |  40 ++
>>  .../classes/anaconda_support_kernel.bbclass        |   8 +
>>  meta-installer/conf/distro/anaconda.conf           |  33 ++
>>  meta-installer/conf/layer.conf                     |  31 ++
>>  meta-installer/licenses/FLTK                       | 530
>> ++++++++++++++++++
>>  .../systemd/files/serial-getty@.service            |  40 ++
>>  .../systemd/files/serial-screen-anaconda.sh        |   5 +
>>  .../systemd/systemd-serialgetty.bbappend           |  12 +
>>  .../recipes-core/systemd/systemd_%.bbappend        |   6 +
>>  ...for-anaconda-installer-while-loading-libA.patch |  84 +++
>>  .../recipes-gnome/gtk+/gtk+3_%.%.%.bbappend        |   3 +
>>  .../xorg-xserver/xserver-xf86-config_0.1.bbappend  |  12 +
>>  .../anaconda-init/anaconda-init.bb                 |  77 +++
>>  .../anaconda-init/anaconda-init/COPYING            | 339 ++++++++++++
>>  .../anaconda-init/anaconda-init/Xusername          |   1 +
>>  .../anaconda-init/anaconda-init/anaconda-init      | 362 +++++++++++++
>>  .../anaconda-init/anaconda-init-screen@.service    |  22 +
>>  .../anaconda-init/anaconda-init.service            |  13 +
>>  .../anaconda-init/anaconda-init.target             |   6 +
>>  .../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 ++++++
>>  .../images/core-image-anaconda-initramfs.bb        |  33 ++
>>  .../images/core-image-anaconda.bb                  |  34 ++
>>  .../initrdscripts/files/init-live.sh               | 249 +++++++++
>>  .../initrdscripts/initramfs-live-boot_1.0.bbappend |   5 +
>>  .../recipes-installer/logos/yocto-compat-logos.bb  |  24 +
>>  .../logos/yocto-compat-logos/COPYING               | 339 ++++++++++++
>>  .../logos/yocto-compat-logos/banner_yocto1.png     | Bin 0 -> 44650 bytes
>>  .../logos/yocto-compat-logos/banner_yocto2.png     | Bin 0 -> 39223 bytes
>>  .../logos/yocto-compat-logos/sidebar-logo.png      | Bin 0 -> 17651 bytes
>>  .../logos/yocto-compat-logos/topbar-bg.png         | Bin 0 -> 77956 bytes
>>  .../packagegroup-installer-x11-anaconda.bb         |  28 +
>>  .../packagegroups/packagegroup-anaconda-support.bb |  26 +
>>  .../recipes-kernel/linux/files/crypt.cfg           |   2 +
>>  .../recipes-kernel/linux/files/crypt.scc           |   1 +
>>  .../recipes-kernel/linux/files/dmthin.cfg          |   1 +
>>  .../recipes-kernel/linux/files/dmthin.scc          |   1 +
>>  .../recipes-kernel/linux/files/efivars.cfg         |   1 +
>>  .../recipes-kernel/linux/files/efivars.scc         |   1 +
>>  meta-installer/recipes-kernel/linux/files/ide.cfg  |   5 +
>>  meta-installer/recipes-kernel/linux/files/ide.scc  |   1 +
>>  .../recipes-kernel/linux/files/liveinstall.cfg     |   5 +
>>  .../recipes-kernel/linux/files/liveinstall.scc     |   1 +
>>  .../recipes-kernel/linux/files/multipath.cfg       |   3 +
>>  .../recipes-kernel/linux/files/multipath.scc       |   1 +
>>  .../multipath-tools/multipath-tools_%.bbappend     |   8 +
>>  120 files changed, 7845 insertions(+)
>>  create mode 100644 meta-installer/COPYING.MIT
>>  create mode 100644 meta-installer/README
>>  create mode 100644 meta-installer/README.anaconda
>>  create mode 100644 meta-installer/classes/anaconda_image.bbclass
>>  create mode 100644 meta-installer/classes/anaconda_kernel.bbclass
>>  create mode 100644 meta-installer/classes/anaconda_support_image.bbclass
>>  create mode 100644 meta-installer/classes/anaconda_support_kernel.bbclass
>>  create mode 100644 meta-installer/conf/distro/anaconda.conf
>>  create mode 100644 meta-installer/conf/layer.conf
>>  create mode 100644 meta-installer/licenses/FLTK
>>  create mode 100644
>> meta-installer/recipes-core/systemd/files/serial-getty@.service
>>  create mode 100644
>> meta-installer/recipes-core/systemd/files/serial-screen-anaconda.sh
>>  create mode 100644
>> meta-installer/recipes-core/systemd/systemd-serialgetty.bbappend
>>  create mode 100644 meta-installer/recipes-core/systemd/systemd_%.bbappend
>>  create mode 100644
>> meta-installer/recipes-gnome/gtk+/files/workaround-for-anaconda-installer-while-loading-libA.patch
>>  create mode 100644 meta-installer/recipes-gnome/gtk+/gtk+3_%.%.%.bbappend
>>  create mode 100644
>> meta-installer/recipes-graphics/xorg-xserver/xserver-xf86-config_0.1.bbappend
>>  create mode 100644 meta-installer/recipes-installer/anaconda-init/
>> anaconda-init.bb
>>  create mode 100644
>> meta-installer/recipes-installer/anaconda-init/anaconda-init/COPYING
>>  create mode 100644
>> meta-installer/recipes-installer/anaconda-init/anaconda-init/Xusername
>>  create mode 100644
>> meta-installer/recipes-installer/anaconda-init/anaconda-init/anaconda-init
>>  create mode 100644
>> meta-installer/recipes-installer/anaconda-init/anaconda-init/anaconda-init-screen@
>> .service
>>  create mode 100644
>> meta-installer/recipes-installer/anaconda-init/anaconda-init/anaconda-init.service
>>  create mode 100644
>> meta-installer/recipes-installer/anaconda-init/anaconda-init/anaconda-init.target
>>  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
>>  create mode 100644 meta-installer/recipes-installer/images/
>> core-image-anaconda-initramfs.bb
>>  create mode 100644 meta-installer/recipes-installer/images/
>> core-image-anaconda.bb
>>  create mode 100644
>> meta-installer/recipes-installer/initrdscripts/files/init-live.sh
>>  create mode 100644
>> meta-installer/recipes-installer/initrdscripts/initramfs-live-boot_1.0.bbappend
>>  create mode 100644 meta-installer/recipes-installer/logos/
>> yocto-compat-logos.bb
>>  create mode 100644
>> meta-installer/recipes-installer/logos/yocto-compat-logos/COPYING
>>  create mode 100644
>> meta-installer/recipes-installer/logos/yocto-compat-logos/banner_yocto1.png
>>  create mode 100644
>> meta-installer/recipes-installer/logos/yocto-compat-logos/banner_yocto2.png
>>  create mode 100644
>> meta-installer/recipes-installer/logos/yocto-compat-logos/sidebar-logo.png
>>  create mode 100644
>> meta-installer/recipes-installer/logos/yocto-compat-logos/topbar-bg.png
>>  create mode 100644 meta-installer/recipes-installer/packagegroups/
>> packagegroup-installer-x11-anaconda.bb
>>  create mode 100644 meta-installer/recipes-installersupport/packagegroups/
>> packagegroup-anaconda-support.bb
>>  create mode 100644 meta-installer/recipes-kernel/linux/files/crypt.cfg
>>  create mode 100644 meta-installer/recipes-kernel/linux/files/crypt.scc
>>  create mode 100644 meta-installer/recipes-kernel/linux/files/dmthin.cfg
>>  create mode 100644 meta-installer/recipes-kernel/linux/files/dmthin.scc
>>  create mode 100644 meta-installer/recipes-kernel/linux/files/efivars.cfg
>>  create mode 100644 meta-installer/recipes-kernel/linux/files/efivars.scc
>>  create mode 100644 meta-installer/recipes-kernel/linux/files/ide.cfg
>>  create mode 100644 meta-installer/recipes-kernel/linux/files/ide.scc
>>  create mode 100644
>> meta-installer/recipes-kernel/linux/files/liveinstall.cfg
>>  create mode 100644
>> meta-installer/recipes-kernel/linux/files/liveinstall.scc
>>  create mode 100644
>> meta-installer/recipes-kernel/linux/files/multipath.cfg
>>  create mode 100644
>> meta-installer/recipes-kernel/linux/files/multipath.scc
>>  create mode 100644
>> meta-installer/recipes-support/multipath-tools/multipath-tools_%.bbappend
>>
>
>> --
>> 2.8.1
>>
>> --
>> _______________________________________________
>> Openembedded-devel mailing list
>> Openembedded-devel@lists.openembedded.org
>> http://lists.openembedded.org/mailman/listinfo/openembedded-devel
>>
>


^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [oe] [PATCH 00/15] create meta-installer layer
  2017-11-24  0:35   ` Khem Raj
@ 2017-11-24  1:55       ` Hongxu Jia
  0 siblings, 0 replies; 27+ messages in thread
From: Hongxu Jia @ 2017-11-24  1:55 UTC (permalink / raw)
  To: Khem Raj, Burton, Ross, Michael Halstead; +Cc: yocto, OpenEmbedded Devel List

[-- Attachment #1: Type: text/plain, Size: 28920 bytes --]

On 2017年11月24日 08:35, Khem Raj wrote:
>
> On Thu, Nov 23, 2017 at 4:15 AM Burton, Ross <ross.burton@intel.com 
> <mailto:ross.burton@intel.com>> wrote:
>
>     I honestly don't see why this has to belong in meta-openembedded
>     and can't live in a standalone repository.
>
>
> I share the same opinion it should probably be
>  Repo of its own
>

Hi Ross & Khem,

Since both of you think it should be as a standalone repository,
I do not insist on it.

Hi Michael,

Would you please create a repository on http://git.yoctoproject.org/
the layer name called `meta-installer', should I resend pull request
for review or directly push the repo contents to it once it's created.

If the latter one, should I send my ssh pub key to you privately?

//Hongxu


>
>     Ross
>
>     On 23 November 2017 at 12:09, Hongxu Jia <hongxu.jia@windriver.com
>     <mailto:hongxu.jia@windriver.com>> wrote:
>
>         The meta-installer layer provides a collection of installation
>         programs based on OE platform.
>
>         One implementation is the target installer 'anaconda', the version
>         is 26.21.11 which is based on Fedora 26.
>
>         The anacoda requires:
>         - systemd as init manager
>         - python3
>         - dnf2/rpm4
>         - gobject-introspection which requires qemu-usermode
>           in MACHINE_FEATURES
>
>         The anaconda provides:
>         - graphic install and text install.
>
>         - package based (dnf/rpm) install and image (copy)
>           based install.
>
>         - package based (dnf/rpm) install from local and
>           remote rpm sources such as CDs and DVDs, images
>           stored on a hard drive, NFS, HTTP, and FTP.
>
>         - kickstart install which provides a fully unattended
>           installation that can be duplicated on scores of machines.
>
>         - install over VNC on headless machines.
>
>         - timezone setting.
>
>         - root password setting.
>
>         - user account creation.
>
>         - a variety of advanced storage devices including
>           LVM, Btrfs, Ext4, and filesystem encryption.
>
>         TODO (currently not support):
>         - keyboard setting
>
>         - language support setting
>
>         - network & host name setting
>
>         //Hongxu
>
>         The following changes since commit
>         34aa4c3202b427f59f843dc43a4e1afda4f81d13:
>
>           usb-modeswitch: add usb-modeswitch@.service (2017-11-19
>         13:45:38 -0800)
>
>         are available in the git repository at:
>
>           git://git.openembedded.org/openembedded-core-contrib
>         <http://git.openembedded.org/openembedded-core-contrib>
>         hongxu/meta-installer
>         http://cgit.openembedded.org/openembedded-core-contrib/log/?h=hongxu/meta-installer
>
>         Hongxu Jia (15):
>           meta-installer: create layer
>           meta-installer: add kernel config
>           meta-installer: add anaconda support for target build
>           meta-installer: add distro anaconda for host build
>           meta-installer: add systemd/systemd-serialgetty bbappend
>           meta-installer: add gtk+3 bbappend
>           meta-installer: add initramfs-live-boot bbappend
>           meta-installer: add xserver-xf86-config bbappend
>           meta-installer: add multipath-tools bbappend
>           meta-installer: add recipe packagegroup-installer-x11-anaconda
>           meta-installer: add recipe yocto-compat-logos
>           meta-installer: add recipe anaconda-init
>           meta-installer: add recipe anaconda 26.21.11
>           meta-installer: add recipe core-image-anaconda
>           meta-installer: add recipe core-image-anaconda-initramfs
>
>          meta-installer/COPYING.MIT                         | 17 +
>          meta-installer/README                              | 47 ++
>          meta-installer/README.anaconda                     | 341
>         ++++++++++++
>          meta-installer/classes/anaconda_image.bbclass      | 321
>         +++++++++++
>          meta-installer/classes/anaconda_kernel.bbclass     | 14 +
>          .../classes/anaconda_support_image.bbclass         | 40 ++
>          .../classes/anaconda_support_kernel.bbclass        |  8 +
>          meta-installer/conf/distro/anaconda.conf           | 33 ++
>          meta-installer/conf/layer.conf                     | 31 ++
>          meta-installer/licenses/FLTK                       | 530
>         ++++++++++++++++++
>          .../systemd/files/serial-getty@.service            | 40 ++
>          .../systemd/files/serial-screen-anaconda.sh        |  5 +
>          .../systemd/systemd-serialgetty.bbappend           | 12 +
>          .../recipes-core/systemd/systemd_%.bbappend        |  6 +
>          ...for-anaconda-installer-while-loading-libA.patch | 84 +++
>          .../recipes-gnome/gtk+/gtk+3_%.%.%.bbappend        |  3 +
>          .../xorg-xserver/xserver-xf86-config_0.1.bbappend  | 12 +
>          .../anaconda-init/anaconda-init.bb <http://anaconda-init.bb>
>                |  77 +++
>          .../anaconda-init/anaconda-init/COPYING            | 339
>         ++++++++++++
>          .../anaconda-init/anaconda-init/Xusername          |  1 +
>          .../anaconda-init/anaconda-init/anaconda-init      | 362
>         +++++++++++++
>          .../anaconda-init/anaconda-init-screen@.service    | 22 +
>          .../anaconda-init/anaconda-init.service            | 13 +
>          .../anaconda-init/anaconda-init.target             |  6 +
>          .../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
>         <http://python3-anaconda_26.21.11.bb>         | 161 ++++++
>          .../images/core-image-anaconda-initramfs.bb
>         <http://core-image-anaconda-initramfs.bb>       |  33 ++
>          .../images/core-image-anaconda.bb
>         <http://core-image-anaconda.bb>               |  34 ++
>          .../initrdscripts/files/init-live.sh               | 249
>         +++++++++
>          .../initrdscripts/initramfs-live-boot_1.0.bbappend |  5 +
>          .../recipes-installer/logos/yocto-compat-logos.bb
>         <http://yocto-compat-logos.bb> |  24 +
>          .../logos/yocto-compat-logos/COPYING               | 339
>         ++++++++++++
>          .../logos/yocto-compat-logos/banner_yocto1.png     | Bin 0 ->
>         44650 bytes
>          .../logos/yocto-compat-logos/banner_yocto2.png     | Bin 0 ->
>         39223 bytes
>          .../logos/yocto-compat-logos/sidebar-logo.png      | Bin 0 ->
>         17651 bytes
>          .../logos/yocto-compat-logos/topbar-bg.png         | Bin 0 ->
>         77956 bytes
>          .../packagegroup-installer-x11-anaconda.bb
>         <http://packagegroup-installer-x11-anaconda.bb>        |  28 +
>          .../packagegroups/packagegroup-anaconda-support.bb
>         <http://packagegroup-anaconda-support.bb> |  26 +
>          .../recipes-kernel/linux/files/crypt.cfg           |  2 +
>          .../recipes-kernel/linux/files/crypt.scc           |  1 +
>          .../recipes-kernel/linux/files/dmthin.cfg          |  1 +
>          .../recipes-kernel/linux/files/dmthin.scc          |  1 +
>          .../recipes-kernel/linux/files/efivars.cfg         |  1 +
>          .../recipes-kernel/linux/files/efivars.scc         |  1 +
>          meta-installer/recipes-kernel/linux/files/ide.cfg  |  5 +
>          meta-installer/recipes-kernel/linux/files/ide.scc  |  1 +
>          .../recipes-kernel/linux/files/liveinstall.cfg     |  5 +
>          .../recipes-kernel/linux/files/liveinstall.scc     |  1 +
>          .../recipes-kernel/linux/files/multipath.cfg       |  3 +
>          .../recipes-kernel/linux/files/multipath.scc       |  1 +
>          .../multipath-tools/multipath-tools_%.bbappend     |  8 +
>          120 files changed, 7845 insertions(+)
>          create mode 100644 meta-installer/COPYING.MIT
>          create mode 100644 meta-installer/README
>          create mode 100644 meta-installer/README.anaconda
>          create mode 100644 meta-installer/classes/anaconda_image.bbclass
>          create mode 100644 meta-installer/classes/anaconda_kernel.bbclass
>          create mode 100644
>         meta-installer/classes/anaconda_support_image.bbclass
>          create mode 100644
>         meta-installer/classes/anaconda_support_kernel.bbclass
>          create mode 100644 meta-installer/conf/distro/anaconda.conf
>          create mode 100644 meta-installer/conf/layer.conf
>          create mode 100644 meta-installer/licenses/FLTK
>          create mode 100644
>         meta-installer/recipes-core/systemd/files/serial-getty@.service
>          create mode 100644
>         meta-installer/recipes-core/systemd/files/serial-screen-anaconda.sh
>          create mode 100644
>         meta-installer/recipes-core/systemd/systemd-serialgetty.bbappend
>          create mode 100644
>         meta-installer/recipes-core/systemd/systemd_%.bbappend
>          create mode 100644
>         meta-installer/recipes-gnome/gtk+/files/workaround-for-anaconda-installer-while-loading-libA.patch
>          create mode 100644
>         meta-installer/recipes-gnome/gtk+/gtk+3_%.%.%.bbappend
>          create mode 100644
>         meta-installer/recipes-graphics/xorg-xserver/xserver-xf86-config_0.1.bbappend
>          create mode 100644
>         meta-installer/recipes-installer/anaconda-init/anaconda-init.bb
>         <http://anaconda-init.bb>
>          create mode 100644
>         meta-installer/recipes-installer/anaconda-init/anaconda-init/COPYING
>          create mode 100644
>         meta-installer/recipes-installer/anaconda-init/anaconda-init/Xusername
>          create mode 100644
>         meta-installer/recipes-installer/anaconda-init/anaconda-init/anaconda-init
>          create mode 100644
>         meta-installer/recipes-installer/anaconda-init/anaconda-init/anaconda-init-screen@.service
>          create mode 100644
>         meta-installer/recipes-installer/anaconda-init/anaconda-init/anaconda-init.service
>          create mode 100644
>         meta-installer/recipes-installer/anaconda-init/anaconda-init/anaconda-init.target
>          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
>         <http://python3-anaconda_26.21.11.bb>
>          create mode 100644
>         meta-installer/recipes-installer/images/core-image-anaconda-initramfs.bb
>         <http://core-image-anaconda-initramfs.bb>
>          create mode 100644
>         meta-installer/recipes-installer/images/core-image-anaconda.bb
>         <http://core-image-anaconda.bb>
>          create mode 100644
>         meta-installer/recipes-installer/initrdscripts/files/init-live.sh
>          create mode 100644
>         meta-installer/recipes-installer/initrdscripts/initramfs-live-boot_1.0.bbappend
>          create mode 100644
>         meta-installer/recipes-installer/logos/yocto-compat-logos.bb
>         <http://yocto-compat-logos.bb>
>          create mode 100644
>         meta-installer/recipes-installer/logos/yocto-compat-logos/COPYING
>          create mode 100644
>         meta-installer/recipes-installer/logos/yocto-compat-logos/banner_yocto1.png
>          create mode 100644
>         meta-installer/recipes-installer/logos/yocto-compat-logos/banner_yocto2.png
>          create mode 100644
>         meta-installer/recipes-installer/logos/yocto-compat-logos/sidebar-logo.png
>          create mode 100644
>         meta-installer/recipes-installer/logos/yocto-compat-logos/topbar-bg.png
>          create mode 100644
>         meta-installer/recipes-installer/packagegroups/packagegroup-installer-x11-anaconda.bb
>         <http://packagegroup-installer-x11-anaconda.bb>
>          create mode 100644
>         meta-installer/recipes-installersupport/packagegroups/packagegroup-anaconda-support.bb
>         <http://packagegroup-anaconda-support.bb>
>          create mode 100644
>         meta-installer/recipes-kernel/linux/files/crypt.cfg
>          create mode 100644
>         meta-installer/recipes-kernel/linux/files/crypt.scc
>          create mode 100644
>         meta-installer/recipes-kernel/linux/files/dmthin.cfg
>          create mode 100644
>         meta-installer/recipes-kernel/linux/files/dmthin.scc
>          create mode 100644
>         meta-installer/recipes-kernel/linux/files/efivars.cfg
>          create mode 100644
>         meta-installer/recipes-kernel/linux/files/efivars.scc
>          create mode 100644
>         meta-installer/recipes-kernel/linux/files/ide.cfg
>          create mode 100644
>         meta-installer/recipes-kernel/linux/files/ide.scc
>          create mode 100644
>         meta-installer/recipes-kernel/linux/files/liveinstall.cfg
>          create mode 100644
>         meta-installer/recipes-kernel/linux/files/liveinstall.scc
>          create mode 100644
>         meta-installer/recipes-kernel/linux/files/multipath.cfg
>          create mode 100644
>         meta-installer/recipes-kernel/linux/files/multipath.scc
>          create mode 100644
>         meta-installer/recipes-support/multipath-tools/multipath-tools_%.bbappend
>
>
>         --
>         2.8.1
>
>         --
>         _______________________________________________
>         Openembedded-devel mailing list
>         Openembedded-devel@lists.openembedded.org
>         <mailto:Openembedded-devel@lists.openembedded.org>
>         http://lists.openembedded.org/mailman/listinfo/openembedded-devel
>


[-- Attachment #2: Type: text/html, Size: 40290 bytes --]

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH 00/15] create meta-installer layer
@ 2017-11-24  1:55       ` Hongxu Jia
  0 siblings, 0 replies; 27+ messages in thread
From: Hongxu Jia @ 2017-11-24  1:55 UTC (permalink / raw)
  To: Khem Raj, Burton, Ross, Michael Halstead; +Cc: yocto, OpenEmbedded Devel List

On 2017年11月24日 08:35, Khem Raj wrote:
>
> On Thu, Nov 23, 2017 at 4:15 AM Burton, Ross <ross.burton@intel.com 
> <mailto:ross.burton@intel.com>> wrote:
>
>     I honestly don't see why this has to belong in meta-openembedded
>     and can't live in a standalone repository.
>
>
> I share the same opinion it should probably be
>  Repo of its own
>

Hi Ross & Khem,

Since both of you think it should be as a standalone repository,
I do not insist on it.

Hi Michael,

Would you please create a repository on http://git.yoctoproject.org/
the layer name called `meta-installer', should I resend pull request
for review or directly push the repo contents to it once it's created.

If the latter one, should I send my ssh pub key to you privately?

//Hongxu


>
>     Ross
>
>     On 23 November 2017 at 12:09, Hongxu Jia <hongxu.jia@windriver.com
>     <mailto:hongxu.jia@windriver.com>> wrote:
>
>         The meta-installer layer provides a collection of installation
>         programs based on OE platform.
>
>         One implementation is the target installer 'anaconda', the version
>         is 26.21.11 which is based on Fedora 26.
>
>         The anacoda requires:
>         - systemd as init manager
>         - python3
>         - dnf2/rpm4
>         - gobject-introspection which requires qemu-usermode
>           in MACHINE_FEATURES
>
>         The anaconda provides:
>         - graphic install and text install.
>
>         - package based (dnf/rpm) install and image (copy)
>           based install.
>
>         - package based (dnf/rpm) install from local and
>           remote rpm sources such as CDs and DVDs, images
>           stored on a hard drive, NFS, HTTP, and FTP.
>
>         - kickstart install which provides a fully unattended
>           installation that can be duplicated on scores of machines.
>
>         - install over VNC on headless machines.
>
>         - timezone setting.
>
>         - root password setting.
>
>         - user account creation.
>
>         - a variety of advanced storage devices including
>           LVM, Btrfs, Ext4, and filesystem encryption.
>
>         TODO (currently not support):
>         - keyboard setting
>
>         - language support setting
>
>         - network & host name setting
>
>         //Hongxu
>
>         The following changes since commit
>         34aa4c3202b427f59f843dc43a4e1afda4f81d13:
>
>           usb-modeswitch: add usb-modeswitch@.service (2017-11-19
>         13:45:38 -0800)
>
>         are available in the git repository at:
>
>           git://git.openembedded.org/openembedded-core-contrib
>         <http://git.openembedded.org/openembedded-core-contrib>
>         hongxu/meta-installer
>         http://cgit.openembedded.org/openembedded-core-contrib/log/?h=hongxu/meta-installer
>
>         Hongxu Jia (15):
>           meta-installer: create layer
>           meta-installer: add kernel config
>           meta-installer: add anaconda support for target build
>           meta-installer: add distro anaconda for host build
>           meta-installer: add systemd/systemd-serialgetty bbappend
>           meta-installer: add gtk+3 bbappend
>           meta-installer: add initramfs-live-boot bbappend
>           meta-installer: add xserver-xf86-config bbappend
>           meta-installer: add multipath-tools bbappend
>           meta-installer: add recipe packagegroup-installer-x11-anaconda
>           meta-installer: add recipe yocto-compat-logos
>           meta-installer: add recipe anaconda-init
>           meta-installer: add recipe anaconda 26.21.11
>           meta-installer: add recipe core-image-anaconda
>           meta-installer: add recipe core-image-anaconda-initramfs
>
>          meta-installer/COPYING.MIT                         | 17 +
>          meta-installer/README                              | 47 ++
>          meta-installer/README.anaconda                     | 341
>         ++++++++++++
>          meta-installer/classes/anaconda_image.bbclass      | 321
>         +++++++++++
>          meta-installer/classes/anaconda_kernel.bbclass     | 14 +
>          .../classes/anaconda_support_image.bbclass         | 40 ++
>          .../classes/anaconda_support_kernel.bbclass        |  8 +
>          meta-installer/conf/distro/anaconda.conf           | 33 ++
>          meta-installer/conf/layer.conf                     | 31 ++
>          meta-installer/licenses/FLTK                       | 530
>         ++++++++++++++++++
>          .../systemd/files/serial-getty@.service            | 40 ++
>          .../systemd/files/serial-screen-anaconda.sh        |  5 +
>          .../systemd/systemd-serialgetty.bbappend           | 12 +
>          .../recipes-core/systemd/systemd_%.bbappend        |  6 +
>          ...for-anaconda-installer-while-loading-libA.patch | 84 +++
>          .../recipes-gnome/gtk+/gtk+3_%.%.%.bbappend        |  3 +
>          .../xorg-xserver/xserver-xf86-config_0.1.bbappend  | 12 +
>          .../anaconda-init/anaconda-init.bb <http://anaconda-init.bb>
>                |  77 +++
>          .../anaconda-init/anaconda-init/COPYING            | 339
>         ++++++++++++
>          .../anaconda-init/anaconda-init/Xusername          |  1 +
>          .../anaconda-init/anaconda-init/anaconda-init      | 362
>         +++++++++++++
>          .../anaconda-init/anaconda-init-screen@.service    | 22 +
>          .../anaconda-init/anaconda-init.service            | 13 +
>          .../anaconda-init/anaconda-init.target             |  6 +
>          .../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
>         <http://python3-anaconda_26.21.11.bb>         | 161 ++++++
>          .../images/core-image-anaconda-initramfs.bb
>         <http://core-image-anaconda-initramfs.bb>       |  33 ++
>          .../images/core-image-anaconda.bb
>         <http://core-image-anaconda.bb>               |  34 ++
>          .../initrdscripts/files/init-live.sh               | 249
>         +++++++++
>          .../initrdscripts/initramfs-live-boot_1.0.bbappend |  5 +
>          .../recipes-installer/logos/yocto-compat-logos.bb
>         <http://yocto-compat-logos.bb> |  24 +
>          .../logos/yocto-compat-logos/COPYING               | 339
>         ++++++++++++
>          .../logos/yocto-compat-logos/banner_yocto1.png     | Bin 0 ->
>         44650 bytes
>          .../logos/yocto-compat-logos/banner_yocto2.png     | Bin 0 ->
>         39223 bytes
>          .../logos/yocto-compat-logos/sidebar-logo.png      | Bin 0 ->
>         17651 bytes
>          .../logos/yocto-compat-logos/topbar-bg.png         | Bin 0 ->
>         77956 bytes
>          .../packagegroup-installer-x11-anaconda.bb
>         <http://packagegroup-installer-x11-anaconda.bb>        |  28 +
>          .../packagegroups/packagegroup-anaconda-support.bb
>         <http://packagegroup-anaconda-support.bb> |  26 +
>          .../recipes-kernel/linux/files/crypt.cfg           |  2 +
>          .../recipes-kernel/linux/files/crypt.scc           |  1 +
>          .../recipes-kernel/linux/files/dmthin.cfg          |  1 +
>          .../recipes-kernel/linux/files/dmthin.scc          |  1 +
>          .../recipes-kernel/linux/files/efivars.cfg         |  1 +
>          .../recipes-kernel/linux/files/efivars.scc         |  1 +
>          meta-installer/recipes-kernel/linux/files/ide.cfg  |  5 +
>          meta-installer/recipes-kernel/linux/files/ide.scc  |  1 +
>          .../recipes-kernel/linux/files/liveinstall.cfg     |  5 +
>          .../recipes-kernel/linux/files/liveinstall.scc     |  1 +
>          .../recipes-kernel/linux/files/multipath.cfg       |  3 +
>          .../recipes-kernel/linux/files/multipath.scc       |  1 +
>          .../multipath-tools/multipath-tools_%.bbappend     |  8 +
>          120 files changed, 7845 insertions(+)
>          create mode 100644 meta-installer/COPYING.MIT
>          create mode 100644 meta-installer/README
>          create mode 100644 meta-installer/README.anaconda
>          create mode 100644 meta-installer/classes/anaconda_image.bbclass
>          create mode 100644 meta-installer/classes/anaconda_kernel.bbclass
>          create mode 100644
>         meta-installer/classes/anaconda_support_image.bbclass
>          create mode 100644
>         meta-installer/classes/anaconda_support_kernel.bbclass
>          create mode 100644 meta-installer/conf/distro/anaconda.conf
>          create mode 100644 meta-installer/conf/layer.conf
>          create mode 100644 meta-installer/licenses/FLTK
>          create mode 100644
>         meta-installer/recipes-core/systemd/files/serial-getty@.service
>          create mode 100644
>         meta-installer/recipes-core/systemd/files/serial-screen-anaconda.sh
>          create mode 100644
>         meta-installer/recipes-core/systemd/systemd-serialgetty.bbappend
>          create mode 100644
>         meta-installer/recipes-core/systemd/systemd_%.bbappend
>          create mode 100644
>         meta-installer/recipes-gnome/gtk+/files/workaround-for-anaconda-installer-while-loading-libA.patch
>          create mode 100644
>         meta-installer/recipes-gnome/gtk+/gtk+3_%.%.%.bbappend
>          create mode 100644
>         meta-installer/recipes-graphics/xorg-xserver/xserver-xf86-config_0.1.bbappend
>          create mode 100644
>         meta-installer/recipes-installer/anaconda-init/anaconda-init.bb
>         <http://anaconda-init.bb>
>          create mode 100644
>         meta-installer/recipes-installer/anaconda-init/anaconda-init/COPYING
>          create mode 100644
>         meta-installer/recipes-installer/anaconda-init/anaconda-init/Xusername
>          create mode 100644
>         meta-installer/recipes-installer/anaconda-init/anaconda-init/anaconda-init
>          create mode 100644
>         meta-installer/recipes-installer/anaconda-init/anaconda-init/anaconda-init-screen@.service
>          create mode 100644
>         meta-installer/recipes-installer/anaconda-init/anaconda-init/anaconda-init.service
>          create mode 100644
>         meta-installer/recipes-installer/anaconda-init/anaconda-init/anaconda-init.target
>          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
>         <http://python3-anaconda_26.21.11.bb>
>          create mode 100644
>         meta-installer/recipes-installer/images/core-image-anaconda-initramfs.bb
>         <http://core-image-anaconda-initramfs.bb>
>          create mode 100644
>         meta-installer/recipes-installer/images/core-image-anaconda.bb
>         <http://core-image-anaconda.bb>
>          create mode 100644
>         meta-installer/recipes-installer/initrdscripts/files/init-live.sh
>          create mode 100644
>         meta-installer/recipes-installer/initrdscripts/initramfs-live-boot_1.0.bbappend
>          create mode 100644
>         meta-installer/recipes-installer/logos/yocto-compat-logos.bb
>         <http://yocto-compat-logos.bb>
>          create mode 100644
>         meta-installer/recipes-installer/logos/yocto-compat-logos/COPYING
>          create mode 100644
>         meta-installer/recipes-installer/logos/yocto-compat-logos/banner_yocto1.png
>          create mode 100644
>         meta-installer/recipes-installer/logos/yocto-compat-logos/banner_yocto2.png
>          create mode 100644
>         meta-installer/recipes-installer/logos/yocto-compat-logos/sidebar-logo.png
>          create mode 100644
>         meta-installer/recipes-installer/logos/yocto-compat-logos/topbar-bg.png
>          create mode 100644
>         meta-installer/recipes-installer/packagegroups/packagegroup-installer-x11-anaconda.bb
>         <http://packagegroup-installer-x11-anaconda.bb>
>          create mode 100644
>         meta-installer/recipes-installersupport/packagegroups/packagegroup-anaconda-support.bb
>         <http://packagegroup-anaconda-support.bb>
>          create mode 100644
>         meta-installer/recipes-kernel/linux/files/crypt.cfg
>          create mode 100644
>         meta-installer/recipes-kernel/linux/files/crypt.scc
>          create mode 100644
>         meta-installer/recipes-kernel/linux/files/dmthin.cfg
>          create mode 100644
>         meta-installer/recipes-kernel/linux/files/dmthin.scc
>          create mode 100644
>         meta-installer/recipes-kernel/linux/files/efivars.cfg
>          create mode 100644
>         meta-installer/recipes-kernel/linux/files/efivars.scc
>          create mode 100644
>         meta-installer/recipes-kernel/linux/files/ide.cfg
>          create mode 100644
>         meta-installer/recipes-kernel/linux/files/ide.scc
>          create mode 100644
>         meta-installer/recipes-kernel/linux/files/liveinstall.cfg
>          create mode 100644
>         meta-installer/recipes-kernel/linux/files/liveinstall.scc
>          create mode 100644
>         meta-installer/recipes-kernel/linux/files/multipath.cfg
>          create mode 100644
>         meta-installer/recipes-kernel/linux/files/multipath.scc
>          create mode 100644
>         meta-installer/recipes-support/multipath-tools/multipath-tools_%.bbappend
>
>
>         --
>         2.8.1
>
>         --
>         _______________________________________________
>         Openembedded-devel mailing list
>         Openembedded-devel@lists.openembedded.org
>         <mailto:Openembedded-devel@lists.openembedded.org>
>         http://lists.openembedded.org/mailman/listinfo/openembedded-devel
>



^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [oe] [PATCH 00/15] create meta-installer layer
  2017-11-24  1:55       ` Hongxu Jia
  (?)
@ 2017-11-24  5:44       ` Hongxu Jia
  -1 siblings, 0 replies; 27+ messages in thread
From: Hongxu Jia @ 2017-11-24  5:44 UTC (permalink / raw)
  To: Michael Halstead; +Cc: Paul Eggleton, yocto

On 2017年11月24日 09:55, Hongxu Jia wrote:
> On 2017年11月24日 08:35, Khem Raj wrote:
>>
>> On Thu, Nov 23, 2017 at 4:15 AM Burton, Ross <ross.burton@intel.com 
>> <mailto:ross.burton@intel.com>> wrote:
>>
>>     I honestly don't see why this has to belong in meta-openembedded
>>     and can't live in a standalone repository.
>>
>>
>> I share the same opinion it should probably be
>>  Repo of its own
>>
>
> Hi Ross & Khem,
>
> Since both of you think it should be as a standalone repository,
> I do not insist on it.
>
> Hi Michael,
>
> Would you please create a repository on http://git.yoctoproject.org/
> the layer name called `meta-installer', should I resend pull request
> for review or directly push the repo contents to it once it's created.
>

Hi Michael,

I think we should called the layer `meta-anaconda', Alex suggestion
is reasonable. There are many available installers, and this would
make it clear what the directory contains

//Hongxu

> If the latter one, should I send my ssh pub key to you privately?
>
> //Hongxu
>
>
>>
>>     Ross 



^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [oe] [PATCH 00/15] create meta-installer layer
  2017-11-24  1:55       ` Hongxu Jia
@ 2017-11-24 19:34         ` akuster808
  -1 siblings, 0 replies; 27+ messages in thread
From: akuster808 @ 2017-11-24 19:34 UTC (permalink / raw)
  To: Hongxu Jia, Khem Raj, Burton, Ross, Michael Halstead
  Cc: yocto, OpenEmbedded Devel List

[-- Attachment #1: Type: text/plain, Size: 29861 bytes --]



On 11/23/2017 05:55 PM, Hongxu Jia wrote:
> On 2017年11月24日 08:35, Khem Raj wrote:
>>
>> On Thu, Nov 23, 2017 at 4:15 AM Burton, Ross <ross.burton@intel.com
>> <mailto:ross.burton@intel.com>> wrote:
>>
>>     I honestly don't see why this has to belong in meta-openembedded
>>     and can't live in a standalone repository.
>>
>>
>> I share the same opinion it should probably be
>>  Repo of its own
>>
>
> Hi Ross & Khem,
>
> Since both of you think it should be as a standalone repository,
> I do not insist on it.
>
> Hi Michael,
>
> Would you please create a repository on http://git.yoctoproject.org/
> the layer name called `meta-installer', should I resend pull request
> for review or directly push the repo contents to it once it's created.

These are sitting in the meta-openembedded patch queue. Did I miss the
reject request?

- armin
>
> If the latter one, should I send my ssh pub key to you privately?
>
> //Hongxu
>
>
>>
>>     Ross
>>
>>     On 23 November 2017 at 12:09, Hongxu Jia
>>     <hongxu.jia@windriver.com <mailto:hongxu.jia@windriver.com>> wrote:
>>
>>         The meta-installer layer provides a collection of installation
>>         programs based on OE platform.
>>
>>         One implementation is the target installer 'anaconda', the
>>         version
>>         is 26.21.11 which is based on Fedora 26.
>>
>>         The anacoda requires:
>>         - systemd as init manager
>>         - python3
>>         - dnf2/rpm4
>>         - gobject-introspection which requires qemu-usermode
>>           in MACHINE_FEATURES
>>
>>         The anaconda provides:
>>         - graphic install and text install.
>>
>>         - package based (dnf/rpm) install and image (copy)
>>           based install.
>>
>>         - package based (dnf/rpm) install from local and
>>           remote rpm sources such as CDs and DVDs, images
>>           stored on a hard drive, NFS, HTTP, and FTP.
>>
>>         - kickstart install which provides a fully unattended
>>           installation that can be duplicated on scores of machines.
>>
>>         - install over VNC on headless machines.
>>
>>         - timezone setting.
>>
>>         - root password setting.
>>
>>         - user account creation.
>>
>>         - a variety of advanced storage devices including
>>           LVM, Btrfs, Ext4, and filesystem encryption.
>>
>>         TODO (currently not support):
>>         - keyboard setting
>>
>>         - language support setting
>>
>>         - network & host name setting
>>
>>         //Hongxu
>>
>>         The following changes since commit
>>         34aa4c3202b427f59f843dc43a4e1afda4f81d13:
>>
>>           usb-modeswitch: add usb-modeswitch@.service (2017-11-19
>>         13:45:38 -0800)
>>
>>         are available in the git repository at:
>>
>>           git://git.openembedded.org/openembedded-core-contrib
>>         <http://git.openembedded.org/openembedded-core-contrib>
>>         hongxu/meta-installer
>>          
>>         http://cgit.openembedded.org/openembedded-core-contrib/log/?h=hongxu/meta-installer
>>
>>         Hongxu Jia (15):
>>           meta-installer: create layer
>>           meta-installer: add kernel config
>>           meta-installer: add anaconda support for target build
>>           meta-installer: add distro anaconda for host build
>>           meta-installer: add systemd/systemd-serialgetty bbappend
>>           meta-installer: add gtk+3 bbappend
>>           meta-installer: add initramfs-live-boot bbappend
>>           meta-installer: add xserver-xf86-config bbappend
>>           meta-installer: add multipath-tools bbappend
>>           meta-installer: add recipe packagegroup-installer-x11-anaconda
>>           meta-installer: add recipe yocto-compat-logos
>>           meta-installer: add recipe anaconda-init
>>           meta-installer: add recipe anaconda 26.21.11
>>           meta-installer: add recipe core-image-anaconda
>>           meta-installer: add recipe core-image-anaconda-initramfs
>>
>>          meta-installer/COPYING.MIT                         |  17 +
>>          meta-installer/README                              |  47 ++
>>          meta-installer/README.anaconda                     | 341
>>         ++++++++++++
>>          meta-installer/classes/anaconda_image.bbclass      | 321
>>         +++++++++++
>>          meta-installer/classes/anaconda_kernel.bbclass     |  14 +
>>          .../classes/anaconda_support_image.bbclass         |  40 ++
>>          .../classes/anaconda_support_kernel.bbclass        |   8 +
>>          meta-installer/conf/distro/anaconda.conf           |  33 ++
>>          meta-installer/conf/layer.conf                     |  31 ++
>>          meta-installer/licenses/FLTK                       | 530
>>         ++++++++++++++++++
>>          .../systemd/files/serial-getty@.service            |  40 ++
>>          .../systemd/files/serial-screen-anaconda.sh        |   5 +
>>          .../systemd/systemd-serialgetty.bbappend           |  12 +
>>          .../recipes-core/systemd/systemd_%.bbappend        |   6 +
>>          ...for-anaconda-installer-while-loading-libA.patch |  84 +++
>>          .../recipes-gnome/gtk+/gtk+3_%.%.%.bbappend        |   3 +
>>          .../xorg-xserver/xserver-xf86-config_0.1.bbappend  |  12 +
>>          .../anaconda-init/anaconda-init.bb
>>         <http://anaconda-init.bb>                 |  77 +++
>>          .../anaconda-init/anaconda-init/COPYING            | 339
>>         ++++++++++++
>>          .../anaconda-init/anaconda-init/Xusername          |   1 +
>>          .../anaconda-init/anaconda-init/anaconda-init      | 362
>>         +++++++++++++
>>          .../anaconda-init/anaconda-init-screen@.service    |  22 +
>>          .../anaconda-init/anaconda-init.service            |  13 +
>>          .../anaconda-init/anaconda-init.target             |   6 +
>>          .../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
>>         <http://python3-anaconda_26.21.11.bb>          | 161 ++++++
>>          .../images/core-image-anaconda-initramfs.bb
>>         <http://core-image-anaconda-initramfs.bb>        |  33 ++
>>          .../images/core-image-anaconda.bb
>>         <http://core-image-anaconda.bb>                  |  34 ++
>>          .../initrdscripts/files/init-live.sh               | 249
>>         +++++++++
>>          .../initrdscripts/initramfs-live-boot_1.0.bbappend |   5 +
>>          .../recipes-installer/logos/yocto-compat-logos.bb
>>         <http://yocto-compat-logos.bb>  |  24 +
>>          .../logos/yocto-compat-logos/COPYING               | 339
>>         ++++++++++++
>>          .../logos/yocto-compat-logos/banner_yocto1.png     | Bin 0
>>         -> 44650 bytes
>>          .../logos/yocto-compat-logos/banner_yocto2.png     | Bin 0
>>         -> 39223 bytes
>>          .../logos/yocto-compat-logos/sidebar-logo.png      | Bin 0
>>         -> 17651 bytes
>>          .../logos/yocto-compat-logos/topbar-bg.png         | Bin 0
>>         -> 77956 bytes
>>          .../packagegroup-installer-x11-anaconda.bb
>>         <http://packagegroup-installer-x11-anaconda.bb>         |  28 +
>>          .../packagegroups/packagegroup-anaconda-support.bb
>>         <http://packagegroup-anaconda-support.bb> |  26 +
>>          .../recipes-kernel/linux/files/crypt.cfg           |   2 +
>>          .../recipes-kernel/linux/files/crypt.scc           |   1 +
>>          .../recipes-kernel/linux/files/dmthin.cfg          |   1 +
>>          .../recipes-kernel/linux/files/dmthin.scc          |   1 +
>>          .../recipes-kernel/linux/files/efivars.cfg         |   1 +
>>          .../recipes-kernel/linux/files/efivars.scc         |   1 +
>>          meta-installer/recipes-kernel/linux/files/ide.cfg  |   5 +
>>          meta-installer/recipes-kernel/linux/files/ide.scc  |   1 +
>>          .../recipes-kernel/linux/files/liveinstall.cfg     |   5 +
>>          .../recipes-kernel/linux/files/liveinstall.scc     |   1 +
>>          .../recipes-kernel/linux/files/multipath.cfg       |   3 +
>>          .../recipes-kernel/linux/files/multipath.scc       |   1 +
>>          .../multipath-tools/multipath-tools_%.bbappend     |   8 +
>>          120 files changed, 7845 insertions(+)
>>          create mode 100644 meta-installer/COPYING.MIT
>>          create mode 100644 meta-installer/README
>>          create mode 100644 meta-installer/README.anaconda
>>          create mode 100644 meta-installer/classes/anaconda_image.bbclass
>>          create mode 100644
>>         meta-installer/classes/anaconda_kernel.bbclass
>>          create mode 100644
>>         meta-installer/classes/anaconda_support_image.bbclass
>>          create mode 100644
>>         meta-installer/classes/anaconda_support_kernel.bbclass
>>          create mode 100644 meta-installer/conf/distro/anaconda.conf
>>          create mode 100644 meta-installer/conf/layer.conf
>>          create mode 100644 meta-installer/licenses/FLTK
>>          create mode 100644
>>         meta-installer/recipes-core/systemd/files/serial-getty@.service
>>          create mode 100644
>>         meta-installer/recipes-core/systemd/files/serial-screen-anaconda.sh
>>          create mode 100644
>>         meta-installer/recipes-core/systemd/systemd-serialgetty.bbappend
>>          create mode 100644
>>         meta-installer/recipes-core/systemd/systemd_%.bbappend
>>          create mode 100644
>>         meta-installer/recipes-gnome/gtk+/files/workaround-for-anaconda-installer-while-loading-libA.patch
>>          create mode 100644
>>         meta-installer/recipes-gnome/gtk+/gtk+3_%.%.%.bbappend
>>          create mode 100644
>>         meta-installer/recipes-graphics/xorg-xserver/xserver-xf86-config_0.1.bbappend
>>          create mode 100644
>>         meta-installer/recipes-installer/anaconda-init/anaconda-init.bb
>>         <http://anaconda-init.bb>
>>          create mode 100644
>>         meta-installer/recipes-installer/anaconda-init/anaconda-init/COPYING
>>          create mode 100644
>>         meta-installer/recipes-installer/anaconda-init/anaconda-init/Xusername
>>          create mode 100644
>>         meta-installer/recipes-installer/anaconda-init/anaconda-init/anaconda-init
>>          create mode 100644
>>         meta-installer/recipes-installer/anaconda-init/anaconda-init/anaconda-init-screen@.service
>>          create mode 100644
>>         meta-installer/recipes-installer/anaconda-init/anaconda-init/anaconda-init.service
>>          create mode 100644
>>         meta-installer/recipes-installer/anaconda-init/anaconda-init/anaconda-init.target
>>          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
>>         <http://python3-anaconda_26.21.11.bb>
>>          create mode 100644
>>         meta-installer/recipes-installer/images/core-image-anaconda-initramfs.bb
>>         <http://core-image-anaconda-initramfs.bb>
>>          create mode 100644
>>         meta-installer/recipes-installer/images/core-image-anaconda.bb
>>         <http://core-image-anaconda.bb>
>>          create mode 100644
>>         meta-installer/recipes-installer/initrdscripts/files/init-live.sh
>>          create mode 100644
>>         meta-installer/recipes-installer/initrdscripts/initramfs-live-boot_1.0.bbappend
>>          create mode 100644
>>         meta-installer/recipes-installer/logos/yocto-compat-logos.bb
>>         <http://yocto-compat-logos.bb>
>>          create mode 100644
>>         meta-installer/recipes-installer/logos/yocto-compat-logos/COPYING
>>          create mode 100644
>>         meta-installer/recipes-installer/logos/yocto-compat-logos/banner_yocto1.png
>>          create mode 100644
>>         meta-installer/recipes-installer/logos/yocto-compat-logos/banner_yocto2.png
>>          create mode 100644
>>         meta-installer/recipes-installer/logos/yocto-compat-logos/sidebar-logo.png
>>          create mode 100644
>>         meta-installer/recipes-installer/logos/yocto-compat-logos/topbar-bg.png
>>          create mode 100644
>>         meta-installer/recipes-installer/packagegroups/packagegroup-installer-x11-anaconda.bb
>>         <http://packagegroup-installer-x11-anaconda.bb>
>>          create mode 100644
>>         meta-installer/recipes-installersupport/packagegroups/packagegroup-anaconda-support.bb
>>         <http://packagegroup-anaconda-support.bb>
>>          create mode 100644
>>         meta-installer/recipes-kernel/linux/files/crypt.cfg
>>          create mode 100644
>>         meta-installer/recipes-kernel/linux/files/crypt.scc
>>          create mode 100644
>>         meta-installer/recipes-kernel/linux/files/dmthin.cfg
>>          create mode 100644
>>         meta-installer/recipes-kernel/linux/files/dmthin.scc
>>          create mode 100644
>>         meta-installer/recipes-kernel/linux/files/efivars.cfg
>>          create mode 100644
>>         meta-installer/recipes-kernel/linux/files/efivars.scc
>>          create mode 100644
>>         meta-installer/recipes-kernel/linux/files/ide.cfg
>>          create mode 100644
>>         meta-installer/recipes-kernel/linux/files/ide.scc
>>          create mode 100644
>>         meta-installer/recipes-kernel/linux/files/liveinstall.cfg
>>          create mode 100644
>>         meta-installer/recipes-kernel/linux/files/liveinstall.scc
>>          create mode 100644
>>         meta-installer/recipes-kernel/linux/files/multipath.cfg
>>          create mode 100644
>>         meta-installer/recipes-kernel/linux/files/multipath.scc
>>          create mode 100644
>>         meta-installer/recipes-support/multipath-tools/multipath-tools_%.bbappend
>>
>>
>>         --
>>         2.8.1
>>
>>         --
>>         _______________________________________________
>>         Openembedded-devel mailing list
>>         Openembedded-devel@lists.openembedded.org
>>         <mailto:Openembedded-devel@lists.openembedded.org>
>>         http://lists.openembedded.org/mailman/listinfo/openembedded-devel
>>
>


[-- Attachment #2: Type: text/html, Size: 42390 bytes --]

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH 00/15] create meta-installer layer
@ 2017-11-24 19:34         ` akuster808
  0 siblings, 0 replies; 27+ messages in thread
From: akuster808 @ 2017-11-24 19:34 UTC (permalink / raw)
  To: Hongxu Jia, Khem Raj, Burton, Ross, Michael Halstead
  Cc: yocto, OpenEmbedded Devel List



On 11/23/2017 05:55 PM, Hongxu Jia wrote:
> On 2017年11月24日 08:35, Khem Raj wrote:
>>
>> On Thu, Nov 23, 2017 at 4:15 AM Burton, Ross <ross.burton@intel.com
>> <mailto:ross.burton@intel.com>> wrote:
>>
>>     I honestly don't see why this has to belong in meta-openembedded
>>     and can't live in a standalone repository.
>>
>>
>> I share the same opinion it should probably be
>>  Repo of its own
>>
>
> Hi Ross & Khem,
>
> Since both of you think it should be as a standalone repository,
> I do not insist on it.
>
> Hi Michael,
>
> Would you please create a repository on http://git.yoctoproject.org/
> the layer name called `meta-installer', should I resend pull request
> for review or directly push the repo contents to it once it's created.

These are sitting in the meta-openembedded patch queue. Did I miss the
reject request?

- armin
>
> If the latter one, should I send my ssh pub key to you privately?
>
> //Hongxu
>
>
>>
>>     Ross
>>
>>     On 23 November 2017 at 12:09, Hongxu Jia
>>     <hongxu.jia@windriver.com <mailto:hongxu.jia@windriver.com>> wrote:
>>
>>         The meta-installer layer provides a collection of installation
>>         programs based on OE platform.
>>
>>         One implementation is the target installer 'anaconda', the
>>         version
>>         is 26.21.11 which is based on Fedora 26.
>>
>>         The anacoda requires:
>>         - systemd as init manager
>>         - python3
>>         - dnf2/rpm4
>>         - gobject-introspection which requires qemu-usermode
>>           in MACHINE_FEATURES
>>
>>         The anaconda provides:
>>         - graphic install and text install.
>>
>>         - package based (dnf/rpm) install and image (copy)
>>           based install.
>>
>>         - package based (dnf/rpm) install from local and
>>           remote rpm sources such as CDs and DVDs, images
>>           stored on a hard drive, NFS, HTTP, and FTP.
>>
>>         - kickstart install which provides a fully unattended
>>           installation that can be duplicated on scores of machines.
>>
>>         - install over VNC on headless machines.
>>
>>         - timezone setting.
>>
>>         - root password setting.
>>
>>         - user account creation.
>>
>>         - a variety of advanced storage devices including
>>           LVM, Btrfs, Ext4, and filesystem encryption.
>>
>>         TODO (currently not support):
>>         - keyboard setting
>>
>>         - language support setting
>>
>>         - network & host name setting
>>
>>         //Hongxu
>>
>>         The following changes since commit
>>         34aa4c3202b427f59f843dc43a4e1afda4f81d13:
>>
>>           usb-modeswitch: add usb-modeswitch@.service (2017-11-19
>>         13:45:38 -0800)
>>
>>         are available in the git repository at:
>>
>>           git://git.openembedded.org/openembedded-core-contrib
>>         <http://git.openembedded.org/openembedded-core-contrib>
>>         hongxu/meta-installer
>>          
>>         http://cgit.openembedded.org/openembedded-core-contrib/log/?h=hongxu/meta-installer
>>
>>         Hongxu Jia (15):
>>           meta-installer: create layer
>>           meta-installer: add kernel config
>>           meta-installer: add anaconda support for target build
>>           meta-installer: add distro anaconda for host build
>>           meta-installer: add systemd/systemd-serialgetty bbappend
>>           meta-installer: add gtk+3 bbappend
>>           meta-installer: add initramfs-live-boot bbappend
>>           meta-installer: add xserver-xf86-config bbappend
>>           meta-installer: add multipath-tools bbappend
>>           meta-installer: add recipe packagegroup-installer-x11-anaconda
>>           meta-installer: add recipe yocto-compat-logos
>>           meta-installer: add recipe anaconda-init
>>           meta-installer: add recipe anaconda 26.21.11
>>           meta-installer: add recipe core-image-anaconda
>>           meta-installer: add recipe core-image-anaconda-initramfs
>>
>>          meta-installer/COPYING.MIT                         |  17 +
>>          meta-installer/README                              |  47 ++
>>          meta-installer/README.anaconda                     | 341
>>         ++++++++++++
>>          meta-installer/classes/anaconda_image.bbclass      | 321
>>         +++++++++++
>>          meta-installer/classes/anaconda_kernel.bbclass     |  14 +
>>          .../classes/anaconda_support_image.bbclass         |  40 ++
>>          .../classes/anaconda_support_kernel.bbclass        |   8 +
>>          meta-installer/conf/distro/anaconda.conf           |  33 ++
>>          meta-installer/conf/layer.conf                     |  31 ++
>>          meta-installer/licenses/FLTK                       | 530
>>         ++++++++++++++++++
>>          .../systemd/files/serial-getty@.service            |  40 ++
>>          .../systemd/files/serial-screen-anaconda.sh        |   5 +
>>          .../systemd/systemd-serialgetty.bbappend           |  12 +
>>          .../recipes-core/systemd/systemd_%.bbappend        |   6 +
>>          ...for-anaconda-installer-while-loading-libA.patch |  84 +++
>>          .../recipes-gnome/gtk+/gtk+3_%.%.%.bbappend        |   3 +
>>          .../xorg-xserver/xserver-xf86-config_0.1.bbappend  |  12 +
>>          .../anaconda-init/anaconda-init.bb
>>         <http://anaconda-init.bb>                 |  77 +++
>>          .../anaconda-init/anaconda-init/COPYING            | 339
>>         ++++++++++++
>>          .../anaconda-init/anaconda-init/Xusername          |   1 +
>>          .../anaconda-init/anaconda-init/anaconda-init      | 362
>>         +++++++++++++
>>          .../anaconda-init/anaconda-init-screen@.service    |  22 +
>>          .../anaconda-init/anaconda-init.service            |  13 +
>>          .../anaconda-init/anaconda-init.target             |   6 +
>>          .../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
>>         <http://python3-anaconda_26.21.11.bb>          | 161 ++++++
>>          .../images/core-image-anaconda-initramfs.bb
>>         <http://core-image-anaconda-initramfs.bb>        |  33 ++
>>          .../images/core-image-anaconda.bb
>>         <http://core-image-anaconda.bb>                  |  34 ++
>>          .../initrdscripts/files/init-live.sh               | 249
>>         +++++++++
>>          .../initrdscripts/initramfs-live-boot_1.0.bbappend |   5 +
>>          .../recipes-installer/logos/yocto-compat-logos.bb
>>         <http://yocto-compat-logos.bb>  |  24 +
>>          .../logos/yocto-compat-logos/COPYING               | 339
>>         ++++++++++++
>>          .../logos/yocto-compat-logos/banner_yocto1.png     | Bin 0
>>         -> 44650 bytes
>>          .../logos/yocto-compat-logos/banner_yocto2.png     | Bin 0
>>         -> 39223 bytes
>>          .../logos/yocto-compat-logos/sidebar-logo.png      | Bin 0
>>         -> 17651 bytes
>>          .../logos/yocto-compat-logos/topbar-bg.png         | Bin 0
>>         -> 77956 bytes
>>          .../packagegroup-installer-x11-anaconda.bb
>>         <http://packagegroup-installer-x11-anaconda.bb>         |  28 +
>>          .../packagegroups/packagegroup-anaconda-support.bb
>>         <http://packagegroup-anaconda-support.bb> |  26 +
>>          .../recipes-kernel/linux/files/crypt.cfg           |   2 +
>>          .../recipes-kernel/linux/files/crypt.scc           |   1 +
>>          .../recipes-kernel/linux/files/dmthin.cfg          |   1 +
>>          .../recipes-kernel/linux/files/dmthin.scc          |   1 +
>>          .../recipes-kernel/linux/files/efivars.cfg         |   1 +
>>          .../recipes-kernel/linux/files/efivars.scc         |   1 +
>>          meta-installer/recipes-kernel/linux/files/ide.cfg  |   5 +
>>          meta-installer/recipes-kernel/linux/files/ide.scc  |   1 +
>>          .../recipes-kernel/linux/files/liveinstall.cfg     |   5 +
>>          .../recipes-kernel/linux/files/liveinstall.scc     |   1 +
>>          .../recipes-kernel/linux/files/multipath.cfg       |   3 +
>>          .../recipes-kernel/linux/files/multipath.scc       |   1 +
>>          .../multipath-tools/multipath-tools_%.bbappend     |   8 +
>>          120 files changed, 7845 insertions(+)
>>          create mode 100644 meta-installer/COPYING.MIT
>>          create mode 100644 meta-installer/README
>>          create mode 100644 meta-installer/README.anaconda
>>          create mode 100644 meta-installer/classes/anaconda_image.bbclass
>>          create mode 100644
>>         meta-installer/classes/anaconda_kernel.bbclass
>>          create mode 100644
>>         meta-installer/classes/anaconda_support_image.bbclass
>>          create mode 100644
>>         meta-installer/classes/anaconda_support_kernel.bbclass
>>          create mode 100644 meta-installer/conf/distro/anaconda.conf
>>          create mode 100644 meta-installer/conf/layer.conf
>>          create mode 100644 meta-installer/licenses/FLTK
>>          create mode 100644
>>         meta-installer/recipes-core/systemd/files/serial-getty@.service
>>          create mode 100644
>>         meta-installer/recipes-core/systemd/files/serial-screen-anaconda.sh
>>          create mode 100644
>>         meta-installer/recipes-core/systemd/systemd-serialgetty.bbappend
>>          create mode 100644
>>         meta-installer/recipes-core/systemd/systemd_%.bbappend
>>          create mode 100644
>>         meta-installer/recipes-gnome/gtk+/files/workaround-for-anaconda-installer-while-loading-libA.patch
>>          create mode 100644
>>         meta-installer/recipes-gnome/gtk+/gtk+3_%.%.%.bbappend
>>          create mode 100644
>>         meta-installer/recipes-graphics/xorg-xserver/xserver-xf86-config_0.1.bbappend
>>          create mode 100644
>>         meta-installer/recipes-installer/anaconda-init/anaconda-init.bb
>>         <http://anaconda-init.bb>
>>          create mode 100644
>>         meta-installer/recipes-installer/anaconda-init/anaconda-init/COPYING
>>          create mode 100644
>>         meta-installer/recipes-installer/anaconda-init/anaconda-init/Xusername
>>          create mode 100644
>>         meta-installer/recipes-installer/anaconda-init/anaconda-init/anaconda-init
>>          create mode 100644
>>         meta-installer/recipes-installer/anaconda-init/anaconda-init/anaconda-init-screen@.service
>>          create mode 100644
>>         meta-installer/recipes-installer/anaconda-init/anaconda-init/anaconda-init.service
>>          create mode 100644
>>         meta-installer/recipes-installer/anaconda-init/anaconda-init/anaconda-init.target
>>          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
>>         <http://python3-anaconda_26.21.11.bb>
>>          create mode 100644
>>         meta-installer/recipes-installer/images/core-image-anaconda-initramfs.bb
>>         <http://core-image-anaconda-initramfs.bb>
>>          create mode 100644
>>         meta-installer/recipes-installer/images/core-image-anaconda.bb
>>         <http://core-image-anaconda.bb>
>>          create mode 100644
>>         meta-installer/recipes-installer/initrdscripts/files/init-live.sh
>>          create mode 100644
>>         meta-installer/recipes-installer/initrdscripts/initramfs-live-boot_1.0.bbappend
>>          create mode 100644
>>         meta-installer/recipes-installer/logos/yocto-compat-logos.bb
>>         <http://yocto-compat-logos.bb>
>>          create mode 100644
>>         meta-installer/recipes-installer/logos/yocto-compat-logos/COPYING
>>          create mode 100644
>>         meta-installer/recipes-installer/logos/yocto-compat-logos/banner_yocto1.png
>>          create mode 100644
>>         meta-installer/recipes-installer/logos/yocto-compat-logos/banner_yocto2.png
>>          create mode 100644
>>         meta-installer/recipes-installer/logos/yocto-compat-logos/sidebar-logo.png
>>          create mode 100644
>>         meta-installer/recipes-installer/logos/yocto-compat-logos/topbar-bg.png
>>          create mode 100644
>>         meta-installer/recipes-installer/packagegroups/packagegroup-installer-x11-anaconda.bb
>>         <http://packagegroup-installer-x11-anaconda.bb>
>>          create mode 100644
>>         meta-installer/recipes-installersupport/packagegroups/packagegroup-anaconda-support.bb
>>         <http://packagegroup-anaconda-support.bb>
>>          create mode 100644
>>         meta-installer/recipes-kernel/linux/files/crypt.cfg
>>          create mode 100644
>>         meta-installer/recipes-kernel/linux/files/crypt.scc
>>          create mode 100644
>>         meta-installer/recipes-kernel/linux/files/dmthin.cfg
>>          create mode 100644
>>         meta-installer/recipes-kernel/linux/files/dmthin.scc
>>          create mode 100644
>>         meta-installer/recipes-kernel/linux/files/efivars.cfg
>>          create mode 100644
>>         meta-installer/recipes-kernel/linux/files/efivars.scc
>>          create mode 100644
>>         meta-installer/recipes-kernel/linux/files/ide.cfg
>>          create mode 100644
>>         meta-installer/recipes-kernel/linux/files/ide.scc
>>          create mode 100644
>>         meta-installer/recipes-kernel/linux/files/liveinstall.cfg
>>          create mode 100644
>>         meta-installer/recipes-kernel/linux/files/liveinstall.scc
>>          create mode 100644
>>         meta-installer/recipes-kernel/linux/files/multipath.cfg
>>          create mode 100644
>>         meta-installer/recipes-kernel/linux/files/multipath.scc
>>          create mode 100644
>>         meta-installer/recipes-support/multipath-tools/multipath-tools_%.bbappend
>>
>>
>>         --
>>         2.8.1
>>
>>         --
>>         _______________________________________________
>>         Openembedded-devel mailing list
>>         Openembedded-devel@lists.openembedded.org
>>         <mailto:Openembedded-devel@lists.openembedded.org>
>>         http://lists.openembedded.org/mailman/listinfo/openembedded-devel
>>
>



^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [oe] [PATCH 00/15] create meta-installer layer
  2017-11-24 19:34         ` akuster808
@ 2017-11-25  8:58           ` Hongxu Jia
  -1 siblings, 0 replies; 27+ messages in thread
From: Hongxu Jia @ 2017-11-25  8:58 UTC (permalink / raw)
  To: akuster808, Khem Raj, Burton, Ross, Michael Halstead
  Cc: yocto, OpenEmbedded Devel List

On 2017年11月25日 03:34, akuster808 wrote:
>
> These are sitting in the meta-openembedded patch queue. Did I miss the 
> reject request?
>
> - armin

I marked them as `rejected' in OE's patch work, I have applied to submit

meta-anaconda to yocto as a standalone repository.


//Hongxu



^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH 00/15] create meta-installer layer
@ 2017-11-25  8:58           ` Hongxu Jia
  0 siblings, 0 replies; 27+ messages in thread
From: Hongxu Jia @ 2017-11-25  8:58 UTC (permalink / raw)
  To: akuster808, Khem Raj, Burton, Ross, Michael Halstead
  Cc: yocto, OpenEmbedded Devel List

On 2017年11月25日 03:34, akuster808 wrote:
>
> These are sitting in the meta-openembedded patch queue. Did I miss the 
> reject request?
>
> - armin

I marked them as `rejected' in OE's patch work, I have applied to submit

meta-anaconda to yocto as a standalone repository.


//Hongxu



^ permalink raw reply	[flat|nested] 27+ messages in thread

end of thread, other threads:[~2017-11-25  8:55 UTC | newest]

Thread overview: 27+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-11-23 12:09 [PATCH 00/15] create meta-installer layer Hongxu Jia
2017-11-23 12:09 ` [PATCH 01/15] meta-installer: create layer Hongxu Jia
2017-11-23 12:09 ` [PATCH 02/15] meta-installer: add kernel config Hongxu Jia
2017-11-23 12:09 ` [PATCH 03/15] meta-installer: add anaconda support for target build Hongxu Jia
2017-11-23 12:09 ` [PATCH 04/15] meta-installer: add distro anaconda for host build Hongxu Jia
2017-11-23 12:09 ` [PATCH 05/15] meta-installer: add systemd/systemd-serialgetty bbappend Hongxu Jia
2017-11-23 12:09 ` [PATCH 06/15] meta-installer: add gtk+3 bbappend Hongxu Jia
2017-11-23 12:09 ` [PATCH 07/15] meta-installer: add initramfs-live-boot bbappend Hongxu Jia
2017-11-23 12:09 ` [PATCH 08/15] meta-installer: add xserver-xf86-config bbappend Hongxu Jia
2017-11-23 12:09 ` [PATCH 09/15] meta-installer: add multipath-tools bbappend Hongxu Jia
2017-11-23 12:09 ` [PATCH 10/15] meta-installer: add recipe packagegroup-installer-x11-anaconda Hongxu Jia
2017-11-23 12:09 ` [PATCH 11/15] meta-installer: add recipe yocto-compat-logos Hongxu Jia
2017-11-23 12:09 ` [PATCH 12/15] meta-installer: add recipe anaconda-init Hongxu Jia
2017-11-23 12:09 ` [PATCH 13/15] meta-installer: add recipe anaconda 26.21.11 Hongxu Jia
2017-11-23 12:09 ` [PATCH 14/15] meta-installer: add recipe core-image-anaconda Hongxu Jia
2017-11-23 12:09 ` [PATCH 15/15] meta-installer: add recipe core-image-anaconda-initramfs Hongxu Jia
2017-11-23 12:14 ` [PATCH 00/15] create meta-installer layer Hongxu Jia
2017-11-23 12:15 ` Burton, Ross
2017-11-23 12:34   ` Hongxu Jia
2017-11-24  0:35   ` Khem Raj
2017-11-24  1:55     ` [oe] " Hongxu Jia
2017-11-24  1:55       ` Hongxu Jia
2017-11-24  5:44       ` [oe] " Hongxu Jia
2017-11-24 19:34       ` akuster808
2017-11-24 19:34         ` akuster808
2017-11-25  8:58         ` [oe] " Hongxu Jia
2017-11-25  8:58           ` Hongxu Jia

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.