#!/usr/bin/env python FTP_LOGIN = '' FTP_PASS = '' FTP_HOST = '' BACKUP_NAME = 'backup.tar.gz' BACKUP_LIST = ['/home', '/etc', '/root', '/srv',] EMAIL_RECIPIENTS = ( 'foo@bar.org', ) EMAIL_SENDER = 'root@bar.org' EMAIL_SUBJECT = '[bar.org] backup status: %s' FIFO_FILENAME = '/tmp/fifo.backup' import sys import os from ftplib import FTP import tarfile from smtplib import SMTP from threading import Thread from glob import glob def send_mail(exception=None): success = exception is None server = SMTP('localhost') msg = 'From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n' % (EMAIL_SENDER, ', '.join(EMAIL_RECIPIENTS), EMAIL_SUBJECT) msg = msg % (success and 'OK' or 'Failure') msg = msg + '\r\n' msg = msg + 'Backup contents: \r\n' msg = msg + ', '.join(BACKUP_LIST) + '\r\n' msg = msg + '--------------------\r\n' msg = msg + '\r\n' if exception is not None: msg = msg + str(exception) + '\r\n' else: msg = msg + 'No errors\r\n' server.sendmail(EMAIL_SENDER, EMAIL_RECIPIENTS, msg) server.quit() class TarThread(Thread): def run(self): fifo = open(FIFO_FILENAME, 'w') tar = tarfile.open(mode='w:gz', fileobj=fifo) for elt in BACKUP_LIST: for file_or_directory in glob(elt): print 'Adding: ' + file_or_directory tar.add(file_or_directory, recursive=True) tar.close() fifo.close() class UploadThread(Thread): def run(self): fifo = open(FIFO_FILENAME, 'r') ftp = FTP(FTP_HOST, FTP_LOGIN, FTP_PASS) ftp.storbinary('STOR %s' % BACKUP_NAME, fifo) def main(argv): try: try: os.unlink(FIFO_FILENAME) except: pass os.mkfifo(FIFO_FILENAME) os.chmod(FIFO_FILENAME, 0600) t1 = TarThread() t1.start() t2 = UploadThread() t2.start() t1.join() t2.join() send_mail() os.unlink(FIFO_FILENAME) except Exception as e: send_mail(e) if __name__ == '__main__': main(sys.argv)