#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # SPDX-License-Identifier: LGPL-2.1-or-later # # 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. # # systemd 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 Lesser General Public License # along with systemd; If not, see . skip_remaining=77 usage() { echo "Usage:" echo " kernel-install [OPTIONS...] add KERNEL-VERSION KERNEL-IMAGE [INITRD-FILE...]" echo " kernel-install [OPTIONS...] remove KERNEL-VERSION" echo " kernel-install [OPTIONS...] inspect" echo "Options:" echo " -h, --help Print this help and exit" echo " --version Print version string and exit" echo " -v, --verbose Increase verbosity" } dropindirs_sort() { suffix="$1" shift for d; do for i in "$d/"*"$suffix"; do [ -e "$i" ] && echo "${i##*/}" done done | sort -Vu | while read -r f; do for d; do if [ -e "$d/$f" ]; then [ -x "$d/$f" ] && echo "$d/$f" continue 2 fi done done } export LC_COLLATE=C for i; do if [ "$i" = "--help" ] || [ "$i" = "-h" ]; then usage exit 0 fi done for i; do if [ "$i" = "--version" ]; then echo "kernel-install {{PROJECT_VERSION}} ({{GIT_VERSION}})" exit 0 fi done if [ "$KERNEL_INSTALL_BYPASS" = "1" ]; then echo "kernel-install: Skipping execution because KERNEL_INSTALL_BYPASS=1" exit 0 fi export KERNEL_INSTALL_VERBOSE=0 if [ "$1" = "--verbose" ] || [ "$1" = "-v" ]; then shift export KERNEL_INSTALL_VERBOSE=1 fi if [ "${0##*/}" = "installkernel" ]; then COMMAND=add # make install doesn't pass any initrds no_initrds=1 else COMMAND="$1" [ $# -ge 1 ] && shift no_initrds=0 fi if [ "$COMMAND" = "inspect" ]; then KERNEL_VERSION="" else if [ $# -lt 1 ]; then echo "Error: not enough arguments" >&2 exit 1 fi KERNEL_VERSION="$1" shift fi # These two settings are settable in install.conf layout= initrd_generator= if [ -r "/etc/kernel/install.conf" ]; then install_conf="/etc/kernel/install.conf" elif [ -r "/usr/lib/kernel/install.conf" ]; then install_conf="/usr/lib/kernel/install.conf" else install_conf= fi if [ -n "$install_conf" ]; then [ "$KERNEL_INSTALL_VERBOSE" -gt 0 ] && echo "Reading $install_conf…" # shellcheck source=/dev/null . "$install_conf" # FIXME: This may override configuration in environment variables, e.g. $BOOT_ROOT. fi [ "$KERNEL_INSTALL_VERBOSE" -gt 0 ] && [ -n "$layout" ] && \ echo "$install_conf configures layout=$layout" [ "$KERNEL_INSTALL_VERBOSE" -gt 0 ] && [ -n "$initrd_generator" ] && \ echo "$install_conf configures initrd_generator=$initrd_generator" [ -n "$MACHINE_ID" ] && [ "$KERNEL_INSTALL_VERBOSE" -gt 0 ] && \ echo "machine-id $MACHINE_ID set via environment or install.conf" [ -n "$BOOT_ROOT" ] && [ "$KERNEL_INSTALL_VERBOSE" -gt 0 ] && \ echo "BOOT_ROOT=$BOOT_ROOT set via environment or install.conf" # If /etc/machine-id is initialized we'll use it, otherwise we'll use a freshly # generated one. If the user configured an explicit machine ID to use in # /etc/machine-info to use for our purpose, we'll use that instead (for # compatibility). # shellcheck source=/dev/null if [ -z "$MACHINE_ID" ] && [ -r /etc/machine-info ] && . /etc/machine-info && MACHINE_ID="$KERNEL_INSTALL_MACHINE_ID"; then [ -n "$MACHINE_ID" ] && [ "$KERNEL_INSTALL_VERBOSE" -gt 0 ] && \ echo "machine-id $MACHINE_ID acquired from /etc/machine-info" fi if [ -z "$MACHINE_ID" ] && [ -r /etc/machine-id ] && read -r MACHINE_ID &2 exit 1 fi if ! [ -f "$1" ]; then echo "Error: kernel image argument $1 not a file" >&2 exit 1 fi if [ "$MAKE_ENTRY_DIR_ABS" -eq 0 ]; then # Compatibility with earlier versions that used the presence of $BOOT_ROOT/$ENTRY_TOKEN # to signal to 00-entry-directory to create $ENTRY_DIR_ABS # to serve as the indication to use or to not use the BLS if [ "$KERNEL_INSTALL_VERBOSE" -gt 0 ]; then echo "+mkdir -v -p $ENTRY_DIR_ABS" mkdir -v -p "$ENTRY_DIR_ABS" || exit 1 else mkdir -p "$ENTRY_DIR_ABS" || exit 1 fi fi for f in $PLUGINS; do if [ "$no_initrds" = 1 ]; then # kernel's install.sh invokes us as # /sbin/installkernel # We ignore the last two arguments. [ "$KERNEL_INSTALL_VERBOSE" -gt 0 ] && echo "+$f add $KERNEL_VERSION $ENTRY_DIR_ABS $1" "$f" add "$KERNEL_VERSION" "$ENTRY_DIR_ABS" "$1" else [ "$KERNEL_INSTALL_VERBOSE" -gt 0 ] && echo "+$f add $KERNEL_VERSION $ENTRY_DIR_ABS $*" "$f" add "$KERNEL_VERSION" "$ENTRY_DIR_ABS" "$@" fi err=$? [ $err -eq $skip_remaining ] && break [ $err -ne 0 ] && exit $err done ;; remove) for f in $PLUGINS; do [ "$KERNEL_INSTALL_VERBOSE" -gt 0 ] && echo "+$f remove $KERNEL_VERSION $ENTRY_DIR_ABS" "$f" remove "$KERNEL_VERSION" "$ENTRY_DIR_ABS" err=$? [ $err -eq $skip_remaining ] && break [ $err -ne 0 ] && exit $err done if [ "$MAKE_ENTRY_DIR_ABS" -eq 0 ]; then [ "$KERNEL_INSTALL_VERBOSE" -gt 0 ] && echo "Removing $ENTRY_DIR_ABS/" rm -rf "$ENTRY_DIR_ABS" fi ;; inspect) echo "KERNEL_INSTALL_MACHINE_ID: $KERNEL_INSTALL_MACHINE_ID" echo "KERNEL_INSTALL_ENTRY_TOKEN: $KERNEL_INSTALL_ENTRY_TOKEN" echo "KERNEL_INSTALL_BOOT_ROOT: $KERNEL_INSTALL_BOOT_ROOT" echo "KERNEL_INSTALL_LAYOUT: $KERNEL_INSTALL_LAYOUT" echo "KERNEL_INSTALL_INITRD_GENERATOR: $KERNEL_INSTALL_INITRD_GENERATOR" echo "ENTRY_DIR_ABS: $KERNEL_INSTALL_BOOT_ROOT/$ENTRY_TOKEN/\$KERNEL_VERSION" # Assert that ENTRY_DIR_ABS actually matches what we are printing here [ "${ENTRY_DIR_ABS%/*}" = "$KERNEL_INSTALL_BOOT_ROOT/$ENTRY_TOKEN" ] || { echo "Assertion didn't pass." >&2; exit 1; } ;; *) echo "Error: unknown command '$COMMAND'" >&2 exit 1 ;; esac exit "$ret"