# $3 = version b
vercmp() {
local _n1
- read -a _n1 <<< "${1//./ }"
+ read -r -a _n1 <<< "${1//./ }"
local _op=$2
local _n2
- read -a _n2 <<< "${3//./ }"
+ read -r -a _n2 <<< "${3//./ }"
local _i _res
for ((_i = 0; ; _i++)); do
# $ normalize_path ///test/test//
# /test/test
normalize_path() {
+ # shellcheck disable=SC2064
+ trap "$(shopt -p extglob)" RETURN
shopt -q -s extglob
- set -- "${1//+(\/)//}"
- shopt -q -u extglob
- printf "%s\n" "${1%/}"
+ local p=${1//+(\/)//}
+ printf "%s\n" "${p%/}"
}
# convert_abs_rel <from> <to>
return
}
- read -d '/' -r -a __current <<< "$1"
- read -d '/' -a __absolute <<< "$2"
+ IFS=/ read -r -a __current <<< "$1"
+ IFS=/ read -r -a __absolute <<< "$2"
__abssize=${#__absolute[@]}
__cursize=${#__current[@]}
[[ $1 ]] || return
unset ID_FS_TYPE
ID_FS_TYPE=$(blkid -u filesystem -o export -- "$1" \
- | while read line || [ -n "$line" ]; do
- if [[ $line == TYPE\=* ]]; then
+ | while read -r line || [ -n "$line" ]; do
+ if [[ $line == "TYPE="* ]]; then
printf "%s" "${line#TYPE=}"
exit 0
fi
if [[ $use_fstab != yes ]]; then
[[ -d $_find_mpt/. ]]
findmnt -e -v -n -o 'MAJ:MIN,SOURCE' --target "$_find_mpt" | {
- while read _majmin _dev || [ -n "$_dev" ]; do
+ while read -r _majmin _dev || [ -n "$_dev" ]; do
if [[ -b $_dev ]]; then
if ! [[ $_majmin ]] || [[ $_majmin == 0:* ]]; then
- _majmin=$(get_maj_min $_dev)
+ _majmin=$(get_maj_min "$_dev")
fi
if [[ $_majmin ]]; then
printf "%s\n" "$_majmin"
# fall back to /etc/fstab
findmnt -e --fstab -v -n -o 'MAJ:MIN,SOURCE' --target "$_find_mpt" | {
- while read _majmin _dev || [ -n "$_dev" ]; do
+ while read -r _majmin _dev || [ -n "$_dev" ]; do
if ! [[ $_dev ]]; then
_dev="$_majmin"
unset _majmin
fi
if [[ -b $_dev ]]; then
- [[ $_majmin ]] || _majmin=$(get_maj_min $_dev)
+ [[ $_majmin ]] || _majmin=$(get_maj_min "$_dev")
if [[ $_majmin ]]; then
printf "%s\n" "$_majmin"
else
if [[ $use_fstab != yes ]]; then
findmnt -e -v -n -o 'FSTYPE' --target "$1" | {
- while read _fs || [ -n "$_fs" ]; do
+ while read -r _fs || [ -n "$_fs" ]; do
[[ $_fs ]] || continue
[[ $_fs == "autofs" ]] && continue
printf "%s" "$_fs"
fi
findmnt --fstab -e -v -n -o 'FSTYPE' --target "$1" | {
- while read _fs || [ -n "$_fs" ]; do
+ while read -r _fs || [ -n "$_fs" ]; do
[[ $_fs ]] || continue
[[ $_fs == "autofs" ]] && continue
printf "%s" "$_fs"
if [[ $use_fstab != yes ]]; then
findmnt -e -v -n -o 'FSTYPE' --source "$_find_dev" | {
- while read _fs || [ -n "$_fs" ]; do
+ while read -r _fs || [ -n "$_fs" ]; do
[[ $_fs ]] || continue
[[ $_fs == "autofs" ]] && continue
printf "%s" "$_fs"
fi
findmnt --fstab -e -v -n -o 'FSTYPE' --source "$_find_dev" | {
- while read _fs || [ -n "$_fs" ]; do
+ while read -r _fs || [ -n "$_fs" ]; do
[[ $_fs ]] || continue
[[ $_fs == "autofs" ]] && continue
printf "%s" "$_fs"
check_block_and_slaves() {
local _x
[[ -b /dev/block/$2 ]] || return 1 # Not a block device? So sorry.
- if ! lvm_internal_dev $2; then "$1" $2 && return; fi
+ if ! lvm_internal_dev "$2"; then "$1" "$2" && return; fi
check_vol_slaves "$@" && return 0
if [[ -f /sys/dev/block/$2/../dev ]] && [[ /sys/dev/block/$2/../subsystem -ef /sys/class/block ]]; then
- check_block_and_slaves $1 $(< "/sys/dev/block/$2/../dev") && return 0
+ check_block_and_slaves "$1" "$(< "/sys/dev/block/$2/../dev")" && return 0
fi
- for _x in /sys/dev/block/$2/slaves/*; do
+ for _x in /sys/dev/block/"$2"/slaves/*; do
[[ -f $_x/dev ]] || continue
[[ $_x/subsystem -ef /sys/class/block ]] || continue
- check_block_and_slaves $1 $(< "$_x/dev") && return 0
+ check_block_and_slaves "$1" "$(< "$_x/dev")" && return 0
done
return 1
}
check_block_and_slaves_all() {
local _x _ret=1
[[ -b /dev/block/$2 ]] || return 1 # Not a block device? So sorry.
- if ! lvm_internal_dev $2 && "$1" $2; then
+ if ! lvm_internal_dev "$2" && "$1" "$2"; then
_ret=0
fi
check_vol_slaves_all "$@" && return 0
if [[ -f /sys/dev/block/$2/../dev ]] && [[ /sys/dev/block/$2/../subsystem -ef /sys/class/block ]]; then
- check_block_and_slaves_all $1 $(< "/sys/dev/block/$2/../dev") && _ret=0
+ check_block_and_slaves_all "$1" "$(< "/sys/dev/block/$2/../dev")" && _ret=0
fi
- for _x in /sys/dev/block/$2/slaves/*; do
+ for _x in /sys/dev/block/"$2"/slaves/*; do
[[ -f $_x/dev ]] || continue
[[ $_x/subsystem -ef /sys/class/block ]] || continue
- check_block_and_slaves_all $1 $(< "$_x/dev") && _ret=0
+ check_block_and_slaves_all "$1" "$(< "$_x/dev")" && _ret=0
done
return $_ret
}
for _dev in "${host_devs[@]}"; do
[[ -b $_dev ]] || continue
- if check_block_and_slaves_all $_func $(get_maj_min $_dev); then
+ if check_block_and_slaves_all "$_func" "$(get_maj_min "$_dev")"; then
_ret=0
fi
done
for _dev in "${host_devs[@]}"; do
[[ -b $_dev ]] || continue
- check_block_and_slaves $_func $(get_maj_min $_dev) && return 0
+ check_block_and_slaves "$_func" "$(get_maj_min "$_dev")" && return 0
done
return 1
}
# but you cannot create the logical volume without the volume group.
# And the volume group might be bigger than the devices the LV needs.
check_vol_slaves() {
- local _lv _vg _pv _dm _majmin
+ local _vg _pv _dm _majmin
_majmin="$2"
- _lv="/dev/block/$_majmin"
_dm=/sys/dev/block/$_majmin/dm
- [[ -f $_dm/uuid && $(< $_dm/uuid) =~ LVM-* ]] || return 1
- _vg=$(dmsetup splitname --noheadings -o vg_name $(< "$_dm/name"))
+ [[ -f $_dm/uuid && $(< "$_dm"/uuid) =~ LVM-* ]] || return 1
+ _vg=$(dmsetup splitname --noheadings -o vg_name "$(< "$_dm/name")")
# strip space
_vg="${_vg//[[:space:]]/}"
if [[ $_vg ]]; then
for _pv in $(lvm vgs --noheadings -o pv_name "$_vg" 2> /dev/null); do
- check_block_and_slaves $1 $(get_maj_min $_pv) && return 0
+ check_block_and_slaves "$1" "$(get_maj_min "$_pv")" && return 0
done
fi
return 1
}
check_vol_slaves_all() {
- local _lv _vg _pv _majmin
+ local _vg _pv _majmin
_majmin="$2"
- _lv="/dev/block/$_majmin"
_dm="/sys/dev/block/$_majmin/dm"
- [[ -f $_dm/uuid && $(< $_dm/uuid) =~ LVM-* ]] || return 1
- _vg=$(dmsetup splitname --noheadings -o vg_name $(< "$_dm/name"))
+ [[ -f $_dm/uuid && $(< "$_dm"/uuid) =~ LVM-* ]] || return 1
+ _vg=$(dmsetup splitname --noheadings -o vg_name "$(< "$_dm/name")")
# strip space
_vg="${_vg//[[:space:]]/}"
if [[ $_vg ]]; then
# when filter/global_filter is set, lvm may be failed
- lvm lvs --noheadings -o vg_name $_vg 2> /dev/null 1> /dev/null
- if [ $? -ne 0 ]; then
+ if ! lvm lvs --noheadings -o vg_name "$_vg" 2> /dev/null 1> /dev/null; then
return 1
fi
for _pv in $(lvm vgs --noheadings -o pv_name "$_vg" 2> /dev/null); do
- check_block_and_slaves_all $1 $(get_maj_min $_pv)
+ check_block_and_slaves_all "$1" "$(get_maj_min "$_pv")"
done
return 0
fi
local _option=$2
local OLDIFS="$IFS"
IFS=,
+ # shellcheck disable=SC2086
set -- $_fsopts
IFS="$OLDIFS"
while [ $# -gt 0 ]; do
case $1 in
$_option=*)
- echo ${1#${_option}=}
+ echo "${1#${_option}=}"
break
;;
esac
# 0 if the kernel module is either built-in or available
# 1 if the kernel module is not enabled
check_kernel_module() {
- modprobe -S $kernel --dry-run $1 &> /dev/null || return 1
+ modprobe -S "$kernel" --dry-run "$1" &> /dev/null || return 1
}
# get_cpu_vendor
# get_host_ucode
# Get the hosts' ucode file based on the /proc/cpuinfo
get_ucode_file() {
- local family=$(grep -E "cpu family" /proc/cpuinfo | head -1 | sed s/.*:\ //)
- local model=$(grep -E "model" /proc/cpuinfo | grep -v name | head -1 | sed s/.*:\ //)
- local stepping=$(grep -E "stepping" /proc/cpuinfo | head -1 | sed s/.*:\ //)
+ local family
+ local model
+ local stepping
+ family=$(grep -E "cpu family" /proc/cpuinfo | head -1 | sed s/.*:\ //)
+ model=$(grep -E "model" /proc/cpuinfo | grep -v name | head -1 | sed s/.*:\ //)
+ stepping=$(grep -E "stepping" /proc/cpuinfo | head -1 | sed s/.*:\ //)
if [[ "$(get_cpu_vendor)" == "AMD" ]]; then
if [[ $family -ge 21 ]]; then
- printf "microcode_amd_fam%xh.bin" $family
+ printf "microcode_amd_fam%xh.bin" "$family"
else
printf "microcode_amd.bin"
fi
fi
if [[ "$(get_cpu_vendor)" == "Intel" ]]; then
# The /proc/cpuinfo are in decimal.
- printf "%02x-%02x-%02x" ${family} ${model} ${stepping}
+ printf "%02x-%02x-%02x" "${family}" "${model}" "${stepping}"
fi
}
# If it is an LVM device, touch only devices which have /dev/VG/LV symlink.
lvm_internal_dev() {
local dev_dm_dir=/sys/dev/block/$1/dm
- [[ ! -f $dev_dm_dir/uuid || $(< $dev_dm_dir/uuid) != LVM-* ]] && return 1 # Not an LVM device
+ [[ ! -f $dev_dm_dir/uuid || $(< "$dev_dm_dir"/uuid) != LVM-* ]] && return 1 # Not an LVM device
local DM_VG_NAME DM_LV_NAME DM_LV_LAYER
- eval $(dmsetup splitname --nameprefixes --noheadings --rows "$(< $dev_dm_dir/name)" 2> /dev/null)
+ eval "$(dmsetup splitname --nameprefixes --noheadings --rows "$(< "$dev_dm_dir"/name)" 2> /dev/null)"
[[ ${DM_VG_NAME} ]] && [[ ${DM_LV_NAME} ]] || return 0 # Better skip this!
[[ ${DM_LV_LAYER} ]] || [[ ! -L /dev/${DM_VG_NAME}/${DM_LV_NAME} ]]
}
btrfs_devs() {
local _mp="$1"
btrfs device usage "$_mp" \
- | while read _dev _rest; do
+ | while read -r _dev _; do
str_starts "$_dev" "/" || continue
_dev=${_dev%,}
printf -- "%s\n" "$_dev"
}
iface_for_remote_addr() {
+ # shellcheck disable=SC2046
set -- $(ip -o route get to "$1")
- echo $3
+ echo "$3"
}
local_addr_for_remote_addr() {
+ # shellcheck disable=SC2046
set -- $(ip -o route get to "$1")
- echo $5
+ echo "$5"
}
peer_for_addr() {
# remote address can be reached
ip_params_for_remote_addr() {
local remote_addr=$1
- local ifname local_addr peer netmask= gateway ifmac
+ local ifname local_addr peer netmask gateway ifmac
[[ $remote_addr ]] || return 1
ifname=$(iface_for_remote_addr "$remote_addr")
until [[ -d "$_dir/sys" ]]; do
_dir="$_dir/.."
if [[ -d "$_dir/subsystem" ]]; then
- subsystem=$(basename $(readlink $_dir/subsystem))
+ subsystem=$(basename "$(readlink "$_dir"/subsystem)")
[[ $subsystem == "fcoe" ]] && return 0
fi
done
# $1 = type of hook, $2 = hook priority (lower runs first), $3 = hook
# All hooks should be POSIX/SuS compliant, they will be sourced by init.
inst_hook() {
+ local hook
if ! [[ -f $3 ]]; then
dfatal "Cannot install a hook ($3) that does not exist."
dfatal "Aborting initrd creation."
dfatal "No such hook type $1. Aborting initrd creation."
exit 1
fi
- inst_simple "$3" "/lib/dracut/hooks/${1}/${2}-${3##*/}"
+ hook="/lib/dracut/hooks/${1}/${2}-${3##*/}"
+ inst_simple "$3" "$hook"
+ chmod u+x "$initdir/$hook"
}
# install any of listed files
else
unset check depends cmdline install installkernel
check() { true; }
+ # shellcheck disable=SC1090
. "$_moddir"/module-setup.sh
is_func check || return 0
[[ $_forced != 0 ]] && unset hostonly
else
unset check depends cmdline install installkernel
check() { false; }
+ # shellcheck disable=SC1090
. "$_moddir"/module-setup.sh
moddir=$_moddir check 0
_ret=$?
else
unset check depends cmdline install installkernel
depends() { true; }
+ # shellcheck disable=SC1090
. "$_moddir"/module-setup.sh
moddir=$_moddir depends
_ret=$?
[[ -z $_moddir ]] && _moddir=$(dracut_module_path "$1")
[[ -d $_moddir ]] || return 1
if [[ ! -f $_moddir/module-setup.sh ]]; then
+ # shellcheck disable=SC1090
[[ -x $_moddir/cmdline ]] && . "$_moddir/cmdline"
return $?
else
unset check depends cmdline install installkernel
cmdline() { true; }
+ # shellcheck disable=SC1090
. "$_moddir"/module-setup.sh
moddir="$_moddir" cmdline
_ret=$?
[[ -z $_moddir ]] && _moddir=$(dracut_module_path "$1")
[[ -d $_moddir ]] || return 1
if [[ ! -f $_moddir/module-setup.sh ]]; then
+ # shellcheck disable=SC1090
[[ -x $_moddir/install ]] && . "$_moddir/install"
return $?
else
unset check depends cmdline install installkernel
install() { true; }
+ # shellcheck disable=SC1090
. "$_moddir"/module-setup.sh
moddir="$_moddir" install
_ret=$?
[[ -z $_moddir ]] && _moddir=$(dracut_module_path "$1")
[[ -d $_moddir ]] || return 1
if [[ ! -f $_moddir/module-setup.sh ]]; then
+ # shellcheck disable=SC1090
[[ -x $_moddir/installkernel ]] && . "$_moddir/installkernel"
return $?
else
unset check depends cmdline install installkernel
installkernel() { true; }
+ # shellcheck disable=SC1090
. "$_moddir"/module-setup.sh
moddir="$_moddir" installkernel
_ret=$?