#!/bin/bash # Minecraft Java serverdir builder function fail(){ >&2 echo $@ exit 1 } function perror() { echo $@ } >&2 # 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 -ni "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) ;& unassign) ;& assign) shift eval 'world_$CMD "$@"' ;; *) fail "world: Unknown argument $CMD" esac exit $? } function world_exists() { [ -d "$WORLDS/$1" ] return $? } function world_list() { for WORLD in $WORLDS/*/; do WORLD=$(basename $WORLD) [ -e "$WORLDS/$WORLD.lock" ] && source "$WORLDS/$WORLD.lock" [ -z "$ASSIGNED_TO" ] || WORLD="$WORLD (-> $ASSIGNED_TO)" echo $WORLD done } # 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." ) if [ -f "$WORLDS/$WORLD.lock" ]; then source "$WORLDS/$WORLD.lock" [ "$ASSIGNED_TO" = "$INSTANCE" ] \ || fail "$WORLD is already used by another instance." fi [ -L "$INSTANCES/$INSTANCE/$WORLD" ] \ && rm "$INSTANCES/$INSTANCE/$WORLD" [ -e "$INSTANCES/$INSTANCE/$WORLD" ] \ && fail "A file/folder named $WORLD already exists in the instance directory." echo "ASSIGNED_TO=\"$INSTANCE\"" > "$WORLDS/$WORLD.lock" ln -s "$WORLDS/$WORLD" "$INSTANCES/$INSTANCE/$WORLD" serverprop_set "$INSTANCES/$INSTANCE/server.properties" level-name "$WORLD" } # 1: world function world_unassign() { local WORLD="$1" world_exists "$WORLD" || fail "World $WORLD not found." [ -f "$WORLDS/$WORLD.lock" ] || fail "World is not in use." source "$WORLDS/$WORLD.lock" rm "$WORLDS/$WORLD.lock" [ -L "$INSTANCES/$ASSIGNED_TO/$WORLD" ] && rm "$INSTANCES/$ASSIGNED_TO/$WORLD" echo "$WORLD was assigned to $ASSIGNED_TO" #serverprop_set "$WORLDS/$WORLD/settings.sh" LOCK 1 } function world_clone() { fail "TODO" } function world_backup() { fail "TODO" } function world_restore() { fail "TODO" } function world_delete() { fail "TODO" } # 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_list() { for INSTANCE in $INSTANCES/*/; do INSTANCE="$(basename "$INSTANCE")" instance_status "$INSTANCE" > /dev/null 2>&1 && INSTANCE+=" (RUNNING)" echo "$INSTANCE" done return 0 } function instance_status() { instance_exists "$1" || fail "instance $1 not found." local PWD="$(pwd)" cd "$INSTANCES/$1" $RUNNER status local RET=$? cd "$PWD" return $RET } function instance_exists() { [ -d "$INSTANCES/$1" ] return $? } # 1: name function instance_create() { local NAME="$1" instance_exists "$NAME" && fail "$NAME already exists." mkdir "$INSTANCES/$NAME" confirm "Accept minecraft EULA?" && serverprop_set "$INSTANCES/$NAME/eula.txt" eula true } function instance_start() { instance_exists "$1" || fail "instance $1 not found." fail "TODO" } function instance_stop() { fail "TODO" } ## version function version() { local CMD="$1" case $CMD in list) ;& install) ;& uninstall) shift eval 'version_$CMD "$@"' ;; *) fail "version: Unknown argument $CMD" esac exit $? } function version_exists() { [ -f "$VERSIONS/$1.jar" ] return $? } function version_list() { for VERSION in $VERSIONS/*.jar; do VERSION="$(basename "$VERSION")" echo "${VERSION%%.jar}" done return 0 } # 1: version 2: instance function version_install() { local VERSION="$1" local INSTANCE="$2" instance_exists "$INSTANCE" || fail "instance $1 not found." version_exists "$VERSION" || fail "version $2 not found." local PWD=$(pwd) cd "$INSTANCES/$INSTANCE" [ -e "$VERSION.jar" ] && rm "$VERSION.jar" ln -s "$VERSIONS/$VERSION.jar" "$VERSION.jar" serverprop_set settings.sh MCJAR "$VERSION.jar" cd "$PWD" } function version_uninstall() { fail "TODO" } # NO_INTERACTIVE=1 PREFIX=$(pwd) VERSIONS="$PREFIX/versions" WORLDS="$PREFIX/worlds" INSTANCES="$PREFIX/instances" RUNNER="$PREFIX/runner.sh" [ -e ./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