#! /bin/sh

set -e

twinstardir='/usr/share/twinstar'
servicedir="$twinstardir/services.d"
rundir="$twinstardir/run.d"

usage() {
	echo >&2 "Usage:"
	echo >&2 "       $0 list-available"
	echo >&2 "       $0 list-active"
	echo >&2 "       $0 report"
	echo >&2 "       $0 add    <service_name>"
	echo >&2 "       $0 remove <service_name>"
	echo >&2 "       $0 start"
	echo >&2 "       $0 stop"
	echo >&2 "       $0 status"
	echo >&2 "       $0 validate"
	exit 1
}

list_dir() {
	dir="$1"
	cd "$dir" 2>/dev/null && ls -1 *.run 2>/dev/null
}

process_files() {
	sed -e 's/^\([0-9]\+\)-\(.*\).run$/&\t\1\t\2/'
}

[ "$#" -ge 1 ] || usage
action="$1"

case "$action" in
list-available)
	list_dir "$servicedir" | process_files | awk '{ print $3 }'
	;;
list-active)
	list_dir "$rundir" |  process_files | awk '{ print $3 }'
	;;
report)
	list_dir "$servicedir" |  process_files | while read file seq name; do
		if [ -e "$rundir/$file" ]; then
			state='on'
		else
			state='off'
		fi
		printf "%02s\t%-15s %s\n" "$seq" "$name" "$state"
	done
	;;
add)
	[ "$#" -ge 2 ] || usage
	wanted_name="$2"
	list_dir "$servicedir" | process_files | while read file seq name; do
		if [ "$wanted_name" = "$name" ]; then
			( cd "$rundir" && ln -sf "../services.d/$file" . )
			break
		fi
	done
	;;
remove)
	[ "$#" -ge 2 ] || usage
	wanted_name="$2"
	list_dir "$rundir" | process_files | while read file seq name; do
		if [ "$wanted_name" = "$name" ]; then
			rm -f "$rundir/$file"
			break
		fi
	done
	;;
start)
	[ "$#" -eq 1 ] || usage
	list_dir "$rundir" | process_files | while read file seq name; do
		r="$rundir/$file"
		"$r" start
	done
	;;
stop)
	[ "$#" -eq 1 ] || usage
	list_dir "$rundir" | sort -r | process_files | while read file seq name; do
		r="$rundir/$file"
		"$r" stop
	done
	;;
status)
	[ "$#" -eq 1 ] || usage
	list_dir "$rundir" | process_files | while read file seq name; do
		r="$rundir/$file"
		echo "---> $name:"
		"$r" status || :
		echo ""
	done
	;;
validate)
	[ "$#" -eq 1 ] || usage
	list_dir "$rundir" | process_files | while read file seq name; do
		r="$rundir/$file"
		echo -n "---> $name: "
		if ! "$r" validate; then
			echo >&2 "$0: FAILED($file)"
			exit 1
		fi
		echo ""
	done
	;;
*)
	usage
	;;
esac
