chiark / gitweb /
kernel-install: add compat with 'installkernel'
[elogind.git] / src / kernel-install / kernel-install
index 16c06e08421da98de928095d4db4e7b743ce165d..9d3e75db08102dd582252be422654a2579208b93 100644 (file)
 # You should have received a copy of the GNU Lesser General Public License
 # along with systemd; If not, see <http://www.gnu.org/licenses/>.
 
-export LC_COLLATE=C
-
-COMMAND="$1"
-KERNEL_VERSION="$2"
-KERNEL_IMAGE="$3"
-
-[[ -f /etc/os-release ]] && . /etc/os-release
-if ! [[ $ID ]]; then
-    echo "Can't determine the name of your distribution. Please create /etc/os-release." >&2
-    echo "See man:os-release(5)" >&2
-    exit 1
-fi
-
-[[ -f /etc/machine-id ]] && read MACHINE_ID < /etc/machine-id
-if ! [[ $MACHINE_ID ]]; then
-    echo "Can't determine your machine id. Please create /etc/machine-id!" >&2
-    echo "See man:machine-id(5)" >&2
-    exit 1
-fi
-
-if [[ -f /etc/kernel/cmdline ]]; then
-    readarray -t BOOT_OPTIONS < /etc/kernel/cmdline
-fi
-
-if ! [[ "${BOOT_OPTIONS[@]}" ]]; then
-    readarray -t BOOT_OPTIONS < /proc/cmdline
-fi
-
-if ! [[ $BOOT_OPTIONS ]]; then
-    echo "Can't determine the kernel command line parameters." >&2
-    echo "Please specify the kernel command line in /etc/kernel/cmdline!" >&2
-    exit 1
-fi
-
 usage()
 {
-    {
-        echo "Usage:"
-        echo "        $0 add <kernel-version> <kernel-image>"
-        echo "        $0 remove <kernel-version> <kernel-image>"
-    } >&2
+    echo "Usage:" >&2
+    echo "        $0 add <kernel-version> <kernel-image>" >&2
+    echo "        $0 remove <kernel-version> <kernel-image>" >&2
 }
 
-if ! ( [[ $COMMAND ]] && [[ $KERNEL_VERSION ]] && [[ $KERNEL_IMAGE ]] ); then
-    usage
-    exit 1
-fi
-
-BOOT_DIR="/${MACHINE_ID}/${KERNEL_VERSION}"
-BOOT_DIR_ABS="/boot${BOOT_DIR}"
-LOADER_ENTRY="/boot/loader/entries/${MACHINE_ID}-${KERNEL_VERSION}.conf"
-ret=0
-
 dropindirs_sort()
 {
-    suffix=$1; shift
-    readarray -t files< <(
+    local suffix=$1; shift
+    local -a files
+    local f d i
+
+    readarray -t files < <(
         for d in "$@"; do
-            for i in "${d}/"*${suffix}; do
-                [[ -e $i ]] && echo ${i##*/}
+            for i in "$d/"*"$suffix"; do
+                if [[ -e "$i" ]]; then
+                    echo "${i##*/}"
+                fi
             done
         done | sort -Vu
     )
@@ -93,60 +52,78 @@ dropindirs_sort()
     done
 }
 
+export LC_COLLATE=C
+
+if [[ "${0##*/}" == 'installkernel' ]]; then
+    COMMAND='add'
+else
+    COMMAND="$1"
+    shift
+fi
+
+KERNEL_VERSION="$1"
+KERNEL_IMAGE="$2"
+
+if [[ -f /etc/machine-id ]]; then
+    read MACHINE_ID < /etc/machine-id
+fi
+
+if ! [[ $MACHINE_ID ]]; then
+    echo "Could not determine your machine ID from /etc/machine-id." >&2
+    echo "Please run 'systemd-machine-id-setup' as root. See man:machine-id(5)" >&2
+    exit 1
+fi
+
+if [[ ! $COMMAND ]] || [[ ! $KERNEL_VERSION ]]; then
+    usage
+    exit 1
+fi
+
+BOOT_DIR_ABS="/boot/$MACHINE_ID/$KERNEL_VERSION"
+ret=0
+
 readarray -t PLUGINS < <(
     dropindirs_sort ".install" \
         "/etc/kernel/install.d" \
         "/usr/lib/kernel/install.d"
 )
 
-case "$COMMAND" in
+case $COMMAND in
     add)
-        mkdir -p "$BOOT_DIR_ABS" || exit 1
-
-        for f in "${PLUGINS[@]}"; do
-            [[ -x $f ]] && "$f" add "$KERNEL_VERSION" "$BOOT_DIR_ABS"
-            ((ret+=$?))
-        done
-
-        if ! cp --preserve "$KERNEL_IMAGE" "$BOOT_DIR_ABS"/linux; then
-            echo "Can't copy '$KERNEL_IMAGE to '$BOOT_DIR_ABS/linux'!" >&2
+        if [[ ! $KERNEL_IMAGE ]]; then
+            usage
+            exit 1
         fi
 
-        [[ -d /boot/loader/entries ]] || mkdir -p /boot/loader/entries
-
-        {
-            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
+        mkdir -p "$BOOT_DIR_ABS" || {
+            echo "Could not create boot directory '$BOOT_DIR_ABS'." >&2
+            exit 1
+        }
 
-        ((ret+=$?))
-
-        if ! [[ -f $LOADER_ENTRY ]]; then
-            echo "Could not create '$LOADER_ENTRY'!" >&2
-        fi
+        for f in "${PLUGINS[@]}"; do
+            if [[ -x $f ]]; then
+                "$f" add "$KERNEL_VERSION" "$BOOT_DIR_ABS" "$KERNEL_IMAGE"
+                ((ret+=$?))
+            fi
+        done
         ;;
 
     remove)
         for f in "${PLUGINS[@]}"; do
-            [[ -x $f ]] && "$f" remove "$KERNEL_VERSION" "$BOOT_DIR_ABS"
-            ((ret+=$?))
+            if [[ -x $f ]]; then
+                "$f" remove "$KERNEL_VERSION" "$BOOT_DIR_ABS"
+                ((ret+=$?))
+            fi
         done
 
-        rm -fr "$BOOT_DIR_ABS"
-        rm -f "$LOADER_ENTRY"
+        rm -rf "$BOOT_DIR_ABS"
+        ((ret+=$?))
         ;;
 
     *)
         usage
-        ret=1;;
+        exit 1
+        ;;
 esac
 
-((ret+=$?))
-
 exit $ret