| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- #!/usr/bin/python
- import os
- import tarfile
- import smtplib
- from email.header import Header
- from email.mime.text import MIMEText
- from email.mime.multipart import MIMEMultipart
- from collections import namedtuple
- from datetime import datetime
- """
- MySQL dumper tool
- used for backup mysql automatically(which could be done by cron).
- Aims:
- 1. support multiple database
- 2. support dump to local basically and push to remote server/send an email
- """
- """ Config Section """
- db_t = namedtuple('db_t', ['host', 'port', 'db', 'username', 'password'])
- smtp_t = namedtuple('smtp_t', ['server', 'sender', 'username', 'password',
- 'to', 'title'])
- # mysql config
- mylist = [
- db_t('localhost', # host
- 3306, # port
- 'twongd', # db
- 'twongd', # username
- 'twongd'), # password
- ]
- # email config
- email = smtp_t('smtp.163.com', # smtp server
- 'yyk882002@163.com', # from
- 'yyk882002@163.com', # username
- 'initialize', # password
- 'wedtrav@foxmail.com', # to
- 'twongd backup') # title
- # local config
- saveto = '/tmp/'
- """ /Config Section """
- def dump():
- """
- return False or saved filename
- """
- files = []
- for my in mylist:
- filename = my.db + datetime.now().strftime('_%Y_%m_%d_%H_%M_%S.sql')
- dest = os.path.join(saveto, filename)
- cmd = 'mysqldump -h {} -u {} --password={} {} > {}'.format(
- my.host, my.username, my.password, my.db, dest
- )
- if os.system(cmd):
- break
- files.append(dest)
- return files
- def create_targz(source_files, dest_file):
- try:
- with tarfile.open(dest_file, 'w:gz') as tar:
- for file in source_files:
- tar.add(file)
- return True
- except Exception as e:
- print(e)
- return False
- def send_mail(sqlfile):
- """
- return bool
- """
- msg = MIMEMultipart()
- msg['From'] = email.sender
- msg['To'] = email.to
- msg['Subject'] = Header(email.title, 'utf-8')
- msg.attach(MIMEText('daily backup', 'plain', 'utf-8'))
- att = MIMEText(str(open(sqlfile, 'rb').read()), 'base64', 'utf-8')
- att['Content-Type'] = 'application/octet-stream'
- name = os.path.basename(sqlfile)
- att['Content-Disposition'] = 'attachment; filename={}'.format(name)
- msg.attach(att)
- smtp_obj = smtplib.SMTP_SSL()
- smtp_obj.connect(email.server)
- smtp_obj.login(email.username, email.password)
- smtp_obj.sendmail(email.sender, email.to, msg.as_string())
- smtp_obj.quit()
- def main():
- # check config
- if not mylist:
- print('no any mysql configurations')
- return
- # dump to sql files
- sqlfiles = dump()
- if not sqlfiles:
- print('ERROR: dump failed')
- return
- # compress all sql files
- tmp_targz = datetime.now().strftime('/tmp/%H_%m_%s_%H:%M_%S.tar.gz')
- if not create_targz(sqlfiles, tmp_targz):
- print('compress .sql failed')
- return
- # send email
- send_mail(tmp_targz)
- # remove sql files (keep .tar.gz on dist)
- _ = [os.remove(sql) for sql in sqlfiles]
- if __name__ == '__main__':
- main()
|