#!/bin/bash usage () { echo "Usage: $0 [-h] [-s] [-t ] [-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