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