From 1748f754ca63cac5d9c6a251172414e1b60e87ca Mon Sep 17 00:00:00 2001 From: Simon Zeyer Date: Tue, 15 Oct 2024 19:08:21 +0000 Subject: [PATCH] http for jfw bf tag --- Dockerfile | 3 +- app/hooks.py | 80 +++++++++++++++++++++++++++++++++------------ app/http.py | 65 ++++++++++++++++++++++++++++++++++++ docker-compose.yaml | 1 + requirements.txt | 9 ++++- 5 files changed, 135 insertions(+), 23 deletions(-) create mode 100644 app/http.py diff --git a/Dockerfile b/Dockerfile index 851cedc..60f7142 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,6 +13,7 @@ ENV alarminator_zvies_use_PEALGRP="False" ENV print_num=0 ENV printer="DEFAULT" ENV REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt +ENV MAPS_API_KEY="" COPY *.deb / @@ -61,4 +62,4 @@ COPY ./app . COPY *.crt /usr/local/share/ca-certificates/ RUN update-ca-certificates -CMD [ "sh","-c","/etc/init.d/cups start && python3 /usr/src/app/exchange_connect.py" ] +CMD [ "sh","-c","/etc/init.d/cups start && python3 /usr/src/app/http.py" ] diff --git a/app/hooks.py b/app/hooks.py index 0a92043..44639e5 100644 --- a/app/hooks.py +++ b/app/hooks.py @@ -2,7 +2,8 @@ import os import logging import requests import cups -from weasyprint import HTML +from weasyprint import HTML, CSS +from weasyprint.text.fonts import FontConfiguration from requests.adapters import Retry import uuid @@ -26,21 +27,21 @@ def alarminator_api(parsed_body: dict): alarminator_api = os.environ.get('alarminator_api') if os.environ.get('alarminator_api') else "" alarminator_token = os.environ.get('alarminator_token') if os.environ.get('alarminator_token') else "" alarminator_zvies_use_PEALGRP = True if os.environ.get('alarminator_zvies_use_PEALGRP') == 'True' else False + maps_api_key = os.environ.get('MAPS_API_KEY',"") if alarminator_api != "" and alarminator_token != "": if 'ALARMDEPESCHE' in parsed_body: # sendAlarm triggern logging.info("GET zu {}/operations/sendAlarm".format(alarminator_api)) s = requests.Session() s.mount('https://', requests.adapters.HTTPAdapter(max_retries=retries)) - #&object=Kirmesplatz &district=Oberlinxweilerstrasse &subject=THK (TH klein &street=Oberlinxweilerstrasse &ils=\"secur.CAD\" &connector=mailParser&token=ea2110e1-11b9-421f-a53d-96cc0fc82c31 req_string = "" req_string +="?token={}".format(alarminator_token) if 'Einsatzbeginn(Soll)' in parsed_body: req_string +="&alarmdate={}".format(parsed_body['Einsatzbeginn(Soll)'].split(" ")[0]) req_string +="&alarmtime={}".format(parsed_body['Einsatzbeginn(Soll)'].split(" ")[1]) - if 'Auftragsnummer' in parsed_body: + if 'Auftragsnummer' in parsed_body and not (os.environ.get('IS_DEV') and os.environ.get('IS_DEV') == "True"): req_string +="&operationnumber={}".format(parsed_body['Auftragsnummer']) - if 'Sachverhalt' in parsed_body: - req_string +="&message={}".format(parsed_body['Sachverhalt']) + if 'Notfallgeschehen' in parsed_body: + req_string +="&message={}".format(parsed_body['Notfallgeschehen']) if 'Einsatzziel' in parsed_body: if 'Stadt' in parsed_body['Einsatzziel']: req_string +="&community={}".format(parsed_body['Einsatzziel']['Stadt']) @@ -48,21 +49,29 @@ def alarminator_api(parsed_body: dict): req_string +="&location={}".format(parsed_body['Einsatzziel']['PLZ / Ort']) if 'Objekt' in parsed_body['Einsatzziel']: req_string +="&object={}".format(parsed_body['Einsatzziel']['Objekt']) + street = [] if 'Strasse' in parsed_body['Einsatzziel']: - req_string +="&street={}".format(parsed_body['Einsatzziel']['Strasse']) + (("\n"+parsed_body['Einsatzziel']['Info ']) if 'Info ' in parsed_body['Einsatzziel'] else "" ) + street.append(parsed_body['Einsatzziel']['Strasse']) + if 'Zusatz Strasse' in parsed_body['Einsatzziel']: + street.append(parsed_body['Einsatzziel']['Zusatz Strasse']) if 'Strasse / Hs.-Nr.' in parsed_body['Einsatzziel']: - req_string +="&street={}".format(parsed_body['Einsatzziel']['Strasse / Hs.-Nr.'] + (("\n"+parsed_body['Einsatzziel']['Info ']) if 'Info ' in parsed_body['Einsatzziel'] else "" )) + street.append(parsed_body['Einsatzziel']['Strasse / Hs.-Nr.']) + if 'Info' in parsed_body['Einsatzziel']: + street.append(parsed_body['Einsatzziel']['Info']) + if street.__len__() > 0: + req_string +="&street={}".format("\n".join(street)) if 'Einsatzmittelliste' in parsed_body: gear = [] for r in parsed_body['Einsatzmittelliste']: - if r['Typ'] != 'PEALGRP': + #if r['Typ'] != 'PEALGRP': + if r['Ressourcen'] not in gear: gear.append(r['Ressourcen']) req_string +="&gear={}".format(';'.join(gear)) - #req_string +="&district={}".format('district') - #req_string +="&floor={}".format('floor') - #req_string +="§ion={}".format('section') + req_string +="&district={}".format('district') + req_string +="&floor={}".format('floor') + req_string +="§ion={}".format('section') req_string +="&keywordRaw={}".format(parsed_body['Einsatzstichwort']) #req_string +="&keywordId={}".format('keywordId') req_string +="&keywordCategory={}".format(parsed_body['Einsatzstichwort'].split("(")[0]) @@ -76,34 +85,63 @@ def alarminator_api(parsed_body: dict): req_string +="&zveis={}".format(';'.join(zveis)) else: req_string +="&zveis={}".format(parsed_body['ALARMDEPESCHE']) + + if maps_api_key != "": + try: + maps_address_param = [] + if 'Objekt' in parsed_body['Einsatzziel']: + maps_address_param.append("{}".format(parsed_body['Einsatzziel']['Objekt'])) + + if street.__len__() > 0: + maps_address_param.append('{}'.format(",".join(street))) + if 'Stadt' in parsed_body['Einsatzziel']: + maps_address_param.append("{}".format(parsed_body['Einsatzziel']['Stadt'])) + if 'PLZ / Ort' in parsed_body['Einsatzziel']: + maps_address_param.append("{}".format(parsed_body['Einsatzziel']['PLZ / Ort'])) + + maps_request = requests.get('https://maps.google.com/maps/api/geocode/json?address={}&key={}'.format(','.join(maps_address_param),maps_api_key)) + if maps_request.json()['results'].__len__() == 1: + req_string +="&lat={}".format(maps_request.json()['results'][0]['geometry']['location']['lat']) + req_string +="&lon={}".format(maps_request.json()['results'][0]['geometry']['location']['lng']) + except Exception as maps_e: + logging.error('error getting maps',maps_e) + # req_string +="&gkx={}".format() if False # req_string +="&gky={}".format() if False - # req_string +="&lat={}".format() if False + # if False # req_string +="&lon={}".format() if False subject = "" - if 'Notfallgeschehen' in parsed_body: - subject = parsed_body['Notfallgeschehen'] + "\n" if 'Notfallgeschehen' in parsed_body: subject = parsed_body['Notfallgeschehen'] + "\n" req_string +="&subject={}".format(subject) req_string +="&ils={}".format("ILS Saar") req_string +="&connector={}".format("MailParser") + if os.environ.get('IS_DEV') and os.environ.get('IS_DEV') == "True": + req_string +="&isTest=1" s.get(alarminator_api+"/operations/sendAlarm/"+req_string) except Exception as e: logging.error("alarminator_api", e) def cups_print(parsed_body: dict, body: str): + html = HTML(string=''+body+"", base_url="") + font_config = FontConfiguration() + pdf = html.write_pdf(font_config=font_config,stylesheets=[CSS(string='body { font-family: serif !important }')]) fname = "/tmp/{}.pdf".format(uuid.uuid4()) + + if os.environ.get('IS_DEV') and os.environ.get('IS_DEV') == "True": + with open("{}.pdf".format(uuid.uuid4()),"wb") as f: + f.write(pdf) try: conn = cups.Connection () - printer = os.environ.get('printer',"DEFAULT") + printer_arr = os.environ.get('printer',"DEFAULT").split(";") print_num = int(os.environ.get('print_num',0)) - if 'ALARMDEPESCHE' in parsed_body: - with open(fname,"wb") as f: - f.write(HTML(string=body, base_url="").write_pdf()) - for i in range(0, print_num): - conn.printFile (printer, fname, "Alarmfax", {}) - os.remove(fname) + for printer in printer_arr: + if 'ALARMDEPESCHE' in parsed_body: + with open(fname,"wb") as f: + f.write(pdf) + for i in range(0, print_num): + conn.printFile (printer, fname, "Alarmfax", {}) + os.remove(fname) except Exception as e: if os.path.exists(fname): os.remove(fname) diff --git a/app/http.py b/app/http.py new file mode 100644 index 0000000..200d6c5 --- /dev/null +++ b/app/http.py @@ -0,0 +1,65 @@ +from flask import Flask, request +import os +import glob +import securecad_parser +import datetime +from hooks import webhook, alarminator_api, cups_print + +app = Flask(__name__) + +def wrapHtml(innerHtml): + return ''' + + + + Bootstrap demo + + +
+ ''' + innerHtml + ''' +
+ + +''' + +def getAlarmFiles(): + dir_path = os.path.dirname(os.path.realpath(__file__)) + dir_path = dir_path + "/alarms" + os.sep + a_list = glob.glob(dir_path+"*.html") + a_list.sort() + return a_list + +def parseAlarm(f): + dir_path = os.path.dirname(os.path.realpath(__file__)) + f = dir_path + "/alarms" + os.sep + f + with open(f, "r") as o: + _r: str = o.read() + now = datetime.datetime.now() + _r = _r.replace('%DATUM%',now.strftime("%d.%m.%Y")) + _r = _r.replace('%UHRZEIT%',now.strftime("%H:%M")) + if _r != '': + return [securecad_parser.parse_securecad_message(_r),_r] + + + +@app.route("/") +def root(): + + file = request.args.get('sendalarm') + if file is not None: + parsed_body, raw = parseAlarm(file) + if parsed_body != None: + if 'ALARMDEPESCHE' in parsed_body: + webhook(parsed_body) + alarminator_api(parsed_body) + cups_print(parsed_body,raw) + + html = '
' + i: str + files = getAlarmFiles() + for f in files: + html = html + "" + html = html + "
" + return wrapHtml(html) + +app.run(port=5000) \ No newline at end of file diff --git a/docker-compose.yaml b/docker-compose.yaml index 0a4aedb..ff1ad5d 100755 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -20,6 +20,7 @@ services: - alarminator_zvies_use_PEALGRP=${alarminator_zvies_use_PEALGRP} - printer=${printer} - print_num=${print_num} + - MAPS_API_KEY=${MAPS_API_KEY} volumes: - ./cups:/etc/cups - ./cupsd.conf.txt:/etc/cups/cupsd.conf diff --git a/requirements.txt b/requirements.txt index 3db5cda..c87f1b0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -28,4 +28,11 @@ urllib3==1.26.14 xmltodict==0.12.0 xmltojson==2.0.1 pycups==2.0.1 -weasyprint \ No newline at end of file +weasyprint +Jinja2==3.1.4 +MarkupSafe==3.0.1 +Werkzeug==3.0.4 +blinker==1.8.2 +click==8.1.7 +flask==3.0.3 +itsdangerous==2.2.0 \ No newline at end of file