Skip to content

Commit d9ee3ee

Browse files
authored
Refactor deploy gtnh (#4141)
1 parent ab505fa commit d9ee3ee

2 files changed

Lines changed: 117 additions & 90 deletions

File tree

docs/types-and-platforms/mod-platforms/gtnh.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ For optimal performance choose java25 with GTNH 2.8.0 and later.
3535

3636
## Config backups
3737

38-
During version upgrade, the server will replace all config files to make sure all new features are setup as intended. The old config files are stored in a backup folder in the data directory, for you to use as reference for manual reapplication of your changed settings. Set the environment variable `GTNH_DELETE_BACKUPS` to true to delete all backup folders at startup.
38+
During version upgrade, the server will replace all config files to make sure all new features are setup as intended. The old config files are stored in a backup folder in the data directory, for you to use as reference for manual reapplication of your changed settings. The folder name starts with `gtnh-upgrade-` followed by a timestamp. Set the environment variable `GTNH_DELETE_BACKUPS` to true to delete all backup folders at startup.
3939

4040
## server.properties defaults
4141

scripts/start-deployGTNH

Lines changed: 116 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
function getGTNHdownloadPath(){
88
gtnh_download_path=""
99
local release_object=""
10-
local current_java_version=$(mc-image-helper java-release)
10+
local current_java_version=""
11+
current_java_version=$(mc-image-helper java-release)
1112

1213
# Select release JSON object
1314
if [ "$GTNH_PACK_VERSION" == "latest-dev" ]; then
@@ -38,6 +39,11 @@ function getGTNHdownloadPath(){
3839
log "Selected $(jq -r '.key' <<< "$release_object") as matching version for download."
3940

4041
fi
42+
43+
if [[ -z $release_object ]]; then
44+
logError "No release found for GTNH_PACK_VERSION=$GTNH_PACK_VERSION. Please check if the version is valid."
45+
exit 1
46+
fi
4147

4248
# Select compatible server files for java version
4349
if (( current_java_version == 8 )); then
@@ -59,6 +65,10 @@ function getGTNHdownloadPath(){
5965

6066
fi
6167

68+
if [[ -z $gtnh_download_path ]]; then
69+
logError "Server files not found! Please check if the selected GTNH_PACK_VERSION=$GTNH_PACK_VERSION is valid."
70+
exit 1
71+
fi
6272
debug "Download source URL: $gtnh_download_path"
6373

6474
}
@@ -70,80 +80,125 @@ function deleteGTNHbackup(){
7080
fi
7181
}
7282

83+
function downloadGTNH(){
84+
local gtnh_download=""
85+
base_dir=/data/.tmp/gtnh_base
86+
87+
debug "Creating temporary /data/.tmp/packs folder for GTNH download"
88+
mkdir -p /data/.tmp/packs
89+
trap 'rm -rf /data/.tmp' EXIT
90+
91+
log "Downloading $gtnh_download_path."
92+
if ! gtnh_download=$(mc-image-helper get -o /data/.tmp/packs --output-filename --skip-up-to-date "$gtnh_download_path"); then
93+
logError "Failed to download $gtnh_download_path"
94+
exit 1
95+
fi
96+
debug "Downloaded GTNH server files to $gtnh_download"
97+
98+
# Unpacking Server files into temporary directory
99+
log "Unpacking Server Files into $base_dir"
100+
mkdir -p "${base_dir}"
101+
extract "${gtnh_download}" "${base_dir}"
102+
103+
# Remove any eula file since container manages it
104+
debug "Removing eula.txt from $base_dir"
105+
rm -f "${base_dir}/eula.txt"
106+
107+
# recalculate the actual base directory of content
108+
if ! base_dir=$(mc-image-helper find \
109+
--max-depth=3 --type=directory --name=mods,config \
110+
--only-shallowest --fail-no-matches --format '%h' \
111+
"$base_dir"); then
112+
logError "Unable to find content base of downloaded Server Files"
113+
exit 1
114+
fi
115+
debug "Base directory of unpacked Server Files: $base_dir"
116+
}
117+
118+
function updateGTNHresource(){
119+
local resource="$1"
120+
local new_resource="$2"
121+
log "Trying to update $resource"
122+
123+
if [[ -z "$resource" ]]; then
124+
logWarning "No resource specified for update"
125+
return 0
126+
fi
127+
128+
if [[ -e "$resource" ]]; then
129+
log "Deleting existing resource: $resource"
130+
if ! rm -rf "$resource"; then
131+
logError "Failed to delete resource: $resource"
132+
exit 1
133+
fi
134+
fi
135+
136+
if [[ -d "$new_resource" ]]; then
137+
log "Copying $new_resource to /data"
138+
if ! cp -r "$new_resource" "/data/"; then
139+
logError "Failed to copy $new_resource to /data"
140+
exit 1
141+
fi
142+
return 0
143+
fi
144+
if [[ -f "$new_resource" ]]; then
145+
log "Copying $new_resource to /data"
146+
if ! cp "$new_resource" "/data/"; then
147+
logError "Failed to copy $new_resource to /data"
148+
exit 1
149+
fi
150+
return 0
151+
fi
152+
153+
logWarning "Resource update failed: $new_resource does not exist!"
154+
return 0
155+
}
156+
73157
function updateGTNH(){
74158
# Get the current date and time
75-
current_datetime=$(date +%Y-%m-%dT%H:%M)
159+
local current_datetime=""
160+
current_datetime=$(date +%Y-%m-%dT+%H%M)
76161

77162
# Define folders and files to update
78-
folders_to_update=("libraries" "mods" "resources" "scripts")
79-
files_to_update=("lwjgl3ify-forgePatches.jar" "java9args.txt" "startserver-java9.bat" "startserver-java9.sh" "forge-1.7.10-10.13.4.1614-1.7.10-universal.jar" "startserver.bat" "startserver.sh" "server-icon.png")
80-
config_folder="config"
81-
backup_folder="/data/gtnh-upgrade-$current_datetime"
82-
journey_map_folder="JourneyMapServer"
83-
84-
# Delete specified folders if they exist
85-
for folder in "${folders_to_update[@]}"; do
86-
folder_path="/data/$folder"
87-
if [[ -d "$folder_path" ]]; then
88-
log "Deleting folder: $folder_path"
89-
rm -rf "$folder_path"
90-
fi
91-
done
92-
93-
# Delete specific files if they exist
94-
for file in "${files_to_update[@]}"; do
95-
file_path="/data/$file"
96-
if [[ -f "$file_path" ]]; then
97-
log "Deleting file: $file_path"
98-
rm -f "$file_path"
99-
fi
100-
done
163+
# base_dir is already defined in handleGTNH function
164+
local folders_to_update=("libraries" "mods" "resources" "scripts")
165+
local files_to_update=("lwjgl3ify-forgePatches.jar" "java9args.txt" "startserver-java9.bat" "startserver-java9.sh" "forge-1.7.10-10.13.4.1614-1.7.10-universal.jar" "startserver.bat" "startserver.sh" "server-icon.png")
166+
local config_folder="config"
167+
local backup_folder="/data/gtnh-upgrade-$current_datetime"
168+
local journey_map_folder="JourneyMapServer"
101169

102170
# Backup the config folder
103171
if [[ -d "/data/$config_folder" ]]; then
104172
log "Creating backup of /data/$config_folder at $backup_folder"
105173
cp -r "/data/$config_folder" "$backup_folder"
106-
log "Deleting original /data/$config_folder"
107-
rm -rf "/data/$config_folder"
108174
fi
109175

110-
# Updating the required folders in data directory
111-
for folder in "${folders_to_update[@]}" "$config_folder"; do
112-
if [[ -d "$base_dir/$folder" ]]; then
113-
log "Copying $folder to /data"
114-
cp -r "$base_dir/$folder" "/data/"
115-
else
116-
logWarning "Folder $folder not found in the unzipped data!"
117-
fi
118-
done
119-
120-
# Copy specific files to the /data directory
121-
for file in "${files_to_update[@]}"; do
122-
if [[ -f "$base_dir/$file" ]]; then
123-
log "Copying $file to /data"
124-
cp "$base_dir/$file" "/data/"
125-
else
126-
logWarning "File $file not found in the unzipped data!"
127-
fi
128-
done
176+
# Update resources from unpacked server files to /data
177+
for resource in "${folders_to_update[@]}" "$config_folder" "${files_to_update[@]}"; do
178+
local resource_path="/data/$resource"
179+
local new_resource_path="$base_dir/$resource"
129180

130-
# Ensure the config folder exists
131-
if [[ ! -d "$config_folder" ]]; then
132-
log "$config_folder does not exist. Creating it now."
133-
mkdir -p "$config_folder"
134-
fi
181+
debug "Updating resource: $resource_path with new resource: $new_resource_path"
182+
updateGTNHresource "$resource_path" "$new_resource_path"
183+
done
135184

136185
# Restore JourneyMapServer folder from backup
137186
if [[ -d "$backup_folder/$journey_map_folder" ]]; then
138-
log "Restoring $journey_map_folder to $config_folder"
139-
cp -r "$backup_folder/$journey_map_folder" "$config_folder/"
187+
if [[ ! -d "/data/$config_folder" ]]; then
188+
log "/data/$config_folder folder does not exist. Creating it now."
189+
mkdir -p "/data/$config_folder"
190+
fi
191+
log "Restoring $journey_map_folder to /data/$config_folder"
192+
cp -r "$backup_folder/$journey_map_folder" "/data/$config_folder/"
140193
else
141194
logWarning "$journey_map_folder not found in backup!"
142195
fi
143196

144197
# Copy the changelog file to /data
198+
local gtnh_changelog_file=""
145199
gtnh_changelog_file=$(mc-image-helper find --max-depth=1 --type=file --name=changelog*.md "$base_dir")
146200
if [[ -n "$gtnh_changelog_file" ]]; then
201+
debug "Found changelog file: $gtnh_changelog_file"
147202
log "Copying changelog file to /data"
148203
cp -f "$gtnh_changelog_file" /data/
149204
fi
@@ -163,46 +218,16 @@ function handleGTNH() {
163218
if [[ -n "$GTNH_PACK_VERSION" ]] && isFalse "$SKIP_GTNH_UPDATE_CHECK" ; then
164219

165220
getGTNHdownloadPath
166-
167-
if [[ -z $gtnh_download_path ]]; then
168-
logError "Server files not found for GTNH_PACK_VERSION=$GTNH_PACK_VERSION! Download not possible!"
169-
exit 1
170-
fi
171221
log "Server files located! Will proceed update $gtnh_download_path."
172222

223+
173224
# Decide if update or install is needed or not.
174225
if [[ ! -f /data/.gtnh-version || "$(basename "$gtnh_download_path")" != "$(cat /data/.gtnh-version)" ]]; then
175226
log "Update/Install required: /data/.gtnh-version is missing or does not match the selected version $(basename "$gtnh_download_path")."
176227

177-
mkdir -p /data/packs
178-
log "Downloading $gtnh_download_path."
179-
if ! gtnh_download=$(mc-image-helper get -o /data/packs --output-filename --skip-up-to-date "$gtnh_download_path"); then
180-
logError "Failed to download $gtnh_download_path"
181-
exit 1
182-
fi
183-
184-
# Unpacking Server files into temporary directory
185-
log "Unpacking Server Files..."
186-
original_base_dir=/data/.tmp/gtnh_base
187-
base_dir=$original_base_dir
188-
rm -rf "${base_dir}"
189-
mkdir -p "${base_dir}"
190-
extract "${gtnh_download}" "${base_dir}"
191-
trap 'rm -rf /data/.tmp' EXIT
192-
# Removing downloaded zip
193-
rm -f "$gtnh_download"
194-
195-
# Remove any eula file since container manages it
196-
rm -f "${base_dir}/eula.txt"
197-
198-
# recalculate the actual base directory of content
199-
if ! base_dir=$(mc-image-helper find \
200-
--max-depth=3 --type=directory --name=mods,config \
201-
--only-shallowest --fail-no-matches --format '%h' \
202-
"$base_dir"); then
203-
logError "Unable to find content base of downloaded Server Files"
204-
exit 1
205-
fi
228+
# Download and unpack GTNH server files
229+
downloadGTNH
230+
log "GTNH server files downloaded and unpacked to $base_dir."
206231

207232
# Split installation from update path. Check for version file.
208233
if [[ -f /data/.gtnh-version ]]; then
@@ -212,10 +237,12 @@ function handleGTNH() {
212237
log "No .gtnh-version file detected! Assuming no old server exists. Proceed installing new server..."
213238
cp -R -f "${base_dir}"/* /data
214239
fi
240+
215241
# Update .gtnh-version
216242
basename "$gtnh_download_path" > /data/.gtnh-version
217-
# Cleaning up
218-
rm -rf "$original_base_dir"
243+
244+
# Cleaning up temporary files
245+
rm -rf /data/.tmp
219246

220247
else
221248
log "No update required: /data/.gtnh-version matches the selected version $(basename "$gtnh_download_path")."

0 commit comments

Comments
 (0)