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 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" ]

View File

@ -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\" <leitstelle@zrf-saar.de>&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 +="&section={}".format('section')
req_string +="&district={}".format('district')
req_string +="&floor={}".format('floor')
req_string +="&section={}".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='<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())
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)

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}
- printer=${printer}
- print_num=${print_num}
- MAPS_API_KEY=${MAPS_API_KEY}
volumes:
- ./cups:/etc/cups
- ./cupsd.conf.txt:/etc/cups/cupsd.conf

View File

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