Skip to content

Instantly share code, notes, and snippets.

@kevinramharak
Created January 2, 2018 16:25
Show Gist options
  • Save kevinramharak/e66489c0cee0156c29ffa8813eadab7c to your computer and use it in GitHub Desktop.
Save kevinramharak/e66489c0cee0156c29ffa8813eadab7c to your computer and use it in GitHub Desktop.
MAR pull/build script
#!/bin/bash
#### utils
## print to stdout
stdout() {
echo -e "$@"
}
## print to stderr
stderr() {
echo -e "$@" >&2
}
## usage
usage() {
stdout "setup.bash [-F|-B] [-r] [-p] [-m PORT] [-w PORT] [-h HOSTNAME] DIRECTORY"
stdout "OPTIONS:"
stdout " -F - Do NOT setup frontend"
stdout " -B - Do NOT setup backend"
stdout " -r - Start up both servers, use CTRL-C to exit"
stdout " -p - purge files/database from previous run"
stdout " -m PORT - Define port to use for MySQL [3306]"
stdout " -w PORT - Define port to use for server Websocket [8887]"
stdout " -H HOSTNAME - Define hostname to use [localhost]"
stdout "ARGUMENTS:"
stdout " DIRECTORY - The directory to place the repositories in"
stdout " it will be created if it does not exist"
stdout ""
stdout "Sets up Much Assembly Required in given DIRECTORY argument."
stdout "This is meant for development only!."
stdout ""
stdout "This script depends on * being installed:"
stdout " git php mysql maven openjdk-8-jdk"
stdout ""
stdout "Setting the port options are only needed if you know what you are "
stdout "doing."
stdout ""
stdout "TODO: support docker"
stdout ""
stdout "Version: $version"
stdout "Authors: $authors"
}
# if no args print usage
if [[ "$#" -eq 0 ]]; then
usage
exit
fi
## contants
authors="Kevin Ramharak <kevin@ramharak.nl>"
version="0.1"
curr_pwd=$(pwd)
## urls
backend_name="Much-Assembly-Required"
backend_repo="https://github.com/simon987/$backend_name.git"
frontend_name="$backend_name-Frontend"
frontend_repo="https://github.com/simon987/$frontend_name.git"
## flags
flag_frontend=1
flag_backend=1
flag_check_java=1
flag_run=0
flag_purge=0
## defaults
port_mysql=3306
port_websocket=8887
port_frontend=8080
my_hostname="localhost"
directory=""
## optional configuration
mysql_root_password=""
mysql_database_name="mar"
mysql_database_user="mar"
mysql_database_pass="mar"
# TODO: add flag to set this to $my_hostname
mysql_hostname="localhost"
## dependencies
depends="git mysql"
depends_frontend="php"
depends_backend="mvn jrunscript"
#### functions
## checks if $1 is a valid port number
port_check() {
# is number between 1001 and 65535
if [[ "$1" =~ ^[0-9]+$ && "$1" -gt 1000 && "$1" -lt 65536 ]]; then
return 0
else
return 1
fi
}
## should be run after `check_depends()`
check_php_version() {
if [[ ! "$(php -v)" =~ ^PHP\ (5\.[5-9])|7 ]]; then
stderr "PHP version 5.5 is required"
return 1
fi
return 0
}
## should be run after `check_depends()`
## TODO: is 9 good to?
check_java_version() {
local version=$(jrunscript -e 'java.lang.System.out.println(java.lang.System.getProperty("java.home"));')
if [[ ! "$version" =~ java-8-openjdk ]]; then
stderr "Java (OpenJDK 8) is required"
return 1
fi
return 0
}
## check if dependecies are met
check_depends() {
if [[ "$flag_frontend" -eq 1 ]]; then
depends="$depends $depends_frontend"
fi
if [[ "$flag_backend" -eq 1 ]]; then
depends="$depends $depends_backend"
fi
local err=0
for cmd in $depends; do
stdout "checking for '$cmd'"
command -v "$cmd" >/dev/null 2>&1
if [[ "$?" -ne 0 ]]; then
stderr "missing dependency: '$cmd'"
err=1
fi
done
check_php_version || err=1
if [[ "$flag_check_java" -eq 1 ]]; then
check_java_version || err=1
fi
return $err
}
## setup_frontend() should be a wrapper around all the frontend stuff
setup_frontend() {
if [[ -d "$frontend_name" ]]; then
if [[ "$flag_purge" -eq 1 ]]; then
rm -rf "$frontend_name"
else
stderr "$frontend_name already exists"
return 1
fi
fi
stdout "#### Running 'git clone $frontend_repo'"
git clone "$frontend_repo" || { stderr "setup_frontend() :: failed to clone repo"; return 1; }
cd "$frontend_name"
# build database
# NOTE: This part can be ommited if PR gets accepted
local mysql_script="\
create database if not exists \`$mysql_database_name\`;\
create user if not exists \`$mysql_database_user\`@\`$mysql_hostname\` identified by '$mysql_database_pass';\
grant all privileges on \`$mysql_database_name\`.* to \`$mysql_database_user\`@\`$mysql_hostname\`;\
flush privileges;\
use \`$mysql_database_name\`;\
"
if [[ "$flag_purge" -eq 1 ]]; then
mysql_script="\
drop user if exists \`$mysql_database_user\`@\`$mysql_hostname\`;\
drop database if exists \`$mysql_database_name\`;\
$mysql_script
"
fi
stdout "#### Running 'echo \"\$mysql_script\" | cat - database.sql | mysql -u root -p$mysql_root_password'"
# note: mysql is s{mart/tupid}. It will out of the box only allow 'sudo mysql -u root [-p]'
# might want to work around this. for now the user has to install and mysql correctly
# we just try a bunch off stuff in the hope it works
echo "$mysql_script" | cat - database.sql | mysql -u root -p"$mysql_root_password"
if [[ $? -ne 0 ]]; then
stdout "#### falling back on 'sudo mysql -u root -p\$password'"
echo "$mysql_script" | cat - database.sql | sudo mysql -u root -p"$mysql_root_password"
if [[ $? -ne 0 ]]; then
stdout "#### falling back on 'sudo mysql -u root -p'"
echo "$mysql_script" | cat - database.sql | sudo mysql -u root -p
stderr "setup_frontend() :: mysql script failed"
return 1
fi
fi
# change config if needed
if [[ "$port_mysql" -ne 3306 || "$mysql_hostname" != "localhost" || "$mysql_database_name" != "mar" ]]; then
sed -i -e "s#host=localhost;dbname=mar#host=$mysql_hostname:$port_mysql;dbname=$mysql_database_name;" includes/config.php
fi
if [[ "$mysql_database_user" != "mar" ]]; then
sed -i -e "s#define(\"SQL_USER\", \"mar\")#define(\"SQL_USER\", "\"$mysql_database_user"\")" includes/config.php
fi
if [[ "$mysql_database_pass" != "mar" ]]; then
sed -i -e "s#define(\"SQL_PASS\", \"mar\")#define(\"SQL_PASS\", "\"$mysql_database_pass"\")" includes/config.php
fi
if [[ "$port_websocket" -ne 8887 || "$my_hostname" != "localhost" ]]; then
sed -e -e "s#define(\"MAR_ADDRESS\", \"ws://localhost:8887\");#define(\"MAR_ADDRESS\", \"ws://$my_hostname:$port_websocket\");" includes/config.php
fi
cd ..
}
## setup_backend() should be a wrapper around all the backend stuff
setup_backend() {
if [[ -d "$backend_name" ]]; then
if [[ "$flag_purge" -eq 1 ]]; then
rm -rf "$backend_name"
else
stderr "$backend_name already exists"
return 1
fi
fi
git clone "$backend_repo" || { stderr "setup_backend() :: failed to clone repo"; return 1; }
cd "$backend_name"
# build project
stdout "#### checking \$JAVA_HOME"
# set java home if not available
if [[ -z "$JAVA_HOME" ]]; then
export JAVA_HOME=$(jrunscript -e 'java.lang.System.out.println(java.lang.System.getProperty("java.home"));')
stdout "#### set \$JAVA_HOME to: '$JAVA_HOME'"
fi
stdout "#### Running 'mvn package'"
mvn package
# change config if needed
if [[ "$port_mysql" -ne 3306 || "$mysql_hostname" != "localhost" || "$mysql_database_name" != "mar" ]]; then
sed -i -e "s#mysql_url=jdbc:mysql://localhost:3306/mar#mysql_url=jdbc:mysql://$mysql_hostname:$port_mysql/$mysql_database_name" target/config.properties
fi
if [[ "$mysql_database_user" != "mar" ]]; then
sed -i -e "s/mysql_user=mar/mysql_user=$mysql_database_user" target/config.properties
fi
if [[ "$mysql_database_pass" != "mar" ]]; then
sed -i -e "s/mysql_pass=mar/mysql_user=$mysql_database_pass" target/config.properties
fi
if [[ "$port_websocket" -ne 8887 ]]; then
sed -e -e "s#webSocket_port=8887#webSocket_port=$port_websocket" target/config.properties
fi
if [[ "$my_hostname" != "localhost" ]]; then
sed -e -e "s#webSocket_host=0.0.0.0#webSocket_host=$my_hostname" target/config.properties
fi
cd ..
}
#### main
## parse arguments
## handle -h and -v inside loop
while getopts :hFBJprm:w:f:H: opt; do
case "$opt" in
\?)
stderr "invalid option: -$OPTARG"
usage
exit 1
;;
h)
usage
exit
;;
F)
flag_frontend=0
;;
B)
flag_backend=0
;;
p)
flag_purge=1
;;
J)
flag_check_java=0
;;
r)
flag_run=1
;;
m)
port_check "$OPTARG"
if [[ "$?" -eq 0 ]]; then
port_mysql="$OPTARG"
else
stderr "'-m $OPTARG' is an invalid port. PORT should can be in range 1001 - 65535"
exit 1
fi
;;
w)
port_check "$OPTARG"
if [[ "$?" -eq 0 ]]; then
port_websocket="$OPTARG"
else
stderr "'-w $OPTARG' is an invalid port. PORT should can be in range 1001 - 65535"
exit 1
fi
;;
f)
port_check "$OPTARG"
if [[ "$?" -eq 0 ]]; then
port_frontend="$OPTARG"
else
stderr "'-w $OPTARG' is an invalid port. PORT should can be in range 1001 - 65535"
exit 1
fi
;;
H)
my_hostname="$OPTARG"
# for now
mysql_hostname="$OPTARG"
;;
:)
stderr "option '-$OPTARG' requires an argument"
usage
exit 1
;;
esac
done
## shift arguments
shift $((OPTIND-1))
## if no DIRECTORY print error and exit
if [[ -z "$1" ]]; then
stderr "need at least 1 argument"
exit 1
else
directory="$1"
fi
# if both NOT flags are set print message and exit
if [[ "$flag_frontend" -eq 0 && "$flag_backend" -eq 0 ]]; then
stdout "'-F' && '-B' equals a no-op. What are you doing?"
exit
fi
## check dependencies; will exit on failure
stdout "#### Checking dependencies"
check_depends || { stderr "dependency not met :: exiting..."; exit 1; }
## setup DIRECTORY
if [[ ! -d "$directory" ]]; then
stdout "#### Creating directory: '$directory'"
mkdir -p "$directory" || { stderr "error creating directory: '$directory'"; exit 1; }
fi
stdout "#### Changing working directory to '$directory'"
cd "$directory" || { stderr "could not enter directory: '$directory'"; exit 1; }
if [[ "$flag_frontend" -eq 1 ]]; then
stdout "#### Running 'setup_frontend()'"
setup_frontend || { stderr "setup_frontend() :: critical error" && exit 1; }
stdout "#### 'setup_frontend()' completed succesfully."
fi
if [[ "$flag_backend" -eq 1 ]]; then
stdout "#### Running 'setup_backend()'"
setup_backend || { stderr "setup_backend() :: critical error"; exit 1; }
stdout "#### 'setup_backend()' completed succesfully."
fi
cd .. # go back to intial dir
if [[ "$flag_frontend" -eq 1 && "$flag_run" -eq 1 ]]; then
stdout "#### starting frontend server'"
stdout "#### Running 'php -S $my_hostname:$port_frontend -t $directory/$frontend_name 1>/dev/null 2>&1 &'"
php -S $my_hostname:$port_frontend -t $directory/$frontend_name 1>/dev/null 2>&1 &
fi
if [[ "$flag_backend" -eq 1 && "$flag_run" -eq 1 ]]; then
stdout "#### Running 'run_backend()'"
stdout "#### Running 'cd ./$directory/$backend_name/target && java -jar server-*.jar'"
cd ./$directory/$backend_name/target && java -jar server-*.jar
fi
if [[ "$flag_run" -eq 0 ]]; then
stdout "setup.bash completed you can (re)start the servers by:"
stdout " webserver : 'php -S $my_hostname:$port_frontend -t $directory/$frontend_name'"
stdout " java : 'cd ./$directory/$backend_name/target && java -jar server-*.jar'"
stdout " onliner : 'php -S $my_hostname:$port_frontend -t $directory/$frontend_name 1>/dev/null 2>&1 & cd ./$directory/$backend_name/target && java -jar server-*.jar'"
stdout "now browse to http://$my_hostname:$port_frontend"
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment