#!/bin/bash
# limit-mythcommflag.sh   v0.2  03/2/10
# Utility to automatically limit mythcommflag if CPU system load is above a certain level
# and if backend usage is above a certain level
# Uses cpulimit from http://cpulimit.sourceforge.net/
# Free for any use.
# Installation:
#  cp limit-mythcommflag.sh /usr/LH/bin
#  chmod +x /usr/LH/bin/limit-mythcommflag.sh
# Usage: Executed from runit limit-mythcommflag at boot

#-----OPTIONS______
# Number of seconds to wait between checking for mythcommflag process
SLEEP=5
# Backend and Frontend thresholds above which mythcommflag is stopped
BETHRESHOLD=30
FETHRESHOLD=55

# FUNCTIONS
limit_cpu()
# Arg_1 = LimitedRangeNum; Arg_2 = CPULimitPercent; Arg_3 = Commflag PID
{
if [ $ALREADYLIMITED -ne $1 ] ; then
    if [ $cpulimit_pid -ne 0 ]; then
        kill $cpulimit_pid
    fi
    cpulimit -p $3 -l $2 &
    cpulimit_pid=$!
    ALREADYLIMITED=$1
fi
}

stop_limit()
{
if [ $ALREADYLIMITED -ne 0 ]; then
    if [ $cpulimit_pid -ne 0 ]; then
        kill $cpulimit_pid
        cpulimit_pid=0
    fi
    ALREADYLIMITED=0
fi
}

ALREADYLIMITED=0
STOPPED=0
cpulimit_pid=0

while true; do
    PROCCOMMFLAG=`pidof mythcommflag`
    if [ -n "${PROCCOMMFLAG}" ]; then
        BACKENDCPU=`top -bn1u mythtv | grep -m 1 mythbackend | awk '{ print $9 }'`
        FRONTENDCPU=`top -bn1u mythtv | grep -m 1 mythfrontend | awk '{ print $9 }'`
        if [ "$FRONTENDCPU" = "" ]; then
            FRONTENDCPU=0
        fi
        if [ "$BACKENDCPU" -ge "$BETHRESHOLD" ]; then
            if [ "$FRONTENDCPU" -ge $FETHRESHOLD ]; then
                if [ $STOPPED -eq 0 ]; then
                    kill -s STOP $PROCCOMMFLAG
                    STOPPED=1
                fi
            else
                if [ $STOPPED -eq 1 ]; then
                    kill -s CONT $PROCCOMMFLAG
                    STOPPED=0
                fi
                stop_limit
            fi
        else
            if [ $STOPPED -eq 1 ]; then
                kill -s CONT $PROCCOMMFLAG
                STOPPED=0
            fi
            case $FRONTENDCPU in
	        [0-9]|[0-3][0-9] )
                stop_limit;;
	        [4-5][0-9] ) 
                limit_cpu "1" "70" $PROCCOMMFLAG;;
	        [6-7][0-9] ) 
                limit_cpu "2" "50" $PROCCOMMFLAG;;
	        [8-9][0-9] ) 
                limit_cpu "3" "20" $PROCCOMMFLAG;;
	        [1][0-9][0-9] )
                limit_cpu "4" "10" $PROCCOMMFLAG;;
	        esac
        fi
#    else
#        echo "No COMMFLAG Process Active"
    fi
    sleep $SLEEP
done