from flask import Flask, flash, request, redirect, send_from_directory, get_flashed_messages import os import glob import securecad_parser import datetime from hooks import webhook, alarminator_api, cups_print from pathlib import Path from flask_basicauth import BasicAuth app = Flask(__name__) app.secret_key = 'super secret key' app.config['SESSION_TYPE'] = 'filesystem' app.config['BASIC_AUTH_USERNAME'] = 'admin' app.config['BASIC_AUTH_PASSWORD'] = os.environ.get('BASIC_AUTH_PASSWORD','password') basic_auth = BasicAuth(app) def wrapHtml(innerHtml): return ''' JFW Alarm
''' + flashMessages() +''' ''' + innerHtml + '''
''' def flashMessages(): messages = get_flashed_messages(with_categories=True) html = "" if messages: for category, message in messages: html = html + category + ": "+message+"
" return html def alarmsPath(): dir_path = os.path.dirname(os.path.realpath(__file__)) return dir_path + "/alarms" + os.sep def getAlarmFiles(): a_list = glob.glob(alarmsPath()+"*.html") a_list.sort() return [os.path.basename(f) for f in a_list] def parseAlarm(f): f = alarmsPath() + 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] def allowed_file(filename:str): print(filename.rsplit('.', 1)[1].lower()) return '.' in filename and \ filename.rsplit('.', 1)[1].lower() in ["html"] @app.route("/") @basic_auth.required def root(): html = "" 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) flash("Alarm gesendet!") return redirect('/') html = html + '
' i: str files = getAlarmFiles() for f in files: html = html + "
" + f + "
" html = html + "
" return wrapHtml(html) @app.route('/files', methods=['POST']) @basic_auth.required def upload_file(): # check if the post request has the file part print(request.files) if 'file' not in request.files: flash('No file part') return redirect(request.url) file = request.files['file'] # If the user does not select a file, the browser submits an # empty file without a filename. print(file.filename) if file.filename == '': flash('No selected file') return redirect(request.url) if file and allowed_file(file.filename): file.save(os.path.join(alarmsPath(), file.filename)) return redirect('/files') @app.route('/files/', methods=['GET']) @basic_auth.required def download(filename): uploads = alarmsPath() return send_from_directory(uploads, filename, as_attachment=True) @app.route("/files", methods=['GET']) @basic_auth.required def files(): Path(alarmsPath()).mkdir(parents=True, exist_ok=True) file = request.args.get('del') if file is not None: try: os.remove(alarmsPath()+os.sep+file) except: pass flash("Datei gelöscht!") return redirect('/files') files = getAlarmFiles() html = '
' return html # if __name__ == "__main__": # app.run(port=5000, host='0.0.0.0')