Hello smartdrivecheck.sh
Signed-off-by: hax <hax@lainlounge.xyz>
This commit is contained in:
parent
4d32211278
commit
31a5a104f7
1 changed files with 119 additions and 0 deletions
119
smartdrivecheck.sh
Normal file
119
smartdrivecheck.sh
Normal file
|
@ -0,0 +1,119 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
SMARTCTL="/usr/sbin/smartctl"
|
||||
BADBLOCKS="/sbin/badblocks"
|
||||
|
||||
usage() {
|
||||
echo "Usage: $(basename "$0") <device>" >&2
|
||||
}
|
||||
|
||||
check_dependencies() {
|
||||
for program in "$SMARTCTL" "$BADBLOCKS"; do
|
||||
if ! command -v "$program" &>/dev/null; then
|
||||
echo "Error: $program is not installed or not executable" >&2
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
validate_device() {
|
||||
local device="$1"
|
||||
if [ ! -b "$device" ]; then
|
||||
echo "Error: $device is not a valid block device" >&2
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
enable_smart() {
|
||||
local device="$1"
|
||||
echo "Enabling SMART on $device..."
|
||||
$SMARTCTL -q silent -s on -S on "$device" || {
|
||||
echo "SMART enable failed. Retrying..." >&2
|
||||
$SMARTCTL -s on -S on "$device" || true
|
||||
}
|
||||
}
|
||||
|
||||
check_smart_status() {
|
||||
local device="$1"
|
||||
echo "Checking SMART status..."
|
||||
$SMARTCTL -q silent -H "$device" || { echo "SMART Health Check Failed" >&2; exit 1; }
|
||||
$SMARTCTL -q silent -l error "$device" || { echo "SMART Error Log Check Failed" >&2; exit 1; }
|
||||
$SMARTCTL -q silent -l selftest "$device" || { echo "SMART Self-Test Log Check Failed" >&2; exit 1; }
|
||||
}
|
||||
|
||||
run_self_tests() {
|
||||
local device="$1"
|
||||
local test_type="$2"
|
||||
local sleep_time="$3"
|
||||
|
||||
echo "Running $test_type test (estimated time: $sleep_time minutes)..."
|
||||
$SMARTCTL -q silent -t "$test_type" "$device"
|
||||
sleep "${sleep_time}m"
|
||||
check_smart_status "$device"
|
||||
}
|
||||
|
||||
perform_write_test() {
|
||||
local device="$1"
|
||||
echo "Performing non-destructive write test on $device..."
|
||||
$BADBLOCKS -s -n "$device" || { echo "Non-destructive write test failed" >&2; exit 1; }
|
||||
check_smart_status "$device"
|
||||
}
|
||||
|
||||
parse_polling_times() {
|
||||
local device="$1"
|
||||
local tmp_file
|
||||
tmp_file=$(mktemp /tmp/drivetest.XXXXXXXXXX)
|
||||
|
||||
$SMARTCTL -c "$device" | awk '
|
||||
/^(Short|Extended|Conveyance) self-test routine/ {
|
||||
test_type = toupper($1)
|
||||
getline
|
||||
time = $0 ~ /\(\s*[0-9]+\)/ ? $2 : 0
|
||||
printf "%s_SLEEP=%d\n", test_type, time
|
||||
}
|
||||
' >"$tmp_file"
|
||||
source "$tmp_file"
|
||||
rm -f "$tmp_file"
|
||||
}
|
||||
|
||||
main() {
|
||||
if [ $# -ne 1 ]; then
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
local device="$1"
|
||||
validate_device "$device"
|
||||
check_dependencies
|
||||
|
||||
if [[ "$(basename "$device" | sed 's/^\(..\).*$/\1/')" == "sd" ]]; then
|
||||
SMARTCTL="$SMARTCTL -d ata"
|
||||
fi
|
||||
|
||||
enable_smart "$device"
|
||||
check_smart_status "$device"
|
||||
parse_polling_times "$device"
|
||||
|
||||
if [ -n "${CONVEYANCE_SLEEP:-}" ]; then
|
||||
run_self_tests "$device" "conveyance" "$CONVEYANCE_SLEEP"
|
||||
elif [ -n "${SHORT_SLEEP:-}" ]; then
|
||||
run_self_tests "$device" "short" "$SHORT_SLEEP"
|
||||
else
|
||||
echo "Skipping conveyance/short tests..."
|
||||
fi
|
||||
|
||||
perform_write_test "$device"
|
||||
|
||||
if [ -n "${EXTENDED_SLEEP:-}" ]; then
|
||||
run_self_tests "$device" "long" "$EXTENDED_SLEEP"
|
||||
else
|
||||
echo "Skipping extended test..."
|
||||
fi
|
||||
|
||||
echo "All tests completed successfully."
|
||||
}
|
||||
|
||||
main "$@"
|
Loading…
Add table
Reference in a new issue