sys-apps/kexec-tools: support more kernel names.
authorRobin H. Johnson <robbat2@gentoo.org>
Sun, 8 Jan 2017 00:31:46 +0000 (16:31 -0800)
committerRobin H. Johnson <robbat2@gentoo.org>
Sun, 8 Jan 2017 00:32:50 +0000 (16:32 -0800)
Package-Manager: portage-2.3.2
Gentoo-Bug: 489864
Fixes: https://bugs.gentoo.org/show_bug.cgi?id=489864
Signed-off-by: Robin H. Johnson <robbat2@gentoo.org>
sys-apps/kexec-tools/files/kexec.init-2.0.12 [changed mode: 0755->0644]
sys-apps/kexec-tools/files/kexec.init-2.0.13-r1 [new file with mode: 0644]
sys-apps/kexec-tools/kexec-tools-2.0.13-r1.ebuild [new file with mode: 0644]

old mode 100755 (executable)
new mode 100644 (file)
index 87863b3..93f8c04
@@ -1,5 +1,5 @@
 #!/sbin/openrc-run
-# Copyright 1999-2016 Gentoo Foundation
+# Copyright 1999-2017 Gentoo Foundation
 # Distributed under the terms of the GNU General Public License v2
 # $Id$
 
diff --git a/sys-apps/kexec-tools/files/kexec.init-2.0.13-r1 b/sys-apps/kexec-tools/files/kexec.init-2.0.13-r1
new file mode 100644 (file)
index 0000000..1f18f67
--- /dev/null
@@ -0,0 +1,187 @@
+#!/sbin/openrc-run
+# Copyright 1999-2017 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+# Set up some defaults.
+: "${LOAD_DURING_SHUTDOWN:=yes}"
+: "${BOOTPART:=/boot}"
+: "${DONT_MOUNT_BOOT:=no}"
+
+depend() {
+       need localmount
+}
+
+auto_prefix_bootpath() {
+       # Only auto-add prefix to relative paths.
+       case $1 in
+       */*) echo "$1";;
+       *)   echo "${BOOTPART}/$1" ;;
+       esac
+}
+
+get_genkernel_arch() {
+       case $1 in
+         x86_64) echo "amd64" ;;
+         i[3456]86) echo "x86" ;;
+         *) echo "$1" ;;
+       esac
+}
+
+image_path() {
+       # Do no sanity checking if the user has set a value.
+       if [ -n "${KNAME}" ]; then
+               auto_prefix_bootpath "${KNAME}"
+               return
+       fi
+
+       local x kver="$(uname -r)" karch="$(uname -m)" 
+       local gkarch="$(get_genkernel_arch $karch)"
+       for x in \
+               "bzImage" \
+               "vmlinuz" \
+               "bzImage-${kver}" \
+               "vmlinuz-${kver}" \
+               "kernel-genkernel-${karch}-${kver}" \
+               "kernel-genkernel-${gkarch}-${kver}" \
+               "kernel-${kver}" \
+               "kernel-${karch}"; do
+               if [ -e "${BOOTPART}/${x}" ]; then
+                       echo "${BOOTPART}/${x}"
+                       return
+               fi
+       done
+
+       return 1
+}
+
+initrd_path() {
+       # Do no sanity checking if the user has set a value.
+       if [ -n "${INITRD}" ]; then
+               auto_prefix_bootpath "${INITRD}"
+               return 0
+       fi
+
+       local x kver="$(uname -r)" karch="$(uname -m)"
+       local gkarch="$(get_genkernel_arch $karch)"
+       for x in \
+               "initrd" \
+               "initrd.img-${kver}" \
+               "initrd-${kver}.img" \
+               "initrd-${kver}" \
+               "initramfs-${kver}.img" \
+               "initramfs-genkernel-${karch}-${kver}"; do
+               "initramfs-genkernel-${gkarch}-${kver}"; do
+               if [ -e "${BOOTPART}/${x}" ]; then
+                       echo "${BOOTPART}/${x}"
+                       return 0
+               fi
+       done
+
+       return 1
+}
+
+mount_boot() {
+       [ "${DONT_MOUNT_BOOT}" != "no" ] && return 1
+       mountinfo -q "${BOOTPART}" && return 1
+
+       ebegin "Mounting ${BOOTPART}"
+       mount "${BOOTPART}"
+       eend $?
+}
+
+load_image() {
+       if [ "${KNAME}" = "-" ]; then
+               ebegin "Disabling kexec"
+               kexec -u
+               eend $?
+               return  # eend preserved $? for us.
+       fi
+
+       local img initrd="$(initrd_path)" mounted=false kparamopt initrdopt
+
+       if ! img="$(image_path)"; then
+               if mount_boot; then
+                       if img="$(image_path)"; then
+                               mounted=true
+                               initrd="$(initrd_path)"
+                       else
+                               eerror "No kernel image found in ${BOOTPART}!"
+                               umount "${BOOTPART}"
+                               return 1
+                       fi
+               else
+                       eerror "No kernel image found in ${BOOTPART}!"
+                       return 1
+               fi
+       fi
+
+       if [ -z "${ROOTPART}" ]; then
+               ROOTPART="$(readlink -f "$(sed -n '/^\/[^ ]* \/ / s,^\([^ ]*\).*,\1,p' /proc/mounts)")"
+       fi
+
+       if [ -z "${KPARAM}" ]; then
+               kparamopt="--reuse-cmdline"
+       fi
+
+       if [ -n "${initrd}" ]; then
+               initrdopt="--initrd=${initrd}"
+       fi
+
+       local msg
+       [ -n "${initrd}" ] && \
+               msg=" (with ${initrd})"
+       ebegin "Using kernel image ${img}${msg} for kexec"
+
+       kexec ${KEXEC_OPT_ARGS} ${kparamopt} \
+               -l "${img}" --append="root=${ROOTPART} ${KPARAM}" ${initrdopt}
+       local ret=$?
+
+       ${mounted} && umount "${BOOTPART}"
+       eend ${ret}
+       return ${ret}
+}
+
+start() {
+       if [ "${LOAD_DURING_SHUTDOWN}" = "yes" ]; then
+               local mounted
+               if mount_boot; then
+                       mounted=true
+               fi
+               if ! image_path >/dev/null; then
+                       ewarn "Cannot find kernel image!"
+                       ewarn "Please make sure a valid kernel image is present before reboot."
+                       return 0
+               fi
+               if [ -n "${mounted}" ]; then
+                       ebegin "Unmounting ${BOOTPART}"
+                       umount "${BOOTPART}"
+                       eend $?
+               fi
+               # $? is already set to the previous calls.
+               return
+       else
+               load_image
+       fi
+}
+
+stop() {
+       if ! yesno ${RC_REBOOT}; then
+               ebegin "Not rebooting; disabling kexec"
+               kexec -u
+               eend $?
+               return
+       fi
+
+       if [ -f /nokexec ]; then
+               ebegin "Rebooting; disabling kexec due to /nokexec"
+               rm -f /nokexec
+               kexec -u
+               eend $?
+               return
+       fi
+
+       if [ "${LOAD_DURING_SHUTDOWN}" = "yes" ]; then
+               load_image
+       fi
+}
diff --git a/sys-apps/kexec-tools/kexec-tools-2.0.13-r1.ebuild b/sys-apps/kexec-tools/kexec-tools-2.0.13-r1.ebuild
new file mode 100644 (file)
index 0000000..8bc203d
--- /dev/null
@@ -0,0 +1,77 @@
+# Copyright 1999-2017 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+EAPI="5"
+
+if [[ ${PV} == "9999" ]] ; then
+       inherit git-r3
+       EGIT_REPO_URI="git://git.kernel.org/pub/scm/utils/kernel/kexec/kexec-tools.git"
+       AUTOTOOLS_AUTORECONF=true
+else
+       SRC_URI="mirror://kernel/linux/utils/kernel/kexec/${P}.tar.xz"
+       KEYWORDS="~amd64 ~x86"
+fi
+
+inherit autotools-utils linux-info systemd
+
+DESCRIPTION="Load another kernel from the currently executing Linux kernel"
+HOMEPAGE="https://kernel.org/pub/linux/utils/kernel/kexec/"
+
+LICENSE="GPL-2"
+SLOT="0"
+IUSE="booke lzma xen zlib"
+
+REQUIRED_USE="lzma? ( zlib )"
+
+DEPEND="
+       lzma? ( app-arch/xz-utils )
+       zlib? ( sys-libs/zlib )"
+RDEPEND="${DEPEND}"
+
+CONFIG_CHECK="~KEXEC"
+
+PATCHES=(
+       "${FILESDIR}"/${PN}-2.0.4-disable-kexec-test.patch
+       "${FILESDIR}"/${PN}-2.0.4-out-of-source.patch
+)
+
+pkg_setup() {
+       # GNU Make's $(COMPILE.S) passes ASFLAGS to $(CCAS), CCAS=$(CC)
+       export ASFLAGS="${CCASFLAGS}"
+}
+
+src_configure() {
+       local myeconfargs=(
+               $(use_with booke)
+               $(use_with lzma)
+               $(use_with xen)
+               $(use_with zlib)
+       )
+       autotools-utils_src_configure
+}
+
+src_install() {
+       autotools-utils_src_install
+
+       dodoc "${FILESDIR}"/README.Gentoo
+
+       newinitd "${FILESDIR}"/kexec.init-2.0.13-r1 kexec
+       newconfd "${FILESDIR}"/kexec.conf-2.0.4 kexec
+
+       insinto /etc
+       doins "${FILESDIR}"/kexec.conf
+
+       insinto /etc/kernel/postinst.d
+       doins "${FILESDIR}"/90_kexec
+
+       systemd_dounit "${FILESDIR}"/kexec.service
+}
+
+pkg_postinst() {
+       if systemd_is_booted || has_version sys-apps/systemd; then
+               elog "For systemd support the new config file is"
+               elog "   /etc/kexec.conf"
+               elog "Please adopt it to your needs as there is no autoconfig anymore"
+       fi
+}