#!/bin/bash
set -e
set -o pipefail
shopt -s nullglob

OARHOMEDIR=/var/lib/oar
CHECKSCRIPTDIR=/etc/oar/check.d
CHECKLOGDIR=$OARHOMEDIR/checklogs

# If no check script directory or if it is empty of any executable script, do nothing
[ -d $CHECKSCRIPTDIR ] || exit 0

mapfile -t CHECKSCRIPTS < <( find $CHECKSCRIPTDIR -maxdepth 1 -type f -executable )
[ "${#CHECKSCRIPTS}" -gt 0 ] || exit 0

# If no check-log directory, this is an error
if [ ! -d $CHECKLOGDIR ]; then
  echo 1>&2 "Checklogs directory ($CHECKLOGDIR) does not exist, please fix."
  exit 1
fi

# If there is any running job then exit
# Legacy CPUSET/CGroupV1 version
OAR_CPUSET_DIR=/dev/cpuset/oar
if [ -d "$OAR_CPUSET_DIR" ]; then
    for f in "$OAR_CPUSET_DIR"/*/tasks; do
        echo 1>&2 "A job is running, do nothing".
        exit 0
    done
fi
# CGroupV2 version
OAR_CGV2_DIR="$(sed -ne 's/^cgroup2 \([^ ]\+\) .*/\1/p' /proc/mounts)/oar.slice"
if [ -d "$OAR_CGV2_DIR" ]; then
    for f in "$OAR_CGV2_DIR"/oar-*.slice; do
        echo 1>&2 "A job is running, do nothing".
        exit 0
    done
fi

LOCKFILE=$OARHOMEDIR/${0##*/}.lock
STAMPFILE=$OARHOMEDIR/oarnodecheckrun.lastrun
# Code from man flock(1)
(
    if ! flock -n 9; then
        echo 1>&2 "Another instance is running, do nothing."
        exit 0
    fi
    touch "$STAMPFILE"
    cd "$CHECKSCRIPTDIR"
    for f in "${CHECKSCRIPTS[@]}"; do 
        CHECKLOGFILE="$CHECKLOGDIR/${f##*/}."$(date +%F.%T) ./"${f##*/}"
    done
) 9> "$LOCKFILE"


