Bug fixes for deleting methods

This commit is contained in:
Nicolas Chan 2020-03-21 19:09:49 -07:00
parent 8cf268f40b
commit 94e894645f
5 changed files with 25 additions and 29 deletions

View file

@ -1,4 +1,4 @@
#!/bin/env bash #!/usr/bin/env bash
# Minecraft server automatic backup management script # Minecraft server automatic backup management script
# by Nicolas Chan # by Nicolas Chan
@ -27,6 +27,7 @@ SUPPRESS_WARNINGS=false # Suppress warnings
DATE_FORMAT="%F_%H-%M-%S" DATE_FORMAT="%F_%H-%M-%S"
TIMESTAMP=$(date +$DATE_FORMAT) TIMESTAMP=$(date +$DATE_FORMAT)
OPTIND=1
while getopts 'a:bcd:e:f:ghi:l:m:o:p:qs:v' FLAG; do while getopts 'a:bcd:e:f:ghi:l:m:o:p:qs:v' FLAG; do
case $FLAG in case $FLAG in
a) COMPRESSION_ALGORITHM=$OPTARG ;; a) COMPRESSION_ALGORITHM=$OPTARG ;;
@ -68,7 +69,9 @@ done
BASE_DIR=$(dirname "$(realpath "$0")") BASE_DIR=$(dirname "$(realpath "$0")")
# shellcheck source=src/logging.sh # shellcheck source=src/logging.sh
source "$BASE_DIR/src/logging.sh" source "$BASE_DIR/src/logging.sh" \
-q "$SUPPRESS_WARNINGS" \
-v "$DEBUG"
# Check for missing encouraged arguments # Check for missing encouraged arguments
if [[ $SCREEN_NAME == "" ]]; then if [[ $SCREEN_NAME == "" ]]; then

View file

