#!/usr/bin/bash

function smartctl_apm()
{
  echo "${1}: ${2}"
  smartctl -s apm,"${2}" "${1}"
}

function keepalive()
{
  smartctl_apm "${1}" "${2}"
  s="${?}"
  # APM=off is not supported by every HDD
  if [[ "${s}" -ne "0" && "${2}" == "off" ]]; then
    smartctl_apm "${1}" "${mode_off}"
    s="${?}"
  fi
  return "${s}"
}

filename='/etc/disks-keepalive.conf'

mode_on="128"
mode_off="254"

status="0"

while read -r disk mode options; do
  blkid "${disk}" >/dev/null 2>&1 || continue
  if [[ "${mode}" =~ ^[+-]?[0-9]+$ ]]; then
    mode="$(( mode ))"
    [[ "${mode}" -ge "1" ]] || mode="${mode_on}"
    [[ "${mode}" -le "254" ]] || mode="${mode_off}"
  elif [[ "${mode,,}" =~ ^o(n|ff)$ ]]; then
    mode="${mode,,}"
    [[ "${mode}" == "off" ]] || mode="${mode_on}"
  else
    mode="off"
  fi
  keepalive "${disk}" "${mode}"
  s="${?}"
  [[ "${s}" -eq 0 ]] || status="${s}"
done < <( grep -Ev '^[[:blank:]]*(#|$)' "${filename}" 2>/dev/null )

exit "${status}"

