diff options
Diffstat (limited to 'builder.sh')
-rwxr-xr-x | builder.sh | 187 |
1 files changed, 187 insertions, 0 deletions
diff --git a/builder.sh b/builder.sh new file mode 100755 index 0000000..5f647f8 --- /dev/null +++ b/builder.sh @@ -0,0 +1,187 @@ +#!/bin/bash + +# Minecraft Java serverdir builder + +function fail(){ + >&2 echo $@ + exit 1 +} + +# 1: file 2: attribute +function serverprop_get() { + sed -n "s/$2=\(.*\)$/\1/p" "$1" +} + +# 1: file 2: attribute 3: value +function serverprop_set() { + if grep -s "^$2=.*$" "$1"; then + sed -i "s/$2=.*$/$2=$3/g" "$1" + else + echo "$2=$3" >> "$1" + fi +} + +function confirm() { + [ -z "$NO_INTERACTIVE" ] || return 1 + + read -p "$@ [y/N] " choice + case $choice in + [yY]*) + return 0;; + *) + return 1 + esac +} + +# Sub Commands + +## world + +function world() { + local CMD="$1" + case $CMD in + list) ;& + create) ;& + clone) ;& + backup) ;& + delete) ;& + assign) + shift + eval 'world_$CMD "$@"' + ;; + *) + fail "world: Unknown argument $CMD" + esac + + exit $? +} + +function world_exists() { + [ -d "$WORLDS/$1" ] + return $? +} + +# 1: world 2: instance +function world_assign() { + local WORLD="$1" + local INSTANCE="$2" + + world_exists "$WORLD" \ + || ( confirm "World not found. Create?" \ + && world_create "$WORLD" \ + || fail "World $WORLD not found." ) + + [ -f "$WORLDS/$WORLD.lock" ] && fail "$WORLD is already used by another instance." + + echo "ASSIGNED_TO=\"$INSTANCE\"" > "$WORLDS/$WORLD.lock" + + ln -s "$WORLDS/$WORLD" "$INSTANCES/$INSTANCE" + serverprop_set "$INSTANCES/$INSTANCE/server.properties" level-name "$WORLD" +} + + +# 1: name +function world_create() { + world_exists "$1" && fail "World already exists" + mkdir "$WORLDS/$1" +} + +## instance + +function instance() { + local CMD="$1" + case $CMD in + list) ;& + create) ;& + delete) ;& + start) ;& + stop) ;& + status) + shift + eval 'instance_$CMD "$@"' + ;; + *) + fail "instance: Unknown argument $CMD" + esac + + exit $? +} + +function instance_exists() { + [ -d "$INSTANCES/$1" ] + return $? +} + +# 1: name 2: world 3: version +function instance_create() { + local NAME="$1" + local WORLD="$2" + local VERSION="$3" + + instance_exists "$NAME" && fail "$NAME already exists." + mkdir "$INSTANCES/$NAME" + + version_install "$NAME" "$VERSION" + confirm "Accept minecraft EULA?" && serverprop_set "$INSTANCES/$NAME/eula.txt" eula true + + world_assign "$WORLD" "$NAME" +} + +function instance_start() { + instance_exists "$1" || fail "instance $1 not found." + + + # TODO +} + +## version + +function version() { + fail "not implemented" +} + +function version_exists() { + [ -f "$VERSIONS/$1.jar" ] + return $? +} + +# 1: instance 2: version +function version_install() { + instance_exists "$1" || fail "instance $1 not found." + version_exists "$2" || fail "version $2 not found." + + local PWD=$(pwd) + cd "$INSTANCES/$1" + + [ -e "$2.jar" ] && rm "$2.jar" + + ln -s "$VERSIONS/$2.jar" "$2.jar" + + serverprop_set settings.sh MCJAR "$2.jar" + + cd "$PWD" +} + +# NO_INTERACTIVE=1 + +PREFIX=$(pwd) +VERSIONS="$PREFIX/versions" +WORLDS="$PREFIX/worlds" +INSTANCES="$PREFIX/instances" + +RUNNER="$PREFIX/runner.sh" + +[ -x ./settings.sh ] || fail "settings.sh not found." +source ./settings.sh + +CMD="$1" +case $CMD in + world) ;& + instance) ;& + version) + shift + eval '$CMD "$@"' + ;; + *) + fail "Unknown option $1" +esac |