From 8193e8eb3b7407ea9cb44af18fe52bcdf9463c16 Mon Sep 17 00:00:00 2001 From: David Randall Date: Wed, 15 Nov 2023 20:35:53 -0500 Subject: [PATCH] Chg: Impvoe the JSON collection script; now requires jq/yq Signed-off-by: David Randall --- .gitignore | 3 +-- collect-smartctl-json.sh | 54 ++++++++++++++++++++++++++++++++++++++++ collect_fake_json.sh | 25 ------------------- 3 files changed, 55 insertions(+), 27 deletions(-) create mode 100755 collect-smartctl-json.sh delete mode 100755 collect_fake_json.sh diff --git a/.gitignore b/.gitignore index b7b73ea..930cf26 100644 --- a/.gitignore +++ b/.gitignore @@ -2,8 +2,7 @@ /.build /.release /.tarballs -debug -*.json +debug/ Manifest smartctl_exporter diff --git a/collect-smartctl-json.sh b/collect-smartctl-json.sh new file mode 100755 index 0000000..8466440 --- /dev/null +++ b/collect-smartctl-json.sh @@ -0,0 +1,54 @@ +#! /bin/bash + +script_dir=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + +# Data directory to dump smartctl output +# This directory will be created if it doesn't exist +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" + +# Determine the json query tool to use +if command -v jq >/dev/null; then + json_tool="jq" + json_args="--raw-output" +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" + exit 1 +fi + +if [[ $UID != 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 + # Don't use sudo if root + SUDO="" +fi + +[[ ! -d "${data_dir}" ]] && mkdir --parents "${data_dir}" + +if [[ $# -ne 0 ]]; then + devices="$1" +else + devices=$(smartctl --scan --json | $json_tool $json_args '.devices[].name') +fi + +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" +done diff --git a/collect_fake_json.sh b/collect_fake_json.sh deleted file mode 100755 index 1c08d25..0000000 --- a/collect_fake_json.sh +++ /dev/null @@ -1,25 +0,0 @@ -#! /bin/bash - -script_dir=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) - -# 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" - -[[ ! -d "${script_dir}/debug" ]] && mkdir --parents "${script_dir}/debug" - -if command -v jq >/dev/null; then - devices=$(smartctl --scan --json | jq --raw-output '.devices[].name') -elif command -v yq >/dev/null; then - devices=$(smartctl --scan --json | yq --unwrapScalar '.devices[].name') -elif command -v awk >/dev/null; then - devices=$(smartctl --scan | awk '{ print($1) }') -else - devices=$(smartctl --scan | cut -d ' ' -f 1) -fi - -for device in $devices; do - echo "Collecting data for '${device}'" - # shellcheck disable=SC2086 - sudo smartctl $smartctl_args "${device}" > "${script_dir}/debug/$(basename "${device}").json" -done