#!/bin/bash usage () { echo "Usage: $0 [-h] [-s] [-t ] [-l] [-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 "-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 TIME_BEFORE=20 TIME_AFTER=5 # Only adjustable by editing here while getopts "hslt:v" OPT ; do case $OPT in h) usage 0 ;; s) VERBOSE=0 ;; t) TIME_BEFORE=$OPTARG ;; l) LOGINS=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 within $TIME_BEFORE minutes..." msg /usr/bin/mythshutdown -s 1 BUSY="$?" msg "mythshutdown returned $BUSY" # Ignore certain non-zero flag values BUSY=$(($BUSY & 0x2F)) 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" POTENTIAL=$(mysql_cmd "select count(*) from recordmatch as rm, program as p where rm.chanid = p.chanid and rm.starttime = p.starttime and rm.starttime < now() + interval $TIME_BEFORE minute and now() < p.endtime + interval $TIME_AFTER minute") msg "potential recordings $POTENTIAL" # See if any of the potential upcoming recordings are real. # This is ugly, but only the backend knows what programs it really # plans to record or ignore, so we can't just check the DB. :-( if [ "$VERBOSE" -ge 2 ] ; then mysql_cmd "select p.starttime, p.endtime, p.title, subtitle from recordmatch as rm, program as p where rm.chanid = p.chanid and rm.starttime = p.starttime and rm.starttime < now() + interval $TIME_BEFORE minute and now() < p.endtime + interval $TIME_AFTER minute order by p.starttime, p.endtime" fi UPCOMING=$(/usr/bin/mythbackend --printsched 2>&1 | /bin/awk -v potential=$POTENTIAL ' BEGIN {item=-1;real=0} /--- print list start ---/,/--- print list end ---/ { if (item>0 && item<=potential && substr($0,70,1) ~ "[0-9]") real+=1; item += 1; } END {print real} ') msg "planned recordings $UPCOMING" if [ "$VERBOSE" -ge 2 ] ; then /usr/bin/mythbackend --printsched 2>&1 | /bin/awk -v potential=$POTENTIAL ' BEGIN {item=-1} /--- print list start ---/,/--- print list end ---/ { if (item>0 && item<=potential) print $0; item += 1; }' fi 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: ${USERS}" else LOGINS=0 msg "No user(s) are logged in..." fi fi # Check for open windows /usr/LH/bin/xwin_find.sh -q '.*(mythtv@|xterm|Firefox|Namoroka|Opera).*' WINDOWS="$?" WINDOWS=$(($WINDOWS == 0)) msg "windows $WINDOWS" activities=$(($BUSY + $SCHEMALOCK + $JOBS + $INUSE + $UPCOMING + $LOGINS + $WINDOWS)) msg if [ "$activities" -eq 0 ] ; then msg "System is idle" exit 0 else msg "System is busy" exit 1 fi