Add processing .in files and configure only and skip configure options
This commit is contained in:
parent
d103ee1511
commit
66c3caa549
1 changed files with 183 additions and 134 deletions
317
mca.sh
317
mca.sh
|
|
@ -4,15 +4,16 @@ set -e
|
||||||
|
|
||||||
EXEC_NAME="$(basename -- "$0")"
|
EXEC_NAME="$(basename -- "$0")"
|
||||||
|
|
||||||
USAGE="Usage: $EXEC_NAME [OPTION]... [MCA_NAME|MCA_JAR|MCA_DIR] [INPUT]..."
|
USAGE="Usage: $EXEC_NAME [OPTION]... [NAME|JAR|DIR] [INPUT]..."
|
||||||
VERSION="mca 1.0.0"
|
VERSION="mca 1.0.0"
|
||||||
|
|
||||||
OPTION="$(getopt -n "$EXEC_NAME" -s sh -o hvfdxrs -l help -l version -- "$@")"
|
OPTION="$(getopt -n "$EXEC_NAME" -s sh -o hvfdxrsc -l help -l version -- "$@")"
|
||||||
eval set -- "$OPTION"
|
eval set -- "$OPTION"
|
||||||
|
|
||||||
SCREEN_OPTS=
|
SCREEN_OPTS=
|
||||||
REATTACH_ONLY=0
|
REATTACH_ONLY=0
|
||||||
SKIP_CONFIGURE=0
|
SKIP_CONFIGURE=0
|
||||||
|
CONFIGURE_ONLY=0
|
||||||
|
|
||||||
while :; do
|
while :; do
|
||||||
case "$1" in
|
case "$1" in
|
||||||
|
|
@ -39,6 +40,9 @@ while :; do
|
||||||
-s)
|
-s)
|
||||||
SKIP_CONFIGURE=1
|
SKIP_CONFIGURE=1
|
||||||
;;
|
;;
|
||||||
|
-c)
|
||||||
|
CONFIGURE_ONLY=1
|
||||||
|
;;
|
||||||
--)
|
--)
|
||||||
shift
|
shift
|
||||||
break
|
break
|
||||||
|
|
@ -46,13 +50,19 @@ while :; do
|
||||||
shift
|
shift
|
||||||
done
|
done
|
||||||
|
|
||||||
|
if [ "$SKIP_CONFIGURE" -eq 1 ] && [ "$CONFIGURE_ONLY" -eq 1 ]; then
|
||||||
|
echo "$EXEC_NAME: can't skip configuration and only configure at \
|
||||||
|
the same time" >&2
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
MCA_NAME=$1
|
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,155 +74,191 @@ else
|
||||||
MCA_DIR="$HOME/mca/$MCA_NAME"
|
MCA_DIR="$HOME/mca/$MCA_NAME"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! command -v screen > /dev/null; then
|
if [ "$CONFIGURE_ONLY" -eq 0 ]; then
|
||||||
echo "$EXEC_NAME: screen not found" >&2
|
if ! command -v screen > /dev/null; then
|
||||||
exit 2
|
echo "$EXEC_NAME: screen not found" >&2
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -n "$2" ]; then
|
|
||||||
shift
|
|
||||||
INPUT="$(echo "$*" | sed 's/"/\\\0/g')"
|
|
||||||
if screen -S "$MCA_NAME" -X eval "stuff \"$INPUT\"\\015" > /dev/null; then
|
|
||||||
exit 0
|
|
||||||
else
|
|
||||||
echo "$EXEC_NAME: $MCA_NAME: no such screen found" >&2
|
|
||||||
exit 2
|
exit 2
|
||||||
fi
|
fi
|
||||||
fi
|
|
||||||
|
|
||||||
MCA_SCREENRC_FILE="/etc/mca/screenrc"
|
SCREEN_NAME="$(echo "$MCA_NAME" | tr / -)"
|
||||||
if [ ! -r "$MCA_SCREENRC_FILE" ]; then
|
|
||||||
echo "$EXEC_NAME: can't read $MCA_SCREENRC_FILE" >&2
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
|
|
||||||
if screen -c "$MCA_SCREENRC_FILE" "-$SCREEN_OPTS"rS \
|
if [ -n "$2" ]; then
|
||||||
"$MCA_NAME" > /dev/null 2>&1; then
|
shift
|
||||||
exit 0
|
INPUT="$(echo "$*" | sed 's/"/\\\0/g')"
|
||||||
elif screen -S "$MCA_NAME" -X select . > /dev/null 2>&1; then
|
if screen -S "$SCREEN_NAME" \
|
||||||
echo "$EXEC_NAME: this screen has already been attached to someone" >&2
|
-X eval "stuff \"$INPUT\"\\015" > /dev/null; then
|
||||||
exit 2
|
exit 0
|
||||||
fi
|
else
|
||||||
|
echo "$EXEC_NAME: $SCREEN_NAME: no such screen found" >&2
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
if [ "$REATTACH_ONLY" -eq 1 ]; then
|
SCREEN_RC_FILE=
|
||||||
echo "$EXEC_NAME: $MCA_NAME: no such screen found" >&2
|
for i in "$HOME/.config" /etc; do
|
||||||
exit 2
|
j="$i/mca/screenrc"
|
||||||
fi
|
if [ -r "$j" ]; then
|
||||||
|
SCREEN_RC_FILE=$j
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
if [ ! -d "$MCA_DIR" ]; then
|
if [ -z "$SCREEN_RC_FILE" ]; then
|
||||||
echo "$EXEC_NAME: $MCA_DIR: such directory not found" >&2
|
echo "$EXEC_NAME: can't find screenrc" >&2
|
||||||
exit 2
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
if screen -c "$SCREEN_RC_FILE" "-$SCREEN_OPTS"rS \
|
||||||
|
"$SCREEN_NAME" > /dev/null 2>&1; then
|
||||||
|
exit 0
|
||||||
|
elif screen -S "$SCREEN_NAME" -X select . > /dev/null 2>&1; then
|
||||||
|
echo "$EXEC_NAME: this screen has already been attached to someone" >&2
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$REATTACH_ONLY" -eq 1 ]; then
|
||||||
|
echo "$EXEC_NAME: $SCREEN_NAME: no such screen found" >&2
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d "$MCA_DIR" ]; then
|
||||||
|
echo "$EXEC_NAME: $MCA_DIR: such directory not found" >&2
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
fi
|
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
|
|
||||||
# path to the file.
|
|
||||||
# shellcheck disable=SC1090
|
|
||||||
# `--` is supported in dash.
|
|
||||||
# shellcheck disable=SC2240
|
|
||||||
if [ -e "$MCA_RC_FILE" ]; then
|
if [ -e "$MCA_RC_FILE" ]; then
|
||||||
set -a
|
# don't use `-p` in `read` for line breaks to avoid long lines.
|
||||||
. -- "$MCA_RC_FILE"
|
# shellcheck disable=SC2162
|
||||||
set +a
|
while IFS= read line; do
|
||||||
|
# skip lines starting with '#'
|
||||||
|
case "$line" in
|
||||||
|
''|\#*)
|
||||||
|
continue
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# to get `$1` and `$2` as key and value.
|
||||||
|
# shellcheck disable=SC2086
|
||||||
|
set $line
|
||||||
|
|
||||||
|
if echo "$1" | grep -i '[^a-zA-Z0-9_]'; then
|
||||||
|
echo "$EXEC_NAME: $1: option key contains invalid characters" >&2
|
||||||
|
else
|
||||||
|
KEY="MCA_$(echo "$1" | tr '[:lower:]' '[:upper:]')"
|
||||||
|
if [ -n "$2" ]; then
|
||||||
|
shift
|
||||||
|
VALUE=$*
|
||||||
|
fi
|
||||||
|
export "$KEY"="$VALUE"
|
||||||
|
fi
|
||||||
|
done < "$MCA_RC_FILE"
|
||||||
MCA_RC_FILE_READ=1
|
MCA_RC_FILE_READ=1
|
||||||
else
|
else
|
||||||
MCA_RC_FILE_READ=0
|
MCA_RC_FILE_READ=0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -z "$PLATFORM" ]; then
|
if [ "$CONFIGURE_ONLY" -eq 0 ]; then
|
||||||
if [ -z "$MCA_JAR" ]; then
|
if [ -z "$MCA_PLATFORM" ]; then
|
||||||
MCA_JAR="$(find "$MCA_DIR" -maxdepth 1 \
|
if [ -z "$MCA_JAR" ]; then
|
||||||
-type f -name \*.jar | head -1)"
|
MCA_JAR="$(find "$MCA_DIR" -maxdepth 1 -type f -name \*.jar \
|
||||||
[ -z "$MCA_JAR" ] && {
|
| head -1)"
|
||||||
echo "$EXEC_NAME: no jar found in $MCA_DIR" >&2
|
[ -z "$MCA_JAR" ] && {
|
||||||
|
echo "$EXEC_NAME: no jar found in $MCA_DIR" >&2
|
||||||
|
exit 2
|
||||||
|
}
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -e "$MCA_JAR" ]; then
|
||||||
|
MCA_PLATFORM="$(basename -- "$MCA_JAR")"
|
||||||
|
MCA_PLATFORM="$(echo "$MCA_PLATFORM" \
|
||||||
|
| tr '[:upper:]' '[:lower:]' | grep -oE '[a-z]+' | head -1)"
|
||||||
|
else
|
||||||
|
echo "$EXEC_NAME: $MCA_JAR: no such file" >&2
|
||||||
exit 2
|
exit 2
|
||||||
}
|
fi
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -e "$MCA_JAR" ]; then
|
|
||||||
PLATFORM="$(basename -- "$MCA_JAR")"
|
|
||||||
PLATFORM="$(echo "$PLATFORM" | tr '[:upper:]' '[:lower:]' | \
|
|
||||||
grep -oE '[a-z]+' | head -1)"
|
|
||||||
else
|
else
|
||||||
echo "$EXEC_NAME: $MCA_JAR: no such file" >&2
|
[ -z "$MCA_JAR" ] && MCA_JAR="$MCA_DIR/$MCA_PLATFORM.jar"
|
||||||
|
if [ ! -e "$MCA_JAR" ]; then
|
||||||
|
echo "$EXEC_NAME: $MCA_JAR: no such file" >&2
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
[ -n "$MCA_JVM_FLAGS" ] && MCA_JVM_FLAGS="$MCA_JVM_FLAGS "
|
||||||
|
MCA_JVM_FLAGS="$MCA_JVM_FLAGS-Dfile.encoding=UTF-8 \
|
||||||
|
-Djava.awt.headless=true"
|
||||||
|
|
||||||
|
case "$MCA_PLATFORM" in
|
||||||
|
bungee)
|
||||||
|
;;
|
||||||
|
waterfall|velocity)
|
||||||
|
[ "$MCA_PLATFORM" = "bungee" ] || MCA_JVM_FLAGS="$MCA_JVM_FLAGS \
|
||||||
|
-XX:+UseG1GC \
|
||||||
|
-XX:G1HeapRegionSize=4M \
|
||||||
|
-XX:+UnlockExperimentalVMOptions \
|
||||||
|
-XX:+ParallelRefProcEnabled \
|
||||||
|
-XX:+AlwaysPreTouch \
|
||||||
|
-DIReallyKnowWhatIAmDoingISwear=true"
|
||||||
|
;;
|
||||||
|
minecraft|bukkit|craftbukkit|spigot|paper)
|
||||||
|
MCA_JVM_FLAGS="$MCA_JVM_FLAGS -Dcom.mojang.eula.agree=true \
|
||||||
|
-DIReallyKnowWhatIAmDoingISwear=true"
|
||||||
|
[ "$MCA_PLATFORM" = "paper" ] && MCA_JVM_FLAGS="$MCA_JVM_FLAGS \
|
||||||
|
-XX:+UseG1GC \
|
||||||
|
-XX:+ParallelRefProcEnabled \
|
||||||
|
-XX:MaxGCPauseMillis=200 \
|
||||||
|
-XX:+UnlockExperimentalVMOptions \
|
||||||
|
-XX:+DisableExplicitGC \
|
||||||
|
-XX:+AlwaysPreTouch \
|
||||||
|
-XX:G1NewSizePercent=30 \
|
||||||
|
-XX:G1MaxNewSizePercent=40 \
|
||||||
|
-XX:G1HeapRegionSize=8M \
|
||||||
|
-XX:G1ReservePercent=20 \
|
||||||
|
-XX:G1HeapWastePercent=5 \
|
||||||
|
-XX:G1MixedGCCountTarget=4 \
|
||||||
|
-XX:InitiatingHeapOccupancyPercent=15 \
|
||||||
|
-XX:G1MixedGCLiveThresholdPercent=90 \
|
||||||
|
-XX:G1RSetUpdatingPauseTimePercent=5 \
|
||||||
|
-XX:SurvivorRatio=32 \
|
||||||
|
-XX:+PerfDisableSharedMem \
|
||||||
|
-XX:MaxTenuringThreshold=1 \
|
||||||
|
-Dusing.aikars.flags=https://mcflags.emc.gs \
|
||||||
|
-Daikars.new.flags=true"
|
||||||
|
;;
|
||||||
|
custom)
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "$EXEC_NAME: invalid platform: $MCA_PLATFORM. Valid: bungee, \
|
||||||
|
waterfall, velocity, minecraft, bukkit, craftbukkit, spigot, \
|
||||||
|
paper, custom" >&2
|
||||||
|
exit 2
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if [ -n "$MCA_OPT_JAVA_HOME" ] && [ -d "$MCA_OPT_JAVA_HOME/bin" ]; then
|
||||||
|
PATH="$MCA_OPT_JAVA_HOME/bin:$PATH"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v java > /dev/null; then
|
||||||
|
echo "$EXEC_NAME: unable to get Java version (is Java installed?)" >&2
|
||||||
exit 2
|
exit 2
|
||||||
fi
|
fi
|
||||||
else
|
|
||||||
[ -z "$MCA_JAR" ] && MCA_JAR="$MCA_DIR/$PLATFORM.jar"
|
[ -n "$MCA_OPT_MAX_MEMORY" ] \
|
||||||
[ ! -e "$MCA_JAR" ] && {
|
&& MCA_JVM_FLAGS="-Xmx$MCA_OPT_MAX_MEMORY $MCA_JVM_FLAGS"
|
||||||
echo "$EXEC_NAME: $MCA_JAR: no such file" >&2
|
[ -n "$MCA_OPT_MIN_MEMORY" ] \
|
||||||
exit 2
|
&& MCA_JVM_FLAGS="-Xms$MCA_OPT_MIN_MEMORY $MCA_JVM_FLAGS"
|
||||||
}
|
|
||||||
|
SCREEN_CMD="$(which java) -server $MCA_JVM_FLAGS -jar $MCA_JAR"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
[ -n "$JVM_FLAGS" ] && JVM_FLAGS="$JVM_FLAGS "
|
|
||||||
JVM_FLAGS="$JVM_FLAGS-Dfile.encoding=UTF-8 -Djava.awt.headless=true"
|
|
||||||
|
|
||||||
case "$PLATFORM" in
|
|
||||||
bungee)
|
|
||||||
;;
|
|
||||||
waterfall|velocity)
|
|
||||||
[ "$PLATFORM" = "bungee" ] || JVM_FLAGS="$JVM_FLAGS -XX:+UseG1GC \
|
|
||||||
-XX:G1HeapRegionSize=4M \
|
|
||||||
-XX:+UnlockExperimentalVMOptions \
|
|
||||||
-XX:+ParallelRefProcEnabled \
|
|
||||||
-XX:+AlwaysPreTouch \
|
|
||||||
-DIReallyKnowWhatIAmDoingISwear=true"
|
|
||||||
;;
|
|
||||||
minecraft|bukkit|craftbukkit|spigot|paper)
|
|
||||||
JVM_FLAGS="$JVM_FLAGS -Dcom.mojang.eula.agree=true \
|
|
||||||
-DIReallyKnowWhatIAmDoingISwear=true"
|
|
||||||
[ "$PLATFORM" = "paper" ] && JVM_FLAGS="$JVM_FLAGS -XX:+UseG1GC \
|
|
||||||
-XX:+ParallelRefProcEnabled \
|
|
||||||
-XX:MaxGCPauseMillis=200 \
|
|
||||||
-XX:+UnlockExperimentalVMOptions \
|
|
||||||
-XX:+DisableExplicitGC \
|
|
||||||
-XX:+AlwaysPreTouch \
|
|
||||||
-XX:G1NewSizePercent=30 \
|
|
||||||
-XX:G1MaxNewSizePercent=40 \
|
|
||||||
-XX:G1HeapRegionSize=8M \
|
|
||||||
-XX:G1ReservePercent=20 \
|
|
||||||
-XX:G1HeapWastePercent=5 \
|
|
||||||
-XX:G1MixedGCCountTarget=4 \
|
|
||||||
-XX:InitiatingHeapOccupancyPercent=15 \
|
|
||||||
-XX:G1MixedGCLiveThresholdPercent=90 \
|
|
||||||
-XX:G1RSetUpdatingPauseTimePercent=5 \
|
|
||||||
-XX:SurvivorRatio=32 \
|
|
||||||
-XX:+PerfDisableSharedMem \
|
|
||||||
-XX:MaxTenuringThreshold=1 \
|
|
||||||
-Dusing.aikars.flags=https://mcflags.emc.gs \
|
|
||||||
-Daikars.new.flags=true"
|
|
||||||
;;
|
|
||||||
custom)
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "$EXEC_NAME: invalid platform: $PLATFORM. Valid: bungee, \
|
|
||||||
waterfall, velocity, minecraft, bukkit, craftbukkit, spigot, \
|
|
||||||
paper, custom" >&2
|
|
||||||
exit 2
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if [ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME/bin" ]; then
|
|
||||||
PATH="$JAVA_HOME/bin:$PATH"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if ! command -v java > /dev/null; then
|
|
||||||
echo "$EXEC_NAME: unable to get Java version (is Java installed?)" >&2
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
|
|
||||||
[ -n "$MAX_MEMORY" ] && JVM_FLAGS="-Xmx$MAX_MEMORY $JVM_FLAGS"
|
|
||||||
[ -n "$MIN_MEMORY" ] && JVM_FLAGS="-Xms$MIN_MEMORY $JVM_FLAGS"
|
|
||||||
|
|
||||||
MCA_CMD="$(which java) -server $JVM_FLAGS -jar $MCA_JAR"
|
|
||||||
|
|
||||||
if [ "$SKIP_CONFIGURE" -eq 0 ] && [ "$MCA_RC_FILE_READ" -eq 1 ]; then
|
if [ "$SKIP_CONFIGURE" -eq 0 ] && [ "$MCA_RC_FILE_READ" -eq 1 ]; then
|
||||||
ENV_LIST="$(cut -d= -f1 < "$MCA_RC_FILE" | sed 's/^/$/g'))"
|
ENV_LIST="$(env | grep ^MCA_ | cut -d= -f1 | sed 's/^/$/g')"
|
||||||
FILE_LIST="$(find . -name '*.in' -type f)"
|
FILE_LIST="$(find . -name '*.in' -type f)"
|
||||||
|
|
||||||
[ -z "$FILE_LIST" ] || echo "$FILE_LIST" | while read -r line; do
|
[ -z "$FILE_LIST" ] || echo "$FILE_LIST" | while read -r line; do
|
||||||
|
|
@ -220,11 +266,14 @@ if [ "$SKIP_CONFIGURE" -eq 0 ] && [ "$MCA_RC_FILE_READ" -eq 1 ]; then
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# papermc prints uncolored text if the COLORTERM variable is set to
|
if [ "$CONFIGURE_ONLY" -eq 0 ]; then
|
||||||
# `truecolor`.
|
# papermc prints uncolored text if the COLORTERM variable is set to
|
||||||
export COLORTERM=
|
# `truecolor`.
|
||||||
|
export COLORTERM=
|
||||||
|
|
||||||
# we don't quote $MCA_CMD because screen treats arguments after the second one
|
# we don't quote $SCREEN_CMD because screen treats arguments after the
|
||||||
# as a command.
|
# second one 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 "$SCREEN_RC_FILE" "-$SCREEN_OPTS"S "$SCREEN_NAME" \
|
||||||
|
-- $SCREEN_CMD
|
||||||
|
fi
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue