#!/usr/bin/env python
# -*- coding: utf-8 -*-
# pip install -U cos-python-sdk-v5
import os

import sys
import tarfile

import subprocess
from qcloud_cos import CosConfig
from qcloud_cos import CosS3Client

secret_id = ''
secret_key = ''
region = ''
bucket = ''
token = ''

backup_dir = "/home/mi/Public"  # 需要备份的目录
backup_filename = "backup.tar.gz"
temp_dir = "/tmp/backup/"
sql_filename = "backup.sql"
MYSQL_USER = "root"
MYSQY_PASSWORD = "password"

def put(client, file_path):
    if not os.path.exists(file_path):
        raise Exception("file not exist")
    with open(file_path, 'rb') as f:
        r = client.put_object(
            Bucket=bucket,
            Body=f,
            Key=os.path.basename(file_path),
        )
    print r


def get(client, file_name):
    r = client.get_object(
        Bucket=bucket,
        Key=file_name,
    )
    r['Body'].get_stream_to_file(file_name)
    # r['Body'].get_raw_stream()  流

if __name__ == '__main__':
    config = CosConfig(Secret_id=secret_id, Secret_key=secret_key, Region=region)
    client = CosS3Client(conf=config)

    try:
        if not os.path.isdir(temp_dir):
            os.mkdir(temp_dir)
    except IOError, err:
        print err
        sys.exit()

    full_temp = os.path.join(temp_dir, backup_filename)
    tar = tarfile.open(name=full_temp, mode='w:gz')
    for dirpath, dirnames, filenames in os.walk(backup_dir):
        for file in filenames:
            full_path = os.path.join(dirpath, file)
            tar.add(full_path, arcname=file, recursive=False)


    try:
        # 请自行更改mysqldump路径
        cmd = '/usr/bin/mysqldump -u' + MYSQL_USER + ' -p' + MYSQY_PASSWORD + ' --all-databases > ' + temp_dir + '/' + sql_filename
        h = subprocess.call(cmd)
        if h[0] != 0:
            print "error mysql backup"
        else:
            full_path = os.path.join(temp_dir, sql_filename)
            tar.add(full_path, arcname=sql_filename, recursive=False)
    except IOError, error:
        print error

    tar.close()

    put(client, full_temp)
    # get(client, '')
    os.remove(full_temp)