Created
January 2, 2018 16:25
-
-
Save kevinramharak/e66489c0cee0156c29ffa8813eadab7c to your computer and use it in GitHub Desktop.
MAR pull/build script
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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