102 lines
4.1 KiB
Python
102 lines
4.1 KiB
Python
REGEX = r'SDS_ILS_BEGINN(#D#Leitstelle:\s+)(.*)(m|o|i)(RTW|NAW|KTW) (.*) \$GPSN(.*)E(.*)SDS_ILS_ENDE'
|
|
|
|
from dotenv import load_dotenv
|
|
import requests
|
|
import imaplib
|
|
import email
|
|
from email.header import decode_header
|
|
import os
|
|
import time
|
|
from helpers import get_draeger_json, read_pdf
|
|
from logger import logging
|
|
|
|
load_dotenv(override=True)
|
|
|
|
# Konfigurationsparameter
|
|
IMAP_SERVER = os.environ.get("IMAP_SERVER", default=None)
|
|
EMAIL_ACCOUNT = os.environ.get("EMAIL_ACCOUNT", default=None)
|
|
EMAIL_PASSWORD = os.environ.get("EMAIL_PASSWORD", default=None)
|
|
MAILBOX = os.environ.get("MAILBOX", default=None)
|
|
CHECK_INTERVAL = int(os.environ.get("CHECK_INTERVAL", default=None)) # in Sekunden
|
|
SAVE_FOLDER = os.environ.get("SAVE_FOLDER", default=None)
|
|
DRAEGER_API_KEY = os.environ.get("DRAEGER_API_KEY", default=None)
|
|
HEALTHCHECK_URL = os.environ.get("HEALTHCHECK_URL", default=None)
|
|
|
|
def check_email():
|
|
try:
|
|
mail = imaplib.IMAP4_SSL(IMAP_SERVER)
|
|
mail.login(EMAIL_ACCOUNT, EMAIL_PASSWORD)
|
|
mail.select(MAILBOX)
|
|
|
|
status, messages = mail.search(None, 'UNSEEN SUBJECT "Nachricht von DLRG Stuttgart"')
|
|
|
|
try:
|
|
mail_ids = messages[0].split()
|
|
|
|
for mail_id in mail_ids:
|
|
status, msg_data = mail.fetch(mail_id, '(RFC822)')
|
|
|
|
for response_part in msg_data:
|
|
if isinstance(response_part, tuple):
|
|
msg = email.message_from_bytes(response_part[1])
|
|
subject, encoding = decode_header(msg["Subject"])[0]
|
|
|
|
if isinstance(subject, bytes):
|
|
subject = subject.decode(encoding if encoding else 'utf-8')
|
|
|
|
from_ = msg.get("From")
|
|
logging.info(f'Neue E-Mail von {from_} mit Betreff: {subject}')
|
|
|
|
for part in msg.walk():
|
|
if part.get_content_maintype() == 'multipart':
|
|
continue
|
|
if part.get('Content-Disposition') is None:
|
|
continue
|
|
|
|
filename = part.get_filename()
|
|
if filename:
|
|
filepath = os.path.join(SAVE_FOLDER, filename)
|
|
with open(filepath, 'wb') as f:
|
|
f.write(part.get_payload(decode=True))
|
|
|
|
if filename.endswith('.pdf'):
|
|
pdf_text = read_pdf(filepath)
|
|
|
|
r = requests.post('https://einsatzmeldesystem.de/ems/inbound/deployment/universal/', json=get_draeger_json(pdf_text))
|
|
|
|
logging.debug(r.status_code)
|
|
logging.debug(r.json())
|
|
except Exception as e:
|
|
data = {}
|
|
data["apiKey"] = DRAEGER_API_KEY
|
|
r = requests.post('https://einsatzmeldesystem.de/ems/inbound/deployment/universal/', json=data)
|
|
|
|
r = requests.get(HEALTHCHECK_URL + "?status=down&msg=Can not parse data. Alarming with empty data&ping=")
|
|
logging.debug(r.status_code)
|
|
|
|
mail.logout()
|
|
except Exception as e:
|
|
logging.error(f'Fehler: {e}')
|
|
|
|
r = requests.get(HEALTHCHECK_URL + "?status=down&msg=Can not connect to mail server&ping=")
|
|
logging.debug(r.status_code)
|
|
|
|
if __name__ == "__main__":
|
|
try:
|
|
while True:
|
|
logging.debug("Loop")
|
|
check_email()
|
|
|
|
r = requests.get(HEALTHCHECK_URL + "?status=up&msg=OK&ping=")
|
|
logging.debug(r.status_code)
|
|
|
|
time.sleep(CHECK_INTERVAL)
|
|
except Exception as e:
|
|
try:
|
|
logging.error(f'Fehler: {e}')
|
|
|
|
r = requests.get(HEALTHCHECK_URL + "?status=down&msg=Unknown error&ping=")
|
|
logging.debug(r.status_code)
|
|
except:
|
|
pass
|