diff --git a/scripts/backup.sh b/scripts/backup.sh index 4c442c9..51a33c6 100644 --- a/scripts/backup.sh +++ b/scripts/backup.sh @@ -124,8 +124,6 @@ function backup_package() { } function upload() { - color blue "upload backup file to storage system" - # upload file not exist if [[ ! -e "${UPLOAD_FILE}" ]]; then color red "upload file not found" @@ -135,10 +133,22 @@ function upload() { exit 1 fi - rclone ${RCLONE_GLOBAL_FLAG} copy "${UPLOAD_FILE}" "${RCLONE_REMOTE}" - if [[ $? != 0 ]]; then - color red "upload failed" + # upload + local HAS_ERROR="FALSE" + for RCLONE_REMOTE_X in "${RCLONE_REMOTE_LIST[@]}" + do + color blue "upload backup file to storage system $(color yellow "[${RCLONE_REMOTE_X}]")" + + rclone ${RCLONE_GLOBAL_FLAG} copy "${UPLOAD_FILE}" "${RCLONE_REMOTE_X}" + if [[ $? != 0 ]]; then + color red "upload failed" + + HAS_ERROR="TRUE" + fi + done + + if [[ "${HAS_ERROR}" == "TRUE" ]]; then send_mail_content "FALSE" "File upload failed at $(date +"%Y-%m-%d %H:%M:%S %Z")." exit 1 @@ -147,18 +157,21 @@ function upload() { function clear_history() { if [[ "${BACKUP_KEEP_DAYS}" -gt 0 ]]; then - color blue "delete ${BACKUP_KEEP_DAYS} days ago backup files" - - mapfile -t RCLONE_DELETE_LIST < <(rclone ${RCLONE_GLOBAL_FLAG} lsf "${RCLONE_REMOTE}" --min-age "${BACKUP_KEEP_DAYS}d") - - for RCLONE_DELETE_FILE in "${RCLONE_DELETE_LIST[@]}" + for RCLONE_REMOTE_X in "${RCLONE_REMOTE_LIST[@]}" do - color yellow "deleting \"${RCLONE_DELETE_FILE}\"" + color blue "delete ${BACKUP_KEEP_DAYS} days ago backup files $(color yellow "[${RCLONE_REMOTE_X}]")" - rclone ${RCLONE_GLOBAL_FLAG} delete "${RCLONE_REMOTE}/${RCLONE_DELETE_FILE}" - if [[ $? != 0 ]]; then - color red "delete \"${RCLONE_DELETE_FILE}\" failed" - fi + mapfile -t RCLONE_DELETE_LIST < <(rclone ${RCLONE_GLOBAL_FLAG} lsf "${RCLONE_REMOTE_X}" --min-age "${BACKUP_KEEP_DAYS}d") + + for RCLONE_DELETE_FILE in "${RCLONE_DELETE_LIST[@]}" + do + color yellow "deleting \"${RCLONE_DELETE_FILE}\"" + + rclone ${RCLONE_GLOBAL_FLAG} delete "${RCLONE_REMOTE_X}/${RCLONE_DELETE_FILE}" + if [[ $? != 0 ]]; then + color red "delete \"${RCLONE_DELETE_FILE}\" failed" + fi + done done fi } diff --git a/scripts/includes.sh b/scripts/includes.sh index a36eda4..7775384 100644 --- a/scripts/includes.sh +++ b/scripts/includes.sh @@ -31,6 +31,7 @@ function color() { # None ######################################## function check_rclone_connection() { + # check configuration exist rclone ${RCLONE_GLOBAL_FLAG} config show "${RCLONE_REMOTE_NAME}" > /dev/null 2>&1 if [[ $? != 0 ]]; then color red "rclone configuration information not found" @@ -38,9 +39,20 @@ function check_rclone_connection() { exit 1 fi - rclone ${RCLONE_GLOBAL_FLAG} mkdir "${RCLONE_REMOTE}" - if [[ $? != 0 ]]; then - color red "storage system connection failure" + # check connection + local HAS_ERROR="FALSE" + + for RCLONE_REMOTE_X in "${RCLONE_REMOTE_LIST[@]}" + do + rclone ${RCLONE_GLOBAL_FLAG} mkdir "${RCLONE_REMOTE_X}" + if [[ $? != 0 ]]; then + color red "storage system connection failure $(color yellow "[${RCLONE_REMOTE_X}]")" + + HAS_ERROR="TRUE" + fi + done + + if [[ "${HAS_ERROR}" == "TRUE" ]]; then exit 1 fi } @@ -179,6 +191,40 @@ function get_env() { export "${VAR}=${VALUE}" } +######################################## +# Get RCLONE_REMOTE_LIST variables. +# Arguments: +# None +# Outputs: +# variable value +######################################## +function get_rclone_remote_list() { + # RCLONE_REMOTE_LIST + RCLONE_REMOTE_LIST=() + + local i=0 + local RCLONE_REMOTE_NAME_X_REFER + local RCLONE_REMOTE_DIR_X_REFER + local RCLONE_REMOTE_X + + # for multiple + while true; do + RCLONE_REMOTE_NAME_X_REFER="RCLONE_REMOTE_NAME_${i}" + RCLONE_REMOTE_DIR_X_REFER="RCLONE_REMOTE_DIR_${i}" + get_env "${RCLONE_REMOTE_NAME_X_REFER}" + get_env "${RCLONE_REMOTE_DIR_X_REFER}" + + if [[ -z "${!RCLONE_REMOTE_NAME_X_REFER}" || -z "${!RCLONE_REMOTE_DIR_X_REFER}" ]]; then + break + fi + + RCLONE_REMOTE_X=$(echo "${!RCLONE_REMOTE_NAME_X_REFER}:${!RCLONE_REMOTE_DIR_X_REFER}" | sed 's@\(/*\)$@@') + RCLONE_REMOTE_LIST=(${RCLONE_REMOTE_LIST[@]} "${RCLONE_REMOTE_X}") + + ((i++)) + done +} + ######################################## # Initialization environment variables. # Arguments: @@ -200,13 +246,15 @@ function init_env() { # RCLONE_REMOTE_NAME get_env RCLONE_REMOTE_NAME RCLONE_REMOTE_NAME="${RCLONE_REMOTE_NAME:-"BitwardenBackup"}" + RCLONE_REMOTE_NAME_0="${RCLONE_REMOTE_NAME}" # RCLONE_REMOTE_DIR get_env RCLONE_REMOTE_DIR RCLONE_REMOTE_DIR="${RCLONE_REMOTE_DIR:-"/BitwardenBackup/"}" + RCLONE_REMOTE_DIR_0="${RCLONE_REMOTE_DIR}" - # RCLONE_REMOTE - RCLONE_REMOTE=$(echo "${RCLONE_REMOTE_NAME}:${RCLONE_REMOTE_DIR}" | sed 's@\(/*\)$@@') + # get RCLONE_REMOTE_LIST + get_rclone_remote_list # RCLONE_GLOBAL_FLAG get_env RCLONE_GLOBAL_FLAG @@ -262,9 +310,12 @@ function init_env() { color yellow "DATA_SENDS: ${DATA_SENDS}" color yellow "========================================" color yellow "CRON: ${CRON}" - color yellow "RCLONE_REMOTE_NAME: ${RCLONE_REMOTE_NAME}" - color yellow "RCLONE_REMOTE_DIR: ${RCLONE_REMOTE_DIR}" - color yellow "RCLONE_REMOTE: ${RCLONE_REMOTE}" + + for RCLONE_REMOTE_X in "${RCLONE_REMOTE_LIST[@]}" + do + color yellow "RCLONE_REMOTE: ${RCLONE_REMOTE_X}" + done + color yellow "RCLONE_GLOBAL_FLAG: ${RCLONE_GLOBAL_FLAG}" color yellow "ZIP_ENABLE: ${ZIP_ENABLE}" color yellow "ZIP_PASSWORD: ${#ZIP_PASSWORD} Chars"