72 lines
2.8 KiB
Python
72 lines
2.8 KiB
Python
#!/usr/bin/env python3
|
|
|
|
import os
|
|
import os.path
|
|
from subprocess import Popen, PIPE, run as subprocess_run
|
|
from datetime import datetime
|
|
from multiprocessing.dummy import Pool as ThreadPool
|
|
|
|
def backup_table(db_name, table_name, output_prefix):
|
|
sql_path = '{}/{}/{}.sql.gz'.format(output_prefix, db_name, table_name)
|
|
#print(sql_path)
|
|
with open(sql_path, 'wb') as sql_out:
|
|
sqldump = Popen(['mysqldump', '-f', '--skip-comments', '-h', 'db', '-u', 'root', '--password={}'.format(root_pw), db_name, table_name], stdout=PIPE)
|
|
gzdump = Popen(['gzip', '-c'], stdin=sqldump.stdout, stdout=sql_out)
|
|
sqldump.wait()
|
|
gzdump.wait()
|
|
os.chmod(sql_path, 0o644)
|
|
print('sql done {}, {}'.format(db_name, table_name))
|
|
|
|
def backup_files(src_path, output_path):
|
|
subprocess_run(['rsync', '-au', src_path, output_path])
|
|
print('file done {}'.format(src_path))
|
|
|
|
now = datetime.now()
|
|
print('> backup begin', now.isoformat())
|
|
weekday = now.weekday()
|
|
hour = now.hour
|
|
|
|
store_path = '/var/backup'
|
|
output_prefix = '{}/hidche_backup_w{}-{:02}'.format(store_path, weekday, hour)
|
|
|
|
os.makedirs(output_prefix, exist_ok=True)
|
|
|
|
db_prefix = os.environ['HIDCHE_DB_PREFIX']
|
|
server_list = os.environ['HIDCHE_SERVER_LIST'].strip(' ,').split(',')
|
|
server_list.append('root')
|
|
|
|
board_db_name = os.environ['HIDCHE_DB_BBS_USER']
|
|
server_list.append(board_db_name)
|
|
#print(server_list)
|
|
|
|
root_pw = os.environ['MARIADB_ROOT_PASSWORD']
|
|
|
|
board_files_path = os.environ.get('HIDCHE_BOARD_FILES_PATH', '/var/www/board/files')
|
|
|
|
with ThreadPool(4) as pool:
|
|
waiters = []
|
|
waiters.append(pool.apply_async(backup_files, ('/var/www/html/sam/d_pic', '{}/sam_image'.format(output_prefix))))
|
|
print(board_files_path)
|
|
if os.path.exists(board_files_path):
|
|
waiters.append(pool.apply_async(backup_files, (board_files_path, '{}/board_files'.format(output_prefix))))
|
|
|
|
for server_name in server_list:
|
|
db_name = '{}_{}'.format(db_prefix, server_name)
|
|
raw_tables = subprocess_run(['mysql', '-NBA' , '-h' ,'db', '-u', 'root' ,'--password={}'.format(root_pw), '-D', db_name, '-e', 'show tables'], stdout=PIPE)
|
|
raw_tables = raw_tables.stdout.decode('utf-8').strip(' \n\t')
|
|
if raw_tables == '':
|
|
continue
|
|
|
|
tables = raw_tables.split('\n')
|
|
d_setting_path = '/var/www/html/sam/{}/d_setting'.format(server_name)
|
|
|
|
if os.path.exists(d_setting_path):
|
|
waiters.append(pool.apply_async(backup_files, (d_setting_path, '{}/{}'.format(output_prefix, db_name))))
|
|
|
|
os.makedirs('{}/{}'.format(output_prefix, db_name), exist_ok=True)
|
|
for table_name in tables:
|
|
waiters.append(pool.apply_async(backup_table, (db_name, table_name, output_prefix)))
|
|
for waiter in waiters:
|
|
waiter.wait()
|
|
|
|
print('> backup finish', datetime.now().isoformat()) |