From 9db67468251c36f864321ba5adae300c3ce5b116 Mon Sep 17 00:00:00 2001 From: Konstantin Shalygin Date: Mon, 20 Nov 2023 18:33:28 +0300 Subject: [PATCH] collect-smartctl-json: shell fixes for script (#178) Signed-off-by: Konstantin Shalygin --- collect-smartctl-json.sh | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/collect-smartctl-json.sh b/collect-smartctl-json.sh index 8466440..89144c1 100755 --- a/collect-smartctl-json.sh +++ b/collect-smartctl-json.sh @@ -8,7 +8,8 @@ data_dir="${script_dir}/smartctl-data" # The original script used --xall but that doesn't work # This matches the command in readSMARTctl() -smartctl_args="--json --info --health --attributes --tolerance=verypermissive --nocheck=standby --format=brief --log=error" +smartctl_args="--json --info --health --attributes --tolerance=verypermissive \ +--nocheck=standby --format=brief --log=error" # Determine the json query tool to use if command -v jq >/dev/null; then @@ -18,18 +19,19 @@ elif command -v yq >/dev/null; then json_tool="yq" json_args="--unwrapScalar" else - echo "One of 'yq' or 'jq' is required. Please try again after installing one of them" + echo -e "One of 'yq' or 'jq' is required. Please try again after \ +installing one of them" exit 1 fi -if [[ $UID != 0 ]] && ! command -v sudo >/dev/null; then +if [[ ! "${UID}" -eq 0 ]] && ! command -v sudo >/dev/null; then # Not root and sudo doesn't exist echo "sudo does not exist. Please run this as root" exit 1 fi SUDO="sudo" -if [[ $UID = 0 ]]; then +if [[ "${UID}" -eq 0 ]]; then # Don't use sudo if root SUDO="" fi @@ -37,18 +39,25 @@ fi [[ ! -d "${data_dir}" ]] && mkdir --parents "${data_dir}" if [[ $# -ne 0 ]]; then - devices="$1" + devices="${1}" else - devices=$(smartctl --scan --json | $json_tool $json_args '.devices[].name') + devices="$(smartctl --scan --json | "${json_tool}" "${json_args}" \ +'.devices[].name')" + mapfile -t devices <<< "${devices[@]}" fi -for device in $devices; do +for device in "${devices[@]}" + do echo -n "Collecting data for '${device}'..." - data=$($SUDO smartctl $smartctl_args "${device}") - type=$(echo "${data}" | $json_tool $json_args '.device.type') - family=$(echo "${data}" | $json_tool $json_args '.model_family' | tr ' ' '_') - model=$(echo "${data}" | $json_tool $json_args '.model_name' | tr ' ' '_') - device_name=$(basename "${device}") - echo -e "\tSaving to ${type}-${family}-${model}-${device_name}.json" - echo "${data}" > "${data_dir}/${type}-${family}-${model}-${device_name}.json" + # shellcheck disable=SC2086 + data="$($SUDO smartctl ${smartctl_args} ${device})" + type="$(echo "${data}" | "${json_tool}" "${json_args}" '.device.type')" + family="$(echo "${data}" | "${json_tool}" "${json_args}" \ +'select(.model_family != null) | .model_family | sub(" |/" ; "_" ; "g")')" + model="$(echo "${data}" | "${json_tool}" "${json_args}" \ +'.model_name | sub(" |/" ; "_" ; "g")')" + device_name="$(basename "${device}")" + echo -e "\tSaving to ${type}-${family:=null}-${model}-${device_name}.json" + echo "${data}" > \ +"${data_dir}/${type}-${family:=null}-${model}-${device_name}.json" done