Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash
- #------------------------------------------------------------------------------------
- #Generic file backup test using rsync
- #Usage: ./filename [--run]
- #
- # Options
- # --run: run the backup, script performs simulation run by default if not specified
- #------------------------------------------------------------------------------------
- #User input
- #--------------------------------------------------------------------
- SOURCE="/mnt/Toshiba_3TB/"
- SNAPSHOT_LIMIT=2 #number of snapshots to preserve (0=infinite)
- #--------------------------------------------------------------------
- echo
- echo
- echo
- ARG1=$1
- TARGET="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
- EXCLUDE_FILE="${TARGET}/exclude"
- #Create Trash folder if it does not exist
- TRASH_FOLDER_NAME=".trash"
- TRASH_DIR="${TARGET}/${TRASH_FOLDER_NAME}/"
- if [ ! -d "${TRASH_DIR}" ]; then
- mkdir "${TRASH_DIR}"
- fi
- #Create snapshot folder if it does not exist
- SNAPSHOT_FOLDER_NAME="snapshots"
- SNAPSHOT_DIR="${TARGET}/${SNAPSHOT_FOLDER_NAME}/"
- if [ ! -d "${SNAPSHOT_DIR}" ]; then
- mkdir "${SNAPSHOT_DIR}"
- fi
- #Create logs folder
- LOG_DIR="${TARGET}/logs/"
- if [ ! -d "${LOG_DIR}" ]; then
- mkdir "$LOG_DIR"
- fi
- LOG_DIR_DRY_RUN="${LOG_DIR}dry_run/"
- if [ ! -d "$LOG_DIR_DRY_RUN" ]; then
- mkdir "$LOG_DIR_DRY_RUN"
- fi
- LOG_DIR_SNAPSHOTS="${LOG_DIR}snapshots/"
- if [ ! -d "$LOG_DIR_SNAPSHOTS" ]; then
- mkdir "$LOG_DIR_SNAPSHOTS"
- fi
- #fetch number of snapshot folders present
- SNAPSHOT_COUNT=`ls -l "$SNAPSHOT_DIR" | grep ^d | wc -l`
- SNAPSHOT_HANDLE="Snapshot_"
- TIMESTAMP=`date +%Y%m%d%H%M%S`
- SNAPSHOT_DIR_NAME="${SNAPSHOT_HANDLE}${TIMESTAMP}"
- LATEST_SNAPSHOT_NAME=
- #Create log file for current session
- LOG_HANDLE="log_"
- LOGFILE_PATH=
- if [ "$ARG1" == "--run" ]; then
- LOGFILE_PATH="${LOG_DIR_SNAPSHOTS}${LOG_HANDLE}${TIMESTAMP}"
- touch "$LOGFILE_PATH"
- else
- LOG_HANDLE="log_dryrun"
- LOGFILE_PATH="${LOG_DIR_DRY_RUN}${LOG_HANDLE}"
- if [ -f "$LOGFILE_PATH" ]; then
- mv --backup=t "$LOGFILE_PATH" "$TRASH_DIR"
- fi
- touch "$LOGFILE_PATH"
- fi
- #options (WARNING: DO NOT specify any dry run tags such as "-n" here)
- OPTIONS=(\
- -aAXSv \
- --delete \
- --one-file-system\
- )
- if [ "$ARG1" != "--run" ]; then
- OPTIONS+=(-n)
- OPTIONS+=(--log-file=$LOGFILE_PATH)
- elif [ "$ARG1" == "--run" ]; then
- OPTIONS+=(--log-file=$LOGFILE_PATH)
- fi
- #fetch most recent snapshot (assumed last folder in snapshot directory)
- if [ $SNAPSHOT_COUNT -ne 0 ]; then
- temp=(`ls -l ${SNAPSHOT_DIR} | grep ^d | tail -1`)
- LATEST_SNAPSHOT_NAME=${temp[-1]}
- LATEST_SNAPSHOT_DIR=${SNAPSHOT_DIR}${LATEST_SNAPSHOT_NAME}
- fi
- EXCLUDE="--exclude-from=$EXCLUDE_FILE"
- RSYNC_COMMAND="${OPTIONS[@]} ${EXCLUDE} ${SOURCE} ${SNAPSHOT_DIR}"
- #perform a dry run
- if [ "$ARG1" != "--run" ]; then
- if [ $SNAPSHOT_COUNT -ne 0 ]; then
- cp -al "$LATEST_SNAPSHOT_DIR" "${SNAPSHOT_DIR}dummy"
- else
- mkdir "${SNAPSHOT_DIR}dummy"
- fi
- rsync ${RSYNC_COMMAND}"dummy"
- rm -rf ${SNAPSHOT_DIR}"dummy"
- else
- if [ $SNAPSHOT_COUNT -eq 0 ]; then
- rsync ${RSYNC_COMMAND}"${SNAPSHOT_DIR_NAME}"
- elif [ $SNAPSHOT_LIMIT -eq 0 ] || [ $SNAPSHOT_COUNT -lt $SNAPSHOT_LIMIT ]; then
- #run backup with hardlinks to latest snapshot
- cp -al "$LATEST_SNAPSHOT_DIR" "${SNAPSHOT_DIR}${SNAPSHOT_DIR_NAME}";
- rsync ${RSYNC_COMMAND}"${SNAPSHOT_DIR_NAME}"
- elif [ $SNAPSHOT_LIMIT -ne 0 ] && [ $SNAPSHOT_COUNT -ge $SNAPSHOT_LIMIT ]; then
- while [ $SNAPSHOT_COUNT -ge $SNAPSHOT_LIMIT ]; do
- #fetch oldest snapshot (assumed first folder in snapshot directory)
- temp=(`ls -l ${SNAPSHOT_DIR} | grep ^d | head -1`)
- OLDEST_SNAPSHOT_NAME=${temp[-1]}
- OLDEST_SNAPSHOT_DIR=${SNAPSHOT_DIR}${OLDEST_SNAPSHOT_NAME}
- #delete oldest snapshot
- mv --backup=t ${OLDEST_SNAPSHOT_DIR} ${TRASH_DIR}
- SNAPSHOT_COUNT=`ls -l "$SNAPSHOT_DIR" | grep ^d | wc -l`
- #fetch oldest associated snapshot logfile
- temp=(`ls -l ${LOG_DIR_SNAPSHOTS} | grep ^- | head -1`)
- OLDEST_SNAPSHOT_LOG_NAME=${temp[-1]}
- OLDEST_SNAPSHOT_LOG_DIR=${LOG_DIR_SNAPSHOTS}${OLDEST_SNAPSHOT_LOG_NAME}
- #delete oldest associated snapshot logfile
- mv --backup=t ${OLDEST_SNAPSHOT_LOG_DIR} ${TRASH_DIR}
- done
- #run backup with hardlinks to latest snapshot
- cp -al "$LATEST_SNAPSHOT_DIR" "${SNAPSHOT_DIR}${SNAPSHOT_DIR_NAME}";
- rsync ${RSYNC_COMMAND}"${SNAPSHOT_DIR_NAME}"
- fi
- fi
- echo
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement