#!/bin/bash
#      ^^^^ or ksh, just not /bin/sh on SCO or Sun
# chkconfig: 235 55 45
# description:
# description: cyclades-serial-client script controls the interfaces of \
#              the physical ports of Cyclades Terminal Servers

ACTION=$1
DEV=${2:-all}
NAME=cyclades-serial-client
DESC="Cyclades Terminal Servers Interface"
DEXE=cyclades-ser-cli
DEVS=/etc/cyclades-devices
BACKVARS=/var/run/${NAME}/backvars$$
FOUND=false
BACKEXIT=0
GLOBALOPTS=""

export DEV DEVS FOUND BACKEXIT BACKVARS PATH

clean() { [[ -f $BACKVARS ]] && rm -f $BACKVARS ; }
abort() { e=$1 ; shift ; echo "$0: $@" ; exit $e ; }

[[ -f $DEVS ]] || abort 1 "Device table \"${DEVS}\" not found"

clean

trap 'clean' 1 2 3 15

[[ -d ${BACKVARS%/*} ]] || mkdir -p ${BACKVARS%/*}

case "$ACTION" in
	"start") echo "Starting $DESC" ;;
	"stop") echo "Stopping $DESC" ;;
	"restart"|"status") : ;;
	*)
		BACKEXIT=2
		echo "BACKEXIT=$BACKEXIT" >> $BACKVARS
		abort $BACKEXIT "Usage: $0 (start|stop|restart|status) [device]"
		;;
esac

n=0 DONE=false
until $DONE ; do
	IFS=: read devc tstype host port proto opts || DONE=true
	((++n))
	case "$devc" in ""|"#*") continue ;; esac

	[[ "$DEV" = "all" ]] || {
		[[ "$DEV" = "$devc" ]] || continue
		FOUND=true
		echo "FOUND=$FOUND" >> $BACKVARS
	}

	[[ "$tstype" ]] || MISSING="Terminal Server Type"
	[[ "$host" ]] || MISSING="${MISSING}${MISSING:+, }Host"
	[[ "$port" ]] || MISSING="${MISSING}${MISSING:+, }Port"
	[[ "MISSING" && {
		BACKEXIT=3
		echo "BACKEXIT=$BACKEXIT" >> $BACKVARS
		abort $BACKEXIT "$DEVS: line $n: device $devc: Missing $MISSING."
	}

	opts="$GLOBALOPTS $opts"

	case "$proto" in
		"rtelnet")
			case "$tstype" in
				"path") opts="-p 28672 $opts" ;;
			esac
			;;
		"socket")
			case "$tstype" in
				"path") opts="-p 32768 $opts" ;;
			esac
			opts="-s $opts"
			;;
		"rfc2217")
			case "$tstype" in
				"opengear"|"cm400?"|"cm41??") opts="-p 5000 $opts" ;;
			esac
			;;
		*)
			BACKEXIT=2
			echo "BACKEXIT=$BACKEXIT" >> $BACKVARS
			abort $BACKEXIT "$DEVS: line $n: device $devc: Invalid type \"$type\""
			;;
	esac

	devst="$devc ($proto at ${host}:${port})"
	ppid=`ps -eopid,comm,args |awk '(($2=="'$DEXE'") && ($(NF-2)=="'$devc'")){print $1}'`

	case "$ACTION" in
	"start")
		[[ "$ppid" ]] && {
			echo "$devc already active"
		} || {
			echo "Starting $devst"
			$DEXE $opts $devc $host $port
		}
		;;
	"stop")
		[[ "$ppid" ]] && {
			echo "Stopping $devst"
			kill $ppid
		} || {
			echo "$devc already inactive"
		}
		;;
	"restart")
		[[ "$ppid" ]] && {
			echo "Restarting $devst"
			kill -s USR1 $ppid
		} || {
			echo "$devc is inactive"
			echo "Starting $devst"
			$DEXE $opts $devc $host $port
		}
		;;
	"status")
		[[ "$ppid" ]] && devst="$devst active, pid $ppid" || devst="$devst inactive"
		echo $devst
		;;
	esac
done < $DEVS

[[ -s $BACKVARS ]] && . $BACKVARS

clean

[[ $BACKEXIT -ne 0 ]] || exit $BACKEXIT

[[ "$DEV" = "all" ]] || $FOUND || abort 3 "Device \"$DEV\" not defined in $DEVS"

exit 0
