Skip to content

Commit c08bc81

Browse files
committed
fix(base): split out dracut-dev-lib.sh
To share the `wait_for_dev` function and use it without side effects on install time, split out the needed functions in an extra library.
1 parent b9b6f0e commit c08bc81

File tree

21 files changed

+145
-118
lines changed

21 files changed

+145
-118
lines changed

Diff for: modules.d/99base/dracut-dev-lib.sh

+119
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
#!/bin/sh
2+
3+
# get a systemd-compatible unit name from a path
4+
# (mimicks unit_name_from_path_instance())
5+
dev_unit_name() {
6+
local dev="$1"
7+
8+
if command -v systemd-escape > /dev/null; then
9+
systemd-escape -p -- "$dev"
10+
return $?
11+
fi
12+
13+
if [ "$dev" = "/" -o -z "$dev" ]; then
14+
printf -- "-"
15+
return 0
16+
fi
17+
18+
dev="${1%%/}"
19+
dev="${dev##/}"
20+
# shellcheck disable=SC1003
21+
dev="$(str_replace "$dev" '\' '\x5c')"
22+
dev="$(str_replace "$dev" '-' '\x2d')"
23+
if [ "${dev##.}" != "$dev" ]; then
24+
dev="\x2e${dev##.}"
25+
fi
26+
dev="$(str_replace "$dev" '/' '-')"
27+
28+
printf -- "%s" "$dev"
29+
}
30+
31+
# set_systemd_timeout_for_dev [-n] <dev> [<timeout>]
32+
# Set 'rd.timeout' as the systemd timeout for <dev>
33+
set_systemd_timeout_for_dev() {
34+
local _name
35+
local _needreload
36+
local _noreload
37+
local _timeout
38+
39+
[ -z "$DRACUT_SYSTEMD" ] && return 0
40+
41+
if [ "$1" = "-n" ]; then
42+
_noreload=1
43+
shift
44+
fi
45+
46+
if [ -n "$2" ]; then
47+
_timeout="$2"
48+
else
49+
_timeout=$(getarg rd.timeout)
50+
fi
51+
52+
_timeout=${_timeout:-0}
53+
54+
_name=$(dev_unit_name "$1")
55+
if ! [ -L "${PREFIX}/etc/systemd/system/initrd.target.wants/${_name}.device" ]; then
56+
[ -d "${PREFIX}"/etc/systemd/system/initrd.target.wants ] || mkdir -p "${PREFIX}"/etc/systemd/system/initrd.target.wants
57+
ln -s ../"${_name}".device "${PREFIX}/etc/systemd/system/initrd.target.wants/${_name}.device"
58+
type mark_hostonly > /dev/null 2>&1 && mark_hostonly /etc/systemd/system/initrd.target.wants/"${_name}".device
59+
_needreload=1
60+
fi
61+
62+
if ! [ -f "${PREFIX}/etc/systemd/system/${_name}.device.d/timeout.conf" ]; then
63+
mkdir -p "${PREFIX}/etc/systemd/system/${_name}.device.d"
64+
{
65+
echo "[Unit]"
66+
echo "JobTimeoutSec=$_timeout"
67+
echo "JobRunningTimeoutSec=$_timeout"
68+
} > "${PREFIX}/etc/systemd/system/${_name}.device.d/timeout.conf"
69+
type mark_hostonly > /dev/null 2>&1 && mark_hostonly /etc/systemd/system/"${_name}".device.d/timeout.conf
70+
_needreload=1
71+
fi
72+
73+
if [ -z "$PREFIX" ] && [ "$_needreload" = 1 ] && [ -z "$_noreload" ]; then
74+
/sbin/initqueue --onetime --unique --name daemon-reload systemctl daemon-reload
75+
fi
76+
}
77+
78+
# wait_for_dev <dev> [<timeout>]
79+
#
80+
# Installs a initqueue-finished script,
81+
# which will cause the main loop only to exit,
82+
# if the device <dev> is recognized by the system.
83+
wait_for_dev() {
84+
local _name
85+
local _noreload
86+
87+
if [ "$1" = "-n" ]; then
88+
_noreload=-n
89+
shift
90+
fi
91+
92+
_name="$(str_replace "$1" '/' '\x2f')"
93+
94+
type mark_hostonly > /dev/null 2>&1 && mark_hostonly "$hookdir/initqueue/finished/devexists-${_name}.sh"
95+
96+
[ -e "${PREFIX}$hookdir/initqueue/finished/devexists-${_name}.sh" ] && return 0
97+
98+
printf '[ -e "%s" ]\n' "$1" \
99+
>> "${PREFIX}$hookdir/initqueue/finished/devexists-${_name}.sh"
100+
{
101+
printf '[ -e "%s" ] || ' "$1"
102+
printf 'warn "\"%s\" does not exist"\n' "$1"
103+
} >> "${PREFIX}$hookdir/emergency/80-${_name}.sh"
104+
105+
set_systemd_timeout_for_dev $_noreload "$@"
106+
}
107+
108+
cancel_wait_for_dev() {
109+
local _name
110+
_name="$(str_replace "$1" '/' '\x2f')"
111+
rm -f -- "$hookdir/initqueue/finished/devexists-${_name}.sh"
112+
rm -f -- "$hookdir/emergency/80-${_name}.sh"
113+
if [ -n "$DRACUT_SYSTEMD" ]; then
114+
_name=$(dev_unit_name "$1")
115+
rm -f -- "${PREFIX}/etc/systemd/system/initrd.target.wants/${_name}.device"
116+
rm -f -- "${PREFIX}/etc/systemd/system/${_name}.device.d/timeout.conf"
117+
/sbin/initqueue --onetime --unique --name daemon-reload systemctl daemon-reload
118+
fi
119+
}

Diff for: modules.d/99base/dracut-lib.sh

+2-113
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#!/bin/sh
22

3+
type wait_for_dev > /dev/null 2>&1 || . /lib/dracut-dev-lib.sh
4+
35
export DRACUT_SYSTEMD
46
export NEWROOT
57
if [ -n "$NEWROOT" ]; then
@@ -838,119 +840,6 @@ wait_for_mount() {
838840
} >> "$hookdir/emergency/90-${_name}.sh"
839841
}
840842

841-
# get a systemd-compatible unit name from a path
842-
# (mimicks unit_name_from_path_instance())
843-
dev_unit_name() {
844-
local dev="$1"
845-
846-
if command -v systemd-escape > /dev/null; then
847-
systemd-escape -p -- "$dev"
848-
return
849-
fi
850-
851-
if [ "$dev" = "/" -o -z "$dev" ]; then
852-
printf -- "-"
853-
exit 0
854-
fi
855-
856-
dev="${1%%/}"
857-
dev="${dev##/}"
858-
# shellcheck disable=SC1003
859-
dev="$(str_replace "$dev" '\' '\x5c')"
860-
dev="$(str_replace "$dev" '-' '\x2d')"
861-
if [ "${dev##.}" != "$dev" ]; then
862-
dev="\x2e${dev##.}"
863-
fi
864-
dev="$(str_replace "$dev" '/' '-')"
865-
866-
printf -- "%s" "$dev"
867-
}
868-
869-
# set_systemd_timeout_for_dev <dev>
870-
# Set 'rd.timeout' as the systemd timeout for <dev>
871-
872-
set_systemd_timeout_for_dev() {
873-
local _name
874-
local _needreload
875-
local _noreload
876-
local _timeout
877-
878-
if [ "$1" = "-n" ]; then
879-
_noreload=1
880-
shift
881-
fi
882-
883-
_timeout=$(getarg rd.timeout)
884-
_timeout=${_timeout:-0}
885-
886-
if [ -n "$DRACUT_SYSTEMD" ]; then
887-
_name=$(dev_unit_name "$1")
888-
if ! [ -L "${PREFIX}/etc/systemd/system/initrd.target.wants/${_name}.device" ]; then
889-
[ -d "${PREFIX}"/etc/systemd/system/initrd.target.wants ] || mkdir -p "${PREFIX}"/etc/systemd/system/initrd.target.wants
890-
ln -s ../"${_name}".device "${PREFIX}/etc/systemd/system/initrd.target.wants/${_name}.device"
891-
type mark_hostonly > /dev/null 2>&1 && mark_hostonly /etc/systemd/system/initrd.target.wants/"${_name}".device
892-
_needreload=1
893-
fi
894-
895-
if ! [ -f "${PREFIX}/etc/systemd/system/${_name}.device.d/timeout.conf" ]; then
896-
mkdir -p "${PREFIX}/etc/systemd/system/${_name}.device.d"
897-
{
898-
echo "[Unit]"
899-
echo "JobTimeoutSec=$_timeout"
900-
echo "JobRunningTimeoutSec=$_timeout"
901-
} > "${PREFIX}/etc/systemd/system/${_name}.device.d/timeout.conf"
902-
type mark_hostonly > /dev/null 2>&1 && mark_hostonly /etc/systemd/system/"${_name}".device.d/timeout.conf
903-
_needreload=1
904-
fi
905-
906-
if [ -z "$PREFIX" ] && [ "$_needreload" = 1 ] && [ -z "$_noreload" ]; then
907-
/sbin/initqueue --onetime --unique --name daemon-reload systemctl daemon-reload
908-
fi
909-
fi
910-
}
911-
# wait_for_dev <dev>
912-
#
913-
# Installs a initqueue-finished script,
914-
# which will cause the main loop only to exit,
915-
# if the device <dev> is recognized by the system.
916-
wait_for_dev() {
917-
local _name
918-
local _noreload
919-
920-
if [ "$1" = "-n" ]; then
921-
_noreload=-n
922-
shift
923-
fi
924-
925-
_name="$(str_replace "$1" '/' '\x2f')"
926-
927-
type mark_hostonly > /dev/null 2>&1 && mark_hostonly "$hookdir/initqueue/finished/devexists-${_name}.sh"
928-
929-
[ -e "${PREFIX}$hookdir/initqueue/finished/devexists-${_name}.sh" ] && return 0
930-
931-
printf '[ -e "%s" ]\n' "$1" \
932-
>> "${PREFIX}$hookdir/initqueue/finished/devexists-${_name}.sh"
933-
{
934-
printf '[ -e "%s" ] || ' "$1"
935-
printf 'warn "\"%s\" does not exist"\n' "$1"
936-
} >> "${PREFIX}$hookdir/emergency/80-${_name}.sh"
937-
938-
set_systemd_timeout_for_dev $_noreload "$1"
939-
}
940-
941-
cancel_wait_for_dev() {
942-
local _name
943-
_name="$(str_replace "$1" '/' '\x2f')"
944-
rm -f -- "$hookdir/initqueue/finished/devexists-${_name}.sh"
945-
rm -f -- "$hookdir/emergency/80-${_name}.sh"
946-
if [ -n "$DRACUT_SYSTEMD" ]; then
947-
_name=$(dev_unit_name "$1")
948-
rm -f -- "${PREFIX}/etc/systemd/system/initrd.target.wants/${_name}.device"
949-
rm -f -- "${PREFIX}/etc/systemd/system/${_name}.device.d/timeout.conf"
950-
/sbin/initqueue --onetime --unique --name daemon-reload systemctl daemon-reload
951-
fi
952-
}
953-
954843
killproc() {
955844
debug_off
956845
local _exe

Diff for: modules.d/99base/module-setup.sh

+4-5
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ install() {
5050
mkdir -p "${initdir}"/tmp
5151

5252
inst_simple "$moddir/dracut-lib.sh" "/lib/dracut-lib.sh"
53+
inst_simple "$moddir/dracut-dev-lib.sh" "/lib/dracut-dev-lib.sh"
5354
mkdir -p "${initdir}"/var
5455

5556
if ! dracut_module_included "systemd"; then
@@ -117,10 +118,8 @@ install() {
117118
fi
118119
export PREFIX="$initdir"
119120

120-
# suppress getarg for `rd.memdebug`
121-
export DEBUG_MEM_LEVEL=0
122-
# shellcheck source=dracut-lib.sh
123-
. "$moddir/dracut-lib.sh"
121+
# shellcheck source=dracut-dev-lib.sh
122+
. "$moddir/dracut-dev-lib.sh"
124123

125124
for _dev in "${host_devs[@]}"; do
126125
for _dev2 in "${root_devs[@]}"; do
@@ -137,7 +136,7 @@ install() {
137136
_pdev=$(get_persistent_dev "$_dev")
138137

139138
case "$_pdev" in
140-
/dev/?*) wait_for_dev "$_pdev" ;;
139+
/dev/?*) wait_for_dev "$_pdev" 0 ;;
141140
*) ;;
142141
esac
143142
done

Diff for: test/TEST-01-BASIC/test.sh

+1
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ test_setup() {
4949
inst "$basedir/modules.d/35network-legacy/ifup.sh" "/sbin/ifup"
5050

5151
inst_simple "${basedir}/modules.d/99base/dracut-lib.sh" "/lib/dracut-lib.sh"
52+
inst_simple "${basedir}/modules.d/99base/dracut-dev-lib.sh" "/lib/dracut-dev-lib.sh"
5253
inst_binary "${basedir}/dracut-util" "/usr/bin/dracut-util"
5354
ln -s dracut-util "${initdir}/usr/bin/dracut-getarg"
5455
ln -s dracut-util "${initdir}/usr/bin/dracut-getargs"

Diff for: test/TEST-02-SYSTEMD/test.sh

+1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ test_setup() {
4848
inst "$basedir/modules.d/35network-legacy/ifup.sh" "/sbin/ifup"
4949

5050
inst_simple "${basedir}/modules.d/99base/dracut-lib.sh" "/lib/dracut-lib.sh"
51+
inst_simple "${basedir}/modules.d/99base/dracut-dev-lib.sh" "/lib/dracut-dev-lib.sh"
5152
inst_binary "${basedir}/dracut-util" "/usr/bin/dracut-util"
5253
ln -s dracut-util "${initdir}/usr/bin/dracut-getarg"
5354
ln -s dracut-util "${initdir}/usr/bin/dracut-getargs"

Diff for: test/TEST-03-USR-MOUNT/test.sh

+1
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ test_setup() {
6969
inst "$basedir/modules.d/35network-legacy/ifup.sh" "/sbin/ifup"
7070

7171
inst_simple "${basedir}/modules.d/99base/dracut-lib.sh" "/lib/dracut-lib.sh"
72+
inst_simple "${basedir}/modules.d/99base/dracut-dev-lib.sh" "/lib/dracut-dev-lib.sh"
7273
inst_binary "${basedir}/dracut-util" "/usr/bin/dracut-util"
7374
ln -s dracut-util "${initdir}/usr/bin/dracut-getarg"
7475
ln -s dracut-util "${initdir}/usr/bin/dracut-getargs"

Diff for: test/TEST-04-FULL-SYSTEMD/test.sh

+1
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ test_setup() {
9393
inst_multiple -o {,/usr}/lib/systemd/system/"dracut*"
9494

9595
inst_simple "${basedir}/modules.d/99base/dracut-lib.sh" "/lib/dracut-lib.sh"
96+
inst_simple "${basedir}/modules.d/99base/dracut-dev-lib.sh" "/lib/dracut-dev-lib.sh"
9697
inst_binary "${basedir}/dracut-util" "/usr/bin/dracut-util"
9798
ln -s dracut-util "${initdir}/usr/bin/dracut-getarg"
9899
ln -s dracut-util "${initdir}/usr/bin/dracut-getargs"

Diff for: test/TEST-10-RAID/test.sh

+1
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ test_setup() {
4646
inst_multiple -o ${_terminfodir}/l/linux
4747

4848
inst_simple "${basedir}/modules.d/99base/dracut-lib.sh" "/lib/dracut-lib.sh"
49+
inst_simple "${basedir}/modules.d/99base/dracut-dev-lib.sh" "/lib/dracut-dev-lib.sh"
4950
inst_binary "${basedir}/dracut-util" "/usr/bin/dracut-util"
5051
ln -s dracut-util "${initdir}/usr/bin/dracut-getarg"
5152
ln -s dracut-util "${initdir}/usr/bin/dracut-getargs"

Diff for: test/TEST-11-LVM/test.sh

+1
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ test_setup() {
5050
inst "$basedir/modules.d/35network-legacy/ifup.sh" "/sbin/ifup"
5151

5252
inst_simple "${basedir}/modules.d/99base/dracut-lib.sh" "/lib/dracut-lib.sh"
53+
inst_simple "${basedir}/modules.d/99base/dracut-dev-lib.sh" "/lib/dracut-dev-lib.sh"
5354
inst_binary "${basedir}/dracut-util" "/usr/bin/dracut-util"
5455
ln -s dracut-util "${initdir}/usr/bin/dracut-getarg"
5556
ln -s dracut-util "${initdir}/usr/bin/dracut-getargs"

Diff for: test/TEST-12-RAID-DEG/test.sh

+1
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ test_setup() {
8080
inst "$basedir/modules.d/35network-legacy/ifup.sh" "/sbin/ifup"
8181

8282
inst_simple "${basedir}/modules.d/99base/dracut-lib.sh" "/lib/dracut-lib.sh"
83+
inst_simple "${basedir}/modules.d/99base/dracut-dev-lib.sh" "/lib/dracut-dev-lib.sh"
8384
inst_binary "${basedir}/dracut-util" "/usr/bin/dracut-util"
8485
ln -s dracut-util "${initdir}/usr/bin/dracut-getarg"
8586
ln -s dracut-util "${initdir}/usr/bin/dracut-getargs"

Diff for: test/TEST-13-ENC-RAID-LVM/test.sh

+1
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ test_setup() {
7878
inst "$basedir/modules.d/35network-legacy/ifup.sh" "/sbin/ifup"
7979

8080
inst_simple "${basedir}/modules.d/99base/dracut-lib.sh" "/lib/dracut-lib.sh"
81+
inst_simple "${basedir}/modules.d/99base/dracut-dev-lib.sh" "/lib/dracut-dev-lib.sh"
8182
inst_binary "${basedir}/dracut-util" "/usr/bin/dracut-util"
8283
ln -s dracut-util "${initdir}/usr/bin/dracut-getarg"
8384
ln -s dracut-util "${initdir}/usr/bin/dracut-getargs"

Diff for: test/TEST-14-IMSM/test.sh

+1
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ test_setup() {
7575
inst "$basedir/modules.d/35network-legacy/ifup.sh" "/sbin/ifup"
7676

7777
inst_simple "${basedir}/modules.d/99base/dracut-lib.sh" "/lib/dracut-lib.sh"
78+
inst_simple "${basedir}/modules.d/99base/dracut-dev-lib.sh" "/lib/dracut-dev-lib.sh"
7879
inst_binary "${basedir}/dracut-util" "/usr/bin/dracut-util"
7980
ln -s dracut-util "${initdir}/usr/bin/dracut-getarg"
8081
ln -s dracut-util "${initdir}/usr/bin/dracut-getargs"

Diff for: test/TEST-15-BTRFSRAID/test.sh

+1
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ test_setup() {
5353
inst "$basedir/modules.d/35network-legacy/ifup.sh" "/sbin/ifup"
5454

5555
inst_simple "${basedir}/modules.d/99base/dracut-lib.sh" "/lib/dracut-lib.sh"
56+
inst_simple "${basedir}/modules.d/99base/dracut-dev-lib.sh" "/lib/dracut-dev-lib.sh"
5657
inst_binary "${basedir}/dracut-util" "/usr/bin/dracut-util"
5758
ln -s dracut-util "${initdir}/usr/bin/dracut-getarg"
5859
ln -s dracut-util "${initdir}/usr/bin/dracut-getargs"

Diff for: test/TEST-16-DMSQUASH/test.sh

+1
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ test_setup() {
8888
inst "$basedir/modules.d/35network-legacy/ifup.sh" "/sbin/ifup"
8989

9090
inst_simple "${basedir}/modules.d/99base/dracut-lib.sh" "/lib/dracut-lib.sh"
91+
inst_simple "${basedir}/modules.d/99base/dracut-dev-lib.sh" "/lib/dracut-dev-lib.sh"
9192
inst_binary "${basedir}/dracut-util" "/usr/bin/dracut-util"
9293
ln -s dracut-util "${initdir}/usr/bin/dracut-getarg"
9394
ln -s dracut-util "${initdir}/usr/bin/dracut-getargs"

Diff for: test/TEST-17-LVM-THIN/test.sh

+1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ test_setup() {
4848
inst "$basedir/modules.d/35network-legacy/ifup.sh" "/sbin/ifup"
4949

5050
inst_simple "${basedir}/modules.d/99base/dracut-lib.sh" "/lib/dracut-lib.sh"
51+
inst_simple "${basedir}/modules.d/99base/dracut-dev-lib.sh" "/lib/dracut-dev-lib.sh"
5152
inst_binary "${basedir}/dracut-util" "/usr/bin/dracut-util"
5253
ln -s dracut-util "${initdir}/usr/bin/dracut-getarg"
5354
ln -s dracut-util "${initdir}/usr/bin/dracut-getargs"

Diff for: test/TEST-20-NFS/test.sh

+1
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,7 @@ test_setup() {
320320
done
321321

322322
inst_simple "${basedir}/modules.d/99base/dracut-lib.sh" "/lib/dracut-lib.sh"
323+
inst_simple "${basedir}/modules.d/99base/dracut-dev-lib.sh" "/lib/dracut-dev-lib.sh"
323324
inst_binary "${basedir}/dracut-util" "/usr/bin/dracut-util"
324325
ln -s dracut-util "${initdir}/usr/bin/dracut-getarg"
325326
ln -s dracut-util "${initdir}/usr/bin/dracut-getargs"

Diff for: test/TEST-30-ISCSI/test.sh

+1
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@ test_setup() {
162162
inst_simple /etc/os-release
163163

164164
inst_simple "${basedir}/modules.d/99base/dracut-lib.sh" "/lib/dracut-lib.sh"
165+
inst_simple "${basedir}/modules.d/99base/dracut-dev-lib.sh" "/lib/dracut-dev-lib.sh"
165166
inst_binary "${basedir}/dracut-util" "/usr/bin/dracut-util"
166167
ln -s dracut-util "${initdir}/usr/bin/dracut-getarg"
167168
ln -s dracut-util "${initdir}/usr/bin/dracut-getargs"

Diff for: test/TEST-35-ISCSI-MULTI/test.sh

+1
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ test_setup() {
174174
inst_simple /etc/os-release
175175

176176
inst_simple "${basedir}/modules.d/99base/dracut-lib.sh" "/lib/dracut-lib.sh"
177+
inst_simple "${basedir}/modules.d/99base/dracut-dev-lib.sh" "/lib/dracut-dev-lib.sh"
177178
inst_binary "${basedir}/dracut-util" "/usr/bin/dracut-util"
178179
ln -s dracut-util "${initdir}/usr/bin/dracut-getarg"
179180
ln -s dracut-util "${initdir}/usr/bin/dracut-getargs"

0 commit comments

Comments
 (0)