#!/usr/bin/env python3 """ Thy pylokid main program """ import logging import os import time import requests from dotenv import find_dotenv, load_dotenv # local classes from emailhandling import EmailHandling from lodur import Lodur from mqtt import MQTTClient from pdf_extract import PDFHandling from webdav import WebDav # TODO replace by IMAP idle _INTERVAL = 10 # Configuration load_dotenv(find_dotenv()) IMAP_SERVER = os.getenv("IMAP_SERVER") IMAP_USERNAME = os.getenv("IMAP_USERNAME") IMAP_PASSWORD = os.getenv("IMAP_PASSWORD") IMAP_MAILBOX = os.getenv("IMAP_MAILBOX", "INBOX") WEBDAV_URL = os.getenv("WEBDAV_URL") WEBDAV_USERNAME = os.getenv("WEBDAV_USERNAME") WEBDAV_PASSWORD = os.getenv("WEBDAV_PASSWORD") WEBDAV_BASEDIR = os.getenv("WEBDAV_BASEDIR") TMP_DIR = os.getenv("TMP_DIR", "/tmp") MQTT_SERVER = os.getenv("MQTT_SERVER") MQTT_USER = os.getenv("MQTT_USER") MQTT_PASSWORD = os.getenv("MQTT_PASSWORD") LODUR_USER = os.getenv("LODUR_USER") LODUR_PASSWORD = os.getenv("LODUR_PASSWORD") LODUR_BASE_URL = os.getenv("LODUR_BASE_URL") HEARTBEAT_URL = os.getenv("HEARTBEAT_URL") def main(): """ main """ # Logging configuration logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' ) logger = logging.getLogger('pylokid') # Initialize IMAP Session imap_client = EmailHandling( IMAP_SERVER, IMAP_USERNAME, IMAP_PASSWORD, IMAP_MAILBOX, TMP_DIR, ) # Initialize Lodur Session lodur_client = Lodur( LODUR_BASE_URL, LODUR_USER, LODUR_PASSWORD, ) # Initialize WebDav Session webdav_client = WebDav( WEBDAV_URL, WEBDAV_USERNAME, WEBDAV_PASSWORD, WEBDAV_BASEDIR, TMP_DIR, ) # Initialize MQTT Sessions mqtt_client = MQTTClient( MQTT_SERVER, MQTT_USER, MQTT_PASSWORD, ) # Initialize PDF Parser pdf = PDFHandling() while True: attachments = {} num_messages, msg_ids = imap_client.search_emails() if num_messages: attachments = imap_client.store_attachments(msg_ids) if attachments: for subject in attachments: f_type, f_id = imap_client.parse_subject(subject) file_name = attachments[subject] webdav_client.upload(file_name, f_id) # Take actions - depending on the type if f_type == 'Einsatzausdruck_FW': lodur_data = webdav_client.get_lodur_data(f_id) if lodur_data: logger.info( '[%s] Einsatzrapport already created in Lodur', f_id ) # Upload Alarmdepesche as it could contain more information # than the first one lodur_client.einsatzrapport_alarmdepesche( f_id, os.path.join(TMP_DIR, file_name), webdav_client, ) else: # get as many information from PDF as possible pdf_data = pdf.extract_einsatzausdruck( os.path.join(TMP_DIR, file_name), f_id, ) # publish Einsatz on MQTT # TODO publish more information about the einsatz - coming from the PDF mqtt_client.send_message(f_type, f_id) # create new Einsatzrapport in Lodur lodur_client.einsatzrapport( f_id, pdf_data, webdav_client, ) # upload Alarmdepesche PDF to Lodur lodur_client.einsatzrapport_alarmdepesche( f_id, os.path.join(TMP_DIR, file_name), webdav_client, ) elif f_type == 'Einsatzprotokoll': # Einsatz finished - publish on MQTT mqtt_client.send_message(f_type, f_id) lodur_data = webdav_client.get_lodur_data(f_id) if lodur_data: logger.info('[%s] Uploading Einsatzprotokoll to Lodur', f_id) # Upload Einsatzprotokoll to Lodur lodur_client.einsatzrapport_alarmdepesche( f_id, os.path.join(TMP_DIR, file_name), webdav_client, ) # Parse the Einsatzprotokoll PDF pdf_data = pdf.extract_einsatzprotokoll( os.path.join(TMP_DIR, file_name), f_id, ) # Update entry in Lodur with parse PDF data logger.info('[%s] Updating Einsatzrapport with data from PDF', f_id) lodur_client.einsatzprotokoll(f_id, pdf_data, webdav_client) else: logger.error( '[%s] Cannot process Einsatzprotokoll as there is no Lodur ID', f_id ) else: logger.error('[%s] Unknown type: %s', f_id, f_type) # send heartbeat requests.get(HEARTBEAT_URL) # repeat every time.sleep(_INTERVAL) if __name__ == '__main__': try: main() except KeyboardInterrupt: print("Byebye")