Python: скрипт бекапа WordPress

Автор: | 06/10/2016
 

PythonСкрипт писался для бекапа нескольких WPMU приложений.

Имеет возможность бекапить несколько сайтов WordPress по данным, указанным в файле конфигурации.

Создаёт tar.gz архив для файлов сайта, и sql-файл — для дампа базы данных.

Файл конфигурации обрабатывается модулем ConfigParser.

Структура каталогов:

$ tree -d 2 .
.
├── bin
├── conf
└── data
    ├── database
    └── www
  • bin — исполняемый файл «утилиты»;
  • conf — файл настроек создания бекапов;
  • data — каталог для хранения бекапов:
    • database — дампы баз;
    • www — архивы с файлами;

 

Разбито по директориям, что бы позже проще было расширить функционал (добавить restore, загпрузку бекапов в AWS S3 и/или Glacier и т.д.)

Файл конфигурации:

$ cat conf/wp_backup.ini 
[site1.co.uk]
www_data = '/var/www/vhosts/site1.co.uk'

mysql_db = 'site1_live'
mysql_host = 'localhost'
mysql_user = 'user1'
mysql_pass = 'pass1'

[site2.de]
www_data = '/var/www/vhosts/site2.de'

mysql_db = 'site2_live'
mysql_host = 'localhost'
mysql_user = 'user2'
mysql_pass = 'pass2'

Сам скрипт:

#!/usr/bin/env python

from __future__ import print_function

import os
import datetime
import subprocess
import tarfile
import ConfigParser


TOOL_ROOT = '/home/user/backups/'
BACKUPS_ROOT = os.path.join(TOOL_ROOT, 'data')
WWW_BACKUPS_ROOT = os.path.join(BACKUPS_ROOT, 'www')
DB_BACKUPS_ROOT = os.path.join(BACKUPS_ROOT, 'database')

WEB_ROOT = '/var/www/vhosts/'

config = os.path.join(TOOL_ROOT, 'conf', 'wp_backup.ini')

parser = ConfigParser.ConfigParser()

if len(parser.read(config)) == 0:
    raise Exception('ERROR: No config file {} found!'.format(config))


def www_backup(source_dir, output_file):

    with tarfile.open(output_file, "w:gz") as tar:
        tar.add(source_dir, arcname=os.path.basename(source_dir))

    #print ("\nBackup content: ")
    #with tarfile.open(output_file, 'r') as tar:
    #    for data in tar.getmembers():
    #        print(data.name)

for section in parser.sections():

    print('Executing WWW data backup on: {}'.format(section))

    today = datetime.datetime.now().strftime('%d-%m-%Y-%H-%M')
    source_dir = parser.get(section, 'www_data').strip("\'")
    backup_name = os.path.join(WWW_BACKUPS_ROOT, section + '-' + today + '.gz')

    www_backup(source_dir, backup_name)

    print('\nExecuting MySQL data backup on: {}\n'.format(section))
    mysql_host = parser.get(section, 'mysql_host')
    mysql_db = parser.get(section, 'mysql_db')
    mysql_user = parser.get(section, 'mysql_user')
    mysql_pass = parser.get(section, 'mysql_pass')

    mysql_backup_file = os.path.join(DB_BACKUPS_ROOT, parser.get(section, 'mysql_db') + '-' + today + '.sql')

    print ('Using: HOST: {}\nDB: {}\nUSER: {}\n'.format(mysql_host, mysql_db, mysql_user, mysql_pass))

    dump_cmd = ['mysqldump ' +
                '--user={mysql_user} '.format(mysql_user=mysql_user) +
                '--password={db_pw} '.format(db_pw=mysql_pass) +
                '--host={db_host} '.format(db_host=mysql_host) +
                '{db_name} '.format(db_name=mysql_db) +
                '> ' +
                '{filepath}'.format(filepath=mysql_backup_file)]
    dump = subprocess.Popen(dump_cmd, shell=True)
    dump.wait()

Его выполнение:

$ ./wp_backup.py
Executing WWW data backup on: site1.co.uk

Executing MySQL data backup on: site1.co.uk

Using: HOST: 'localhost'
DB: 'site1_live'
USER: 'user11'

Executing WWW data backup on: site2.de

Executing MySQL data backup on: site2.de

Using: HOST: 'localhost'
DB: 'site2_live'
USER: 'user2'

Результат бекапа выглядит так:

$ tree -a /home/user/backups/data/
/home/user/backups/data/
├── database
│   ├── site1_live-10-06-2016-11-11.sql
│   └── site2_live-10-06-2016-11-11.sql
└── www
    ├── site1.co.uk-10-06-2016-10-55.gz
    └── site2.de-10-06-2016-10-55.gz