From 1277accf5c1f49b9fb9502fbcda1450b96189659 Mon Sep 17 00:00:00 2001 From: Ching Date: Fri, 4 Feb 2022 16:49:23 +0800 Subject: [PATCH] =?UTF-8?q?feat(scripts):=20=E5=A2=9E=E5=8A=A0bitwarden?= =?UTF-8?q?=E5=A4=87=E4=BB=BD=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加bitwarden备份脚本 Signed-off-by: Ching --- scripts/bitwarden_backup.py | 83 +++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 scripts/bitwarden_backup.py diff --git a/scripts/bitwarden_backup.py b/scripts/bitwarden_backup.py new file mode 100644 index 0000000..4881b97 --- /dev/null +++ b/scripts/bitwarden_backup.py @@ -0,0 +1,83 @@ +# coding: utf-8 +from datetime import datetime +from dateutil import tz +from email import encoders +from email.header import Header +from email.mime.base import MIMEBase +from email.mime.multipart import MIMEMultipart +from email.mime.text import MIMEText +from email.utils import parseaddr, formataddr +import os, tarfile +import smtplib + + +to_zone = tz.gettz('Asia/Shanghai') +localtime = datetime.now(tz=to_zone) + + +def make_targz(output_filename, source_dir): + """ + 一次性打包目录为tar.gz + :param output_filename: 压缩文件名 + :param source_dir: 需要打包的目录 + :return: + """ + try: + with tarfile.open(output_filename, "w:gz") as tar: + tar.add(source_dir, arcname=os.path.basename(source_dir)) + + return True + except Exception as e: + print(e) + return False + + +def send_email(file_name): + def _format_addr(s): + name, addr = parseaddr(s) + return formataddr((Header(name, 'utf-8').encode(), addr)) + + smtp_server = 'smtp.gmail.com' + smtp_port = 587 + server = smtplib.SMTP(smtp_server, smtp_port) + server.starttls() + # 剩下的代码和前面的一模一样: + # server.set_debuglevel(1) + + from_addr = '' + to_addr = '' + to_zone = tz.gettz('Asia/Shanghai') + localtime = datetime.now(tz=to_zone) + + msg = MIMEMultipart() + msg['From'] = _format_addr('Vaultwarden <%s>' % from_addr) + msg['To'] = _format_addr('<%s>' % to_addr) + msg['Subject'] = Header('bitwarden 备份 %s' % localtime.strftime('%Y-%m-%d'), 'utf-8').encode() + + # 邮件正文是MIMEText: + msg.attach(MIMEText('backup file attached', 'plain', 'utf-8')) + + # 添加附件就是加上一个MIMEBase,从本地读取一个图片: + with open(file_name, 'rb') as f: + # 设置附件的MIME和文件名 + mime = MIMEBase('tar.gz', 'tar.gz', filename=file_name) + # 加上必要的头信息: + mime.add_header('Content-Disposition', 'attachment', filename=file_name) + mime.add_header('Content-ID', '<0>') + mime.add_header('X-Attachment-Id', '0') + # 把附件的内容读进来: + mime.set_payload(f.read()) + # 用Base64编码: + encoders.encode_base64(mime) + # 添加到MIMEMultipart: + msg.attach(mime) + + server.login(from_email, password) + server.sendmail(from_addr, [to_addr], msg.as_string()) + server.quit() + + +if __name__ == '__main__': + file_name = './backup/bitwarden-%s.tar.gz' % localtime.strftime('%Y-%m-%d') + if make_targz(file_name, '/root/develop/vaultwarden/vw-data'): + send_email(file_name)