#!/usr/bin/bash

# SPDX-License-Identifier: GPL-2.0-or-later
# Copyright (C) 2024-present Peter Tuschy (foss@bofh42.de)

# bash version 4 or later
[ ${BASH_VERSION%%.*} -ge 4 ] || exit 1

export LANG=C.UTF-8

need_cmd() { hash "$1" 2>/dev/null; if [ $? -ne 0 ]; then echo "ERROR: script ${0##*/} needs command $1"; exit 1; fi; }
for i in readlink date awk ; do need_cmd $i ; done

SCRIPT=$(readlink -f $0)
WHERE=${SCRIPT%/*}

# setting default exit values
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3
STATE_DEPENDENT=4

# import exit values from utils.sh if we found one
for i in ${WHERE}/utils.sh ${WHERE}/../utils.sh ; do
  if [ -f ${i}/utils.sh ] ; then
    . ${i}
    break
  fi
done

PREFIX=/tmp/sar
RESULT=${PREFIX}.txt

usage() {
  echo "Usage: $0 -l <label> -d <description> -p <parameter> [-w <warning>] [-c <critical>]"
  exit $STATE_UNKNOWN
}

# command line parsing
while [ "$1" != "" ];
do
  case $1 in
    -w) warning="$2" ;;
    -c) critical="$2" ;;
    -l) label="$2" ;;
    -d) description="$2" ;;
    -p) parameter="$2" ;;
    --help|-h) usage ;;
    -*) usage ;;
    *) usage ;;
  esac
  shift 2
done

if [ -z "${label}" -o -z "${description}" -o -z "${parameter}" ] ; then
  usage
  exit $STATE_UNKNOWN
fi

if [ ! -z "$warning" -a ! -z "$critical" ] ; then
  if [ $warning -gt $critical ] ; then
    echo "UNKNOWN - Warning value must be less than the critical value"
    exit $STATE_UNKNOWN
  fi
fi

outdated() {
  echo "${label} UNKNOWN - outdated data in $1"
  exit $STATE_UNKNOWN
}

OS=$(uname)
case "${OS}" in
  Linux)
    STIME="$(printf '%(%s)T' -1 2>/dev/null || date +%s)"
    TCURRENT="$((STIME-65))"
    TSAMPLE="$(awk /^SampleTime/'{ print $2 }' ${RESULT})"
    if [ $TCURRENT -lt $TSAMPLE ] ; then
      USESAR=${RESULT}
    else
      outdated ${RESULT}
    fi
    value="$(awk "/^${parameter}/"'{ print $2 }' ${USESAR})"
    ;;   

  *)
    echo "OS ${OS} not supportet by this check"
    exit $STATE_UNKNOWN
esac


if [ -z "${value}" ]; then
  echo "${label} UNKNOWN - no data found matching ${parameter} in ${RESULT}"
  exit $STATE_UNKNOWN
fi

PERFDATA="SAR=${value};${warning};${critical};;;"
PLUGDATA=${description}
OUTPUT=${value}

if [ ! -z "$critical" ]; then
  if [ $OUTPUT -ge $critical ]; then
    echo "${label} CRITICAL - ${value} ${PLUGDATA} | ${PERFDATA}"
    exit $STATE_CRITICAL
  fi
fi
if [ ! -z "$warning" ]; then 
  if [ $OUTPUT -ge $warning ]; then
    echo "${label} WARNING - ${value} ${PLUGDATA} | ${PERFDATA}"
    exit $STATE_WARNING
  fi
fi

echo "${label} OK - ${value} ${PLUGDATA} | ${PERFDATA}"
exit 0
