#!/bin/bash
# 2022-09-14 Hyperling
# Ensure dependencies are met and start the webserver.

## Setup ##

DIR=`dirname $0`
PROG=`basename $0`

## Functions ##

function usage {
	cat <<- EOF
		$PROG calls the main Node.js program after ensuring the project can run.
		  (PORTS)
		    -p : Pass the port numbers that the API/website should listen at.
		         Example: $PROG -p 80 -p 443 -p 8080
		  (HELP)
		    -h : Show this usage output and exit successfully.
	EOF
	exit $1
}

## Parameters ##

while getopts ':p:h' opt; do
	case "$opt" in
		p) (( OPTARG < 1024 )) && [[ $LOGNAME != "root" ]] && {
				echo "WARNING: Port $OPTARG is privileged. Will need to be root."
				exit 1
			}
			ports="$ports $OPTARG" ;;
		h) usage 0 ;;
		*) echo "ERROR: Option $OPTARG not recognized." >&2
			usage 1 ;;
	esac
done

## Build Environment ##

# Ensure we are executing from this file's directory.
cd $DIR

sudo=""
if [[ $LOGNAME != "root" ]]; then
	echo "`date` - Using sudo since user is '$LOGNAME'."
	sudo="sudo"
fi

echo "`date` - Check if any system dependencies need installed."
if [[ ! `which php` ]]; then
	echo "- Installing PHP"
	$sudo apt-get install -y php-cli
fi
if [[ ! `which node` ]]; then
	echo "- Installing Node"
	$sudo apt-get install -y nodejs
fi
if [[ ! `which npm` ]]; then
	echo "- Installing NPM"
	$sudo apt-get install -y npm
fi

# Directories and allowed page types are executable, others are not.
echo "`date` - Fix any strange file permissions."
find ./pages/ | while read file; do
	if [[ $file == *".php" || $file == *".sh" || -d $file ]]; then
		mode=755
	else
		mode=644
	fi
	chmod -c $mode $file
done

echo "`date` - Check if any node modules need updated/installed."
npm install

## Main ##

echo "`date` - Start website API."
node ./main.js $ports
status=$?

## Finish ##

echo "`date` - Exiting with status '$status'."
exit $status