#!/bin/bash
#
# start -- start up configured conmux servers on this host.
#
# (C) Copyright IBM Corp. 2004, 2005, 2006
# Author: Andy Whitcroft <andyw@uk.ibm.com>
#
# The Console Multiplexor is released under the GNU Public License V2
#
if [ -f ~/.gmm.conf ]; then
	. ~/.gmm.conf
fi
CONMUX=${CONMUX:-/usr/local/conmux}

cmd="start"
if [ "$1" != "" ]; then
	cmd="$1"
fi

PATH=$CONMUX/bin:$CONMUX/sbin:$CONMUX/lib/drivers:$CONMUX/lib/helpers:$PATH

function start() {
        typeset name="$1"
        typeset pf="$CONMUX/log/$name.pid"

        shift

        # Determine whether it is already running ... if so leave it be.
        if [ -f "$pf" ]; then
                if kill -0 `cat "$pf"` 2>/dev/null; then
                        return 1
                fi
        fi

	echo "starting $name ..."
        "$@" >"$CONMUX/log/$name.log" 2>&1 &
        echo "$!" >"$pf"

	return 0
}
function stop() {
        typeset name="$1"
        typeset pf="$CONMUX/log/$name.pid"

	echo "stopping $name ..."
        # Kill it and clear up
        kill -HUP `cat "$pf"` 2>/dev/null
	rm -f "$pf"
}

existing=""
for i in $CONMUX/log/*.pid
do
	n=${i%.pid}
	n=${n#$CONMUX/log/}

	if [ "$n" != "*" ]; then
		existing="$existing $n"
	fi
done

if [ "$cmd" = "start" ]; then
	autoboot=""
	[ -f $CONMUX/etc/registry ] || touch $CONMUX/etc/registry
	start registry $CONMUX/sbin/conmux-registry 63000 $CONMUX/etc/registry
	if [ "$?" -eq 0 ]; then
		sleep 1
	fi
	started="registry"
	pause=0
	for i in $CONMUX/etc/*.cf
	do
		n=${i%.cf}
		n=${n#$CONMUX/etc/}

		if [ "$n" != "*" ]; then
			if [ -f "$CONMUX/log/$n.cf" ]; then
				if ! cmp -s "$i" "$CONMUX/log/$n.cf"; then
					stop $n
				fi
			fi
			start $n $CONMUX/sbin/conmux $i
			if [ "$?" -eq 0 ]; then
				pause=1
			fi
			started="$started $n"

			# Preserve the orginal configuration file.
			cp "$i" "$CONMUX/log/$n.cf"

			if grep -q TYPE:numaq "$i"; then
				autoboot="$autoboot $n"
			fi
			for i in `grep FLAGS: "$i"`; do
				case "$i" in
				\#|FLAGS:)	;;
				*)		autoboot="$autoboot $n/$i" ;;
				esac
			done
		fi
	done
	if [ "$pause" -eq 1 ]; then
		sleep 1
	fi
	for nh in $autoboot
	do
		name="${nh%/*}"
		helper="${nh#*/}"

		mn="${name#abat-}"
		start $name-$helper-helper $CONMUX/bin/conmux-attach $mn $helper-helper
		started="$started $name-$helper-helper"
	done
fi

if [ "$cmd" = "start" -o "$cmd" = "stop" ]; then
	for i in $existing
	do
		case " $started " in
		*\ $i\ *)	;;
		*)		stop "$i" ;;
		esac
	done
fi

if [ "$cmd" = "status" ]; then
	for n in $existing
	do
		mn="${n#abat-}"
		case "$n" in
		registry|*-helper)
			;;
		*)
			status=`console -s $mn`
			echo "$mn $status"
		esac
	done
fi
