Created
May 7, 2014 12:35
-
-
Save ziodave/5902d188b8ef02ba834f to your computer and use it in GitHub Desktop.
A silk-workstation scripts that handles being launched as a symlink.
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 | |
### ------------------------------- ### | |
### Helper methods for BASH scripts ### | |
### ------------------------------- ### | |
resolve_symlink() { | |
SCRIPT=$1 NEWSCRIPT='' | |
until [ "$SCRIPT" = "$NEWSCRIPT" ]; do | |
if [ "${SCRIPT:0:1}" = '.' ]; then SCRIPT=$PWD/$SCRIPT; fi | |
cd $(dirname $SCRIPT) | |
if [ ! "${SCRIPT:0:1}" = '.' ]; then SCRIPT=$(basename $SCRIPT); fi | |
SCRIPT=${NEWSCRIPT:=$SCRIPT} | |
NEWSCRIPT=$(ls -l $SCRIPT | awk '{ print $NF }') | |
done | |
if [ ! "${SCRIPT:0:1}" = '/' ]; then SCRIPT=$PWD/$SCRIPT; fi | |
echo $SCRIPT | |
} | |
realpath () { | |
( | |
TARGET_FILE="$1" | |
CHECK_CYGWIN="$2" | |
cd $(dirname "$TARGET_FILE") | |
TARGET_FILE=$(basename "$TARGET_FILE") | |
COUNT=0 | |
while [ -L "$TARGET_FILE" -a $COUNT -lt 100 ] | |
do | |
TARGET_FILE=$(readlink "$TARGET_FILE") | |
cd $(dirname "$TARGET_FILE") | |
TARGET_FILE=$(basename "$TARGET_FILE") | |
COUNT=$(($COUNT + 1)) | |
done | |
if [ "$TARGET_FILE" == "." -o "$TARGET_FILE" == ".." ]; then | |
cd "$TARGET_FILE" | |
TARGET_FILEPATH= | |
else | |
TARGET_FILEPATH=/$TARGET_FILE | |
fi | |
# make sure we grab the actual windows path, instead of cygwin's path. | |
if [[ "x$CHECK_CYGWIN" == "x" ]]; then | |
echo "$(pwd -P)/$TARGET_FILE" | |
else | |
echo $(cygwinpath "$(pwd -P)/$TARGET_FILE") | |
fi | |
) | |
} | |
# TODO - Do we need to detect msys? | |
# Uses uname to detect if we're in the odd cygwin environment. | |
is_cygwin() { | |
local os=$(uname -s) | |
case "$os" in | |
CYGWIN*) return 0 ;; | |
*) return 1 ;; | |
esac | |
} | |
# This can fix cygwin style /cygdrive paths so we get the | |
# windows style paths. | |
cygwinpath() { | |
local file="$1" | |
if is_cygwin; then | |
echo $(cygpath -w $file) | |
else | |
echo $file | |
fi | |
} | |
# Make something URI friendly | |
make_url() { | |
url="$1" | |
local nospaces=${url// /%20} | |
if is_cygwin; then | |
echo "/${nospaces//\\//}" | |
else | |
echo "$nospaces" | |
fi | |
} | |
# This crazy function reads in a vanilla "linux" classpath string (only : are separators, and all /), | |
# and returns a classpath with windows style paths, and ; separators. | |
fixCygwinClasspath() { | |
OLDIFS=$IFS | |
IFS=":" | |
read -a classpath_members <<< "$1" | |
declare -a fixed_members | |
IFS=$OLDIFS | |
for i in "${!classpath_members[@]}" | |
do | |
fixed_members[i]=$(realpath "${classpath_members[i]}" "fix") | |
done | |
IFS=";" | |
echo "${fixed_members[*]}" | |
IFS=$OLDIFS | |
} | |
# Fix the classpath we use for cygwin. | |
fix_classpath() { | |
cp="$1" | |
if is_cygwin; then | |
echo "$(fixCygwinClasspath "$cp")" | |
else | |
echo "$cp" | |
fi | |
} | |
# Detect if we should use JAVA_HOME or just try PATH. | |
get_java_cmd() { | |
if [[ -n "$JAVA_HOME" ]] && [[ -x "$JAVA_HOME/bin/java" ]]; then | |
echo "$JAVA_HOME/bin/java" | |
else | |
echo "java" | |
fi | |
} | |
echoerr () { | |
echo 1>&2 "$@" | |
} | |
vlog () { | |
[[ $verbose || $debug ]] && echoerr "$@" | |
} | |
dlog () { | |
[[ $debug ]] && echoerr "$@" | |
} | |
execRunner () { | |
# print the arguments one to a line, quoting any containing spaces | |
[[ $verbose || $debug ]] && echo "# Executing command line:" && { | |
for arg; do | |
if printf "%s\n" "$arg" | grep -q ' '; then | |
printf "\"%s\"\n" "$arg" | |
else | |
printf "%s\n" "$arg" | |
fi | |
done | |
echo "" | |
} | |
exec "$@" | |
} | |
addJava () { | |
dlog "[addJava] arg = '$1'" | |
java_args=( "${java_args[@]}" "$1" ) | |
} | |
addApp () { | |
dlog "[addApp] arg = '$1'" | |
app_commands=( "${app_commands[@]}" "$1" ) | |
} | |
addResidual () { | |
dlog "[residual] arg = '$1'" | |
residual_args=( "${residual_args[@]}" "$1" ) | |
} | |
addDebugger () { | |
addJava "-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=$1" | |
} | |
# a ham-fisted attempt to move some memory settings in concert | |
# so they need not be messed around with individually. | |
get_mem_opts () { | |
local mem=${1:-1024} | |
local perm=$(( $mem / 4 )) | |
(( $perm > 256 )) || perm=256 | |
(( $perm < 1024 )) || perm=1024 | |
local codecache=$(( $perm / 2 )) | |
echo "-Xms${mem}m -Xmx${mem}m -XX:MaxPermSize=${perm}m -XX:ReservedCodeCacheSize=${codecache}m" | |
} | |
require_arg () { | |
local type="$1" | |
local opt="$2" | |
local arg="$3" | |
if [[ -z "$arg" ]] || [[ "${arg:0:1}" == "-" ]]; then | |
die "$opt requires <$type> argument" | |
fi | |
} | |
require_arg () { | |
local type="$1" | |
local opt="$2" | |
local arg="$3" | |
if [[ -z "$arg" ]] || [[ "${arg:0:1}" == "-" ]]; then | |
die "$opt requires <$type> argument" | |
fi | |
} | |
is_function_defined() { | |
declare -f "$1" > /dev/null | |
} | |
# Attempt to detect if the script is running via a GUI or not | |
# TODO - Determine where/how we use this generically | |
detect_terminal_for_ui() { | |
[[ ! -t 0 ]] && [[ "${#residual_args}" == "0" ]] && { | |
echo "true" | |
} | |
# SPECIAL TEST FOR MAC | |
[[ "$(uname)" == "Darwin" ]] && [[ "$HOME" == "$PWD" ]] && [[ "${#residual_args}" == "0" ]] && { | |
echo "true" | |
} | |
} | |
# Processes incoming arguments and places them in appropriate global variables. called by the run method. | |
process_args () { | |
while [[ $# -gt 0 ]]; do | |
case "$1" in | |
-h|-help) usage; exit 1 ;; | |
-v|-verbose) verbose=1 && shift ;; | |
-d|-debug) debug=1 && shift ;; | |
-mem) require_arg integer "$1" "$2" && app_mem="$2" && shift 2 ;; | |
-jvm-debug) require_arg port "$1" "$2" && addDebugger $2 && shift 2 ;; | |
-java-home) require_arg path "$1" "$2" && java_cmd="$2/bin/java" && shift 2 ;; | |
-D*) addJava "$1" && shift ;; | |
-J*) addJava "${1:2}" && shift ;; | |
*) addResidual "$1" && shift ;; | |
esac | |
done | |
is_function_defined process_my_args && { | |
myargs=("${residual_args[@]}") | |
residual_args=() | |
process_my_args "${myargs[@]}" | |
} | |
} | |
# Actually runs the script. | |
run() { | |
# TODO - check for sane environment | |
# process the combined args, then reset "$@" to the residuals | |
process_args "$@" | |
set -- "${residual_args[@]}" | |
argumentCount=$# | |
#check for jline terminal fixes on cygwin | |
if is_cygwin; then | |
stty -icanon min 1 -echo > /dev/null 2>&1 | |
addJava "-Djline.terminal=jline.UnixTerminal" | |
addJava "-Dsbt.cygwin=true" | |
fi | |
# run sbt | |
execRunner "$java_cmd" \ | |
$(get_mem_opts $app_mem) \ | |
${java_opts} \ | |
${java_args[@]} \ | |
-cp "$(fix_classpath "$app_classpath")" \ | |
$app_mainclass \ | |
"${app_commands[@]}" \ | |
"${residual_args[@]}" | |
local exit_code=$? | |
if is_cygwin; then | |
stty icanon echo > /dev/null 2>&1 | |
fi | |
exit $exit_code | |
} | |
# Loads a configuration file full of default command line options for this script. | |
loadConfigFile() { | |
cat "$1" | sed '/^\#/d' | |
} | |
### ------------------------------- ### | |
### Start of customized settings ### | |
### ------------------------------- ### | |
usage() { | |
cat <<EOM | |
Usage: $script_name [options] | |
-h | -help print this message | |
-v | -verbose this runner is chattier | |
-d | -debug set sbt log level to debug | |
-mem <integer> set memory options (default: $sbt_mem, which is $(get_mem_opts $sbt_mem)) | |
-jvm-debug <port> Turn on JVM debugging, open at the given port. | |
# java version (default: java from PATH, currently $(java -version 2>&1 | grep version)) | |
-java-home <path> alternate JAVA_HOME | |
# jvm options and output control | |
JAVA_OPTS environment variable, if unset uses "$java_opts" | |
-Dkey=val pass -Dkey=val directly to the java runtime | |
-J-X pass option -X directly to the java runtime | |
(-J is stripped) | |
In the case of duplicated or conflicting options, the order above | |
shows precedence: JAVA_OPTS lowest, command line options highest. | |
EOM | |
} | |
### ------------------------------- ### | |
### Main script ### | |
### ------------------------------- ### | |
declare -a residual_args | |
declare -a java_args | |
declare -a app_commands | |
declare -r real_script=$(resolve_symlink "$0") | |
declare -r app_home="$(realpath "$(dirname "$real_script")")" | |
# TODO - Check whether this is ok in cygwin... | |
declare -r lib_dir="$(realpath "${app_home}/../lib")" | |
declare -r app_mainclass="play.core.server.NettyServer" | |
declare -r app_classpath="$lib_dir/silk-workbench.silk-workbench-2.6.0-SNAPSHOT.jar:$lib_dir/silk-workspace.silk-workspace-2.6.0-SNAPSHOT.jar:$lib_dir/silk-core.silk-core-2.6.0-SNAPSHOT.jar:$lib_dir/silk-jena.silk-jena-2.6.0-SNAPSHOT.jar:$lib_dir/silk-learning.silk-learning-2.6.0-SNAPSHOT.jar:$lib_dir/com.rockymadden.stringmetric.stringmetric-core-0.25.3.jar:$lib_dir/org.scala-lang.scala-compiler-2.10.1.jar:$lib_dir/com.thoughtworks.paranamer.paranamer-2.5.7.jar:$lib_dir/org.mockito.mockito-all-1.9.0.jar:$lib_dir/org.clapper.classutil_2.10-1.0.3.jar:$lib_dir/asm.asm-3.3.jar:$lib_dir/asm.asm-commons-3.3.jar:$lib_dir/asm.asm-tree-3.3.jar:$lib_dir/asm.asm-util-3.3.jar:$lib_dir/org.clapper.grizzled-scala_2.10-1.1.2.jar:$lib_dir/jline.jline-2.6.jar:$lib_dir/org.clapper.grizzled-slf4j_2.10-1.0.1.jar:$lib_dir/org.apache.jena.jena-core-2.11.0.jar:$lib_dir/org.apache.jena.jena-iri-1.0.0.jar:$lib_dir/log4j.log4j-1.2.16.jar:$lib_dir/xerces.xercesImpl-2.11.0.jar:$lib_dir/xml-apis.xml-apis-1.4.01.jar:$lib_dir/org.apache.jena.jena-arq-2.11.0.jar:$lib_dir/org.apache.httpcomponents.httpclient-4.2.3.jar:$lib_dir/org.apache.httpcomponents.httpcore-4.2.2.jar:$lib_dir/commons-codec.commons-codec-1.6.jar:$lib_dir/com.typesafe.play.play_2.10-2.2.1.jar:$lib_dir/com.typesafe.play.sbt-link-2.2.1.jar:$lib_dir/org.javassist.javassist-3.18.0-GA.jar:$lib_dir/com.typesafe.play.play-exceptions-2.2.1.jar:$lib_dir/com.typesafe.play.templates_2.10-2.2.1.jar:$lib_dir/com.github.scala-incubator.io.scala-io-file_2.10-0.4.2.jar:$lib_dir/com.github.scala-incubator.io.scala-io-core_2.10-0.4.2.jar:$lib_dir/com.jsuereth.scala-arm_2.10-1.3.jar:$lib_dir/com.typesafe.play.play-iteratees_2.10-2.2.1.jar:$lib_dir/org.scala-stm.scala-stm_2.10-0.7.jar:$lib_dir/com.typesafe.config-1.0.2.jar:$lib_dir/com.typesafe.play.play-json_2.10-2.2.1.jar:$lib_dir/com.typesafe.play.play-functional_2.10-2.2.1.jar:$lib_dir/com.typesafe.play.play-datacommons_2.10-2.2.1.jar:$lib_dir/joda-time.joda-time-2.2.jar:$lib_dir/org.joda.joda-convert-1.3.1.jar:$lib_dir/com.fasterxml.jackson.core.jackson-annotations-2.2.2.jar:$lib_dir/com.fasterxml.jackson.core.jackson-core-2.2.2.jar:$lib_dir/com.fasterxml.jackson.core.jackson-databind-2.2.2.jar:$lib_dir/org.scala-lang.scala-reflect-2.10.2.jar:$lib_dir/io.netty.netty-3.7.0.Final.jar:$lib_dir/com.typesafe.netty.netty-http-pipelining-1.1.2.jar:$lib_dir/org.slf4j.slf4j-api-1.7.5.jar:$lib_dir/org.slf4j.jul-to-slf4j-1.7.5.jar:$lib_dir/org.slf4j.jcl-over-slf4j-1.7.5.jar:$lib_dir/ch.qos.logback.logback-core-1.0.13.jar:$lib_dir/ch.qos.logback.logback-classic-1.0.13.jar:$lib_dir/com.typesafe.akka.akka-actor_2.10-2.2.0.jar:$lib_dir/com.typesafe.akka.akka-slf4j_2.10-2.2.0.jar:$lib_dir/org.apache.commons.commons-lang3-3.1.jar:$lib_dir/com.ning.async-http-client-1.7.18.jar:$lib_dir/oauth.signpost.signpost-core-1.2.1.2.jar:$lib_dir/oauth.signpost.signpost-commonshttp4-1.2.1.2.jar:$lib_dir/javax.transaction.jta-1.1.jar:$lib_dir/com.github.play2war.play2-war-core-servlet30_2.10-1.2-beta2.jar:$lib_dir/org.scala-lang.scala-library-2.10.3.jar:$lib_dir/com.github.play2war.play2-war-core-common_2.10-1.2-beta2.jar" | |
addJava "-Duser.dir=$(cd "${app_home}/.."; pwd -P)" | |
declare -r java_cmd=$(get_java_cmd) | |
# Now check to see if it's a good enough version | |
# TODO - Check to see if we have a configured default java version, otherwise use 1.6 | |
declare -r java_version=$("$java_cmd" -version 2>&1 | awk -F '"' '/version/ {print $2}') | |
if [[ "$java_version" == "" ]]; then | |
echo | |
echo No java installations was detected. | |
echo Please go to http://www.java.com/getjava/ and download | |
echo | |
exit 1 | |
elif [[ ! "$java_version" > "1.6" ]]; then | |
echo | |
echo The java installation you have is not up to date | |
echo $app_name requires at least version 1.6+, you have | |
echo version $java_version | |
echo | |
echo Please go to http://www.java.com/getjava/ and download | |
echo a valid Java Runtime and install before running $app_name. | |
echo | |
exit 1 | |
fi | |
# if configuration files exist, prepend their contents to $@ so it can be processed by this runner | |
[[ -f "$script_conf_file" ]] && set -- $(loadConfigFile "$script_conf_file") "$@" | |
run "$@" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment