scripts/arch_post_update_update_boot.sh

78 lines
2.1 KiB
Bash
Executable File

#!/bin/sh
# arch_post_update_update_boot.sh
#
# In your /etc/profile, export the following variables
# LVM_VG_BOOT=vg0
# LVM_LG_BOOT_NAME=boot
# BOOT_DIR_SUFFIX=/archlinux
#
# Optional variables:
# PACMAN_BIN=/usr/bin/pacman # Alternative pacman binary (eg: aura)
# BOOT_SYMLINK=current (in good boot dir)
set -e
source /etc/profile
ask_overwrite() {
echo "Existing destination folder ($ARCH_BOOT_DST_CURRENT_VERSION), do you want to overwrite? (y/n)";
read OVERWRITE;
return `test "$OVERWRITE" = "y"`
}
do_upgrade() {
PKG_NAME=$1
ARCH_INITRAMFS=$2
ARCH_INITRAMFS_FALLBACK=$3
ARCH_VMLINUZ=$4
PACMAN_BIN=${PACMAN_BIN:-/usr/bin/pacman}
BOOT_SYMLINK=${BOOT_SYMLINK:-$PKG_NAME}
BOOT_ORIG=/boot
ARCH_BOOT_DST=$TMP_BOOT_DST/$BOOT_DIR_SUFFIX
CURRENT_VERSION=`${PACMAN_BIN} -Qi $PKG_NAME \
| sed -n '/^Version *:/p' \
| grep -o '[^ ]*$'`
ARCH_BOOT_DST_CURRENT_VERSION=$ARCH_BOOT_DST/$CURRENT_VERSION
test -d $ARCH_BOOT_DST_CURRENT_VERSION \
&& test `realpath $ARCH_BOOT_DST/$BOOT_SYMLINK` = $ARCH_BOOT_DST_CURRENT_VERSION \
&& echo "$PKG_NAME version already up to date ($CURRENT_VERSION)" && return 1;
mkdir $ARCH_BOOT_DST_CURRENT_VERSION || ask_overwrite || return 1;
(
cd $BOOT_ORIG;
# Copy the new kernel files to the real destination in boot fs
cp -t $ARCH_BOOT_DST_CURRENT_VERSION $ARCH_INITRAMFS $ARCH_INITRAMFS_FALLBACK $ARCH_VMLINUZ;
)
(
cd $ARCH_BOOT_DST;
# Re-link the good version
test -h $BOOT_SYMLINK && rm $BOOT_SYMLINK;
ln -s $CURRENT_VERSION $PKG_NAME;
)
echo "$PKG_NAME version updated to $CURRENT_VERSION"
}
TMP_BOOT_DST=`mktemp -d`
BOOT_BLK=/dev/$LVM_VG_BOOT/$LVM_LG_BOOT_NAME
mount $BOOT_BLK $TMP_BOOT_DST;
do_upgrade linux initramfs-linux.img initramfs-linux-fallback.img vmlinuz-linux \
|| echo "Skipped linux upgrade"
do_upgrade linux-lts initramfs-linux-lts.img initramfs-linux-lts-fallback.img vmlinuz-linux-lts \
|| echo "Skipped linux-lts upgrade"
umount $TMP_BOOT_DST;
rmdir $TMP_BOOT_DST;
exit 0;