-
-
Notifications
You must be signed in to change notification settings - Fork 226
/
bedrock-entry.sh
executable file
·211 lines (179 loc) · 6.71 KB
/
bedrock-entry.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
#!/bin/bash
set -eo pipefail
: "${TMP_DIR:=/tmp}"
: "${PREVIEW:=false}"
function isTrue() {
[[ "${1,,}" =~ ^(true|on|1)$ ]] && return 0
return 1
}
function replace_version_in_url() {
local original_url="$1"
local new_version="$2"
# Use sed to replace the version number in the URL
local modified_url
modified_url=$(echo "$original_url" | sed -E "s/(bedrock-server-)[^/]+(\.zip)/\1${new_version}\2/")
echo "$modified_url"
}
function lookupVersion() {
platform=${1:?Missing required platform indicator}
customVersion=${2:-}
# shellcheck disable=SC2034
for i in {1..3}; do
DOWNLOAD_URL=$(restify --user-agent=itzg/minecraft-bedrock-server --headers "accept-language:*" --attribute=data-platform="${platform}" "${downloadPage}" 2> restify.err | jq -r '.[0].href' || echo '')
[[ -n "${DOWNLOAD_URL}" ]] && break
sleep 1
done
if [[ -z ${DOWNLOAD_URL} ]]; then
DOWNLOAD_URL=$(curl -s https://mc-bds-helper.vercel.app/api/latest)
fi
if [[ -n "${customVersion}" && -n "${DOWNLOAD_URL}" ]]; then
DOWNLOAD_URL=$(replace_version_in_url "${DOWNLOAD_URL}" "${customVersion}")
return
fi
# shellcheck disable=SC2012
if [[ ${DOWNLOAD_URL} =~ http.*/.*-(.*)\.zip ]]; then
VERSION=${BASH_REMATCH[1]}
elif [[ $(ls -rv bedrock_server-* 2> /dev/null|head -1) =~ bedrock_server-(.*) ]]; then
VERSION=${BASH_REMATCH[1]}
echo "WARN Minecraft download page failed, so using existing download of $VERSION"
cat restify.err
else
if [[ -f restify.err ]]; then
echo "Failed to extract download URL '${DOWNLOAD_URL}' from ${downloadPage}"
cat restify.err
rm restify.err
else
echo "Failed to lookup download URL: ${DOWNLOAD_URL}"
fi
exit 2
fi
rm -f restify.err
}
if [[ ${DEBUG^^} == TRUE ]]; then
set -x
curlArgs=(-v)
echo "DEBUG: running as $(id -a) with $(ls -ld /data)"
echo " current directory is $(pwd)"
fi
export HOME=/data
downloadPage=https://www.minecraft.net/en-us/download/server/bedrock
if [[ ${EULA^^} != TRUE ]]; then
echo
echo "EULA must be set to TRUE to indicate agreement with the Minecraft End User License"
echo "See https://minecraft.net/terms"
echo
echo "Current value is '${EULA}'"
echo
exit 1
fi
case ${VERSION^^} in
PREVIEW)
echo "Looking up latest preview version..."
lookupVersion serverBedrockPreviewLinux
;;
LATEST)
echo "Looking up latest version..."
lookupVersion serverBedrockLinux
;;
*)
# use the given version exactly
if isTrue "$PREVIEW"; then
echo "Using given preview version ${VERSION}"
lookupVersion serverBedrockPreviewLinux "${VERSION}"
else
echo "Using given version ${VERSION}"
lookupVersion serverBedrockLinux "${VERSION}"
fi
;;
esac
if [[ ! -f "bedrock_server-${VERSION}" ]]; then
[[ $TMP_DIR != /tmp ]] && mkdir -p "$TMP_DIR"
TMP_ZIP="$TMP_DIR/$(basename "${DOWNLOAD_URL}")"
echo "Downloading Bedrock server version ${VERSION} ..."
if ! curl "${curlArgs[@]}" -o "${TMP_ZIP}" -A "itzg/minecraft-bedrock-server" -fsSL "${DOWNLOAD_URL}"; then
echo "ERROR failed to download from ${DOWNLOAD_URL}"
echo " Double check that the given VERSION is valid"
exit 2
fi
# remove only binaries and some docs, to allow for an upgrade of those
rm -rf -- bedrock_server bedrock_server-* *.so release-notes.txt bedrock_server_how_to.html valid_known_packs.json premium_cache 2> /dev/null
bkupDir=backup-pre-${VERSION}
# fixup any previous interrupted upgrades
rm -rf "${bkupDir}"
for d in behavior_packs definitions minecraftpe resource_packs structures treatments world_templates; do
if [[ -d $d && -n "$(ls $d)" ]]; then
mkdir -p "${bkupDir}/$d"
echo "Backing up $d into $bkupDir"
if [[ "$d" == "resource_packs" ]]; then
mv $d/{chemistry,vanilla} "${bkupDir}/$d/"
cp -a $d/ "${bkupDir}/$d/"
else
mv $d "${bkupDir}/"
fi
fi
done
# remove old package backups, but keep PACKAGE_BACKUP_KEEP
if (( ${PACKAGE_BACKUP_KEEP:=2} >= 0 )); then
shopt -s nullglob
# shellcheck disable=SC2012
for d in $( ls -td1 backup-pre-* | tail +$(( PACKAGE_BACKUP_KEEP + 1 )) ); do
echo "Pruning backup directory: $d"
rm -rf "$d"
done
fi
# Do not overwrite existing files, which means the cleanup above needs to account for things
# that MUST be replaced on upgrade
unzip -q -n "${TMP_ZIP}"
[[ $TMP_DIR != /tmp ]] && rm -rf "$TMP_DIR"
chmod +x bedrock_server
mv bedrock_server "bedrock_server-${VERSION}"
fi
if [[ -n "$OPS" || -n "$MEMBERS" || -n "$VISITORS" ]]; then
echo "Updating permissions"
jq -n --arg ops "$OPS" --arg members "$MEMBERS" --arg visitors "$VISITORS" '[
[$ops | split(",") | map({permission: "operator", xuid:.})],
[$members | split(",") | map({permission: "member", xuid:.})],
[$visitors | split(",") | map({permission: "visitor", xuid:.})]
]| flatten' > permissions.json
fi
if [[ -n "$ALLOW_LIST_USERS" || -n "$WHITE_LIST_USERS" ]]; then
allowListUsers=${ALLOW_LIST_USERS:-$WHITE_LIST_USERS}
if [[ "$allowListUsers" ]]; then
echo "Setting allow list"
if [[ "$allowListUsers" != *":"* ]]; then
jq -c -n --arg users "$allowListUsers" '$users | split(",") | map({"ignoresPlayerLimit":false,"name": .})' > "allowlist.json"
else
jq -c -n --arg users "$allowListUsers" '$users | split(",") | map(split(":") | {"ignoresPlayerLimit":false,"name": .[0], "xuid": .[1]})' > "allowlist.json"
fi
# activate server property to enable list usage
ALLOW_LIST=true
else
ALLOW_LIST=false
rm -f allowlist.json
fi
fi
# prevent issue with bind mounted server.properties which can not be moved (sed tries to move the file when '-i' is used)
_SERVER_PROPERTIES=$(sed '/^white-list=.*/d' server.properties) #Removes white-list= line from server.properties
echo "${_SERVER_PROPERTIES}" > server.properties
export ALLOW_LIST
# update server.properties with environment settings
set-property --file server.properties --bulk /etc/bds-property-definitions.json
export LD_LIBRARY_PATH=.
mcServerRunnerArgs=()
if isTrue "${ENABLE_SSH}"; then
mcServerRunnerArgs+=(--remote-console)
if ! [[ -v RCON_PASSWORD ]]; then
RCON_PASSWORD=$(openssl rand -hex 12)
export RCON_PASSWORD
fi
# For ssh access by tools, export the current password.
# Use rcon's format to align with Java, as Java uses the rcon password for SSH as well.
echo "password=${RCON_PASSWORD}" > "$HOME/.remote-console.env"
echo "password: \"${RCON_PASSWORD}\"" > "$HOME/.remote-console.yaml"
fi
echo "Starting Bedrock server..."
if [[ -f /usr/local/bin/box64 ]] ; then
exec mc-server-runner "${mcServerRunnerArgs[@]}" box64 ./"bedrock_server-${VERSION}"
else
exec mc-server-runner "${mcServerRunnerArgs[@]}" ./"bedrock_server-${VERSION}"
fi