dracut: use /bin/sh instead of bash as the intepreter
Despite that dracut has a hard dependency on bash,
its modules doesn't, dracut only has a hard dependency on bash for
module-setup (on a fully usable machine). Inside initramfs, dracut
allows users choose from a list of handful other shells, e.g. bash,
busybox, dash, mkfsh.
In fact, my local machine's initramfs is being built with dash,
and it's functional for a very long time.
Before 64025fa3a (Silence 'make checkbashisms', 2020-08-20), we also
allows our users to have that right, too.
Let's fix the problem 'make checkbashisms' reported and allows our users
to have that right, again.
For 'plymouth' case, let's simply run the command inside the if instead
of checking for the existence of command before running it, because the
status is also failture if plymouth is unavailable.
While we're at it, let's remove an unnecessary fork for grep in
zfs-generator.sh.in and its following complicated 'if elif fi' with
a simple 'case ... esac'.
To support this change, also exclude 90zfs from "make checkbashisms"
because the current CI infrastructure ships an old version of
"checkbashisms", which complains about "command -v", while the current
latest "checkbashisms" thinks it's fine. In the near future, we can
revert that change to "Makefile.am" when CI infrastructure is updated.
Reviewed-by: Gabriel A. Devenyi <gdevenyi@gmail.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Đoàn Trần Công Danh <congdanhqx@gmail.com>
Closes #11244
2020-11-28 19:02:08 +00:00
|
|
|
#!/bin/sh
|
2015-02-15 19:28:42 +00:00
|
|
|
|
2015-02-16 09:16:46 +00:00
|
|
|
command -v getarg >/dev/null || . /lib/dracut-lib.sh
|
2016-04-24 11:35:44 +00:00
|
|
|
command -v getargbool >/dev/null || {
|
|
|
|
# Compatibility with older Dracut versions.
|
|
|
|
# With apologies to the Dracut developers.
|
|
|
|
getargbool() {
|
2018-02-22 01:54:54 +00:00
|
|
|
if ! [ -z "$_b" ]; then
|
|
|
|
unset _b
|
|
|
|
fi
|
2016-04-24 11:35:44 +00:00
|
|
|
_default="$1"; shift
|
|
|
|
_b=$(getarg "$@")
|
2018-02-22 01:54:54 +00:00
|
|
|
[ $? -ne 0 ] && [ -z "$_b" ] && _b="$_default"
|
2016-04-24 11:35:44 +00:00
|
|
|
if [ -n "$_b" ]; then
|
2018-02-22 01:54:54 +00:00
|
|
|
[ "$_b" = "0" ] && return 1
|
|
|
|
[ "$_b" = "no" ] && return 1
|
|
|
|
[ "$_b" = "off" ] && return 1
|
2016-04-24 11:35:44 +00:00
|
|
|
fi
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
}
|
2015-02-15 19:28:42 +00:00
|
|
|
|
|
|
|
OLDIFS="${IFS}"
|
|
|
|
NEWLINE="
|
|
|
|
"
|
|
|
|
|
|
|
|
ZPOOL_IMPORT_OPTS=""
|
|
|
|
if getargbool 0 zfs_force -y zfs.force -y zfsforce ; then
|
2018-02-22 01:54:54 +00:00
|
|
|
warn "ZFS: Will force-import pools if necessary."
|
|
|
|
ZPOOL_IMPORT_OPTS="${ZPOOL_IMPORT_OPTS} -f"
|
2015-02-15 19:28:42 +00:00
|
|
|
fi
|
|
|
|
|
|
|
|
# find_bootfs
|
|
|
|
# returns the first dataset with the bootfs attribute.
|
|
|
|
find_bootfs() {
|
2018-02-22 01:54:54 +00:00
|
|
|
IFS="${NEWLINE}"
|
|
|
|
for dataset in $(zpool list -H -o bootfs); do
|
|
|
|
case "${dataset}" in
|
|
|
|
"" | "-")
|
|
|
|
continue
|
|
|
|
;;
|
|
|
|
"no pools available")
|
|
|
|
IFS="${OLDIFS}"
|
|
|
|
return 1
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
IFS="${OLDIFS}"
|
|
|
|
echo "${dataset}"
|
|
|
|
return 0
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
|
|
|
|
IFS="${OLDIFS}"
|
|
|
|
return 1
|
2015-02-15 19:28:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
# import_pool POOL
|
|
|
|
# imports the given zfs pool if it isn't imported already.
|
|
|
|
import_pool() {
|
2018-02-22 01:54:54 +00:00
|
|
|
pool="${1}"
|
2015-02-15 19:28:42 +00:00
|
|
|
|
2018-02-22 01:54:54 +00:00
|
|
|
if ! zpool list -H "${pool}" > /dev/null 2>&1; then
|
|
|
|
info "ZFS: Importing pool ${pool}..."
|
|
|
|
if ! zpool import -N ${ZPOOL_IMPORT_OPTS} "${pool}" ; then
|
|
|
|
warn "ZFS: Unable to import pool ${pool}"
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
fi
|
2015-02-15 19:28:42 +00:00
|
|
|
|
2018-02-22 01:54:54 +00:00
|
|
|
return 0
|
2015-02-15 19:28:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
# mount_dataset DATASET
|
|
|
|
# mounts the given zfs dataset.
|
|
|
|
mount_dataset() {
|
2018-02-22 01:54:54 +00:00
|
|
|
dataset="${1}"
|
|
|
|
mountpoint="$(zfs get -H -o value mountpoint "${dataset}")"
|
2015-02-15 19:28:42 +00:00
|
|
|
|
2018-02-22 01:54:54 +00:00
|
|
|
# We need zfsutil for non-legacy mounts and not for legacy mounts.
|
|
|
|
if [ "${mountpoint}" = "legacy" ] ; then
|
|
|
|
mount -t zfs "${dataset}" "${NEWROOT}"
|
|
|
|
else
|
|
|
|
mount -o zfsutil -t zfs "${dataset}" "${NEWROOT}"
|
|
|
|
fi
|
2015-02-15 19:28:42 +00:00
|
|
|
|
2018-02-22 01:54:54 +00:00
|
|
|
return $?
|
2015-02-15 19:28:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
# export_all OPTS
|
|
|
|
# exports all imported zfs pools.
|
|
|
|
export_all() {
|
2018-02-22 01:54:54 +00:00
|
|
|
opts="${@}"
|
|
|
|
ret=0
|
|
|
|
|
|
|
|
IFS="${NEWLINE}"
|
|
|
|
for pool in $(zpool list -H -o name) ; do
|
|
|
|
if zpool list -H "${pool}" > /dev/null 2>&1; then
|
|
|
|
zpool export "${pool}" ${opts} || ret=$?
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
IFS="${OLDIFS}"
|
|
|
|
|
|
|
|
return ${ret}
|
2015-02-15 19:28:42 +00:00
|
|
|
}
|
2018-02-20 18:13:20 +00:00
|
|
|
|
|
|
|
# ask_for_password
|
|
|
|
#
|
|
|
|
# Wraps around plymouth ask-for-password and adds fallback to tty password ask
|
|
|
|
# if plymouth is not present.
|
|
|
|
#
|
|
|
|
# --cmd command
|
|
|
|
# Command to execute. Required.
|
|
|
|
# --prompt prompt
|
|
|
|
# Password prompt. Note that function already adds ':' at the end.
|
|
|
|
# Recommended.
|
|
|
|
# --tries n
|
|
|
|
# How many times repeat command on its failure. Default is 3.
|
|
|
|
# --ply-[cmd|prompt|tries]
|
|
|
|
# Command/prompt/tries specific for plymouth password ask only.
|
|
|
|
# --tty-[cmd|prompt|tries]
|
|
|
|
# Command/prompt/tries specific for tty password ask only.
|
|
|
|
# --tty-echo-off
|
|
|
|
# Turn off input echo before tty command is executed and turn on after.
|
|
|
|
# It's useful when password is read from stdin.
|
|
|
|
ask_for_password() {
|
2018-02-22 01:54:54 +00:00
|
|
|
ply_tries=3
|
|
|
|
tty_tries=3
|
|
|
|
while [ "$#" -gt 0 ]; do
|
2018-02-20 18:13:20 +00:00
|
|
|
case "$1" in
|
|
|
|
--cmd) ply_cmd="$2"; tty_cmd="$2"; shift;;
|
|
|
|
--ply-cmd) ply_cmd="$2"; shift;;
|
|
|
|
--tty-cmd) tty_cmd="$2"; shift;;
|
|
|
|
--prompt) ply_prompt="$2"; tty_prompt="$2"; shift;;
|
|
|
|
--ply-prompt) ply_prompt="$2"; shift;;
|
|
|
|
--tty-prompt) tty_prompt="$2"; shift;;
|
|
|
|
--tries) ply_tries="$2"; tty_tries="$2"; shift;;
|
|
|
|
--ply-tries) ply_tries="$2"; shift;;
|
|
|
|
--tty-tries) tty_tries="$2"; shift;;
|
|
|
|
--tty-echo-off) tty_echo_off=yes;;
|
|
|
|
esac
|
|
|
|
shift
|
|
|
|
done
|
|
|
|
|
|
|
|
{ flock -s 9;
|
|
|
|
# Prompt for password with plymouth, if installed and running.
|
dracut: use /bin/sh instead of bash as the intepreter
Despite that dracut has a hard dependency on bash,
its modules doesn't, dracut only has a hard dependency on bash for
module-setup (on a fully usable machine). Inside initramfs, dracut
allows users choose from a list of handful other shells, e.g. bash,
busybox, dash, mkfsh.
In fact, my local machine's initramfs is being built with dash,
and it's functional for a very long time.
Before 64025fa3a (Silence 'make checkbashisms', 2020-08-20), we also
allows our users to have that right, too.
Let's fix the problem 'make checkbashisms' reported and allows our users
to have that right, again.
For 'plymouth' case, let's simply run the command inside the if instead
of checking for the existence of command before running it, because the
status is also failture if plymouth is unavailable.
While we're at it, let's remove an unnecessary fork for grep in
zfs-generator.sh.in and its following complicated 'if elif fi' with
a simple 'case ... esac'.
To support this change, also exclude 90zfs from "make checkbashisms"
because the current CI infrastructure ships an old version of
"checkbashisms", which complains about "command -v", while the current
latest "checkbashisms" thinks it's fine. In the near future, we can
revert that change to "Makefile.am" when CI infrastructure is updated.
Reviewed-by: Gabriel A. Devenyi <gdevenyi@gmail.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Đoàn Trần Công Danh <congdanhqx@gmail.com>
Closes #11244
2020-11-28 19:02:08 +00:00
|
|
|
if plymouth --ping 2>/dev/null; then
|
2018-02-20 18:13:20 +00:00
|
|
|
plymouth ask-for-password \
|
2018-02-22 01:54:54 +00:00
|
|
|
--prompt "$ply_prompt" --number-of-tries="$ply_tries" \
|
2018-02-20 18:13:20 +00:00
|
|
|
--command="$ply_cmd"
|
|
|
|
ret=$?
|
|
|
|
else
|
|
|
|
if [ "$tty_echo_off" = yes ]; then
|
|
|
|
stty_orig="$(stty -g)"
|
|
|
|
stty -echo
|
|
|
|
fi
|
|
|
|
|
2018-02-22 01:54:54 +00:00
|
|
|
i=1
|
|
|
|
while [ "$i" -le "$tty_tries" ]; do
|
2018-02-20 18:13:20 +00:00
|
|
|
[ -n "$tty_prompt" ] && \
|
2018-02-22 01:54:54 +00:00
|
|
|
printf "%s [%i/%i]:" "$tty_prompt" "$i" "$tty_tries" >&2
|
2018-02-20 18:13:20 +00:00
|
|
|
eval "$tty_cmd" && ret=0 && break
|
|
|
|
ret=$?
|
2018-02-22 01:54:54 +00:00
|
|
|
i=$((i+1))
|
2018-02-20 18:13:20 +00:00
|
|
|
[ -n "$tty_prompt" ] && printf '\n' >&2
|
|
|
|
done
|
2018-02-22 01:54:54 +00:00
|
|
|
unset i
|
|
|
|
[ "$tty_echo_off" = yes ] && stty "$stty_orig"
|
2018-02-20 18:13:20 +00:00
|
|
|
fi
|
|
|
|
} 9>/.console_lock
|
|
|
|
|
|
|
|
[ $ret -ne 0 ] && echo "Wrong password" >&2
|
|
|
|
return $ret
|
|
|
|
}
|