#!/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;