import smtplib import datetime from email.message import EmailMessage from email.utils import formatdate import requests import time import os def wait_until_unlocked(): # Wait for locks to be released # If you don't do this and edit DokuWiki pages, others may overwrite what you do locked = True while locked: locked = os.path.isfile("/srv/dokuwiki/data/data/locks/e0bc4d991c71e981423bfefd6d257985.lock") # Avoid busy loop if locked: time.sleep(5) def get_topics(): with open("/srv/dokuwiki/data/data/pages/intern/diskussionsthemen.txt") as fp: raw = fp.read().split('\n') # Extract Themen firstline = 0 lastline = 0 for index, line in enumerate(raw): # Start marker if "====== 1." in line and not "1.5" in line: firstline = index + 1 continue # End marker if "====== 2." in line or "====== 1.5" in line: lastline = index break # Remove empty lines from topics topics = [] for extracted in raw[firstline:lastline]: if extracted != '': topics.append(extracted) return topics def send_mail(topics, date): # mail template mail = f""" Liebe Zonies, es gibt wieder Themen die im Plenum besprochen werden sollen. Der nächste Reguläre Termin ist am nächsten Dienstag ({str(date)}) um 20:00. Im Wiki (https://wiki.warpzone.ms/intern:diskussionsthemen#diskussionsthemen_naechstes_plenum_automatische_einladung) stehen folgende Themen: {chr(10).join(topics)} Die Teilnahme ist natürlich auch remote möglich unter https://jitsi.dorf-post.de/warpzone-plenum möglich. Viele Grüße und bis Dienstag, sendmail_plenum.py """ msg = EmailMessage() msg['Subject'] = f'Aktuelle Plenumsthemen für Dienstag ({str(date)} 20:00)' msg['From'] = '{{noreply_email_user}}' msg['To'] = 'intern@warpzone.ms' msg['Date'] = formatdate(localtime=True) msg.set_content(mail) server = smtplib.SMTP('{{smtp_host}}', {{smtp_port}}) server.starttls() server.login("{{noreply_email_user}}", "{{noreply_email_pass}}") server.send_message(msg) server.quit() return True def update_page(label): with open("/srv/dokuwiki/data/data/pages/intern/diskussionsthemen.txt") as fp: raw = fp.read().split('\n') new_content = [] topic_replaced = False for old_line in raw: new_content.append(old_line) if not topic_replaced and "====== 1." in old_line: new_content.append(f"====== 1.5 {label} ======") topic_replaced = True with open("/srv/dokuwiki/data/data/pages/intern/diskussionsthemen.txt", "w") as fp: fp.write("\n".join(new_content)) success = False try: wait_until_unlocked() topics = get_topics() if (len(topics) != 0): # calculate date of next tuesday date = datetime.date.today() while date.strftime('%a') != 'Tue': date += datetime.timedelta(1) success = send_mail(topics, date) label = f"Diskussionsthemen für {date}" if success: label += f" (bereits eingeladen)" else: label += f" (Einladung fehlgeschlagen)" success = update_page(label) else: success = True except: success = False raise finally: requests.get("{{ healthchecks_url }}" if success else "{{ healthchecks_url }}" + "/fail")