#!/usr/bin/env bash
#
# Copyright (c) 2015 Google Inc.
# Kevin Klues <klueska@cs.berkeley.edu>
# See LICENSE for details.

function short_description() {
	echo "Launch a Go 9pserver for Akaros"
}

function usage() {
	echo "Usage:"
	echo "    ${cmd} -h | --help"
	echo "    ${cmd} [ --gopath=<gp> ]"
	echo "    ${cmd//?/ } [ --akaros-9p-root=<mnt> ]"
	echo "    ${cmd//?/ } [ --ufs-port=<port> ]"
	echo "    ${cmd//?/ } [ --clear-mount ]"
	echo "    ${cmd//?/ } [ --rebuild-server ]"
	echo ""
	echo "Options:"
	echo "    -h --help               Display this screen and exit"
	echo "    --gopath=<gp>           The path to the go workspace"
	echo "                            [default: \$GOPATH]"
	echo "    --akaros-9p-root=<mnt>  The location of the akaros 9p mount point"
	echo "                            [default: \$AKAROS_9P_ROOT]"
	echo "    --ufs-port=<port>       Port to connect the server on"
	echo "                            [default: 1025]"
	echo "    --clear-mount           Clear the 9p mount folder before mounting"
	echo "    --rebuild-server        Download and rebuild the 9pserver"
}

function main() {
	# Check the sanity of our incoming variables
	check_vars gopath akaros_9p_root ufs_port clear_mount rebuild_server
	check_dirs gopath akaros_9p_root

	# Set up the go environment variables
	eval $(go env)

	# If we don't have a server at all, force a rebuild
	if [ ! -f ${gopath}/bin/ufs ]; then
		rebuild_server=true
	fi

	# Get the latest 9p server which supports akaros
	if [ ${rebuild_server} = true ]; then
		echo "Downloading and installing the latest supported 9p server"
		export GOOS=${GOHOSTOS}
		export GOARCH=${GOHOSTARCH}
		go get -d -u github.com/rminnich/go9p
		go get -d -u github.com/rminnich/go9p/ufs
		go install github.com/rminnich/go9p/ufs
	fi

	# Clear out the ${akaros_9p_root} directory
	if [ ${clear_mount} = true ]; then
		echo "Clearing out ${akaros_9p_root}"
		rm -rf ${akaros_9p_root}
	fi
	mkdir -p ${akaros_9p_root}

	# Kill any old instances of the ufs server on ${ufs_port}
	ak kill-9pserver --ufs-port="${ufs_port}"

	# Start a new ufs instance on ${ufs_port}
	nohup ${gopath}/bin/ufs -akaros=true -addr=:${ufs_port} \
	                        -root=${akaros_9p_root} >/dev/null 2>&1 &
	echo "Started 9p server port=${ufs_port} root=${akaros_9p_root} (pid ${!})"
}
