From: "Bob" <spam at homeurl.co.uk>
> The best solution would be to have the master consider the shutdown
> slave as "sleeping" and not alter the schedule, in an ideal world, with
> a situation like this the master would start it's 8pm recording as
> normal, at 8:55 it should WOLup the slave and then if at 8:58pm the
> slave isn't available to start it's recording the master would ditch and
> delete it's 8 -> 10pm recording and start the 9 -> 10pm one.
>> This way you get to keep the current functionality but gain the ability
> to shutdown slaves when they're not needed.
>> It's all beyond my programming skill though but if you're after testers,
> I'm your man.
A proper solution isn't something I could do either. My simple script is
below, and seems to work ok, with the caveat that the recording schedule may
change as mentioned.
The script runs as a cron job, I'm running it every 10 minutes.
Basic process, is to do a series of checks, and if they all pass, use ssh to
connect to the master backend and queue an at job to send a WOL signal to
the slave. I have ssh setup with private keys, so it can connect without
asking for a password.
It pulls the current backend status and upcoming recordings from the backend
http port. I thought this could be pulled from the database, but couldn't
see the recording schedule. Is it just in memory on the backend?
It won't shut down if the frontend is running, I currently have to exit to
mythwelcome when not in use. I might try and probe the frontend via its
telnet port, and allow a shutdown if it is idle. eg if the frontend has been
showing the main menu for three checks in a row it is idle.
The system load is checked by adding together the 1, 5 and 15 minute load
averages after removing the decimal point. Might need a lower maxidleload on
a more powerful system.
The various echo lines could be removed, they're just for troubleshooting
what is keeping the system awake.
#!/bin/bash
backendhost=backend
maxidleload=30
myencoder=2
maxwaittime=60
warmuptime=5
mymacaddr=12:34:56:78:9A:BC
#################################
#### Check if frontend running
#################################
if ps -e|grep mythfrontend>/dev/null
then
echo "Frontend running"
exit
fi
#################################
#### Check system load isn't high
#################################
set `uptime|sed "s/^.*average://;s/,//g;s/\.//g"`
load=$(( 10#$1 + 10#$2 + 10#$3 ))
if [ $load -gt $maxidleload ]
then
echo "High load $load"
exit
else
echo "Low load $load"
fi
#################################
#### Check not currently recording
#################################
wget -q $backendhost:6544 -O /tmp/backendstatus
if cat /tmp/backendstatus|sed "1,/Encoder status/d;/<h2>Schedule/,$ d"|grep
"Encoder "$myencoder|grep "is recording">/dev/null
then
echo "Recording"
exit
else
echo "Not Recording"
fi
#################################
#### Get time of next recording
#################################
nextrecording=`cat /tmp/backendstatus|sed "1,/<div id=\"schedule\">/d"|grep
"\- Encoder $myencoder \-"|head -n 1|sed "s/^.*This recording will start in
//;s/ using encoder $myencoder .*//;s/ days/ *24*60/;s/ hours*/
*60/;s/and/+/;s/minutes//"`
waittime=$(( $nextrecording ))
echo $waittime
if [ $waittime -lt $maxwaittime ]
then
echo "Less than $maxwaittime minutes wait, $waittime"
else
echo "Long wait $waittime minutes"
wakeup=$(( $waittime - $warmuptime ))
echo "Wake up at now + $wakeup minutes"
echo "/usr/sbin/ether-wake $mymacaddr"|ssh backend at now + $wakeup
minutes
/sbin/shutdown -h now
fi