From 89b0659cba3ff7d9c894e7e33b16a465cf11d85b Mon Sep 17 00:00:00 2001 From: Stefan Bethke Date: Sat, 25 May 2024 13:35:09 +0200 Subject: [PATCH] Send report with emailcheck --- README.md | 2 +- hedgedoc-expire.py | 49 +++++++++++++++++++++++++++------------------- 2 files changed, 30 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 6ddd2e4..f600f46 100644 --- a/README.md +++ b/README.md @@ -75,7 +75,7 @@ Command is one of: |------------|------------------------------------------------------------------------------------------------------------| | check | Print a list of revisions and notes that would be expired, based on the given parameters for `-n` and `-r` | | cron | Run `expire` at 2 am local time each day. Will run until killed. | -| emailcheck | Send a test email from the configured sender to themselves. | +| emailcheck | Send an email from the configured sender to themselves with the the check report. | | expire | Expire old revisions and notes. | ### Environment variables diff --git a/hedgedoc-expire.py b/hedgedoc-expire.py index e4ec253..4ed4e6a 100644 --- a/hedgedoc-expire.py +++ b/hedgedoc-expire.py @@ -69,7 +69,7 @@ class EmailSender: except Exception as e: print(f'Unable to send mail through {self}: {e}') raise e - print(f'Test email to {self.mail_from} sent successfully.') + print(f'Report email to {self.mail_from} sent successfully.') def __str__(self): return f'EmailSender<{self.hostname},{self.port},{self.username},{self.mail_from}>' @@ -168,26 +168,29 @@ class HedgedocExpire: }) return revisions - def check_notes_to_be_expired(self, db) -> None: + def check_notes_to_be_expired(self, db) -> str: """ - Print a list of notes that will be expired. + Return a list of notes that will be expired. :param db: the database connection - :return: + :return: a multi-line text suitable for humans to read """ + r = '' cutoff = datetime.now(timezone.utc) - self.config.note_age - print(f'Notes to be deleted not changed since {cutoff} ({humanize.naturaldelta(self.config.note_age)}):') + r += f'Notes to be deleted not changed since {cutoff} ({humanize.naturaldelta(self.config.note_age)}):\n' for note in self.notes_to_be_expired(db): age = datetime.now(timezone.utc) - datetime.fromisoformat(note['updatedAt']) url = self.config.url + '/' + (note["alias"] if note["alias"] is not None else note["shortid"]) - print(f' {self.email_from_email_or_profile(note)} ({humanize.naturaldelta(age)}) {url}: {note["title"]}') + r += f' {self.email_from_email_or_profile(note)} ({humanize.naturaldelta(age)}) {url}: {note["title"]}\n' + return r - def check_revisions_to_be_expired(self, db) -> None: + def check_revisions_to_be_expired(self, db) -> str: """ - Print a list of revisions that will be expired. - :return: + Return a list of revisions that will be expired. + :return: a multi-line text suitable for humans to read """ + r = '' cutoff = datetime.now(timezone.utc) - self.config.revision_age - print(f'Revisions to be deleted created before {cutoff} ({humanize.naturaldelta(self.config.revision_age)}):') + r += f'Revisions to be deleted created before {cutoff} ({humanize.naturaldelta(self.config.revision_age)}):\n' notes = {} for row in self.revisions_to_be_expired(db): row['age'] = datetime.now(timezone.utc) - datetime.fromisoformat(row['createdAt']) @@ -198,9 +201,10 @@ class HedgedocExpire: addr = self.email_from_email_or_profile(revisions[0]) url = self.config.url + '/' + ( revisions[0]["alias"] if revisions[0]["alias"] is not None else revisions[0]["shortid"]) - print(f' {addr} {url}: {revisions[0]["title"]}') + r += f' {addr} {url}: {revisions[0]["title"]}\n' for rev in revisions: - print(f' {humanize.naturaldelta(rev["age"])}: {rev["revisionId"]}') + r += f' {humanize.naturaldelta(rev["age"])}: {rev["revisionId"]}\n' + return r def expire_old_notes(self, db) -> None: """ @@ -256,19 +260,24 @@ class HedgedocExpire: def cmd_check(self) -> None: with pgsql.Connection((self.config.postgres_hostname, self.config.postgres_port), self.config.postgres_username, self.config.postgres_password) as db: - self.check_revisions_to_be_expired(db) - self.check_notes_to_be_expired(db) + print(self.check_revisions_to_be_expired(db) + + self.check_notes_to_be_expired(db)) def cmd_emailcheck(self) -> None: + with pgsql.Connection((self.config.postgres_hostname, self.config.postgres_port), + self.config.postgres_username, self.config.postgres_password) as db: + report = self.check_revisions_to_be_expired(db) + self.check_notes_to_be_expired(db) msg = MIMEMultipart() msg['From'] = self.email_sender.mail_from msg['To'] = self.email_sender.mail_from - msg['Subject'] = f'Hedgedoc Expire: Test Mail' + msg['Subject'] = f'Hedgedoc Expire: Report' msg.attach(MIMEText(dedent(f'''\ - This is a test email to confirm proper configuration of the SMTP client. - - The admin team for {self.config.url} - '''))) + This report shows which notes and revisions would be deleted if expire would be run now. + + ''') + report + dedent(f'''\ + + The admin team for {self.config.url} + '''))) self.email_sender.send(msg) def cmd_expire(self) -> None: @@ -292,7 +301,7 @@ def main(): command is one of: - check: print a list of revisions and notes to be expired - cron: run expire every 24 hours - - emailcheck: send a test email from the configured sender to themselves + - emailcheck: send am email from the configured sender to themselves with the the check report - expire: expire old revisions and untouched notes See https://git.hamburg.ccc.de/CCCHH/hedgedoc-expire