Compare commits

..

No commits in common. "b58965dc2361d7f9de6692d7e2c5015669d84a7e" and "154da89f0b921b0358c4e66688cea25776970f64" have entirely different histories.

2 changed files with 28 additions and 71 deletions

View file

@ -1,7 +1,7 @@
PREFIX ?= /usr PREFIX ?= /usr
all: all:
@echo Run \'make install\' to install mca @echo Run \'make install\' to install MCA
install: install:
@install -m 0755 mca.sh -D $(DESTDIR)$(PREFIX)/bin/mca @install -m 0755 mca.sh -D $(DESTDIR)$(PREFIX)/bin/mca

97
mca.sh
View file

@ -4,24 +4,20 @@ set -e
EXEC_NAME="$(basename -- "$0")" EXEC_NAME="$(basename -- "$0")"
USAGE="Usage: $EXEC_NAME [OPTION]... [MCA_NAME|MCA_JAR|MCA_DIR] [INPUT]..." options="$(getopt -n "$EXEC_NAME" -s sh -o hvfdxr -l help -l version -- "$@")"
VERSION="mca 1.0.0" eval set -- "$options"
OPTION="$(getopt -n "$EXEC_NAME" -s sh -o hvfdxrs -l help -l version -- "$@")"
eval set -- "$OPTION"
SCREEN_OPTS= SCREEN_OPTS=
REATTACH_ONLY=0 REATTACH_ONLY=0
SKIP_CONFIGURE=0
while :; do while :; do
case "$1" in case "$1" in
-h|--help) -h|--help)
echo "$USAGE" echo "Usage: $EXEC_NAME [-fdxr] [MCA_NAME|MCA_JAR|MCA_DIR] [--] [INPUT]…"
exit exit
;; ;;
-v|--version) -v|--version)
echo "$VERSION" echo "MCA 1.0.0"
exit exit
;; ;;
-f) -f)
@ -36,9 +32,6 @@ while :; do
-r) -r)
REATTACH_ONLY=1 REATTACH_ONLY=1
;; ;;
-s)
SKIP_CONFIGURE=1
;;
--) --)
shift shift
break break
@ -51,8 +44,7 @@ MCA_NAME=$1
if [ -z "$MCA_NAME" ]; then if [ -z "$MCA_NAME" ]; then
MCA_DIR="$PWD" MCA_DIR="$PWD"
MCA_NAME="$(basename -- "$MCA_DIR")" MCA_NAME="$(basename -- "$MCA_DIR")"
elif echo "$MCA_NAME" | grep -qE '^\.{,2}/' && \ elif echo "$MCA_NAME" | grep -qE '^\.{,2}/' && MCA_NAME="$(readlink -f -- "$MCA_NAME")"; then
MCA_NAME="$(readlink -f -- "$MCA_NAME")"; then
if [ -d "$MCA_NAME" ]; then if [ -d "$MCA_NAME" ]; then
MCA_DIR="$MCA_NAME" MCA_DIR="$MCA_NAME"
MCA_NAME="$(basename -- "$MCA_DIR")" MCA_NAME="$(basename -- "$MCA_DIR")"
@ -64,65 +56,45 @@ else
MCA_DIR="$HOME/mca/$MCA_NAME" MCA_DIR="$HOME/mca/$MCA_NAME"
fi fi
if ! command -v screen > /dev/null; then command -v screen > /dev/null || { echo "$EXEC_NAME: screen not found" >&2; exit 2; }
echo "$EXEC_NAME: screen not found" >&2
exit 2
fi
if [ -n "$2" ]; then if [ -n "$2" ]; then
shift shift
INPUT="$(echo "$*" | sed 's/"/\\\0/g')" INPUT="$(echo "$*" | sed 's/"/\\\0/g')"
if screen -S "$MCA_NAME" -X eval "stuff \"$INPUT\"\\015" > /dev/null; then screen -S "$MCA_NAME" -X eval "stuff \"$INPUT\"\\015" > /dev/null || {
exit 0 echo "$EXEC_NAME: no screen found" >&2
else
echo "$EXEC_NAME: $MCA_NAME: no such screen found" >&2
exit 2 exit 2
fi }
exit
fi fi
MCA_SCREENRC_FILE="/etc/mca/screenrc" MCA_SCREENRC_FILE="/etc/mca/screenrc"
if [ ! -r "$MCA_SCREENRC_FILE" ]; then [ -r "$MCA_SCREENRC_FILE" ] || { echo "$EXEC_NAME: can't read $MCA_SCREENRC_FILE" >&2; exit 2; }
echo "$EXEC_NAME: can't read $MCA_SCREENRC_FILE" >&2
exit 2
fi
if screen -c "$MCA_SCREENRC_FILE" "-$SCREEN_OPTS"rS \ if screen -c "$MCA_SCREENRC_FILE" "-$SCREEN_OPTS"rS "$MCA_NAME" > /dev/null 2>&1; then
"$MCA_NAME" > /dev/null 2>&1; then exit
exit 0
elif screen -S "$MCA_NAME" -X select . > /dev/null 2>&1; then elif screen -S "$MCA_NAME" -X select . > /dev/null 2>&1; then
echo "$EXEC_NAME: this screen has already been attached to someone" >&2 echo "$EXEC_NAME: this screen has already been attached to someone" >&2
exit 2 exit 2
fi fi
if [ "$REATTACH_ONLY" -eq 1 ]; then [ "$REATTACH_ONLY" -eq 1 ] && { echo "$EXEC_NAME: $MCA_NAME: no such a screen was found" >&2; exit 2; }
echo "$EXEC_NAME: $MCA_NAME: no such screen found" >&2
exit 2
fi
if [ ! -d "$MCA_DIR" ]; then [ -d "$MCA_DIR" ] || { echo "$EXEC_NAME: $MCA_DIR: not found" >&2; exit 2; }
echo "$EXEC_NAME: $MCA_DIR: such directory not found" >&2
exit 2
fi
cd "$MCA_DIR" cd "$MCA_DIR"
MCA_RC_FILE="$MCA_DIR/.mcarc" MCA_RC_FILE="$MCA_DIR/.mcarc"
# this file is taken from a dynamic variable, so we cannot specify an explicit # this file is taken from a dynamic variable, so we cannot specify an explicit path to the file
# path to the file.
# shellcheck disable=SC1090 # shellcheck disable=SC1090
# `--` is supported in dash. # `--` is supported in dash
# shellcheck disable=SC2240 # shellcheck disable=SC2240
if [ -e "$MCA_RC_FILE" ]; then [ -e "$MCA_RC_FILE" ] && . -- "$MCA_RC_FILE"
set -a
. -- "$MCA_RC_FILE"
set +a
fi
if [ -z "$PLATFORM" ]; then if [ -z "$PLATFORM" ]; then
if [ -z "$MCA_JAR" ]; then if [ -z "$MCA_JAR" ]; then
MCA_JAR="$(find "$MCA_DIR" -maxdepth 1 \ MCA_JAR="$(find "$MCA_DIR" -maxdepth 1 -type f -name \*.jar | head -1)"
-type f -name \*.jar | head -1)"
[ -z "$MCA_JAR" ] && { [ -z "$MCA_JAR" ] && {
echo "$EXEC_NAME: no jar found in $MCA_DIR" >&2 echo "$EXEC_NAME: no jar found in $MCA_DIR" >&2
exit 2 exit 2
@ -131,8 +103,7 @@ if [ -z "$PLATFORM" ]; then
if [ -e "$MCA_JAR" ]; then if [ -e "$MCA_JAR" ]; then
PLATFORM="$(basename -- "$MCA_JAR")" PLATFORM="$(basename -- "$MCA_JAR")"
PLATFORM="$(echo "$PLATFORM" | tr '[:upper:]' '[:lower:]' | \ PLATFORM="$(echo "$PLATFORM" | tr '[:upper:]' '[:lower:]' | grep -oE '[a-z]+' | head -1)"
grep -oE '[a-z]+' | head -1)"
else else
echo "$EXEC_NAME: $MCA_JAR: no such file" >&2 echo "$EXEC_NAME: $MCA_JAR: no such file" >&2
exit 2 exit 2
@ -186,41 +157,27 @@ case "$PLATFORM" in
custom) custom)
;; ;;
*) *)
echo "$EXEC_NAME: invalid platform: $PLATFORM. Valid: bungee, \ echo "$EXEC_NAME: invalid platform: $PLATFORM. Valid: \
waterfall, velocity, minecraft, bukkit, craftbukkit, spigot, \ bungee, waterfall, velocity, minecraft, bukkit, craftbukkit, spigot, paper, custom" >&2
paper, custom" >&2
exit 2 exit 2
;; ;;
esac esac
if [ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME/bin" ]; then [ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME/bin" ] && PATH="$JAVA_HOME/bin:$PATH"
PATH="$JAVA_HOME/bin:$PATH"
fi
if ! command -v java > /dev/null; then java -version > /dev/null 2>&1 || {
echo "$EXEC_NAME: unable to get Java version (is Java installed?)" >&2 echo "$EXEC_NAME: unable to get Java version (is Java installed?)" >&2
exit 2 exit 2
fi }
[ -n "$MAX_MEMORY" ] && JVM_FLAGS="-Xmx$MAX_MEMORY $JVM_FLAGS" [ -n "$MAX_MEMORY" ] && JVM_FLAGS="-Xmx$MAX_MEMORY $JVM_FLAGS"
[ -n "$MIN_MEMORY" ] && JVM_FLAGS="-Xms$MIN_MEMORY $JVM_FLAGS" [ -n "$MIN_MEMORY" ] && JVM_FLAGS="-Xms$MIN_MEMORY $JVM_FLAGS"
MCA_CMD="$(which java) -server $JVM_FLAGS -jar $MCA_JAR" MCA_CMD="$(which java) -server $JVM_FLAGS -jar $MCA_JAR"
if [ "$SKIP_CONFIGURE" -eq 0 ]; then # papermc prints uncolored text if the COLORTERM variable is set to `truecolor`
ENV_LIST="$(cut -d= -f1 < ./.mcarc | sed 's/^/$/g'))"
FILE_LIST="$(find . -name '*.in' -type f)"
echo "$FILE_LIST" | while read -r line; do
envsubst "$ENV_LIST" < "$line" > "${line%*.in}"
done
fi
# papermc prints uncolored text if the COLORTERM variable is set to
# `truecolor`.
export COLORTERM= export COLORTERM=
# we don't quote $MCA_CMD because screen treats arguments after the second one # we don't quote $MCA_CMD because screen treats arguments after the second one as a command
# as a command.
# shellcheck disable=SC2086 # shellcheck disable=SC2086
exec screen -c "$MCA_SCREENRC_FILE" "-$SCREEN_OPTS"S "$MCA_NAME" -- $MCA_CMD exec screen -c "$MCA_SCREENRC_FILE" "-$SCREEN_OPTS"S "$MCA_NAME" -- $MCA_CMD