Skip to content

Commit 6e08b4b

Browse files
authored
Merge pull request #33 from nicolaschan/nicolaschan/save-all
Run save-all before save-off
2 parents 8ba2a8c + 4f675b9 commit 6e08b4b

5 files changed

Lines changed: 37 additions & 8 deletions

File tree

‎.github/workflows/ci.yml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ on:
1212
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
1313
jobs:
1414
test:
15-
runs-on: ubuntu-latest
15+
runs-on: ubuntu-22.04
1616
steps:
1717
- uses: actions/checkout@v2
1818
with:
@@ -28,7 +28,7 @@ jobs:
2828
- name: Run tests
2929
run: test/test.sh
3030
coverage:
31-
runs-on: ubuntu-latest
31+
runs-on: ubuntu-22.04
3232
steps:
3333
- uses: actions/checkout@v2
3434
with:

‎backup.sh‎

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ RESTIC_HOSTNAME="" # Leave empty to use system hostname
2424
LOCK_FILE="" # Optional lock file to acquire to ensure two backups don't run at once
2525
LOCK_FILE_TIMEOUT="" # Optional lock file wait timeout (in seconds)
2626
WINDOW_MANAGER="screen" # Choices: screen, tmux, RCON
27+
SAVE_ALL_WAIT_SECONDS="" # Delay in seconds after save-all flush (default: 5, 0 if rcon)
2728

2829
# Other Variables (do not modify)
2930
DATE_FORMAT="%F_%H-%M-%S"
@@ -41,7 +42,7 @@ debug-log () {
4142
fi
4243
}
4344

44-
while getopts 'a:cd:e:f:hH:i:l:m:o:p:qr:s:t:u:vw:x' FLAG; do
45+
while getopts 'a:cd:e:f:hH:i:l:m:o:p:qr:s:t:u:vw:xz:' FLAG; do
4546
case $FLAG in
4647
a) COMPRESSION_ALGORITHM=$OPTARG ;;
4748
c) ENABLE_CHAT_MESSAGES=true ;;
@@ -69,6 +70,7 @@ while getopts 'a:cd:e:f:hH:i:l:m:o:p:qr:s:t:u:vw:x' FLAG; do
6970
echo "-u Lock file timeout seconds (empty = unlimited)"
7071
echo "-v Verbose mode"
7172
echo "-w Window manager: screen (default), tmux, RCON"
73+
echo "-z Delay in seconds after save-all flush (default: 5, 0 if rcon)"
7274
exit 0
7375
;;
7476
H) RESTIC_HOSTNAME=$OPTARG ;;
@@ -84,6 +86,7 @@ while getopts 'a:cd:e:f:hH:i:l:m:o:p:qr:s:t:u:vw:x' FLAG; do
8486
u) LOCK_FILE_TIMEOUT=$OPTARG ;;
8587
v) DEBUG=true ;;
8688
w) WINDOW_MANAGER=$OPTARG ;;
89+
z) SAVE_ALL_WAIT_SECONDS=$OPTARG ;;
8790
*) log-fatal "Invalid option -$FLAG"; exit 1 ;;
8891
esac
8992
done
@@ -290,6 +293,25 @@ message-players-color () {
290293
execute-command "tellraw @a [\"\",{\"text\":\"[$PREFIX] \",\"color\":\"gray\",\"italic\":true},{\"text\":\"$MESSAGE\",\"color\":\"$COLOR\",\"italic\":true,\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[{\"text\":\"$HOVER_MESSAGE\"}]}}}]"
291294
fi
292295
}
296+
save-all-flush-delay-seconds () {
297+
if [[ -n "$SAVE_ALL_WAIT_SECONDS" ]]; then
298+
echo "$SAVE_ALL_WAIT_SECONDS"
299+
return
300+
fi
301+
302+
case "$WINDOW_MANAGER" in
303+
# RCON already waits for response
304+
"RCON"|"rcon"|"docker-rcon") echo "0"
305+
;;
306+
*) echo "5" # default value for all other cases
307+
;;
308+
esac
309+
}
310+
execute-save-all-flush () {
311+
execute-command "save-all" # for versions <1.16
312+
execute-command "save-all flush"
313+
sleep "$(save-all-flush-delay-seconds)"
314+
}
293315

