#!/bin/sh
#
# SPRI 0.5 [spri@r-fx.org]
#
##############################################################################
#
# You may edit anything below this point at your own risk, do not request
# support for modified versions of this software. This is free software
# and free for redistribution in accordance with the GNU GPL.
#
##############################################################################
#
INSPATH="/usr/local/spri"
CNF="$INSPATH/conf.spri"
TF="$INSPATH/.pscache"

if [ -f "$CNF" ]; then
	. $CNF
else
	echo "could not load config file, aborting."
	exit 1
fi
# Setcolor variables for output
SETCOLOR_GR="echo -en \\033[1;32m"
SETCOLOR_NOR="echo -en \\033[0;39m"
SET_FIN="echo -e \\r"
COL="echo -en \\033[G"

header() {
echo "SPRI 0.5 [spri@r-fx.org]"
echo "========================"
}

file_sanity() {
ARG="$1"
if [ ! -f "$ARG" ]; then
  touch $ARG
  chmod 640 $ARG
fi
}

file_sanity $TF

lcheck() {
LOAD=`cat /proc/loadavg | tr '.' ' ' | awk '{print$1}'`
if [ "$LOAD" -gt "16" ]; then
	echo "error load too high to run spri safely, aborting."
 	exit 1
fi
}

repri() {
	PRI="$1"
	NFILE="$2"
	ps -auxww > $TF
	if [ ! -f "$NFILE" ]; then
		echo "list file '$NFILE' not found, aborting."
		exit 1
	else
		NVAL=`cat $NFILE`
		if [ "$NVAL" == "" ]; then
			echo "list file '$NFILE' appears empty, nothing done for PRIO $PRI." && echo
		fi
		for i in `cat $NFILE`; do
		NAME="$i"
		VNAME=`echo $NAME | tr -d '[]' | tr -d '\\\'`

		$COL
		echo -n "Setting "
		$SETCOLOR_GR
		echo -n "$VNAME"
		$SETCOLOR_NOR
		echo " to priority $PRI: "

                RVAL=`cat $TF | grep -vf $IGNORE | grep -w "$NAME"`
                if [ "$RVAL" == "" ]; then
                        echo "No processes for $VNAME running."
                else
			for x in `cat $TF | grep -vf $IGNORE | grep -w "$NAME" | awk '{print$2}'`; do
				renice $PRI $x
			done
		fi
		echo ""
		done
	fi
}

run() {
	if [ ! -d "$INSPATH" ]; then 
		echo "SPRI install path '$INSPATH' not found ?, aborting."
		exit 1
	fi
	file_sanity $IGNORE
	repri $RTPRI $RT
	repri $HIGHPRI $HIGH
	repri $MEDHPRI $MEDH
	repri $MEDPRI $MED
	repri $LOWMPRI $LOWM
	repri $LOWPRI $LOW
	rm -f $TF
}

case "$1" in
-v)
	header
	lcheck
	run
	;;
-q)
	$0 -v >> /dev/null 2>&1
	;;
*)
	header
	echo "-v	Show Output"
	echo "-q	Hide Output"

esac
exit 0
