#!/bin/sh

# The path to your config file
CONFIGFILE="/usr/local/wired/etc/trackerd.conf"

# The path to your pid file, should be the same as in your trackerd.conf
PIDFILE="/usr/local/wired/trackerd.pid"

# The path to your status file, should be the same as in your trackerd.conf
STATUSFILE="/usr/local/wired/trackerd.status"

# The path to your certificate, should be the same as in your trackerd.conf
CERTIFICATE="/usr/local/wired/etc/certificate.pem"

# The path to your trackerd binary
TRACKERD="/usr/local/sbin/trackerd"

# Flags to pass to trackerd
TRACKERDFLAGS="-d /usr/local/wired -l"

# Begin script
PROG=$(basename $0)
CMD=$1

if [ "$CMD" ]; then
	shift
	TRACKERDFLAGS="$TRACKERDFLAGS $*"
fi

if [ -f "/usr/local/wired/etc/trackerd.flags" ]; then
	STARTUPFLAGS=$(cat "/usr/local/wired/etc/trackerd.flags")
	TRACKERDFLAGS="$TRACKERDFLAGS $STARTUPFLAGS"
fi

checkpid() {
	RUNNING=0

	if [ -f $PIDFILE ]; then
		PID=`cat $PIDFILE`

		if [ "x$PID" != "x" ]; then
			if kill -0 $PID 2>/dev/null ; then
				RUNNING=1
			fi
		fi
	fi
}

checkrunning() {
	checkpid

	if [ $RUNNING -eq 0 ]; then
		echo "$PROG: $CMD: trackerd is not running"
		exit 1
	fi
}

case $CMD in
	start)
		checkpid

		if [ $RUNNING -eq 1 ]; then
			echo "$PROG: $CMD: trackerd (pid $PID) already running"
			exit 1
		fi

		if [ ! -f "$CERTIFICATE" ]; then
			$0 certificate
		fi

		if $TRACKERD $TRACKERDFLAGS; then
			echo "$PROG: $CMD: trackerd started"
		else
			echo "$PROG: $CMD: trackerd could not be started"
		fi
		;;

	stop)
		checkrunning

		if kill $PID; then
			echo "$PROG: $CMD: trackerd stopped"
		else
			echo "$PROG: $CMD: trackerd could not be stopped"
			exit 1
		fi
		;;

	restart)
		checkpid

		if [ $RUNNING -eq 1 ]; then
			if kill $PID; then
				echo "$PROG: $CMD: trackerd stopped"
			else
				echo "$PROG: $CMD: trackerd could not be stopped"
				exit 1
			fi
		fi

		if $TRACKERD $TRACKERDFLAGS; then
			echo "$PROG: $CMD: trackerd started"
		else
			echo "$PROG: $CMD: trackerd could not be started"
		fi
		;;

	reload)
		checkrunning

		if kill -HUP $PID; then
			echo "$PROG: $CMD: trackerd reloaded"
		else
			echo "$PROG: $CMD: trackerd could not be reloaded"
		fi
		;;

	config)
		grep -v "^#" $CONFIGFILE | grep -v "^$" | sort
		;;

	configtest)
		$TRACKERD -t
		;;

	certificate)
		HOSTNAME=$(hostname)
		openssl req -x509 -newkey rsa:1024 -subj "/CN=$HOSTNAME" -days 365 -nodes -keyout "$CERTIFICATE" -out "$CERTIFICATE"
		;;

	status)
		if [ -f $STATUSFILE ]; then
			$TRACKERD -v
			awk '
				function pad(number) {
					if(number < 10)
						return "0" number
					else
						return number
				}

				function ftime(time) {
					days = int(time / 86400)
					time = time % 86400

					hours = int(time / 3600)
					time = time % 3600

					minutes = int(time / 60)
					time = time % 60

					seconds = time

					if(days > 0)
						return pad(days) ":" pad(hours) ":" \
							   pad(minutes) ":" pad(seconds) \
							   " days"
					else if(hours > 0)
						return pad(hours) ":" pad(minutes) ":" \
							   pad(seconds) " hours"
					else if(minutes > 0)
						return pad(minutes) ":" pad(seconds) \
							   " minutes"
					else
						return seconds " seconds"
				}

				function fbytes(bytes) {
					power = 0

					while(bytes > (1024 ^ ++power))
						;

					value = sprintf("%.2f", bytes / (1024 ^ --power))

					if(power == 4)
						return value " TB"
					else if(power == 3)
						return value " GB"
					else if(power == 2)
						return value " MB"
					else if(power == 1)
						return value " KB"
					else if(power == 0)
						if(bytes == 1)
							return bytes " byte"
						else
							return bytes " bytes"
				}

				{
					"date +%s" | getline now
					print "Up " ftime(now - $1)
					print ""
					print "Current servers:       " $2
					print "Total clients:         " $3
					print "Current users:         " $4
					print "Current files:         " $5
					print "Current size:          " fbytes($6)
				}
			' $STATUSFILE
		else
			echo "$PROG: $CMD: $STATUSFILE could not be found"
		fi
		;;

	*)
		echo "Usage: $PROG [start | stop | restart | reload | config | configtest | certificate | status | help]"
		cat <<EOF

    start        start trackerd
    stop         stop trackerd
    restart      restart trackerd
    reload       send trackerd a SIGHUP, causing it to reload its configuration
    config       show the configuration
    configtest   run a configuration syntax test
    certificate  generate a new OpenSSL certificate
    status       show a status screen
    help         display this information

By Axel Andersson <axel@zankasoftware.com>
EOF
		;;
esac
