bf7b6d28c3
This makes two changes: 1. When called for "remove" any drop-ins with "+" suffix are removed too, so that the logic works for entries with boot counting enabled too and we don't lose track of configuration snippets created that way. 2. When called for "add" we optionally generate a "+" suffix, based on the data in /etc/kernel/tries if it exists. This basically means after "echo 5 > /etc/kernel/tries" any installed kernels will automatically set up for 5 boot tries before older kernels will be tried.
104 lines
2.5 KiB
Bash
104 lines
2.5 KiB
Bash
#!/bin/bash
|
|
# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
|
|
# ex: ts=8 sw=4 sts=4 et filetype=sh
|
|
|
|
COMMAND="$1"
|
|
KERNEL_VERSION="$2"
|
|
BOOT_DIR_ABS="$3"
|
|
KERNEL_IMAGE="$4"
|
|
|
|
if ! [[ $KERNEL_INSTALL_MACHINE_ID ]]; then
|
|
exit 0
|
|
fi
|
|
|
|
if ! [[ -d "$BOOT_DIR_ABS" ]]; then
|
|
exit 0
|
|
fi
|
|
|
|
MACHINE_ID=$KERNEL_INSTALL_MACHINE_ID
|
|
|
|
BOOT_DIR="/$MACHINE_ID/$KERNEL_VERSION"
|
|
BOOT_ROOT=${BOOT_DIR_ABS%$BOOT_DIR}
|
|
|
|
if [[ $COMMAND == remove ]]; then
|
|
rm -f "$BOOT_ROOT/loader/entries/$MACHINE_ID-$KERNEL_VERSION.conf"
|
|
rm -f "$BOOT_ROOT/loader/entries/$MACHINE_ID-$KERNEL_VERSION+"*".conf"
|
|
exit 0
|
|
fi
|
|
|
|
if ! [[ $COMMAND == add ]]; then
|
|
exit 1
|
|
fi
|
|
|
|
if ! [[ $KERNEL_IMAGE ]]; then
|
|
exit 1
|
|
fi
|
|
|
|
if [[ -f /etc/os-release ]]; then
|
|
. /etc/os-release
|
|
elif [[ -f /usr/lib/os-release ]]; then
|
|
. /usr/lib/os-release
|
|
fi
|
|
|
|
if ! [[ $PRETTY_NAME ]]; then
|
|
PRETTY_NAME="Linux $KERNEL_VERSION"
|
|
fi
|
|
|
|
declare -a BOOT_OPTIONS
|
|
|
|
if [[ -f /etc/kernel/cmdline ]]; then
|
|
read -r -d '' -a BOOT_OPTIONS < /etc/kernel/cmdline
|
|
fi
|
|
|
|
if ! [[ ${BOOT_OPTIONS[*]} ]]; then
|
|
read -r -d '' -a line < /proc/cmdline
|
|
for i in "${line[@]}"; do
|
|
[[ "${i#initrd=*}" != "$i" ]] && continue
|
|
BOOT_OPTIONS+=("$i")
|
|
done
|
|
fi
|
|
|
|
if ! [[ ${BOOT_OPTIONS[*]} ]]; then
|
|
echo "Could not determine the kernel command line parameters." >&2
|
|
echo "Please specify the kernel command line in /etc/kernel/cmdline!" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [[ -f /etc/kernel/tries ]]; then
|
|
read -r TRIES </etc/kernel/tries
|
|
if ! [[ "$TRIES" =~ ^[0-9]+$ ]] ; then
|
|
echo "/etc/kernel/tries does not contain an integer." >&2
|
|
exit 1
|
|
fi
|
|
LOADER_ENTRY="$BOOT_ROOT/loader/entries/$MACHINE_ID-$KERNEL_VERSION+$TRIES.conf"
|
|
else
|
|
LOADER_ENTRY="$BOOT_ROOT/loader/entries/$MACHINE_ID-$KERNEL_VERSION.conf"
|
|
fi
|
|
|
|
cp "$KERNEL_IMAGE" "$BOOT_DIR_ABS/linux" &&
|
|
chown root:root "$BOOT_DIR_ABS/linux" &&
|
|
chmod 0644 "$BOOT_DIR_ABS/linux" || {
|
|
echo "Could not copy '$KERNEL_IMAGE to '$BOOT_DIR_ABS/linux'." >&2
|
|
exit 1
|
|
}
|
|
|
|
mkdir -p "${LOADER_ENTRY%/*}" || {
|
|
echo "Could not create loader entry directory '${LOADER_ENTRY%/*}'." >&2
|
|
exit 1
|
|
}
|
|
|
|
{
|
|
echo "title $PRETTY_NAME"
|
|
echo "version $KERNEL_VERSION"
|
|
echo "machine-id $MACHINE_ID"
|
|
echo "options ${BOOT_OPTIONS[*]}"
|
|
echo "linux $BOOT_DIR/linux"
|
|
[[ -f $BOOT_DIR_ABS/initrd ]] && \
|
|
echo "initrd $BOOT_DIR/initrd"
|
|
:
|
|
} > "$LOADER_ENTRY" || {
|
|
echo "Could not create loader entry '$LOADER_ENTRY'." >&2
|
|
exit 1
|
|
}
|
|
exit 0
|