]> git.ipfire.org Git - thirdparty/dracut.git/blame - 51-dracut-rescue.install
dracut_mkdir(): create parent directories as needed.
[thirdparty/dracut.git] / 51-dracut-rescue.install
CommitLineData
2fa6fd3a 1#!/bin/bash
d837ac39
HH
2
3export LANG=C
4
5COMMAND="$1"
6KERNEL_VERSION="$2"
8652d549
HH
7BOOT_DIR_ABS="${3%/*}/0-rescue"
8KERNEL_IMAGE="$4"
9
2fa6fd3a
HH
10
11dropindirs_sort()
12{
13 suffix=$1; shift
14 args=("$@")
15 files=$(
16 while (( $# > 0 )); do
17 for i in ${1}/*${suffix}; do
18 [[ -f $i ]] && echo ${i##*/}
19 done
20 shift
21 done | sort -Vu
22 )
23
24 for f in $files; do
25 for d in "${args[@]}"; do
26 if [[ -f "$d/$f" ]]; then
27 echo "$d/$f"
28 continue 2
29 fi
30 done
31 done
32}
d837ac39
HH
33
34[[ -f /etc/os-release ]] && . /etc/os-release
478aa7da 35
b71d162a
YW
36if [[ ${KERNEL_INSTALL_MACHINE_ID+x} ]]; then
37 MACHINE_ID=$KERNEL_INSTALL_MACHINE_ID
38elif [[ -f /etc/machine-id ]] ; then
39 read MACHINE_ID < /etc/machine-id
478aa7da
HH
40fi
41
b71d162a
YW
42if ! [[ $MACHINE_ID ]]; then
43 exit 0
44fi
478aa7da 45
d837ac39 46if [[ -f /etc/kernel/cmdline ]]; then
a6018700 47 read -r -d '' -a BOOT_OPTIONS < /etc/kernel/cmdline
a7d3ad67 48elif [[ -f /usr/lib/kernel/cmdline ]]; then
a6018700 49 read -r -d '' -a BOOT_OPTIONS < /usr/lib/kernel/cmdline
38b4f4b2 50else
b1c5cae6
ZJS
51 declare -a BOOT_OPTIONS
52
10e59202
HH
53 read -r -d '' -a line < /proc/cmdline
54 for i in "${line[@]}"; do
55 [[ "${i#initrd=*}" != "$i" ]] && continue
56 BOOT_OPTIONS+=("$i")
57 done
d837ac39 58fi
10e59202 59
f8c24964 60if [[ -d "${BOOT_DIR_ABS%/*}" ]]; then
b39b8452
JMC
61 BOOT_DIR="/${MACHINE_ID}/0-rescue"
62 BOOT_ROOT=${BOOT_DIR_ABS%$BOOT_DIR}
63 LOADER_ENTRY="$BOOT_ROOT/loader/entries/${MACHINE_ID}-0-rescue.conf"
64 KERNEL="linux"
65 INITRD="initrd"
66else
67 BLS_DIR="/boot/loader/entries"
b39b8452
JMC
68 BOOT_DIR_ABS="/boot"
69 LOADER_ENTRY="$BLS_DIR/${MACHINE_ID}-0-rescue.conf"
70 KERNEL="vmlinuz-0-rescue-${MACHINE_ID}"
71 INITRD="initramfs-0-rescue-${MACHINE_ID}.img"
72fi
d837ac39
HH
73
74ret=0
75
76case "$COMMAND" in
77 add)
b39b8452
JMC
78 [[ -f "$LOADER_ENTRY" ]] && [[ -f "$BOOT_DIR_ABS/$KERNEL" ]] \
79 && [[ -f "$BOOT_DIR_ABS/$INITRD" ]] && exit 0
d837ac39 80
2fa6fd3a
HH
81 # source our config dir
82 for f in $(dropindirs_sort ".conf" "/etc/dracut.conf.d" "/usr/lib/dracut/dracut.conf.d"); do
83 [[ -e $f ]] && . "$f"
84 done
85
86 [[ $dracut_rescue_image != "yes" ]] && exit 0
87
c0c6c74d
HH
88 [[ -d "$BOOT_DIR_ABS" ]] || mkdir -p "$BOOT_DIR_ABS"
89
b39b8452
JMC
90 if ! cp --reflink=auto "$KERNEL_IMAGE" "$BOOT_DIR_ABS/$KERNEL"; then
91 echo "Can't copy '$KERNEL_IMAGE to '$BOOT_DIR_ABS/$KERNEL'!" >&2
2fa6fd3a
HH
92 fi
93
b39b8452 94 if [[ ! -f "$BOOT_DIR_ABS/$INITRD" ]]; then
48c283a2 95 dracut -f --no-hostonly -a "rescue" "$BOOT_DIR_ABS/$INITRD" "$KERNEL_VERSION"
b39b8452
JMC
96 ((ret+=$?))
97 fi
98
f8c24964 99 if [[ "${BOOT_DIR_ABS}" != "/boot" ]]; then
b39b8452
JMC
100 {
101 echo "title $PRETTY_NAME - Rescue Image"
102 echo "version $KERNEL_VERSION"
103 echo "machine-id $MACHINE_ID"
104 echo "options ${BOOT_OPTIONS[@]} rd.auto=1"
105 echo "linux $BOOT_DIR/linux"
106 echo "initrd $BOOT_DIR/initrd"
107 } > $LOADER_ENTRY
108 else
109 cp -aT "${KERNEL_IMAGE%/*}/bls.conf" $LOADER_ENTRY
110 sed -i 's/'$KERNEL_VERSION'/0-rescue-'${MACHINE_ID}'/' $LOADER_ENTRY
111 fi
d837ac39 112
d837ac39 113 ((ret+=$?))
d837ac39
HH
114 ;;
115
116 remove)
2fa6fd3a 117 exit 0
d837ac39
HH
118 ;;
119
120 *)
121 usage
122 ret=1;;
123esac
124
d837ac39 125exit $ret