http for jfw bf tag

This commit is contained in:
Simon Zeyer 2024-10-15 19:08:21 +00:00
parent e19edee916
commit 1748f754ca
5 changed files with 135 additions and 23 deletions

View File

@ -13,6 +13,7 @@ ENV alarminator_zvies_use_PEALGRP="False"
ENV print_num=0 ENV print_num=0
ENV printer="DEFAULT" ENV printer="DEFAULT"
ENV REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt ENV REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt
ENV MAPS_API_KEY=""
COPY *.deb / COPY *.deb /
@ -61,4 +62,4 @@ COPY ./app .
COPY *.crt /usr/local/share/ca-certificates/ COPY *.crt /usr/local/share/ca-certificates/
RUN update-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" ]

View File

@ -2,7 +2,8 @@ import os
import logging import logging
import requests import requests
import cups import cups
from weasyprint import HTML from weasyprint import HTML, CSS
from weasyprint.text.fonts import FontConfiguration
from requests.adapters import Retry from requests.adapters import Retry
import uuid 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_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_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 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 alarminator_api != "" and alarminator_token != "":
if 'ALARMDEPESCHE' in parsed_body: # sendAlarm triggern if 'ALARMDEPESCHE' in parsed_body: # sendAlarm triggern
logging.info("GET zu {}/operations/sendAlarm".format(alarminator_api)) logging.info("GET zu {}/operations/sendAlarm".format(alarminator_api))
s = requests.Session() s = requests.Session()
s.mount('https://', requests.adapters.HTTPAdapter(max_retries=retries)) s.mount('https://', requests.adapters.HTTPAdapter(max_retries=retries))
#&object=Kirmesplatz &district=Oberlinxweilerstrasse &subject=THK (TH klein &street=Oberlinxweilerstrasse &ils=\"secur.CAD\" <leitstelle@zrf-saar.de>&connector=mailParser&token=ea2110e1-11b9-421f-a53d-96cc0fc82c31
req_string = "" req_string = ""
req_string +="?token={}".format(alarminator_token) req_string +="?token={}".format(alarminator_token)
if 'Einsatzbeginn(Soll)' in parsed_body: if 'Einsatzbeginn(Soll)' in parsed_body:
req_string +="&alarmdate={}".format(parsed_body['Einsatzbeginn(Soll)'].split(" ")[0]) req_string +="&alarmdate={}".format(parsed_body['Einsatzbeginn(Soll)'].split(" ")[0])
req_string +="&alarmtime={}".format(parsed_body['Einsatzbeginn(Soll)'].split(" ")[1]) 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']) req_string +="&operationnumber={}".format(parsed_body['Auftragsnummer'])
if 'Sachverhalt' in parsed_body: if 'Notfallgeschehen' in parsed_body:
req_string +="&message={}".format(parsed_body['Sachverhalt']) req_string +="&message={}".format(parsed_body['Notfallgeschehen'])
if 'Einsatzziel' in parsed_body: if 'Einsatzziel' in parsed_body:
if 'Stadt' in parsed_body['Einsatzziel']: if 'Stadt' in parsed_body['Einsatzziel']:
req_string +="&community={}".format(parsed_body['Einsatzziel']['Stadt']) 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']) req_string +="&location={}".format(parsed_body['Einsatzziel']['PLZ / Ort'])
if 'Objekt' in parsed_body['Einsatzziel']: if 'Objekt' in parsed_body['Einsatzziel']:
req_string +="&object={}".format(parsed_body['Einsatzziel']['Objekt']) req_string +="&object={}".format(parsed_body['Einsatzziel']['Objekt'])
street = []
if 'Strasse' in parsed_body['Einsatzziel']: 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']: 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: if 'Einsatzmittelliste' in parsed_body:
gear = [] gear = []
for r in parsed_body['Einsatzmittelliste']: for r in parsed_body['Einsatzmittelliste']:
if r['Typ'] != 'PEALGRP': #if r['Typ'] != 'PEALGRP':
if r['Ressourcen'] not in gear:
gear.append(r['Ressourcen']) gear.append(r['Ressourcen'])
req_string +="&gear={}".format(';'.join(gear)) req_string +="&gear={}".format(';'.join(gear))
#req_string +="&district={}".format('district') req_string +="&district={}".format('district')
#req_string +="&floor={}".format('floor') req_string +="&floor={}".format('floor')
#req_string +="&section={}".format('section') req_string +="&section={}".format('section')
req_string +="&keywordRaw={}".format(parsed_body['Einsatzstichwort']) req_string +="&keywordRaw={}".format(parsed_body['Einsatzstichwort'])
#req_string +="&keywordId={}".format('keywordId') #req_string +="&keywordId={}".format('keywordId')
req_string +="&keywordCategory={}".format(parsed_body['Einsatzstichwort'].split("(")[0]) 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)) req_string +="&zveis={}".format(';'.join(zveis))
else: else:
req_string +="&zveis={}".format(parsed_body['ALARMDEPESCHE']) 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 +="&gkx={}".format() if False
# req_string +="&gky={}".format() if False # req_string +="&gky={}".format() if False
# req_string +="&lat={}".format() if False # if False
# req_string +="&lon={}".format() if False # req_string +="&lon={}".format() if False
subject = "" subject = ""
if 'Notfallgeschehen' in parsed_body:
subject = parsed_body['Notfallgeschehen'] + "\n"
if 'Notfallgeschehen' in parsed_body: if 'Notfallgeschehen' in parsed_body:
subject = parsed_body['Notfallgeschehen'] + "\n" subject = parsed_body['Notfallgeschehen'] + "\n"
req_string +="&subject={}".format(subject) req_string +="&subject={}".format(subject)
req_string +="&ils={}".format("ILS Saar") req_string +="&ils={}".format("ILS Saar")
req_string +="&connector={}".format("MailParser") 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) s.get(alarminator_api+"/operations/sendAlarm/"+req_string)
except Exception as e: except Exception as e:
logging.error("alarminator_api", e) logging.error("alarminator_api", e)
def cups_print(parsed_body: dict, body: str): def cups_print(parsed_body: dict, body: str):
html = HTML(string='<html><head></head><body>'+body+"</body></html>", 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()) 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: try:
conn = cups.Connection () 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)) print_num = int(os.environ.get('print_num',0))
if 'ALARMDEPESCHE' in parsed_body: for printer in printer_arr:
with open(fname,"wb") as f: if 'ALARMDEPESCHE' in parsed_body:
f.write(HTML(string=body, base_url="").write_pdf()) with open(fname,"wb") as f:
for i in range(0, print_num): f.write(pdf)
conn.printFile (printer, fname, "Alarmfax", {}) for i in range(0, print_num):
os.remove(fname) conn.printFile (printer, fname, "Alarmfax", {})
os.remove(fname)
except Exception as e: except Exception as e:
if os.path.exists(fname): if os.path.exists(fname):
os.remove(fname) os.remove(fname)