@ -23,16 +23,14 @@ mkdir -p "$BACKUP_DIRECTORY"
# Parse file timestamp to one readable by "date" # Parse file timestamp to one readable by "date"
parse-file-timestamp () { parse-file-timestamp () {
local DATE_STRING echo "$1" | awk -F_ '{gsub(/-/,":",$2); print $1" "$2}'
DATE_STRING=$(echo "$1" | awk -F_ '{gsub(/-/,":",$2); print $1" "$2}')
echo "$DATE_STRING"
} }
# Delete a backup # Delete a backup
delete-backup () { delete-backup () {
local BACKUP=$1 local BACKUP=$1
rm -f "$BACKUP_DIRECTORY/$BACKUP" rm -f "$BACKUP_DIRECTORY/$BACKUP"
message-players "Deleted old backup" "$BACKUP" echo "Deleted old backup" "$BACKUP"
} }
# Sequential delete method # Sequential delete method
@ -44,9 +42,9 @@ delete-sequentially () {
BASENAME=$(basename "$BACKUP_NAME") BASENAME=$(basename "$BACKUP_NAME")
BACKUPS_UNSORTED+=("$BASENAME") BACKUPS_UNSORTED+=("$BASENAME")
done done
local BACKUPS=()
# List oldest first # List oldest first
while IFS='' read -r line; do BACKUPS+=("$line"); done < <(IFS=$'\n' sort <<<"${BACKUPS_UNSORTED[*]}") # shellcheck disable=SC2207
IFS=$'\n' BACKUPS=($(sort <<<"${BACKUPS_UNSORTED[*]}"))
while [[ $MAX_BACKUPS -ge 0 && ${#BACKUPS[@]} -gt $MAX_BACKUPS ]]; do while [[ $MAX_BACKUPS -ge 0 && ${#BACKUPS[@]} -gt $MAX_BACKUPS ]]; do
delete-backup "${BACKUPS[0]}" delete-backup "${BACKUPS[0]}"
@ -57,9 +55,9 @@ delete-sequentially () {
BASENAME=$(basename "$BACKUP_NAME") BASENAME=$(basename "$BACKUP_NAME")
BACKUPS_UNSORTED+=("$BASENAME") BACKUPS_UNSORTED+=("$BASENAME")
done done
local BACKUPS=()
# List oldest first # List oldest first
while IFS='' read -r line; do BACKUPS+=("$line"); done < <(IFS=$'\n' sort <<<"${BACKUPS_UNSORTED[*]}") # shellcheck disable=SC2207
IFS=$'\n' BACKUPS=($(sort <<<"${BACKUPS_UNSORTED[*]}"))
done done
} }
@ -107,6 +105,7 @@ delete-thinning () {
fi fi
local CURRENT_INDEX=0 local CURRENT_INDEX=0
local BACKUPS_UNSORTED_RAW=("$BACKUP_DIRECTORY"/*) local BACKUPS_UNSORTED_RAW=("$BACKUP_DIRECTORY"/*)
local BACKUPS_UNSORTED=() local BACKUPS_UNSORTED=()
for BACKUP_NAME in "${BACKUPS_UNSORTED_RAW[@]}"; do for BACKUP_NAME in "${BACKUPS_UNSORTED_RAW[@]}"; do
@ -114,9 +113,9 @@ delete-thinning () {
BASENAME=$(basename "$BACKUP_NAME") BASENAME=$(basename "$BACKUP_NAME")
BACKUPS_UNSORTED+=("$BASENAME") BACKUPS_UNSORTED+=("$BASENAME")
done done
local BACKUPS=()
# List newest first # List newest first
while IFS='' read -r line; do BACKUPS+=("$line"); done < <(IFS=$'\n' sort -r <<<"${BACKUPS_UNSORTED[*]}") # shellcheck disable=SC2207
IFS=$'\n' BACKUPS=($(sort -r <<<"${BACKUPS_UNSORTED[*]}"))
for BLOCK_INDEX in "${!BLOCK_SIZES[@]}"; do for BLOCK_INDEX in "${!BLOCK_SIZES[@]}"; do
local BLOCK_SIZE=${BLOCK_SIZES[BLOCK_INDEX]} local BLOCK_SIZE=${BLOCK_SIZES[BLOCK_INDEX]}
@ -130,14 +129,8 @@ delete-thinning () {
local OLDEST_BACKUP_TIMESTAMP local OLDEST_BACKUP_TIMESTAMP
OLDEST_BACKUP_TIMESTAMP=$(parse-file-timestamp "${OLDEST_BACKUP_IN_BLOCK:0:19}") OLDEST_BACKUP_TIMESTAMP=$(parse-file-timestamp "${OLDEST_BACKUP_IN_BLOCK:0:19}")
local BLOCK_COMMAND="$BLOCK_FUNCTION $OLDEST_BACKUP_TIMESTAMP"
if $BLOCK_COMMAND; then if ! $BLOCK_FUNCTION "$OLDEST_BACKUP_TIMESTAMP"; then
# Oldest backup in this block satisfies the condition for placement in the next block
if $DEBUG; then
echo "$OLDEST_BACKUP_IN_BLOCK promoted to next block"
fi
else
# Oldest backup in this block does not satisfy the condition for placement in next block # Oldest backup in this block does not satisfy the condition for placement in next block
delete-backup "$OLDEST_BACKUP_IN_BLOCK" delete-backup "$OLDEST_BACKUP_IN_BLOCK"
break break

View file

@ -1,12 +1,5 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Minecraft server automatic backup management script
# by Nicolas Chan
# https://github.com/nicolaschan/minecraft-backup
# MIT License
#
# For most convenience, run automatically with cron.
# This script implements the core functionality, and expects the following # This script implements the core functionality, and expects the following
# functions to be defined by the method scripts: # functions to be defined by the method scripts:
# #
@ -35,6 +28,7 @@ while [[ $1 != "--" ]]; do
done done
shift shift
OPTIND=1
while getopts 'c:g:p:q:v:' FLAG; do while getopts 'c:g:p:q:v:' FLAG; do
case $FLAG in case $FLAG in
c) ENABLE_CHAT_MESSAGES=$OPTARG ;; c) ENABLE_CHAT_MESSAGES=$OPTARG ;;
@ -124,7 +118,7 @@ message-players-color () {
local HOVER_MESSAGE=$3 local HOVER_MESSAGE=$3
log-info "$MESSAGE ($HOVER_MESSAGE)" log-info "$MESSAGE ($HOVER_MESSAGE)"
if $ENABLE_CHAT_MESSAGES; then if $ENABLE_CHAT_MESSAGES; then
execute_command \ 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\"}]}}}]" "tellraw @a [\"\",{\"text\":\"[$PREFIX] \",\"color\":\"gray\",\"italic\":true},{\"text\":\"$MESSAGE\",\"color\":\"$COLOR\",\"italic\":true,\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[{\"text\":\"$HOVER_MESSAGE\"}]}}}]"
fi fi
} }

View file

@ -3,6 +3,7 @@
SUPPRESS_WARNINGS=false SUPPRESS_WARNINGS=false
DEBUG=true DEBUG=true
OPTIND=1
while getopts 'q:v:' FLAG; do while getopts 'q:v:' FLAG; do
case $FLAG in case $FLAG in
q) SUPPRESS_WARNINGS=$OPTARG ;; q) SUPPRESS_WARNINGS=$OPTARG ;;

View file

@ -6,13 +6,18 @@ ITERATIONS=1000
MINUTE_INTERVAL=30 MINUTE_INTERVAL=30
MINUTES_SINCE_START=0 MINUTES_SINCE_START=0
WORLD=test/world
BACKUP_DIR=test/backups
mkdir -p $WORLD
echo "hello there" > "$WORLD/content.txt"
if [[ $1 != "" ]]; then if [[ $1 != "" ]]; then
ITERATIONS=$1 ITERATIONS=$1
fi fi
for (( c=1; c<=$ITERATIONS; c++ )); do for (( c=1; c<=ITERATIONS; c++ )); do
TIMESTAMP=$(( START_TIMESTAMP + MINUTES_SINCE_START * 60 )) TIMESTAMP=$(( START_TIMESTAMP + MINUTES_SINCE_START * 60 ))
FILE_NAME=$(date -d "@$TIMESTAMP" +%F_%H-%M-%S) FILE_NAME=$(date -d "@$TIMESTAMP" +%F_%H-%M-%S)
./backup.sh -q -i /home/nicolas/privatesurvival/world -o /home/nicolas/backups -f $FILE_NAME ./backup.sh -q -s minecraft -i "$WORLD" -o "$BACKUP_DIR" -f "$FILE_NAME"
(( MINUTES_SINCE_START += MINUTE_INTERVAL )) (( MINUTES_SINCE_START += MINUTE_INTERVAL ))
done done