wanglian/workbase-server

View on GitHub
.snapcraft/resources/restoredb

Summary

Maintainability
Test Coverage
#!/bin/bash

function warn {
  echo "[!] ${1}"
  echo "[*] Check ${RESTORE_DIR}/${LOG_NAME} for details."
}

function abort {
  echo "[!] ${1}"
  echo "[*] Check ${RESTORE_DIR}/${LOG_NAME} for details."
  echo "[-] Restore aborted!"
  exit 1
}

if [[ ${EUID} != 0 ]]; then
  echo "[-] This task must be run with 'sudo'."
  exit 1
fi

echo "*** ATTENTION ***"
echo "* Your current database WILL BE DROPPED prior to the restore!"
echo "* Do you want to continue?"

select yn in "Yes" "No"; do
  case $yn in
    Yes ) break;;
    No ) exit 1;;
  esac
done

if $(ps x | grep "node ${SNAP}/main.js" | grep -qv "grep"); then
  echo "[-] Please shutdown WorkBase first to restore a clean backup"
  echo "[-] Use 'sudo systemctl stop snap.workbase-server.workbase-server'"
  echo "[-] Backup aborted!"
  exit 1
fi

TIMESTAMP=$(date +"%Y%m%d.%H%M")
RESTORE_DIR="${SNAP_COMMON}/restore"
DATA_DIR="${RESTORE_DIR}/dump/parties"
LOG_NAME="restore_${TIMESTAMP}.log"

if [[ ! -d ${RESTORE_DIR} ]]; then
  mkdir ${RESTORE_DIR}
fi

if [[ -d ${RESTORE_DIR}/dump ]]; then
  rm -rf ${RESTORE_DIR}/dump
fi

if [[ -f ${RESTORE_DIR}/${LOG_NAME} ]]; then
  rm -f ${RESTORE_DIR}/${LOG_NAME}
fi

BACKUP_FILE=${1}
if [[ ! -f ${BACKUP_FILE} ]]; then
  echo "[-] Usage: sudo snap run workbase-server.restoredb ${SNAP_COMMON}/workbase_backup_{TIMESTAMP}.tar.gz"
  exit 1
fi

if ! $(echo "${BACKUP_FILE}" | grep -q "${SNAP_COMMON}"); then
  echo "[-] Backup file must be within ${SNAP_COMMON}."
  exit 1
fi

echo "[*] Extracting backup file..."
echo "[*] Extracting backup file with \"tar --no-same-owner --overwrite -xzvf ${BACKUP_FILE}\"" &> "${RESTORE_DIR}/${LOG_NAME}"
cd ${RESTORE_DIR}
tar --no-same-owner --overwrite -xzvf ${BACKUP_FILE} &>> "${RESTORE_DIR}/${LOG_NAME}" \
  || abort "Failed to extract backup files to ${RESTORE_DIR}!"

if [ $(ls -l ${DATA_DIR} | wc -l) -le 1 ]; then
  abort "No restore data found within ${DATA_DIR}!"
fi
echo "[*] Restoring data..."
echo "[*] Restoring data with \"mongorestore --db parties --noIndexRestore --drop ${DATA_DIR}\"" &>> "${RESTORE_DIR}/${LOG_NAME}"
mongorestore --db parties --noIndexRestore --drop ${DATA_DIR} &>> "${RESTORE_DIR}/${LOG_NAME}" \
  || abort "Failed to execute mongorestore from ${DATA_DIR}!"
if [ $(cat ${RESTORE_DIR}/${LOG_NAME} | grep $(date +%Y) | wc -l) -lt 24 ]; then
  warn "Little or no data could be restored from the backup!"
fi

echo "[*] Preparing database..."
echo "[*] Preparing database with \"mongo parties --eval 'db.repairDatabase()' --verbose\"" &>> "${RESTORE_DIR}/${LOG_NAME}"
mongo parties --eval "db.repairDatabase()" --verbose &>> "${RESTORE_DIR}/${LOG_NAME}" \
  || abort "Failed to prepare database for usage!"

echo "[+] Restore completed! Please with 'sudo systemctl restart snap.workbase-server.workbase-server' to verify."