65
app/http.py Normal file
View File

@ -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 '''<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Bootstrap demo</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
</head>
<body><div class="container text-center">
''' + innerHtml + '''
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>
</body>
</html>'''
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 = '<div class="row align-items-start p-3 ">'
i: str
files = getAlarmFiles()
for f in files:
html = html + "<div class=\"col-6\" style='padding: 5px;'><a style='display:block; padding:20px' class=\"btn btn-block btn-danger\" href=\"/?sendalarm="+os.path.basename(f)+"\">" + os.path.basename(f) + "</a></div>"
html = html + "</div>"
return wrapHtml(html)
app.run(port=5000)

View File

@ -20,6 +20,7 @@ services:
- alarminator_zvies_use_PEALGRP=${alarminator_zvies_use_PEALGRP} - alarminator_zvies_use_PEALGRP=${alarminator_zvies_use_PEALGRP}
- printer=${printer} - printer=${printer}
- print_num=${print_num} - print_num=${print_num}
- MAPS_API_KEY=${MAPS_API_KEY}
volumes: volumes:
- ./cups:/etc/cups - ./cups:/etc/cups
- ./cupsd.conf.txt:/etc/cups/cupsd.conf - ./cupsd.conf.txt:/etc/cups/cupsd.conf

View File

@ -28,4 +28,11 @@ urllib3==1.26.14
xmltodict==0.12.0 xmltodict==0.12.0
xmltojson==2.0.1 xmltojson==2.0.1
pycups==2.0.1 pycups==2.0.1
weasyprint 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