Advertisement
Guest User

Untitled

a guest
Apr 25th, 2017
951
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.83 KB | None | 0 0
  1. #!/bin/bash
  2.  
  3. # A Temporary Location to work with files , DO NOT END THE DIRECTORY WITH BACKSLASH !
  4. TMP_DIR=/var/www/backups/tmp
  5. SOURCE_DIR=/var/www/561media.com/prod
  6. TARGET_DIR=/var/www/backups
  7.  
  8. # Hostname
  9. HOST="561media.com"
  10. MAIL="slee@561media.com"
  11. EMAIL_SUBJECT_TAG="[backup of $SOURCE_DIR@$HOST]"
  12.  
  13. # Number of day the daily backup keep ( 2 day = 2 daily backup retention)
  14. RETENTION_DAY=10
  15. # Number of day the weekly backup keep (14 day = 2 weekly backup retention )
  16. RETENTION_WEEK=14
  17. # Number of day the monthly backup keep (30 day = 2 montly backup retention)
  18. RETENTION_MONTH=60
  19. # Monthly date backup option (day of month)
  20. MONTHLY_BACKUP_DATE=1
  21. # Weekly day to backup option (day of week - 1 is monday )
  22. WEEKLY_BACKUP_DAY=6
  23.  
  24. # -----------------
  25. # FTP Configuration
  26. # -----------------
  27.  
  28. FTP_HOST='backups.561media.com'
  29. FTP_PORT=21
  30. FTP_USER='561media'
  31. FTP_PASSWORD=''
  32. FTP_TARGET_DIR='prod'
  33.  
  34. # --------------------------------------------------
  35. # MYSQL Configuration
  36. # --------------------------------------------------
  37.  
  38. DB_USER='root'
  39. DB_PASSWORD='Dev2013guy##'
  40. DB_DATABASE='561media'
  41. DB_HOST='127.0.0.1'
  42.  
  43. # -------------------------------------------------
  44. # Extra mysqldump option
  45. # -------------------------------------------------
  46. EXTRA_MYSQLDUMP_OPTIONS=''
  47.  
  48. # --------------------------------------------------
  49. # Here you can set what you want to be backed up by
  50. # Default. 0 = no ; 1 = yes
  51. # --------------------------------------------------
  52.  
  53. # 0 or 1
  54. LOCAL_BACKUP_OPTION=1
  55. FTP_BACKUP_OPTION=1
  56.  
  57. #----------------------------------#
  58. # Daily | Weekly | Monthly | Value #
  59. #-------|--------|---------|-------#
  60. # Yes | No | No | 1 #
  61. # No | Yes | No | 2 #
  62. # Yes | Yes | No | 3 #
  63. # No | No | Yes | 4 #
  64. # Yes | No | Yes | 5 #
  65. # No | Yes | Yes | 6 #
  66. # Yes | Yes | Yes | 7 #
  67. #----------------------------------#
  68.  
  69. #Between 1-7
  70. SQL_BACKUP_OPTION=1
  71. FILES_BACKUP_OPTION=2
  72.  
  73. # -----------------
  74. # End configuration
  75. # -----------------
  76.  
  77. RUN_NOW=0
  78. #------------------
  79. #Begin Switches
  80. #------------------
  81.  
  82. while [ "$#" -gt 0 ];
  83. do
  84. case "$1" in
  85. -h|--help)
  86. echo "-h|--help was triggered"
  87. exit 1
  88. ;;
  89.  
  90. --both)
  91. LOCAL_BACKUP_OPTION=1
  92. FTP_BACKUP_OPTION=1
  93. ;;
  94.  
  95. --ftp)
  96. FTP_BACKUP_OPTION=1
  97. if [ "$#" -gt 1 ]; then
  98. if [ ! "$2" = \-* ]; then
  99. if [[ ! "$3" = \-* && ! "$4" = \-* && ! "$5" = \-* && ! "$6" = \-* && ! "$3" == "" && ! "$4" == "" && ! "$5" = "" && ! "$6" = "" ]]; then
  100. FTP_HOST=$2
  101. FTP_PORT=$3
  102. FTP_USER=$4
  103. FTP_PASSWORD=$5
  104. FTP_TARGET_DIR=$6
  105. shift 5
  106. else
  107. echo "Error in --ftp syntax. Script failed."
  108. exit 1
  109. fi
  110. fi
  111. fi
  112. ;;
  113.  
  114. --sql)
  115. if [[ "$#" -gt 1 && ! "$2" = \-* ]]; then
  116. SQL_BACKUP_OPTION=$2
  117. if [[ ! "$3" = \-* && ! "$4" = \-* && ! "$5" = \-* && ! "$6" = \-* && ! "$3" == "" && ! "$4" == "" && ! "$5" = "" && ! "$6" = "" ]]; then
  118. DB_HOST=$3
  119. DB_USER=$4
  120. DB_PASSWORD=$5
  121. DB_DATABASE=$6
  122. shift 4
  123. else
  124. echo "Error in --sql syntax. Script failed."
  125. exit 1
  126. fi
  127. shift
  128. fi
  129. ;;
  130.  
  131. --now)
  132. RUN_NOW=1
  133. ;;
  134.  
  135. -bd|--backupdir)
  136. if [[ "$#" -gt 1 && ! "$2" = \-* ]]; then
  137. FILES_BACKUP_OPTION=$2
  138. if [[ ! "$3" = \-* && ! "$3" == "" ]]; then
  139. SOURCE_DIR=${3%/}
  140. shift 2
  141. else
  142. echo "Error in -bd|--backupdir syntax. Script failed."
  143. exit 1
  144. fi
  145. fi
  146. ;;
  147.  
  148.  
  149. -td|--targetdir)
  150. if [[ "$#" -gt 1 && ! "$2" = \-* ]]; then
  151. TARGET_DIR=${2%/}
  152. LOCAL_BACKUP_OPTION=1
  153. shift
  154. else
  155. echo "Error in -td|--targetdir syntax. Script failed."
  156. exit 1
  157. fi
  158. ;;
  159.  
  160. -e|--email)
  161. if [[ "$#" -gt 1 && ! "$2" = \-* ]]; then
  162. MAIL=$2
  163. shift
  164. else
  165. echo "Error in -e|--email syntax. Script failed."
  166. exit 1
  167. fi
  168. ;;
  169.  
  170. -r|--retention)
  171. if [[ "$#" -gt 1 && ! "$2" = \-* && ! "$3" = \-* && ! "$4" = \-* && ! "$3" == "" && ! "$4" == "" ]]; then
  172. RETENTION_DAY=$2
  173. RETENTION_WEEK=$3
  174. RETENTION_MONTH=$4
  175. shift 3
  176. else
  177. echo "Error in -r|--retention syntax. Script failed."
  178. exit 1
  179. fi
  180. ;;
  181.  
  182. -d|--dates)
  183. if [[ "$#" -gt 1 && ! "$2" = \-* && ! "$3" = \-* && ! "$3" == "" ]]; then
  184. MONTHLY_BACKUP_DATE=$2
  185. WEEKLY_BACKUP_DAY=$3
  186. shift 2
  187. else
  188. echo "Error in -d|--dates syntax. Script failed."
  189. exit 1
  190. fi
  191. ;;
  192.  
  193. --) # End of all options.
  194. shift
  195. break
  196. ;;
  197.  
  198. -?*)
  199. printf 'WARN: Unknown option (ignored): %s\n' "$1" >&2
  200. ;;
  201.  
  202. '') # Empty case: If no more options then break out of the loop.
  203. break
  204. ;;
  205.  
  206. *) # Anything unrecognized
  207. echo "The value "$1" was not expected. Script failed."
  208. exit 1
  209. ;;
  210. esac
  211.  
  212. shift
  213. done
  214.  
  215. # STARTING BACKUP SCRIPT
  216.  
  217. #Check date
  218.  
  219. # Get current month and week day number
  220. month_day=`date +"%d"`
  221. week_day=`date +"%u"`
  222.  
  223. # On first month day do
  224. if [ "$month_day" -eq $MONTHLY_BACKUP_DATE ] ; then
  225. BACKUP_TYPE='-monthly'
  226. RETENTION_DAY_LOOKUP=$RETENTION_MONTH
  227.  
  228. COMPARATOR=4
  229. else
  230. # On saturdays do
  231. if [ "$week_day" -eq $WEEKLY_BACKUP_DAY ] ; then
  232. # weekly - keep for RETENTION_WEEK
  233. BACKUP_TYPE='-weekly'
  234. RETENTION_DAY_LOOKUP=$RETENTION_WEEK
  235.  
  236. COMPARATOR=2
  237. else
  238. # On any regular day do
  239. BACKUP_TYPE='-daily'
  240. RETENTION_DAY_LOOKUP=$RETENTION_DAY
  241.  
  242. COMPARATOR=1
  243. fi
  244. fi
  245.  
  246. CURRENT_DIR=${PWD}
  247.  
  248. if [ ! $FTP_BACKUP_OPTION -eq 0 ]; then
  249. # Create list of expired backups
  250. mkdir -p $TMP_DIR/.ftp_cache/
  251. cd $TMP_DIR/.ftp_cache/
  252. find -maxdepth 1 -name "*$BACKUP_TYPE*" -mtime +$RETENTION_DAY_LOOKUP >> $TMP_DIR/.ftp_cache/search_file.tmp
  253. cd $CURRENT_DIR
  254. # List has been created, now lets get rid of them locally.
  255. # Delete expired backups
  256. find $TMP_DIR/.ftp_cache/ -maxdepth 1 -mtime +$RETENTION_DAY_LOOKUP -name "*$BACKUP_TYPE*" -exec rm -rv {} \;
  257. fi
  258.  
  259. # Cleanup expired backups
  260. echo "Removing expired backups..."
  261. find $TARGET_DIR/ -maxdepth 1 -mtime +$RETENTION_DAY_LOOKUP -name "*$BACKUP_TYPE*" -exec rm -rv {} \;
  262.  
  263. PERFORM_SQL_BACKUP=0
  264. PERFORM_FILES_BACKUP=0
  265.  
  266. # Check wheter to do backup
  267. # This no longer is FTP or LOCAL
  268. # but rather if the backup of the
  269. # files should be SQL or FILES.
  270. if [[ $(( $COMPARATOR & $SQL_BACKUP_OPTION )) == $COMPARATOR ]]; then
  271. PERFORM_SQL_BACKUP=1
  272. fi
  273.  
  274. if [[ $(( $COMPARATOR & $FILES_BACKUP_OPTION )) == $COMPARATOR ]]; then
  275. PERFORM_FILES_BACKUP=1
  276. fi
  277.  
  278. #This will force the backup to run immediately.
  279. if [ $RUN_NOW -eq 1 ]; then
  280. PERFORM_LOCAL_BACKUP=$LOCAL_BACKUP_OPTION
  281. PERFORM_FTP_BACKUP=$FTP_BACKUP_OPTION
  282. PERFORM_SQL_BACKUP=$SQL_BACKUP_OPTION
  283. PERFORM_FILES_BACKUP=$FILES_BACKUP_OPTION
  284. fi
  285.  
  286. echo "Creating backup dir.."
  287.  
  288. #Remove previous tmp dir
  289. rm -rf $TMP_DIR/backup.incoming
  290. mkdir -p $TMP_DIR/backup.incoming
  291.  
  292. # Destination file names
  293. base_backup_filename=`date +"%Y-%m-%d"`$BACKUP_TYPE
  294. backup_filename=$base_backup_filename'.tar.xz'
  295.  
  296. # SQL section
  297. if [ ! $PERFORM_SQL_BACKUP -eq 0 ]; then
  298.  
  299. echo "Perform sql backup..."
  300.  
  301. # Destination file names
  302. backup_filename=$base_backup_filename'.sql.tar.xz'
  303.  
  304. backup_filename_sql=$backup_filename
  305.  
  306. # Dump MySQL tables
  307. mysqldump -h $DB_HOST -u $DB_USER -p$DB_PASSWORD $DB_DATABASE $EXTRA_MYSQLDUMP_OPTIONS > $TMP_DIR/backup.incoming/mysql_dump.sql
  308.  
  309. echo "Compress sql backup.."
  310.  
  311. cd $TMP_DIR/backup.incoming
  312. tar -cJf $backup_filename mysql_dump.sql
  313.  
  314.  
  315. #clean sql file
  316. rm $TMP_DIR/backup.incoming/mysql_dump.sql
  317. fi
  318.  
  319. cd $CURRENT_DIR
  320.  
  321. # Perform Files Backup
  322. if [ ! $PERFORM_FILES_BACKUP -eq 0 ]; then
  323. backup_filename=$base_backup_filename'.data.tar.xz'
  324. echo "Perform file backup"
  325. # Compress files
  326. cd $TARGET_DIR
  327. tar -chJf $TMP_DIR/backup.incoming/$backup_filename $SOURCE_DIR
  328. fi
  329.  
  330. # FTP
  331. if [ ! $FTP_BACKUP_OPTION -eq 0 ]; then
  332. echo "Copy backup to FTP.."
  333. #create cache copy to detect the remote file
  334. #remove previous backup
  335. mkdir -p $TMP_DIR/.ftp_cache
  336. touch $TMP_DIR/.ftp_cache/$backup_filename
  337. touch $TMP_DIR/.ftp_cache/$backup_filename_sql
  338.  
  339. echo "user $FTP_USER $FTP_PASSWORD" >> $TMP_DIR/backup.incoming/ftp_command.tmp
  340. echo "mkdir $FTP_TARGET_DIR" >> $TMP_DIR/backup.incoming/ftp_command.tmp
  341. echo "cd $FTP_TARGET_DIR" >> $TMP_DIR/backup.incoming/ftp_command.tmp
  342. echo "binary" >> $TMP_DIR/backup.incoming/ftp_command.tmp
  343. echo "passive" >> $TMP_DIR/backup.incoming/ftp_command.tmp
  344.  
  345. ## file data backup
  346. if [ ! $PERFORM_FILES_BACKUP -eq 0 ]; then
  347. echo "put $TMP_DIR/backup.incoming/$backup_filename $backup_filename" >> $TMP_DIR/backup.incoming/ftp_command.tmp
  348. fi
  349.  
  350. ## sql backup
  351. if [ ! $PERFORM_SQL_BACKUP -eq 0 ]; then
  352. echo "put $TMP_DIR/backup.incoming/$backup_filename_sql $backup_filename_sql" >> $TMP_DIR/backup.incoming/ftp_command.tmp
  353. fi
  354.  
  355. ## this should add the command to delete the expired backups
  356. ## ---------------------------------------------------------------------------------------
  357. for f in $(<$TMP_DIR/.ftp_cache/search_file.tmp)
  358. do
  359. echo "delete ${f/.\//}" >> $TMP_DIR/backup.incoming/ftp_command.tmp
  360. done
  361. ## ---------------------------------------------------------------------------------------
  362. echo "bye" >> $TMP_DIR/backup.incoming/ftp_command.tmp
  363.  
  364. ftp -n -v $FTP_HOST $FTP_PORT < $TMP_DIR/backup.incoming/ftp_command.tmp
  365.  
  366. echo "FTP Backup finish" | mail -s "$EMAIL_SUBJECT_TAG FTP backup finished !" $MAIL
  367. fi
  368.  
  369.  
  370. #Perform local backup
  371. if [ ! $LOCAL_BACKUP_OPTION -eq 0 ]; then
  372.  
  373. if [ ! -d $TARGET_DIR ]; then
  374. echo "Target directory : '$TARGET_DIR/' doesn't exist.."
  375. echo "Target directory : '$TARGET_DIR/' doesn't exist.." | mail -s "$EMAIL_SUBJECT_TAG Failed !" $MAIL
  376. echo "Exiting..."
  377. exit
  378. fi
  379.  
  380. echo "Copy backup to local dir.."
  381. # Move the files
  382. mv -v $TMP_DIR/backup.incoming/* $TARGET_DIR
  383. fi
  384.  
  385. # Optional check if source files exist. Email if failed.
  386. if [ -f $TARGET_DIR/$backup_filename ]; then
  387. # +Randomly generate a number to reduse the chances of overwriting an existing file. Helps ensure we get a current list and not something possibly stale.
  388. RANDOM=$(( ( RANDOM % 100 ) + 1 ))
  389. # +Temp file to allow easy emailing of current list of backups.
  390. BACKUP_LIST=$TMP_DIR/backup.list.$RANDOM.txt
  391. touch $BACKUP_LIST
  392. echo "Sending mail"
  393. echo "Local backup finished. Here's the current list of backups." > $BACKUP_LIST
  394. echo " " >> $BACKUP_LIST
  395. # +Sleep here to give the system a chance to catch up. If it goes to fast, the total size count could sometimes be incorrect.
  396. sleep 2
  397. ls -lah $TARGET_DIR >> $BACKUP_LIST
  398. cat $BACKUP_LIST | mail -s "$EMAIL_SUBJECT_TAG Finished !" $MAIL
  399. rm $TMP_DIR/backup.list.*
  400. else
  401. echo "$TARGET_DIR/$backup_filename does not seem to exist. Something failed." | mail -s "$EMAIL_SUBJECT_TAG Finished, but failed." $MAIL
  402. fi
  403.  
  404. echo "Finish.."
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement