From 2329f6398df13501bc8ee386f275596b1e16d577 Mon Sep 17 00:00:00 2001 From: Luca Beltrame Date: Fri, 24 Jul 2020 23:12:27 +0200 Subject: [PATCH] Script to notify every week how many backups were made --- backup_summary.py | 76 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 backup_summary.py diff --git a/backup_summary.py b/backup_summary.py new file mode 100644 index 0000000..7e31818 --- /dev/null +++ b/backup_summary.py @@ -0,0 +1,76 @@ +#!/usr/bin/python3 + +from email.message import EmailMessage +from email.utils import formatdate +import smtplib +import sarge +import json +from datetime import datetime, timedelta + +TEMPLATE=""" +Hello, + +as of today, {num_backups} backups have been made this week: + +{content} + +Only successful backups are listed. + +-- +Automated notification system + +""" + + +def find_range(array): + sorted_array = sorted(array["archives"], + key=lambda x: datetime.strptime(x["time"],"%Y-%m-%dT%H:%M:%S.%f"), + reverse=True) + last_time = datetime.strptime(sorted_array[0]["time"], + "%Y-%m-%dT%H:%M:%S.%f") + for idx, record in reversed(list(enumerate(sorted_array))): + if record == sorted_array[0]: + break + first_time = datetime.strptime(record["time"], "%Y-%m-%dT%H:%M:%S.%f") + monday1 = (first_time - timedelta(days=first_time.weekday())) + monday2 = (last_time - timedelta(days=last_time.weekday())) + weeks = (monday2 - monday1).days / 7 + if weeks <= 1: + break + + return [item["archive"] for item in sorted_array[0: idx + 1]] + + +def create_message(data): + + content = "\n".join("* {}".format(item) for item in data) + complete_message = TEMPLATE.format(num_backups=len(data), + content=content) + + msg = EmailMessage() + msg.set_content(complete_message) + msg["Subject"] = "Weekly backup report" + msg["From"] = "Notification system " + msg["To"] = "Mr.X " + msg["Date"] = formatdate(localtime=True) + msg.set_param("charset", "UTF-8") + msg.replace_header("Content-Transfer-Encoding", "8bit") + + return msg + + +def main(): + + borgmatic_data = sarge.get_stdout( + "borgmatic list --last 10 --json --successful") + borgmatic_data = json.loads(borgmatic_data) + contents = find_range(borgmatic_data[0]) + + msg = create_message(contents) + + s = smtplib.SMTP('localhost') + s.send_message(msg) + s.quit() + +if __name__ == "__main__": + main()