#!/bin/bash
# --
# Check the date and mount count of the device passed by parameter. It's able to
# manage devices not configurated to be checked by fsck (values -1 and none in
# max mount count and date interval).
#
# Needs sudo without passwd to run tune2fs
#
# Usage: check_next_fsck -w DAYS,MOUNTS -c DAYS,MOUNTS -d DEVICE
#
# @author: Fede Diaz nordri@gmail.com
# @version: 1
# @date: 2011/03/20
# --

if [ "$#" -lt 6 ]; then
  echo "Usage: $0 -w DAYS,MOUNTS -c DAYS,MOUNTS -d DEVICE";
  exit 3;
fi

until [ -z "$1" ]  
do
  if [ $1 == "-w" ]; then
    VALUE=$2;
    WARNING_DAYS=$(echo $VALUE | cut -d, -f1);
    WARNING_MOUNTS=$(echo $VALUE | cut -d, -f2);
  elif [ $1 == "-c" ]; then
    VALUE=$2;
    CRITICAL_DAYS=$(echo $VALUE | cut -d, -f1);
    CRITICAL_MOUNTS=$(echo $VALUE | cut -d, -f2);
  elif [ $1 == "-d" ]; then
    DEVICE=$2;
  fi
  shift;
done

# Parsing tune2fs exits (Beware with sudo)
TARGET_DATE=$(sudo /sbin/tune2fs -l $DEVICE | grep "Next check after" | cut -d: -f2,3,4 );
CHECK_INTERVAL=$(sudo /sbin/tune2fs -l $DEVICE | grep "Check interval" | cut -d: -f2 );
INTERVAL=$(echo $CHECK_INTERVAL | cut -d" " -f1);
MOUNT_COUNT=$(sudo /sbin/tune2fs -l $DEVICE | grep "Mount count" | cut -d: -f2 );
MAX_MOUNT_COUNT=$(sudo /sbin/tune2fs -l $DEVICE | grep "Maximum mount count" | cut -d: -f2 );

# Calculating dates
TODAY=$(date +"%s");
EPOCH_TARGET_DATE=$(date +"%s" -d "$TARGET_DATE");

let SECONDS_LEFT="$EPOCH_TARGET_DATE - $TODAY";

CHECK_DATES="YES"; # Check interval = none means NO INTERVAL TIME BETWEEN MOUNTS
if [ $INTERVAL == 0 ]; then 
  CHECK_DATES="NO";
else
  let DAYS_LEFT="$SECONDS_LEFT/86400";
fi

CHECK_MOUNT_COUNT="YES"; # Maximum mount count = -1 means NO COUNT MOUNTS
if [ $MAX_MOUNT_COUNT == -1 ]; then
  CHECK_MOUNT_COUNT="NO";
else
  let MOUNT_LEFT="$MAX_MOUNT_COUNT - $MOUNT_COUNT";
fi

# Calculating WARNINGS and CRITICAL
if [ $CHECK_DATES == "YES" ]; then
  if [ $DAYS_LEFT -gt $WARNING_DAYS ]; then
    VALUE="0";
  elif [ $DAYS_LEFT -lt $CRITICAL_DAYS ]; then
    VALUE="2";
  else
    VALUE="1";
  fi
else
  VALUE="3";
fi

if [ $CHECK_MOUNT_COUNT == "YES" ]; then
  if [ $MOUNT_LEFT -gt $WARNING_MOUNTS ]; then
    VALUE=$VALUE"0";
  elif [ $MOUNT_LEFT -lt $CRITICAL_MOUNTS ]; then
    VALUE=$VALUE"2";
  else
    VALUE=$VALUE"1";
  fi
else
  VALUE=$VALUE"3";
fi

# Returning the results
case $VALUE in
  "00")
    echo "OK next check in $DAYS_LEFT days or $MOUNT_LEFT mounts";
    exit 0;
    ;;
  "01")
    echo "WARNING next check in $MOUNT_LEFT mounts";
    exit 1;
    ;;
  "02")
    echo "CRITICAL next check in $MOUNT_LEFT mounts";
    exit 2;
    ;; 
  "10")
    echo "WARNING next check in $DAYS_LEFT days";
    exit 1;
    ;;
  "11")
    echo "WARNING next check in $DAYS_LEFT days and $MOUNTS_LEFT mounts";
    exit 1;
    ;;
  "12")
    echo "CRITICAL next check in $MOUNT_LEFT mounts";
    exit 2;
    ;;
  "20")
    echo "CRITICAL next check in $DAYS_LEFT days";
    exit 2;
    ;;
  "21")
    echo "CRITICAL next check in $DAYS_LEFT days";
    exit 2;
    ;;
  "22")
    echo "CRITICAL next check in $DAYS_LEFT days and $MOUNTS_LEFT mounts";
    exit 2;
    ;;
  "33")
    echo "UNKNOWN Nothing to check";
    exit 3;
    ;;
esac
