#!/bin/bash

usage () {
    echo "Usage: $0 [-h] [-s] [-t <minutes_needed>] [-l] [-w] [-m] [-r] [-v]"
    echo
    echo "-h - Print this help/usage message and quit"
    echo "-s - Run silently (default is verbose)"
    echo "-t - Minutes of idle time needed (default is 20)"
    echo "-l - Check for user logins (default: false - do not check)"
    echo "-w - Check for open windows (default: false - do not check)"
    echo "-m - Include mythshutdown daily wake, locked, & about to start wake in system busy"
    echo "     (default: daily wake, locked & about to start wake is system idle)"
    echo "-r - Check if mythfrontends are running (default: false - do not check)"
    echo "-v - Be more verbose for debugging"
    echo
    echo "Silent mode is recommended for use in cron jobs or scripts."
    exit $1
}

msg () {  # A status reporting function
    [ "$VERBOSE" -ne 0 ] && echo "$*"
}

mysql_cmd () {
    /usr/bin/mysql -u root mythconverg -sBe "$*"
}

# Command line argument handling
VERBOSE=1
LOGINS=0
WINDOWS=0
DAILY=0
RUNNING=0
TIME_BEFORE=20
TIME_AFTER=5    # Only adjustable by editing here

while getopts "hslwmrt:v" OPT ; do
    case $OPT in
    h) usage 0 ;;
    s) VERBOSE=0 ;;
    t) TIME_BEFORE=$OPTARG ;;
    l) LOGINS=1 ;;
    w) WINDOWS=1 ;;
    m) DAILY=1 ;;
    r) RUNNING=1 ;;
    v) VERBOSE=2 ;;
    *) usage 1 ;;
    esac
done
# Check for extra cruft on the command line...
shift $(($OPTIND - 1))
[ -n "$*" ] && usage 1

msg "Checking what MythTV is doing now or plans to within $TIME_BEFORE minutes..."
msg

/usr/bin/mythshutdown --status
BUSY="$?"
msg "mythshutdown returned $BUSY"
if [ "$DAILY" -eq 0 ] ; then
    msg "  including daily wake, locked, and about to start wake as system idle"
    # Ignore daily wake, locked and about to start wake flag values
    BUSY=$(($BUSY & 0x2F))
    msg "  mythshutdown returned $BUSY"
fi

SCHEMALOCK=$(mysql_cmd "select count(*) from schemalock")
msg "schemalock $SCHEMALOCK"

JOBS=$(mysql_cmd "select count(*) from jobqueue where status = 4")
msg "running jobs $JOBS"

INUSE=$(mysql_cmd "select count(*) from inuseprograms")
msg "inuse programs $INUSE"

UPCOMING=$(timeout 3 misc_upcoming_recordings.pl --plain_text --text_format "%rs " --heading "" --minutes $TIME_BEFORE --recordings -1 | wc -w)
msg "planned recordings $UPCOMING"
if [ "$VERBOSE" -ge 2 ] ; then
    msg
    timeout 3 /usr/LH/bin/misc_upcoming_recordings.pl --plain_text --minutes $TIME_BEFORE --recordings -1
fi

# Check all host's mythfrontends if they are running and playing
HOSTNAMES=$(mysql_cmd "select hostname from settings where value = 'FrontendIdleTimeout'")
FERUNNING=0
PLAYING=0
for HOST in $HOSTNAMES
do
    if [ "$VERBOSE" -ge 2 ]; then
        msg "Checking $HOST's mythfrontend status..."
    fi
ncOUTPUT=$(timeout 2 nc $HOST 6546  << EOF
query location
quit
EOF
)
    if [ "$RUNNING" -ge 1 ] ; then
        if [[ "$ncOUTPUT" == *"# "* ]]; then
            FERUNNING=$(( $FERUNNING + 1 ))
            msg "$HOST's mythfrontend is running $FERUNNING"
        else
            msg "$HOST's mythfrontend is NOT running $FERUNNING"
        fi
    fi
    if [[ "$ncOUTPUT" == *"# Playback "* ]]; then
        PLAYING=$(( $PLAYING + 1 ))
        msg "$HOST is playing a recording or video $PLAYING"
    else
        msg "$HOST is NOT playing a recording or video $PLAYING"
    fi
done

# Check for users logged in
if [ "$LOGINS" -ge 1 ] ; then
  USERS=`/usr/bin/last | /bin/grep "still logged in"  | awk '{ print $1 }'`
  if [ -n "$USERS" ] ; then
    LOGINS=1
    msg "The following user(s) are still logged in:"
    msg "${USERS}"
  else
    LOGINS=0
    msg "No users are logged in $LOGINS"
  fi
fi

# Check for open windows
FOUNDWINDOWS=0
if [ "$WINDOWS" -ge 1 ] ; then
    /usr/LH/bin/xwin_find.sh -q '.*(mythtv@|xterm|Firefox|Namoroka|Opera|Chromium).*'
    FOUNDWINDOWS="$?"
    FOUNDWINDOWS=$(($FOUNDWINDOWS == 0))
    if [ "$FOUNDWINDOWS" -eq 0 ] ; then
        msg "no application windows open $FOUNDWINDOWS"
    else
        msg "one or more application windows open $FOUNDWINDOWS"
    fi
fi

activities=$(($BUSY + $SCHEMALOCK + $JOBS + $INUSE + $UPCOMING + $FERUNNING + $PLAYING + $LOGINS + $FOUNDWINDOWS))
msg
if [ "$activities" -eq 0 ] ; then
    msg "System is idle"
    exit 0
else
    msg "System is busy"
    exit 1
fi