Advertisement
Guest User

backup.sh

a guest
Mar 6th, 2018
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 4.26 KB | None | 0 0
  1. #!/bin/bash
  2. #------------------------------------------------------------------------------------
  3. #Generic file backup test using rsync
  4. #Usage: ./filename [--run]
  5. #
  6. # Options
  7. # --run: run the backup, script performs simulation run by default if not specified
  8. #------------------------------------------------------------------------------------
  9. #User input
  10. #--------------------------------------------------------------------
  11. SOURCE="/mnt/Toshiba_3TB/"
  12. SNAPSHOT_LIMIT=2 #number of snapshots to preserve (0=infinite)
  13. #--------------------------------------------------------------------
  14.  
  15. echo
  16. echo
  17. echo
  18. ARG1=$1
  19. TARGET="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  20. EXCLUDE_FILE="${TARGET}/exclude"
  21.  
  22. #Create Trash folder if it does not exist
  23. TRASH_FOLDER_NAME=".trash"
  24. TRASH_DIR="${TARGET}/${TRASH_FOLDER_NAME}/"
  25. if [ ! -d "${TRASH_DIR}" ]; then
  26.     mkdir "${TRASH_DIR}"
  27. fi
  28.  
  29. #Create snapshot folder if it does not exist
  30. SNAPSHOT_FOLDER_NAME="snapshots"
  31. SNAPSHOT_DIR="${TARGET}/${SNAPSHOT_FOLDER_NAME}/"
  32. if [ ! -d "${SNAPSHOT_DIR}" ]; then
  33.     mkdir "${SNAPSHOT_DIR}"
  34. fi
  35.  
  36. #Create logs folder
  37. LOG_DIR="${TARGET}/logs/"
  38. if [ ! -d "${LOG_DIR}" ]; then
  39.     mkdir "$LOG_DIR"
  40. fi
  41. LOG_DIR_DRY_RUN="${LOG_DIR}dry_run/"
  42. if [ ! -d "$LOG_DIR_DRY_RUN" ]; then
  43.     mkdir "$LOG_DIR_DRY_RUN"
  44. fi
  45. LOG_DIR_SNAPSHOTS="${LOG_DIR}snapshots/"
  46. if [ ! -d "$LOG_DIR_SNAPSHOTS" ]; then
  47.     mkdir "$LOG_DIR_SNAPSHOTS"
  48. fi
  49.  
  50. #fetch number of snapshot folders present
  51. SNAPSHOT_COUNT=`ls -l "$SNAPSHOT_DIR" | grep ^d | wc -l`
  52.  
  53. SNAPSHOT_HANDLE="Snapshot_"
  54. TIMESTAMP=`date +%Y%m%d%H%M%S`
  55. SNAPSHOT_DIR_NAME="${SNAPSHOT_HANDLE}${TIMESTAMP}"
  56. LATEST_SNAPSHOT_NAME=
  57.  
  58. #Create log file for current session
  59. LOG_HANDLE="log_"
  60. LOGFILE_PATH=
  61. if [ "$ARG1" == "--run" ]; then
  62.     LOGFILE_PATH="${LOG_DIR_SNAPSHOTS}${LOG_HANDLE}${TIMESTAMP}"
  63.     touch "$LOGFILE_PATH"
  64. else
  65.     LOG_HANDLE="log_dryrun"
  66.     LOGFILE_PATH="${LOG_DIR_DRY_RUN}${LOG_HANDLE}"
  67.     if [ -f "$LOGFILE_PATH" ]; then
  68.         mv --backup=t "$LOGFILE_PATH" "$TRASH_DIR"
  69.     fi
  70.     touch "$LOGFILE_PATH"
  71. fi
  72.  
  73. #options (WARNING: DO NOT specify any dry run tags such as "-n" here)
  74. OPTIONS=(\
  75. -aAXSv \
  76. --delete \
  77. --one-file-system\
  78. )
  79.  
  80. if [ "$ARG1" != "--run" ]; then
  81.     OPTIONS+=(-n)
  82.     OPTIONS+=(--log-file=$LOGFILE_PATH)
  83. elif [ "$ARG1" == "--run" ]; then
  84.     OPTIONS+=(--log-file=$LOGFILE_PATH)
  85. fi
  86.  
  87. #fetch most recent snapshot (assumed last folder in snapshot directory)
  88. if [ $SNAPSHOT_COUNT -ne 0 ]; then
  89.     temp=(`ls -l ${SNAPSHOT_DIR} | grep ^d | tail -1`)
  90.     LATEST_SNAPSHOT_NAME=${temp[-1]}
  91.     LATEST_SNAPSHOT_DIR=${SNAPSHOT_DIR}${LATEST_SNAPSHOT_NAME}
  92. fi
  93.  
  94. EXCLUDE="--exclude-from=$EXCLUDE_FILE"
  95. RSYNC_COMMAND="${OPTIONS[@]} ${EXCLUDE} ${SOURCE} ${SNAPSHOT_DIR}"
  96.  
  97. #perform a dry run
  98. if [ "$ARG1" != "--run" ]; then
  99.     if [ $SNAPSHOT_COUNT -ne 0 ]; then
  100.         cp -al "$LATEST_SNAPSHOT_DIR" "${SNAPSHOT_DIR}dummy"
  101.     else
  102.         mkdir "${SNAPSHOT_DIR}dummy"
  103.     fi
  104.     rsync ${RSYNC_COMMAND}"dummy"
  105.     rm -rf ${SNAPSHOT_DIR}"dummy"
  106. else
  107.     if [ $SNAPSHOT_COUNT -eq 0 ]; then
  108.         rsync ${RSYNC_COMMAND}"${SNAPSHOT_DIR_NAME}"
  109.  
  110.     elif [ $SNAPSHOT_LIMIT -eq 0 ] || [ $SNAPSHOT_COUNT -lt $SNAPSHOT_LIMIT ]; then
  111.         #run backup with hardlinks to latest snapshot
  112.         cp -al "$LATEST_SNAPSHOT_DIR" "${SNAPSHOT_DIR}${SNAPSHOT_DIR_NAME}";
  113.         rsync ${RSYNC_COMMAND}"${SNAPSHOT_DIR_NAME}"
  114.  
  115.     elif [ $SNAPSHOT_LIMIT -ne 0 ] && [ $SNAPSHOT_COUNT -ge $SNAPSHOT_LIMIT ]; then
  116.         while [ $SNAPSHOT_COUNT -ge $SNAPSHOT_LIMIT ]; do
  117.             #fetch oldest snapshot (assumed first folder in snapshot directory)
  118.             temp=(`ls -l ${SNAPSHOT_DIR} | grep ^d | head -1`)
  119.             OLDEST_SNAPSHOT_NAME=${temp[-1]}
  120.             OLDEST_SNAPSHOT_DIR=${SNAPSHOT_DIR}${OLDEST_SNAPSHOT_NAME}
  121.  
  122.             #delete oldest snapshot
  123.             mv --backup=t ${OLDEST_SNAPSHOT_DIR} ${TRASH_DIR}
  124.             SNAPSHOT_COUNT=`ls -l "$SNAPSHOT_DIR" | grep ^d | wc -l`
  125.  
  126.             #fetch oldest associated snapshot logfile
  127.             temp=(`ls -l ${LOG_DIR_SNAPSHOTS} | grep ^- | head -1`)
  128.             OLDEST_SNAPSHOT_LOG_NAME=${temp[-1]}
  129.             OLDEST_SNAPSHOT_LOG_DIR=${LOG_DIR_SNAPSHOTS}${OLDEST_SNAPSHOT_LOG_NAME}
  130.  
  131.             #delete oldest associated snapshot logfile
  132.             mv --backup=t ${OLDEST_SNAPSHOT_LOG_DIR} ${TRASH_DIR}
  133.         done
  134.  
  135.         #run backup with hardlinks to latest snapshot
  136.         cp -al "$LATEST_SNAPSHOT_DIR" "${SNAPSHOT_DIR}${SNAPSHOT_DIR_NAME}";
  137.         rsync ${RSYNC_COMMAND}"${SNAPSHOT_DIR_NAME}"
  138.     fi
  139. fi
  140. echo
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement