summaryrefslogtreecommitdiffstats
path: root/abs/core/LinHES-system/idle.sh
blob: 4f6174cef2898b7f7ef3c8594a4e99d6d57d3855 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#!/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