Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash
- Z_WORKDIR="$(realpath "$(dirname "${0}")")"
- source "${Z_WORKDIR}/ansihelper.sh"
- drives=($(ls -1 /dev/sd?))
- function zcmd() {
- if [ -n "${DEBUG}" ]; then
- echo "-- Executing ${*} ..." >&2
- fi
- "${@}"
- }
- function zsmart() {
- local drive sopts;
- sopts=("${@}")
- drive="${sopts[$((${#sopts[@]}-1))]}"
- unset -v "sopts[$((${#sopts[@]}-1))]"
- case "${drive}" in
- "/dev/sdi")
- sopts+=("-dsat")
- ;;
- esac
- zcmd sudo smartctl "${sopts[@]}" "${drive}";
- }
- function zgetsts() {
- local sts;
- sts="$(sudo smartctl -c "${1}" | grep "Self-test execution status" | cut -d'(' -f2 | cut -d')' -f1 | sed 's| ||g')"
- case "${sts}" in
- 0)
- echo "No Self-test in Progress"
- ;;
- 24?)
- echo "Extended Self-test in Progress (${sts:2:1}0% remaining)"
- ;;
- *)
- echo "Unknown Self-test status code ${sts}"
- ;;
- esac
- }
- function zgetpoh() {
- local poh;
- poh=$(zsmart -A "${1}" | grep Power_On | rev | cut -d'-' -f1 | rev | sed 's| ||g' | cut -d'(' -f1)
- if [ ${poh} -gt 65535 ]; then
- poh="${poh} (SMART Self-test Log POH: $((poh - 65535)))"
- fi
- echo "${poh}"
- }
- function smartctl_all_drives_cond() {
- if [ "${2}" == "status" ]; then
- if [ -e "${1}" ]; then
- d="${1}";
- str_color "green" "-- Working on ${d} ..." >&2
- echo ""
- zsmart -H "${d}"
- str_color "yellow" "-- Power On Hours: $(str_color "green" "$(zgetpoh "${d}")")"
- echo ""
- str_color "yellow" "-- Self-test status: $(str_color "green" "$(zgetsts "${d}")")"
- echo ""
- zsmart --log=xselftest "${d}"| grep -A3 "SMART Extended Self-test Log"
- else
- for d in "${drives[@]}"; do
- str_color "green" "-- Working on ${d} ..." >&2
- echo ""
- zsmart -H "${d}"
- str_color "yellow" "-- Power On Hours: $(str_color "green" "$(zgetpoh "${d}")")"
- echo ""
- str_color "yellow" "-- Self-test status: $(str_color "green" "$(zgetsts "${d}")")"
- echo ""
- zsmart --log=xselftest "${d}"| grep -A3 "SMART Extended Self-test Log"
- done
- fi
- else
- if [ -e "${1}" ]; then
- d="${1}";
- shift;
- str_color "green" "-- Working on ${d} ..." >&2
- echo ""
- zsmart "${@}" "${d}";
- else
- shift;
- for d in "${drives[@]}"; do
- str_color "green" "-- Working on ${d} ..." >&2
- echo ""
- zsmart "${@}" "${d}";
- done
- fi
- fi
- }
- case "${1}" in
- "extended")
- smartctl_all_drives_cond "${2}" --test=long
- ;;
- "short")
- smartctl_all_drives_cond "${2}" --test=short
- ;;
- "rawcmd")
- shift;
- smartctl_all_drives_cond "${@}"
- ;;
- "cancel")
- smartctl_all_drives_cond "${2}" -X
- ;;
- "status")
- smartctl_all_drives_cond "${2}" "${1}"
- ;;
- *)
- echo "Usage: ${0} [status|extended|short|cancel] (/dev/drive)"
- exit 1;
- ;;
- esac
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement