diff --git a/.gitignore b/.gitignore index 6a5098b..ce282a2 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,6 @@ __pycache__/ /app/logs/ instance/ .vscode/ -.DS_Store \ No newline at end of file +.DS_Store +docker-compose.yml + diff --git a/app/db_interface.py b/app/db_interface.py index ada83c2..ce17303 100644 --- a/app/db_interface.py +++ b/app/db_interface.py @@ -68,49 +68,62 @@ def add_user(mac_address, description, vlan_id): cursor.close() conn.close() -def update_user_description(mac_address, description): - """Update the description field of a user identified by MAC address.""" +def update_user(mac_address, description, vlan_id): + """Update both description and VLAN ID for a given MAC address.""" conn = get_connection() cursor = conn.cursor() - cursor.execute("UPDATE users SET description = %s WHERE mac_address = %s", (description, mac_address.lower())) + cursor.execute( + "UPDATE users SET description = %s, vlan_id = %s WHERE mac_address = %s", + (description, vlan_id, mac_address.lower()) + ) conn.commit() cursor.close() conn.close() + +# def update_user_description(mac_address, description): +# """Update the description field of a user identified by MAC address.""" +# conn = get_connection() +# cursor = conn.cursor() +# cursor.execute("UPDATE users SET description = %s WHERE mac_address = %s", (description, mac_address.lower())) +# conn.commit() +# cursor.close() +# conn.close() + # Note: This function seems redundant with update_user_description. Included as per instructions. -def update_description(mac_address, description): - """Update the description for a given MAC address in the users table.""" - conn = get_connection() - cursor = conn.cursor() - cursor.execute( - "UPDATE users SET description = %s WHERE mac_address = %s", - (description, mac_address.lower()) - ) - conn.commit() - cursor.close() - conn.close() +# def update_description(mac_address, description): +# """Update the description for a given MAC address in the users table.""" +# conn = get_connection() +# cursor = conn.cursor() +# cursor.execute( +# "UPDATE users SET description = %s WHERE mac_address = %s", +# (description, mac_address.lower()) +# ) +# conn.commit() +# cursor.close() +# conn.close() -def update_user_vlan(mac_address, vlan_id): - """Update the VLAN ID for a given MAC address in the users table.""" - conn = get_connection() - cursor = conn.cursor() - cursor.execute("UPDATE users SET vlan_id = %s WHERE mac_address = %s", (vlan_id, mac_address.lower())) - conn.commit() - cursor.close() - conn.close() +# def update_user_vlan(mac_address, vlan_id): +# """Update the VLAN ID for a given MAC address in the users table.""" +# conn = get_connection() +# cursor = conn.cursor() +# cursor.execute("UPDATE users SET vlan_id = %s WHERE mac_address = %s", (vlan_id, mac_address.lower())) +# conn.commit() +# cursor.close() +# conn.close() -# Note: This function seems redundant with update_user_vlan. Included as per instructions. -def update_vlan(mac_address, vlan_id): - """Update the VLAN ID for a given MAC address in the users table.""" - conn = get_connection() - cursor = conn.cursor() - cursor.execute( - "UPDATE users SET vlan_id = %s WHERE mac_address = %s", - (vlan_id, mac_address.lower()) - ) - conn.commit() - cursor.close() - conn.close() +# # Note: This function seems redundant with update_user_vlan. Included as per instructions. +# def update_vlan(mac_address, vlan_id): +# """Update the VLAN ID for a given MAC address in the users table.""" +# conn = get_connection() +# cursor = conn.cursor() +# cursor.execute( +# "UPDATE users SET vlan_id = %s WHERE mac_address = %s", +# (vlan_id, mac_address.lower()) +# ) +# conn.commit() +# cursor.close() +# conn.close() def delete_user(mac_address): """Remove a user from the database by their MAC address.""" diff --git a/app/templates/user_list.html b/app/templates/user_list.html index 593ad26..e46fdee 100644 --- a/app/templates/user_list.html +++ b/app/templates/user_list.html @@ -31,31 +31,28 @@ {{ entry.mac_address }} - -
+ + + - {{ entry.vendor or "..." }} - - - -
+ - +
diff --git a/app/views/user_views.py b/app/views/user_views.py index 2925092..bbf662f 100644 --- a/app/views/user_views.py +++ b/app/views/user_views.py @@ -1,5 +1,13 @@ from flask import Blueprint, render_template, request, redirect, url_for, flash -from db_interface import get_all_users, get_all_groups, add_user, update_description, update_vlan, delete_user, refresh_vendors, get_user_by_mac +from db_interface import ( + get_all_users, + get_all_groups, + add_user, + update_user, + delete_user, + refresh_vendors, + get_user_by_mac +) user = Blueprint('user', __name__, url_prefix='/user') @@ -19,21 +27,28 @@ def add(): add_user(mac, desc, group_id) return redirect(url_for('user.user_list')) - -@user.route('/update_description', methods=['POST']) -def update_description_route(): +@user.route('/update_user', methods=['POST']) +def update_user_route(): mac = request.form['mac_address'] desc = request.form.get('description', '') - update_description(mac, desc) + vlan_id = request.form['group_id'] + update_user(mac, desc, vlan_id) return redirect(url_for('user.user_list')) +# @user.route('/update_description', methods=['POST']) +# def update_description_route(): +# mac = request.form['mac_address'] +# desc = request.form.get('description', '') +# update_description(mac, desc) +# return redirect(url_for('user.user_list')) -@user.route('/update_vlan', methods=['POST']) -def update_vlan_route(): - mac = request.form['mac_address'] - group_id = request.form['group_id'] - update_vlan(mac, group_id) - return redirect(url_for('user.user_list')) + +# @user.route('/update_vlan', methods=['POST']) +# def update_vlan_route(): +# mac = request.form['mac_address'] +# group_id = request.form['group_id'] +# update_vlan(mac, group_id) +# return redirect(url_for('user.user_list')) @user.route('/delete', methods=['POST']) diff --git a/radius/Dockerfile b/radius/Dockerfile index 1e320b2..c863556 100644 --- a/radius/Dockerfile +++ b/radius/Dockerfile @@ -18,5 +18,7 @@ COPY . . # Expose RADIUS port (UDP) EXPOSE 1812/udp +COPY wait-for-db.py . + # Run the RADIUS service -CMD ["python", "main.py"] +CMD ["sh", "-c", "python wait-for-db.py && python main.py"] diff --git a/radius/wait-for-db.py b/radius/wait-for-db.py new file mode 100644 index 0000000..0b2c2f2 --- /dev/null +++ b/radius/wait-for-db.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python3 +import time +import os +import mysql.connector +from mysql.connector import Error + +host = os.getenv("DB_HOST", "db") +port = int(os.getenv("DB_PORT", "3306")) +user = os.getenv("DB_USER") +password = os.getenv("DB_PASSWORD") +database = os.getenv("DB_NAME") + +timeout = 60 # seconds +start_time = time.time() + +print(f"⏳ Waiting for DB at {host}:{port} to be ready...") + +while True: + try: + conn = mysql.connector.connect( + host=host, + port=port, + user=user, + password=password, + database=database + ) + if conn.is_connected(): + print("✅ Database is ready!") + conn.close() + break + except Error as e: + print(f"🛑 DB not ready yet: {e}") + time.sleep(2) + if time.time() - start_time > timeout: + print("❌ Timeout waiting for the database.") + exit(1)