223 lines
12 KiB
Python
223 lines
12 KiB
Python
import os
|
|
import logging
|
|
import requests
|
|
import cups
|
|
from weasyprint import HTML
|
|
from requests.adapters import Retry
|
|
import uuid
|
|
import subprocess
|
|
import datetime
|
|
import time
|
|
|
|
retries = Retry(total=5,
|
|
backoff_factor=0.1,
|
|
status_forcelist=[ 500, 502, 503, 504 ])
|
|
|
|
def webhook(parsed_body: dict):
|
|
try:
|
|
webhooks = os.environ.get('webhooks').split(";") if os.environ.get('webhooks') else []
|
|
for webhook in webhooks:
|
|
logging.info("POST zu {}".format(webhook))
|
|
s = requests.Session()
|
|
s.mount('https://', requests.adapters.HTTPAdapter(max_retries=retries))
|
|
s.post(webhook,json=parsed_body)
|
|
except Exception as e:
|
|
logging.error("alarminator_api", e)
|
|
|
|
def alarminator_api(parsed_body: dict):
|
|
try:
|
|
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))
|
|
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 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 'Einsatzziel' in parsed_body:
|
|
if 'Stadt' in parsed_body['Einsatzziel']:
|
|
req_string +="&community={}".format(parsed_body['Einsatzziel']['Stadt'])
|
|
if 'PLZ / Ort' in parsed_body['Einsatzziel']:
|
|
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']:
|
|
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']:
|
|
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['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 +="&keywordRaw={}".format(parsed_body['Einsatzstichwort'])
|
|
#req_string +="&keywordId={}".format('keywordId')
|
|
req_string +="&keywordCategory={}".format(parsed_body['Einsatzstichwort'].split("(")[0])
|
|
req_string +="&keywordName={}".format(parsed_body['Einsatzstichwort'].split("(")[1].split(")")[0])
|
|
if alarminator_zvies_use_PEALGRP:
|
|
if 'Einsatzmittelliste' in parsed_body:
|
|
zveis = []
|
|
for r in parsed_body['Einsatzmittelliste']:
|
|
if r['Typ'] == 'PEALGRP':
|
|
zveis.append(r['Ressourcen'])
|
|
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
|
|
# 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 generate_pdf(html_body, filename):
|
|
f = "/tmp/{}.html".format(uuid.uuid4())
|
|
with open(f,"w") as _f:
|
|
_f.write(html_body)
|
|
subprocess.run(["/usr/bin/google-chrome-stable", "--headless", "--no-sandbox", "--disable-gpu", "--print-to-pdf="+filename, "--no-pdf-header-footer", "--print-to-pdf-no-header", "--no-margins", f])
|
|
if os.path.exists(f):
|
|
os.remove(f)
|
|
|
|
def cups_print(parsed_body: dict, body: str):
|
|
# if os.environ.get('IS_DEV') and os.environ.get('IS_DEV') == "True":
|
|
# generate_pdf(body, "{}.pdf".format(uuid.uuid4()))
|
|
fname = "{}.pdf".format(uuid.uuid4())
|
|
try:
|
|
conn = cups.Connection ()
|
|
printer_arr = os.environ.get('printer',"DEFAULT").split(";")
|
|
print_num = int(os.environ.get('print_num',0))
|
|
#if printer_arr.__len__() > 0:
|
|
generate_pdf(body, fname)
|
|
for printer in printer_arr:
|
|
print(printer)
|
|
if 'ALARMDEPESCHE' in parsed_body:
|
|
for i in range(0, print_num):
|
|
conn.printFile (printer, fname, "Alarmfax", {})
|
|
except Exception as e:
|
|
logging.error("cups_print", e)
|
|
finally:
|
|
if os.path.exists(fname):
|
|
os.remove(fname)
|
|
|
|
|
|
def divera_messenger(parsed_body: dict):
|
|
# /api/v2/alarms
|
|
# message-channels?accesskey=XXX
|
|
|
|
try:
|
|
api = "https://app.divera247.com/api/v2/"
|
|
messenger_api_token = os.environ.get('DIVERA_MESSANGER_API_KEY') if os.environ.get('DIVERA_MESSANGER_API_KEY') else ""
|
|
alarmer_api_token = os.environ.get('DIVERA_ALARMER_API_KEY') if os.environ.get('DIVERA_ALARMER_API_KEY') else ""
|
|
if messenger_api_token != "":
|
|
if 'ALARMDEPESCHE' in parsed_body: # sendAlarm triggern
|
|
if 'Einsatzmittelliste' in parsed_body:
|
|
|
|
zveis = []
|
|
message = "Alarmierte Einsatzmittel:\n"
|
|
for r in parsed_body['Einsatzmittelliste']:
|
|
if r['Typ'] == 'PEALGRP':
|
|
zveis.append(r['Ressourcen'])
|
|
message +='\n'.join(zveis)
|
|
if 'Zusatztext zum Ort' in parsed_body:
|
|
message += "\n\nZusatztext zum Ort:\n"+parsed_body['Zusatztext zum Ort']
|
|
if 'Zusatztext zum Objekt' in parsed_body:
|
|
message += "\n\nZusatztext zum Objekt:\n"+parsed_body['Zusatztext zum Objekt']
|
|
|
|
logging.info("GET zu {}alarms?accesskey=XXX".format(api))
|
|
s = requests.Session()
|
|
s.mount('https://', requests.adapters.HTTPAdapter(max_retries=retries))
|
|
start = datetime.datetime.now()
|
|
message_channel_id = None
|
|
alarm_id = None
|
|
alarm_text = None
|
|
while message_channel_id is None and datetime.datetime.now() < start + datetime.timedelta(minutes=1):
|
|
r = s.get("{}alarms?accesskey={}".format(api, messenger_api_token))
|
|
r_json = r.json()
|
|
if 'items' in r_json.get('data',{}):
|
|
for item in r_json.get('data',{})['items']:
|
|
if str(r_json['data']['items'][item]['foreign_id']) == str(parsed_body['Auftragsnummer']):
|
|
logging.info("EinsatzNr {} in Divera gefunden, sende Nachricht...".format(r_json['data']['items'][item]['foreign_id']))
|
|
message_channel_id = r_json['data']['items'][item]['message_channel_id']
|
|
alarm_id = r_json['data']['items'][item]['id']
|
|
alarm_text = r_json['data']['items'][item]['text']
|
|
if message_channel_id is None or alarm_id is None:
|
|
time.sleep(20)
|
|
|
|
if alarmer_api_token != "":
|
|
if alarm_text is None:
|
|
alarm_text = ""
|
|
r = s.put("{}alarms/{}?accesskey={}".format(api, alarm_id, alarmer_api_token),json={
|
|
"Alarm": {
|
|
"text": alarm_text+"\n\n"+message,
|
|
}
|
|
})
|
|
|
|
|
|
if message_channel_id:
|
|
r = s.post("{}messages?accesskey={}".format(api, messenger_api_token),json={
|
|
"Message": {
|
|
"message_channel_id": str(message_channel_id),
|
|
# "parent_id": 0,
|
|
"text": message,
|
|
}
|
|
})
|
|
pass
|
|
except Exception as e:
|
|
logging.error("divera_messenger", e)
|