RF-AD/Server/Program/Webserver.py
jeanGaston 6f96516374 Add group page on the webgui
- Add the page groupsdb
- Update menu on other pages
- Add 2 function in webserver.py to display groups and delete them (not fully implemented for now)
2024-06-03 11:02:06 +00:00

112 lines
3.4 KiB
Python

from threading import Thread
from flask import Flask, render_template, send_file, Response, request, redirect, jsonify
import io
from ldapSync import sync_ldap_to_database
from database import *
from env import *
app = Flask(__name__)
# Route to the home
@app.route('/')
def index():
existing_groups = get_existing_groups(DBFILE) # Update with your database file path
logs = get_latest_logs(DBFILE,5)
#print(logs[0])
return render_template('./index.html', existing_groups=existing_groups, logs=logs)
# Route to display the fuser db
@app.route('/UserDB')
def usersdb():
users = get_users()
return render_template('userdb.html', users=users)
# Route to display the fuser db
@app.route('/LogsDB')
def logsdb():
logs = get_logs()
return render_template('logsdb.html', logs=logs)
@app.route('/export_logs')
def export_logs():
logs = get_logs()
# Create a file-like string to write logs
log_output = io.StringIO()
log_line = "TimeStamp,User,Tag UID,Door ID,Granted,\n"
log_output.write(log_line)
for log in logs:
log_line = f"{log[0]},{log[1]},{log[2]},{log[4]},{'Yes' if log[3] else 'No'},\n"
log_output.write(log_line)
# Set the position to the beginning of the stream
log_output.seek(0)
# Create a response with the file data
return Response(
log_output,
mimetype="text/plain",
headers={"Content-disposition": "attachment; filename=logs.csv"}
)
@app.route('/GroupsDB')
def groupsdb():
doors = get_doors()
groups = get_existing_groups(DBFILE)
return render_template('groupsdb.html', doors=doors, groups=groups)
@app.route('/delete_group/<group_cn>', methods=['POST'])
def delete_group(group_cn):
delete_group_from_database(group_cn)
return render_template('./index.html')
# Route to handle form submission and add the door to the database
@app.route('/add_door', methods=['POST'])
def add_door():
Door_id = request.form["Door_id"]
group_cn = request.form["group_cn"]
# Update with your database file path
exec = add_door_to_database(DBFILE, group_cn, Door_id)
if add_door_to_database(DBFILE, group_cn, Door_id):
return redirect('/')
else:
return f"Failed to add door to the database."
# Route to handle sync button click
@app.route('/sync')
def sync():
sync_ldap_to_database(DBFILE)
return render_template('./LDAP.html')
# Route to handle door access requests
@app.route('/access', methods=['POST'])
def door_access():
data = request.get_json()
rfid_uid = data.get('rfid_uid')
door_id = data.get('door_id')
if rfid_uid is None or door_id is None:
return jsonify({'error': 'RFID UID and door ID are required'}), 400
access_granted, upn = check_access(rfid_uid, door_id)
if access_granted:
print('')
log_access_attempt(DBFILE,upn,rfid_uid,True,door_id)
return jsonify({'access_granted': True, 'upn': upn}), 200
else:
log_access_attempt(DBFILE,upn,rfid_uid,False,door_id)
return jsonify({'access_granted': False}), 403
def run_flask_app():
app.run(debug=True, use_reloader=False, port=5000, host="0.0.0.0")
def run_webServer_thread():
print(f'STARTING WEB SERVER ON PORT {WebServerPORT}')
flask_thread = Thread(target=run_flask_app, daemon=True)
flask_thread.start()
# flask_thread.join()
if __name__ == '__main__':
app.run(debug=True)