294316
# Parse file timestamp to one readable by "date"
295317
parse-file-timestamp () {
@@ -489,9 +511,12 @@ do-backup () {
489511
# Notify players of start
490512
message-players "Starting backup..." "$ARCHIVE_PATH"
491513

492-
# Disable world autosaving
514+
# Disable world autosaving, still allows save-all
493515
execute-command "save-off"
494516

517+
# Trigger save now to get most up-to-date data
518+
execute-save-all-flush
519+
495520
# Backup world
496521
START_TIME=$(date +"%s")
497522

‎test/data/test-chat-messages.txt‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
tellraw @a ["",{"text":"[Backup] ","color":"gray","italic":true},{"text":"Starting backup...","color":"gray","italic":true,"hoverEvent":{"action":"show_text","value":{"text":"","extra":[{"text":"test/tmp/backups/2021-01-01_00-00-00.tar.gz"}]}}}]
22
save-off
3+
save-all
4+
save-all flush
35
save-on
46
save-all
57
tellraw @a ["",{"text":"[Backup] ","color":"gray","italic":true},{"text":"Backup complete!","color":"green","italic":true,"hoverEvent":{"action":"show_text","value":{"text":"","extra":[{"text":"0 s, 4.0K/4.0K, 316%"}]}}}]

‎test/data/test-chat-prefix.txt‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
tellraw @a ["",{"text":"[Hello] ","color":"gray","italic":true},{"text":"Starting backup...","color":"gray","italic":true,"hoverEvent":{"action":"show_text","value":{"text":"","extra":[{"text":"test/tmp/backups/2021-01-01_00-00-00.tar.gz"}]}}}]
22
save-off
3+
save-all
4+
save-all flush
35
save-on
46
save-all
57
tellraw @a ["",{"text":"[Hello] ","color":"gray","italic":true},{"text":"Hello complete!","color":"green","italic":true,"hoverEvent":{"action":"show_text","value":{"text":"","extra":[{"text":"0 s, 4.0K/4.0K, 316%"}]}}}]

‎test/test.sh‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -346,24 +346,24 @@ test-nonzero-exit-warning () {
346346
test-screen-interface () {
347347
TIMESTAMP="$(date +%F_%H-%M-%S --date="2021-01-01")"
348348
./backup.sh -i "$TEST_TMP/server/world" -o "$TEST_TMP/backups" -s "$SCREEN_TMP" -f "$TIMESTAMP"
349-
EXPECTED_CONTENTS=$(echo -e "save-off\nsave-on\nsave-all")
349+
EXPECTED_CONTENTS=$(echo -e "save-off\nsave-all\nsave-all flush\nsave-on\nsave-all")
350350
SCREEN_CONTENTS="$(cat "$TEST_TMP/screen-output")"
351351
assertEquals "$EXPECTED_CONTENTS" "$SCREEN_CONTENTS"
352352
}
353353

354354
test-tmux-interface () {
355355
TIMESTAMP="$(date +%F_%H-%M-%S --date="2021-01-01")"
356356
./backup.sh -w tmux -i "$TEST_TMP/server/world" -o "$TEST_TMP/backups" -s "$SCREEN_TMP" -f "$TIMESTAMP"
357-
EXPECTED_CONTENTS=$(echo -e "save-off\nsave-on\nsave-all")
357+
EXPECTED_CONTENTS=$(echo -e "save-off\nsave-all\nsave-all flush\nsave-on\nsave-all")
358358
SCREEN_CONTENTS="$(cat "$TEST_TMP/tmux-output")"
359359
assertEquals "$EXPECTED_CONTENTS" "$SCREEN_CONTENTS"
360360
}
361361

362362
test-rcon-interface () {
363363
TIMESTAMP="$(date +%F_%H-%M-%S --date="2021-01-01")"
364364
./backup.sh -w rcon -i "$TEST_TMP/server/world" -o "$TEST_TMP/backups" -s "localhost:$RCON_PORT:$RCON_PASSWORD" -f "$TIMESTAMP"
365-
EXPECTED_CONTENTS=$(echo -e "save-off\nsave-on\nsave-all")
366-
SCREEN_CONTENTS="$(head -n3 "$TEST_TMP/rcon-output")"
365+
EXPECTED_CONTENTS=$(echo -e "save-off\nsave-all\nsave-all flush\nsave-on\nsave-all")
366+
SCREEN_CONTENTS="$(head -n5 "$TEST_TMP/rcon-output")"
367367
assertEquals "$EXPECTED_CONTENTS" "$SCREEN_CONTENTS"
368368
}
369369

0 commit comments

Comments
 (0)