fix(airgapped): harden community restore script

- Fix stray "+" before set -euo pipefail
- Allow no-argument invocation under set -u (BACKUP_FOLDER="${1:-}")
- Don't exit under pipefail when no compose project matches; recognize
  "running(N)" statuses when checking if the instance is running
- Fix unquoted glob in the backup extraction loop
- Rename extracted dirs (pgdata/redisdata/uploads/rabbitmq_data) to the
  volume paths the airgapped docker-compose expects (db/redis/minio/uploads/mq)
- Update ASCII header to the current logo

Co-Authored-By: WOZCODE <contact@withwoz.com>
This commit is contained in:
akshat5302
2026-09-01 14:55:30 +05:30
parent bc2fce4f1b
commit bbf6f1df4f

View File

@@ -1,20 +1,20 @@
#!/bin/bash
+set -euo pipefail
set -euo pipefail
function print_header() {
clear
cat <<"EOF"
--------------------------------------------
____ _ /////////
| _ \| | __ _ _ __ ___ /////////
| |_) | |/ _` | '_ \ / _ \ ///// /////
| __/| | (_| | | | | __/ ///// /////
|_| |_|\__,_|_| |_|\___| ////
////
--------------------------------------------
Project management tool from the future
--------------------------------------------
##+. ##+ .##-
######+.######-.######.
#######. -### +#####+.
#######. + +######.
#######. .#######
#######. .#######
####### + .#######
.+#####+ ###- .#######
.######.-#####+.+######
-##. -## .+##
EOF
}
@@ -27,7 +27,7 @@ function restoreData() {
echo ""
# set the backup folder path
BACKUP_FOLDER=${1}
BACKUP_FOLDER="${1:-}"
if [ -z "$BACKUP_FOLDER" ]; then
BACKUP_FOLDER="$PWD/backup"
@@ -78,12 +78,12 @@ function restoreData() {
local dockerServiceStatus
if command -v jq &> /dev/null; then
dockerServiceStatus=$($COMPOSE_CMD ls --filter name=plane-airgapped --format=json | jq -r .[0].Status)
dockerServiceStatus=$($COMPOSE_CMD ls --filter name=plane-airgapped --format=json | jq -r '.[0].Status // empty')
else
dockerServiceStatus=$($COMPOSE_CMD ls --filter name=plane-airgapped | grep -o "running" | head -n 1)
dockerServiceStatus=$($COMPOSE_CMD ls --filter name=plane-airgapped | grep -o "running" | head -n 1 || true)
fi
if [[ $dockerServiceStatus == "running" ]]; then
if [[ "$dockerServiceStatus" == running* ]]; then
echo "Plane Airgapped is running. Please STOP the Plane Airgapped before restoring data."
exit 1
fi
@@ -97,36 +97,60 @@ function restoreData() {
chown -R $CURRENT_USER_ID:$CURRENT_GROUP_ID "$AIRGAPPED_INSTALL_PATH/data"
fi
for BACKUP_FILE in "$BACKUP_FOLDER/*.tar.gz"; do
# Extract all backup tar files
for BACKUP_FILE in "$BACKUP_FOLDER"/*.tar.gz; do
if [ -e "$BACKUP_FILE" ]; then
# get the basefilename without the extension
BASE_FILE_NAME=$(basename "$BACKUP_FILE" ".tar.gz")
# extract the restoreFile to the airgapped instance install path
echo "Restoring $BASE_FILE_NAME"
rm -rf "$AIRGAPPED_INSTALL_PATH/data/$BASE_FILE_NAME" || true
tar -xvzf "$BACKUP_FILE" -C "$AIRGAPPED_INSTALL_PATH/data/"
echo "Extracting $BASE_FILE_NAME"
tar -xzvf "$BACKUP_FILE" -C "$AIRGAPPED_INSTALL_PATH/data/"
if [ $? -ne 0 ]; then
echo "Error: Failed to extract $BACKUP_FILE"
exit 1
fi
chown -R $CURRENT_USER_ID:$CURRENT_GROUP_ID "$AIRGAPPED_INSTALL_PATH/data/$BASE_FILE_NAME"
if [ $? -ne 0 ]; then
echo "Error: Failed to change ownership of $AIRGAPPED_INSTALL_PATH/data/$BASE_FILE_NAME"
exit 1
fi
else
echo "No .tar.gz files found in the current directory."
echo ""
echo "Please provide the path to the backup file."
echo ""
echo "Usage: $0 /path/to/backup"
echo "Usage: $0 /path/to/backup"
exit 1
fi
done
DATA_DIR="$AIRGAPPED_INSTALL_PATH/data"
# Rename extracted directories to match docker-compose volume paths
# Backup tars: pgdata, redisdata, uploads, rabbitmq_data
# Docker-compose expects: db, redis, minio/uploads, mq
if [ -d "$DATA_DIR/pgdata" ]; then
rm -rf "$DATA_DIR/db"
mv "$DATA_DIR/pgdata" "$DATA_DIR/db"
echo "Renamed pgdata -> db"
fi
if [ -d "$DATA_DIR/redisdata" ]; then
rm -rf "$DATA_DIR/redis"
mv "$DATA_DIR/redisdata" "$DATA_DIR/redis"
echo "Renamed redisdata -> redis"
fi
if [ -d "$DATA_DIR/uploads" ]; then
mkdir -p "$DATA_DIR/minio"
rm -rf "$DATA_DIR/minio/uploads"
mv "$DATA_DIR/uploads" "$DATA_DIR/minio/uploads"
echo "Renamed uploads -> minio/uploads"
fi
if [ -d "$DATA_DIR/rabbitmq_data" ]; then
rm -rf "$DATA_DIR/mq"
mv "$DATA_DIR/rabbitmq_data" "$DATA_DIR/mq"
echo "Renamed rabbitmq_data -> mq"
fi
# Fix ownership on all restored data
chown -R $CURRENT_USER_ID:$CURRENT_GROUP_ID "$DATA_DIR"
echo ""
echo "Restore completed successfully."
echo ""