Files
swmu_test_web/app.py
2025-11-04 13:50:38 +01:00

441 lines
18 KiB
Python

import os
import shutil
import folium
import pandas as pd
from flask import Flask
from flask import request, render_template
from flask import send_from_directory, url_for, redirect
from werkzeug.utils import secure_filename
from scripts import create_mulog
print("version: 1.5")
ASSETS_DIR = os.path.dirname(os.path.abspath(__file__))
app = Flask(__name__)
# app.config['SECRET_KEY'] = '^%huYtFd90;90jjj'
# app.config['MULOGS'] = 'static'
app.config['MAX_CONTENT_LENGTH'] = 1024 * 1024 * 10 # 10mb
app.config['MAX_RECOMMENDED_POS'] = 10000
app.config['UPLOAD_EXTENSIONS'] = ['.log']
app.config['UPLOAD_PATH'] = 'uploads'
app.config['FILE_NAME'] = app.config['IGN1A'] = None
questions = []
counter_files = 0
@app.route('/', methods=['GET', 'POST'])
@app.route("/home", methods=['GET', 'POST'])
def index():
environment = request.host
clear = False
if request.method == 'POST':
if len(questions) > 20:
del questions[:1]
if request.form['submit_button'] == "Clear":
del questions[:]
return render_template('index_v2.html', questions=questions,
environment=environment, clear=True,
lenquestions=len(questions))
elif request.form['submit_button'] == "Generate":
if request.form['modes'] == "None":
questions.append({
'loglevel': request.form['loglevels'],
'id32': request.form['start-id32'],
'number_swmu': request.form['number_of_swmu'],
'mode': "None", # set default run mode
'server_host': request.form['server_hosts'],
'server_port': request.form['server_ports'],
'start_port': request.form['start_ports'],
'bt_spontaneous_timeout': request.form[
'bt_spontaneous_timeouts'],
'sigma': request.form['sigmas'],
'sta': request.form['stas'],
'sta_pause': request.form['sta_pauses'],
'ft_delay': request.form['ft_delays'],
'ft_mode': request.form['ft_modes'],
})
elif request.form['modes'] == "run":
questions.append({
'loglevel': request.form['loglevels'],
'id32': request.form['start-id32'],
'number_swmu': request.form[
'number_of_swmu'],
'mode': request.form['modes'],
'server_host': request.form['server_hosts'],
'server_port': request.form['server_ports'],
'start_port': request.form['start_ports'],
'bt_spontaneous_timeout': request.form[
'bt_spontaneous_timeouts'],
'sigma': request.form['sigmas'],
'sta': request.form['stas'],
'sta_pause': request.form['sta_pauses'],
'ft_delay': request.form['ft_delays'],
'ft_mode': request.form['ft_modes'],
'latitude': request.form['latitudes'],
'longitude': request.form['longitudes'],
'domain': request.form['domains'],
'near_by_domain': request.form['near_by_domains'],
'x01': request.form['x01s'],
'x01_pause': request.form['x01_pauses'],
'units_wo_x1a': request.form['units_wo_x1as'],
'x1a_pause': request.form['x1a_pauses'],
'x1a_mask': request.form['x1a_masks'],
'x1a_type': request.form['x1a_types'],
'x1d': request.form['x1ds'],
'x1d_pause': request.form['x1d_pauses'],
'x1d_weight_axles': request.form['x1d_weight_axles'],
})
elif request.form['modes'] == "sim":
questions.append({
'loglevel': request.form['loglevels'],
'id32': request.form['start-id32'],
'number_swmu': request.form[
'number_of_swmu'],
'mode': request.form['modes'],
'server_host': request.form['server_hosts'],
'server_port': request.form['server_ports'],
'start_port': request.form['start_ports'],
'bt_spontaneous_timeout': request.form[
'bt_spontaneous_timeouts'],
'sigma': request.form['sigmas'],
'sta': request.form['stas'],
'sta_pause': request.form['sta_pauses'],
'ft_delay': request.form['ft_delays'],
'ft_mode': request.form['ft_modes'],
'log': request.form['logs'],
'sim_time_check': request.form['sim_time_checks'],
'sim_stop': request.form['sim_stops'],
})
elif request.form['modes'] == "simfast":
questions.append({
'loglevel': request.form['loglevels'],
'id32': request.form['start-id32'],
'number_swmu': request.form[
'number_of_swmu'],
'mode': request.form['modes'],
'server_host': request.form['server_hosts'],
'server_port': request.form['server_ports'],
'start_port': request.form['start_ports'],
'bt_spontaneous_timeout': request.form[
'bt_spontaneous_timeouts'],
'sigma': request.form['sigmas'],
'sta': request.form['stas'],
'sta_pause': request.form['sta_pauses'],
'ft_delay': request.form['ft_delays'],
'ft_mode': request.form['ft_modes'],
'log': request.form['logs_simfast'],
'sim_time_check': request.form['sim_time_checks_simfast'],
'sim_stop': request.form['sim_stops'],
'simulate_pause': request.form['simulate_pauses'],
})
return render_template('index_v2.html', questions=questions,
environment=environment, clear=clear,
lenquestions=len(questions))
@app.route('/info')
def info():
environment = request.host
return render_template('info.html', environment=environment)
@app.route('/helpswmu')
def helpswmu():
environment = request.host
return render_template('helpswmu.html', environment=environment)
"""
@app.route('/mulog_read')
def mulog_read():
environment = request.host
return render_template('mulog_read.html', environment=environment)
"""
@app.route('/mulog_read')
def upload_file():
environment = request.host
# environment_road = f"http://{environment}/uploader" # on local
environment_road = f"https://{environment}/uploader"
max_pos = app.config['MAX_RECOMMENDED_POS']
files = listdir_nopos(app.config['UPLOAD_PATH'])
max_size = (app.config['MAX_CONTENT_LENGTH']) / (1024 * 1024) # in mb
ign1a = app.config['IGN1A']
text = warn = ""
mulogt = []
other_type_ttt = []
pos_file = {'latitude': [], 'longitude': [], "msg_type": []}
x01 = x04 = x05 = x08 = x09 = x13 = x14 = x25 = x26 = x0b = 0
x0d = x1a = x1c = x1d = x02 = x10 = x0e = ts_c = pos_c = 0
if files:
try:
mulog_path = f"{app.config['UPLOAD_PATH']}/{files[0]}"
mulog_data = create_mulog.dir_mulog(
import_dir=mulog_path, sim_time_check=False)
# (pos, log, ts_, type, pos)
for (count, message, old_ts, message_type, message_type_parse,
message_type_full_parse, list_ts_warning) in mulog_data:
warn = list_ts_warning
if message_type["type"] == b'\x01':
x01 += 1
elif message_type["type"] == b'\x04':
x04 += 1
elif message_type["type"] == b'\x05':
x05 += 1
elif message_type["type"] == b'\x08':
x08 += 1
elif message_type["type"] == b'\x09':
x09 += 1
elif message_type["type"] == b'\x13':
x13 += 1
elif message_type["type"] == b'\x14':
x14 += 1
elif message_type["type"] == b'\x25':
x25 += 1
elif message_type["type"] == b'\x26':
x26 += 1
elif message_type["type"] == b'\x0b':
x0b += 1
elif message_type["type"] == b'\x0d':
x0d += 1
elif message_type["type"] == b'\x1a':
x1a += 1
if ign1a == "False":
keys = []
key_fast = message_type_full_parse["fastlog"]
for key in key_fast.keys():
if key == "latitude":
keys.append(key)
elif key == "longitude":
keys.append(key)
if "latitude" and "longitude" in keys:
key_lat = key_fast["latitude"]
key_lon = key_fast["longitude"]
for lat in key_lat:
pos_file["latitude"].append(lat)
for lon in key_lon:
pos_file["longitude"].append(lon)
msg_type = message_type_parse["type"]
pos_file["msg_type"].append(msg_type)
pos_c += 1
elif message_type["type"] == b'\x1c':
x1c += 1
elif message_type["type"] == b'\x1d':
x1d += 1
elif message_type["type"] == b'\x02':
x02 += 1
elif message_type["type"] == b'\x10':
x10 += 1
elif message_type["type"] == b'\n':
continue
elif message_type["type"] == b'"':
continue
elif message_type["type"] == b'#':
continue
elif message_type["type"] == b'\x0e':
x0e += 1
else:
other_type_ttt.append(message_type["type"])
if old_ts is not None:
ts_c += 1
if message_type["type"] != b'\x1a':
if "latitude" in message_type_parse and \
"longitude" in message_type_parse:
lat = message_type_parse["latitude"]
lon = message_type_parse["longitude"]
msg_type = message_type_parse["type"]
pos_file["latitude"].append(lat)
pos_file["longitude"].append(lon)
pos_file["msg_type"].append(msg_type)
pos_c += 1
if not other_type_ttt:
other_type_ttt.append("None")
if pos_file is not []:
header_key = ["latitude", "longitude", "msg_type"]
df = pd.DataFrame(pos_file)
df.to_csv(f"{app.config['UPLOAD_PATH']}"
f"/{files[0]}_pos_file.csv", columns=header_key)
mulogt.extend([x01, x04, x05, x08, x09, x13, x14, x25,
x26, x0b, x0d, x1a, x1c, x1d, x10,
x0e, other_type_ttt])
except IOError:
print("Error: File does not appear to exist.")
# remove()
return "Error: File does not appear to exist.", 400
except ValueError:
remove()
text = f"ValueError: {ValueError}, file deleted"
print(text)
pass
return render_template('mulog_read.html', files=files,
max_size=max_size, environment=environment,
environment_road=environment_road, mulog=mulogt,
ts_c=ts_c, pos_c=pos_c, text=text, warn=warn,
ign1a=ign1a, max_pos=max_pos,
_scheme="https", _external=True)
# don't use use_scheme and _external with local testing
@app.route('/uploader', methods=['GET', 'POST'])
def uploader_file():
if request.method == 'POST':
app.config['IGN1A'] = request.form['ign1a']
uploaded_file = request.files['file']
filename = secure_filename(uploaded_file.filename)
app.config['FILE_NAME'] = filename
if filename != '':
file_ext = os.path.splitext(filename)[1]
if file_ext not in app.config['UPLOAD_EXTENSIONS']:
return "Invalid file, supports only <b>.log</b> format", 400
remove()
uploaded_file.save(
os.path.join(app.config['UPLOAD_PATH'], filename))
return redirect(
url_for('upload_file', _scheme="https", _external=True))
# don't use use_scheme and _external with local testing
@app.route('/uploads/<filename>')
def upload(filename):
return send_from_directory(app.config['UPLOAD_PATH'], filename)
@app.route('/call_remove')
def call_remove():
remove()
environment = request.host
# environment_road = f"http://{environment}/uploader" # on local
environment_road = f"https://{environment}/uploader"
files = os.listdir(app.config['UPLOAD_PATH'])
max_size = (app.config['MAX_CONTENT_LENGTH']) / (1024 * 1024) # in mb
return render_template('mulog_read.html', files=files,
max_size=max_size, environment=environment,
environment_road=environment_road, mulog=[],
_scheme="https", _external=True)
# don't use use_scheme and _external with local testing
@app.route('/call_render')
def call_render():
file_path = f"{app.config['UPLOAD_PATH']}/" \
f"{app.config['FILE_NAME']}_pos_file.csv"
file_ = pd.read_csv(file_path)
file_use = file_[["latitude", "longitude"]]
if file_use.empty:
return f"Failed to render {file_path}, file positions empty.", 400
else:
map_ = folium.Map(location=[file_use.latitude.mean(),
file_use.longitude.mean()],
zoom_start=14, control_scale=True)
i_count = 0
for _, row in file_use.iterrows():
if row['latitude'] == "latitude":
continue
else:
i_count += 1
lat_lon = f"{i_count}\n{row['latitude']}\n{row['longitude']}"
if i_count == 1:
folium.Marker([row['latitude'], row['longitude']],
popup=f"First position: \n{lat_lon}",
icon=folium.Icon(color="green",
icon="fas fa-truck"),
).add_to(map_)
elif i_count == len(file_use):
folium.Marker([row['latitude'], row['longitude']],
popup=f"Last position \n{lat_lon}",
icon=folium.Icon(color="red",
icon="fas fa-truck"),
).add_to(map_)
else:
folium.Marker([row['latitude'], row['longitude']],
popup=f"{lat_lon}\n",
).add_to(map_)
"""
points = []
points.append(tuple([row['latitude'], row['longitude']]))
folium.PolyLine(points, color="red",weight=2.5, opacity=1).add_to(map_)
"""
return map_._repr_html_() # https://fontawesome.com/
@app.errorhandler(413)
def too_large(e):
return f"File is too large {e}, maximum is " \
f"{(app.config['MAX_CONTENT_LENGTH']) / (1024 * 1024)}</b>mb", 413
@app.errorhandler(404)
def not_found(e):
return f"Error: File does not appear to exist, {e}.", 404
@app.errorhandler(500)
def some_error(e):
return f"{e}. Try <b>Clear</b> button", 500
def remove():
print("deleted")
folder = app.config['UPLOAD_PATH']
for filename in os.listdir(folder):
file_path = os.path.join(folder, filename)
try:
if os.path.isfile(file_path) or os.path.islink(file_path):
os.unlink(file_path)
elif os.path.isdir(file_path):
shutil.rmtree(file_path)
except Exception as e:
return f"Failed to delete %s. Reason: {(file_path, e)}", 400
def listdir_nopos(path):
r = []
for _ in os.listdir(path):
if not _.endswith('_pos_file.csv'):
r.append(_)
return r
"""
@app.route('/SomeFunction')
def SomeFunction():
print('In SomeFunction')
return "Nothing"
@app.route('/clear')
def SomeFunction2():
print('In SomeFunction2')
return "Nothing"
@app.route('/swmu_run')
def swmu_run():
os.system(
return "Nothing"
"""
if __name__ == '__main__':
app.run(debug=True, host="0.0.0.0", port=50002)
"""
app.run(debug=True, host="0.0.0.0", port=5000 2, ssl_context=(
"server.crt", "server.key"
))
"""
"""
app.run(debug=True, host="0.0.0.0", port=50002,
ssl_context=('cert/cert.pem', 'cert/key.pem')
)
"""