From 2b5ddc772216c93076191033ba4cdec0a1f09cc9 Mon Sep 17 00:00:00 2001 From: Harald Hoyer Date: Fri, 26 Mar 2021 12:30:15 +0100 Subject: [PATCH] fix: shellcheck for dracut*.sh --- .github/workflows/lint.yml | 6 +- dracut-functions.sh | 110 +++++++++++++++++++------------------ dracut-init.sh | 14 ++++- dracut-logger.sh | 31 ++++++++--- dracut.sh | 4 +- 5 files changed, 100 insertions(+), 65 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 2f5d9106..ef6763e6 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -45,4 +45,8 @@ jobs: sh_checker_comment: true - name: shellcheck on all marked directories - run: while read -r -d '' dir; do shellcheck $(shfmt -f $dir); done < <(find . -name .shchkdir -printf '%h\0') + run: | + while read -r -d '' dir; do + shellcheck $(shfmt -f $dir) + done < <(find . -name .shchkdir -printf '%h\0') + shellcheck dracut.sh dracut-init.sh dracut-functions.sh dracut-logger.sh diff --git a/dracut-functions.sh b/dracut-functions.sh index 6b701a68..14cc90d0 100755 --- a/dracut-functions.sh +++ b/dracut-functions.sh @@ -90,10 +90,10 @@ ldconfig_paths() { # $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 @@ -144,10 +144,11 @@ print_vars() { # $ 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 @@ -174,8 +175,8 @@ convert_abs_rel() { 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[@]} @@ -213,8 +214,8 @@ get_fs_env() { [[ $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 @@ -349,10 +350,10 @@ find_block_device() { 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" @@ -372,13 +373,13 @@ find_block_device() { # 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 @@ -410,7 +411,7 @@ find_mp_fstype() { 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" @@ -421,7 +422,7 @@ find_mp_fstype() { 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" @@ -450,7 +451,7 @@ find_dev_fstype() { 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" @@ -461,7 +462,7 @@ find_dev_fstype() { 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" @@ -542,15 +543,15 @@ host_fs_all() { 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 } @@ -558,17 +559,17 @@ check_block_and_slaves() { 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 } @@ -584,7 +585,7 @@ for_each_host_dev_and_slaves_all() { 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 @@ -599,7 +600,7 @@ for_each_host_dev_and_slaves() { 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 } @@ -611,40 +612,37 @@ for_each_host_dev_and_slaves() { # 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 @@ -659,12 +657,13 @@ fs_get_option() { 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 @@ -690,7 +689,7 @@ check_kernel_config() { # 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 @@ -707,20 +706,23 @@ 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 } @@ -728,9 +730,9 @@ get_ucode_file() { # 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} ]] } @@ -738,7 +740,7 @@ lvm_internal_dev() { 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" @@ -746,13 +748,15 @@ btrfs_devs() { } 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() { @@ -809,7 +813,7 @@ is_unbracketed_ipv6_address() { # 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") @@ -893,7 +897,7 @@ block_is_fcoe() { 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 diff --git a/dracut-init.sh b/dracut-init.sh index 859137d3..786f50b1 100644 --- a/dracut-init.sh +++ b/dracut-init.sh @@ -550,6 +550,7 @@ prepare_udev_rules() { # $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." @@ -558,7 +559,9 @@ inst_hook() { 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 @@ -677,6 +680,7 @@ module_check() { 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 @@ -708,6 +712,7 @@ module_check_mount() { else unset check depends cmdline install installkernel check() { false; } + # shellcheck disable=SC1090 . "$_moddir"/module-setup.sh moddir=$_moddir check 0 _ret=$? @@ -733,6 +738,7 @@ module_depends() { else unset check depends cmdline install installkernel depends() { true; } + # shellcheck disable=SC1090 . "$_moddir"/module-setup.sh moddir=$_moddir depends _ret=$? @@ -750,11 +756,13 @@ module_cmdline() { [[ -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=$? @@ -772,11 +780,13 @@ module_install() { [[ -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=$? @@ -794,11 +804,13 @@ module_installkernel() { [[ -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=$? diff --git a/dracut-logger.sh b/dracut-logger.sh index dadbe848..c36525d0 100755 --- a/dracut-logger.sh +++ b/dracut-logger.sh @@ -316,9 +316,10 @@ _dlvl2syslvl() { # - @c INFO to @c info # - @c DEBUG and @c TRACE both to @c debug _do_dlog() { + local lvlc local lvl="$1" shift - local lvlc=$(_lvl2char "$lvl") || return 0 + lvlc=$(_lvl2char "$lvl") || return 0 local msg="$*" local lmsg="$lvlc: $*" @@ -376,7 +377,9 @@ dlog() { dtrace() { set +x dlog 6 "$@" - [ -n "$debug" ] && set -x || : + if [ -n "$debug" ]; then + set -x + fi } ## @brief Logs message at DEBUG level (5) @@ -386,7 +389,9 @@ dtrace() { ddebug() { set +x dlog 5 "$@" - [ -n "$debug" ] && set -x || : + if [ -n "$debug" ]; then + set -x + fi } ## @brief Logs message at INFO level (4) @@ -396,7 +401,9 @@ ddebug() { dinfo() { set +x dlog 4 "$@" - [ -n "$debug" ] && set -x || : + if [ -n "$debug" ]; then + set -x + fi } ## @brief Logs message at WARN level (3) @@ -406,7 +413,9 @@ dinfo() { dwarn() { set +x dlog 3 "$@" - [ -n "$debug" ] && set -x || : + if [ -n "$debug" ]; then + set -x + fi } ## @brief It's an alias to dwarn() function. @@ -416,7 +425,9 @@ dwarn() { dwarning() { set +x dwarn "$@" - [ -n "$debug" ] && set -x || : + if [ -n "$debug" ]; then + set -x + fi } ## @brief Logs message at ERROR level (2) @@ -426,7 +437,9 @@ dwarning() { derror() { set +x dlog 2 "$@" - [ -n "$debug" ] && set -x || : + if [ -n "$debug" ]; then + set -x + fi } ## @brief Logs message at FATAL level (1) @@ -436,5 +449,7 @@ derror() { dfatal() { set +x dlog 1 "$@" - [ -n "$debug" ] && set -x || : + if [ -n "$debug" ]; then + set -x + fi } diff --git a/dracut.sh b/dracut.sh index 8890203a..b8db2dd6 100755 --- a/dracut.sh +++ b/dracut.sh @@ -850,7 +850,7 @@ if [[ $regenerate_all == "yes" ]]; then ((len = ${#dracut_args[@]})) for ((i = 0; i < len; i++)); do [[ ${dracut_args[$i]} == "--regenerate-all" ]] \ - && unset "dracut_args[$i]" + && unset dracut_args["$i"] done cd "$dracutsysrootdir"/lib/modules || exit 1 @@ -1959,7 +1959,7 @@ if [[ $kernel_only != yes ]]; then if [ -z "${fstab_field[1]}" ]; then # Determine device and mount options from current system mountpoint -q "${fstab_field[0]}" || derror "${fstab_field[0]} is not a mount point!" - read -r -a fstab_field <<< "$(findmnt --raw -n --target "${fstab_field[0]}" --output=source,target,fstype,options)" + read -r -a fstab_field < <(findmnt --raw -n --target "${fstab_field[0]}" --output=source,target,fstype,options) dinfo "Line for ${fstab_field[1]}: ${fstab_field[*]}" else # Use default options