Advertisement
Mirovinger

YaBackup

Jun 9th, 2017
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #!/bin/bash
  2. MYSQL_SERVER=localhost
  3. MYSQL_USER=root
  4. MYSQL_PASSWORD=***
  5. BACKUP_DIR='/tmp/backup'
  6. PROJECT='SovStaSaves'
  7. MAX_BACKUPS='365'
  8. DATE=`date '+%Y-%m-%d'`
  9. DIRS='/root/byond/SovietVG/data /root/byond/SovietVG/players2.sqlite'
  10. EXCLUDE=/tmp/backup/exclude.txt
  11. TOKEN='***'
  12. LOGFILE='backup.log'
  13. sendLog='***'
  14. sendLogErrorsOnly='false'
  15. ###########################
  16. function mailing()
  17. {
  18.     if [ ! $sendLog = '' ];then
  19.         if [ "$sendLogErrorsOnly" == true ];
  20.         then
  21.             if echo "$1" | grep -q 'error'
  22.             then  
  23.                 echo "$2" | mail -s "$1" $sendLog > /dev/null
  24.             fi
  25.         else
  26.             echo "$2" | mail -s "$1" $sendLog > /dev/null
  27.         fi
  28.     fi
  29. }
  30.  
  31. function logger()
  32. {
  33.     echo "["`date "+%Y-%m-%d %H:%M:%S"`"] File $BACKUP_DIR: $1" >> $BACKUP_DIR/$LOGFILE
  34. }
  35.  
  36. function parseJson()
  37. {
  38.     local output
  39.     regex="(\"$1\":[\"]?)([^\",\}]+)([\"]?)"
  40.     [[ $2 =~ $regex ]] && output=${BASH_REMATCH[2]}
  41.     echo $output
  42. }
  43.  
  44. function checkError()
  45. {
  46.     echo $(parseJson 'error' "$1")
  47. }
  48.  
  49. function getUploadUrl()
  50. {
  51.     json_out=`curl -s -H "Authorization: OAuth $TOKEN" https://cloud-api.yandex.net:443/v1/disk/resources/upload/?path=app:/$backupName&overwrite=true`
  52.     json_error=$(checkError "$json_out")
  53.     if [[ $json_error != '' ]];
  54.     then
  55.         logger "$PROJECT - Yandex.Disk error: $json_error"
  56.         mailing "$PROJECT - Yandex.Disk backup error" "ERROR copy file $FILENAME. Yandex.Disk error: $json_error"
  57.     echo ''
  58.     else
  59.         output=$(parseJson 'href' $json_out)
  60.         echo $output
  61.     fi
  62. }
  63.  
  64. function uploadFile
  65. {
  66.     local json_out
  67.     local uploadUrl
  68.     local json_error
  69.     uploadUrl=$(getUploadUrl)
  70.     if [[ $uploadUrl != '' ]];
  71.     then
  72.     echo $UploadUrl
  73.         json_out=`curl -s -T $1 -H "Authorization: OAuth $TOKEN" $uploadUrl`
  74.         json_error=$(checkError "$json_out")
  75.     if [[ $json_error != '' ]];
  76.     then
  77.         logger "$PROJECT - Yandex.Disk error: $json_error"
  78.         mailing "$PROJECT - Yandex.Disk backup error" "ERROR copy file $FILENAME. Yandex.Disk error: $json_error"
  79.  
  80.     else
  81.         logger "$PROJECT - Copying file to Yandex.Disk success"
  82.         mailing "$PROJECT - Yandex.Disk backup success" "SUCCESS copy file $FILENAME"
  83.  
  84.     fi
  85.     else
  86.         echo 'Some errors occured. Check log file for detail'
  87.     fi
  88. }
  89.  
  90. function backups_list() {
  91.     # Ищем в директории приложения все файлы бекапов и выводим их названия:
  92.     curl -s -H "Authorization: OAuth $TOKEN" "https://cloud-api.yandex.net:443/v1/disk/resources?path=app:/&sort=created&limit=100" | tr "{},[]" "\n" | grep "name[[:graph:]]*.tar.gz" | cut -d: -f 2 | tr -d '"'
  93. }
  94.  
  95. function backups_count() {
  96.     local bkps=$(backups_list | wc -l)
  97.     # Если мы бекапим и файлы, и БД, то на 1 бекап у нас приходится 2 файла. Поэтому количество бекапов = количество файлов / 2:
  98.     expr $bkps / 2
  99. }
  100.  
  101. function remove_old_backups() {
  102.     bkps=$(backups_count)
  103.     old_bkps=$((bkps - MAX_BACKUPS))
  104.     if [ "$old_bkps" -gt "0" ];then
  105.         logger "Удаляем старые бекапы с Яндекс.Диска"
  106.         # Цикл удаления старых бекапов:
  107.         # Выполняем удаление первого в списке файла 2*old_bkps раз
  108.         for i in `eval echo {1..$((old_bkps * 2))}`; do
  109.             curl -X DELETE -s -H "Authorization: OAuth $TOKEN" "https://cloud-api.yandex.net:443/v1/disk/resources?path=app:/$(backups_list | awk '(NR == 1)')&permanently=true"
  110.         done
  111.     fi
  112. }
  113.  
  114. logger "--- $PROJECT START BACKUP $DATE ---"
  115. logger "Выгружаем дампы баз"
  116. mkdir $BACKUP_DIR/$DATE
  117. for i in `mysql -h $MYSQL_SERVER -u $MYSQL_USER -p$MYSQL_PASSWORD -e'show databases;' | grep -v information_schema | grep -v Database`;
  118.     do mysqldump -h $MYSQL_SERVER -u $MYSQL_USER -p$MYSQL_PASSWORD $i > $BACKUP_DIR/$DATE/$i.sql;
  119. done
  120.  
  121. logger "Создаем архив mysql $BACKUP_DIR/$DATE-mysql-$PROJECT.tar.gz"
  122. tar -czf $BACKUP_DIR/$DATE-mysql-$PROJECT.tar.gz $BACKUP_DIR/$DATE
  123. rm -rf $BACKUP_DIR/$DATE
  124.  
  125. logger "Создаем архив каталогов $BACKUP_DIR/$DATE-files-$PROJECT.tar.gz"
  126. tar -czf $BACKUP_DIR/$DATE-files-$PROJECT.tar.gz -X $EXCLUDE $DIRS
  127.  
  128. FILENAME=$DATE-mysql-$PROJECT.tar.gz
  129. logger "Выгружаем на Яндекс.Диск архив mysql $BACKUP_DIR/$DATE-mysql-$PROJECT.tar.gz"
  130. backupName=$DATE-mysql-$PROJECT.tar.gz
  131. uploadFile $BACKUP_DIR/$DATE-mysql-$PROJECT.tar.gz
  132.  
  133. FILENAME=$DATE-files-$PROJECT.tar.gz
  134. logger "Выгружаем на Яндекс.Диск архив с файлами $BACKUP_DIR/$DATE-files-$PROJECT.tar.gz"
  135. backupName=$DATE-files-$PROJECT.tar.gz
  136. uploadFile $BACKUP_DIR/$DATE-files-$PROJECT.tar.gz
  137.  
  138. logger "Удаляем архивы с диска"
  139. find $BACKUP_DIR -type f -name "*.gz" -exec rm '{}' \;
  140.  
  141. # Удаляем старые бекапы с Яндекс.Диска (если MAX_BACKUPS > 0)
  142. if [ $MAX_BACKUPS -gt 0 ];then remove_old_backups; fi
  143.  
  144. logger "Завершение скрипта бекапа"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement