#!/bin/bash
#
# Dieses Skript fhrt etwaige anstehende Festplattenberprfungen
# von Ext3- und Ext2-Systeme beim Shutdown des Rechners vorab durch,
# falls andernfalls beim nchsten Systemstart oder aber innerhalb der
# nchsten 30 Stunden eine regulre berprfung anstnde.
#
# Es muss aus den Shutdown-Skripten der jeweiligen Distribution
# aufgerufen werden, und zwar zu einem Zeitpunkt, an dem die
# Dateisysteme entweder unmounted oder read-only gemounted sind.

function GetValue
{
  shopt -s extglob

  if [ -z "$1" -o -z "$2" ]; then
    echo ""
    return 1
  fi

  Label=$1
  Text=$2

  Value=${!Label/*${Text}*( )}
  echo ${Value%%$'\n'*}
}

#
# Nur Laufwerke aus /etc/fstab bercksichtigen
exec 3</etc/fstab

# /etc/fstab zeilenweise einlesen
while read -u 3 Fstab; do
  # Kommentare entfernen
  Fstab=${Fstab/\#*}

  # Zeile in die einzelnen Felder auftrennen
  set -- ${Fstab}
  Drive=$1
  Mountpoint=$2
  FsType=$3
  FsOptions=$4

  # Nur Ext3- und Ext2-Partitionen werden berprft
  if [ "${FsType}" != "ext3" -a "${FsType}" != "ext2" ]; then
    continue
  # Partitionen, die nicht automatisch gemountet werden, ignorieren
  elif [ -z "${FsOptions/*noauto*}" ]; then
    continue
  fi

  # Dateisysteminformationen einlesen
  FsInfo="$(LANG=C tune2fs -l ${Drive})"

  Mounts=$(GetValue FsInfo "Mount count:")
  MaxMounts=$(GetValue FsInfo "Maximum mount count:")
  NextCheck=$(GetValue FsInfo "Next check after:")

  NextCheckTs=$(LANG=C date -d "${NextCheck}" +%s)
  NowTs=$(LANG=C date +%s)

  # Partition nur prfen, wenn beim nchsten mounten oder innerhalb
  # der nchsten 30 Stunden ohnehin ein fsck fllig wre
  if [ $[${Mounts}+1] -lt ${MaxMounts} -a \
       $[${NowTs}+108000] -lt ${NextCheckTs} ]; then
    echo "No need to check ${Drive}."
    continue
  fi

  # fsck erzwingen -- funktioniert nicht, falls die Partition noch
  # beschreibbar gemountet ist.
  echo "Checking ${Drive}..."
  fsck -y -f ${Drive}
done
