From 8f8945bea6f3ceec0b070d6ad11e0d0dc56aec0e Mon Sep 17 00:00:00 2001 From: Halcy0nic Date: Wed, 4 Sep 2024 13:28:07 -0600 Subject: [PATCH] Chore: Removing Debug Info and changing gateway logic --- app.py | 121 ++++++++++++++++++++++++++++++--------------------------- 1 file changed, 63 insertions(+), 58 deletions(-) diff --git a/app.py b/app.py index 8acb3b3..54b712d 100644 --- a/app.py +++ b/app.py @@ -13,6 +13,7 @@ import ipaddress from io import StringIO, BytesIO import csv import serial.tools.list_ports +from ipaddress import ip_address, AddressValueError app = Flask(__name__) socketio = SocketIO(app) @@ -39,7 +40,6 @@ gateway_ips = { frequency = lambda port: {'port1': 433, 'port2': 868,'port3': 915}.get(port, None) surveydata = {} parsed_entries = set() -gateways_configured = False def read_serial_data(port, ser, buffer): global surveydata @@ -111,15 +111,22 @@ def convert_dict_to_csv(data): output.seek(0) return output +def is_valid_ip(ip): + try: + ip_address(ip) + return True + except AddressValueError: + return False def parse_and_store_data(): global surveydata global parsed_entries global gateway_ips - global gateways_configured # Include the port number (8000) in your gateway URLs gateway_urls = [ - f"http://{gateway_ips[f'gateway{i}']}:8000/cgi-bin/log-traffic.has" for i in range(1, 11) if gateway_ips[f'gateway{i}'] + f"http://{gateway_ips[f'gateway{i}']}:8000/cgi-bin/log-traffic.has" + for i in range(1, 11) + if gateway_ips[f'gateway{i}'] and is_valid_ip(gateway_ips[f'gateway{i}']) ] headers = { @@ -133,60 +140,63 @@ def parse_and_store_data(): "Connection": "keep-alive", "Upgrade-Insecure-Requests": "1" } - if gateways_configured: - for url in gateway_urls: - try: - response = requests.get(url, headers=headers, timeout=10) - if response.status_code == 200: - soup = BeautifulSoup(response.text, 'html.parser') - table = soup.find('table') - if table: - rows = table.find_all('tr')[1:] # Skip the header row - - for row in rows: - # Skip hidden rows in this iteration - if row.get('style') == 'display: none;': - continue - - cells = row.find_all('td') - if not cells: - continue - - # Prepare formatted_row from visible cells, skipping the first cell for Chevron icon - formatted_row = ' | '.join(cell.text.strip() for cell in cells[1:]) - - # Extract dev_id and freq from the visible row - dev_id = extract_dev_id(formatted_row) - freq = extract_freq(formatted_row) - # Extract RSSI from the next hidden row - hidden_row = row.find_next_sibling('tr') - if hidden_row and 'display: none;' in hidden_row.get('style', ''): - hidden_data = hidden_row.td.text.strip() - rssi_match = re.search(r'"Rssi":(-?\d+)', hidden_data) - if rssi_match: - rssi = int(rssi_match.group(1)) - else: - rssi = None + for url in gateway_urls: + try: + print(f"Fetching data from {url}") + response = requests.get(url, headers=headers, timeout=10) + print(f"Status code: {response.status_code}") + if response.status_code == 200: + soup = BeautifulSoup(response.text, 'html.parser') + table = soup.find('table') + if table: + rows = table.find_all('tr')[1:] # Skip the header row + + for row in rows: + # Skip hidden rows in this iteration + if row.get('style') == 'display: none;': + continue + + cells = row.find_all('td') + if not cells: + continue + + # Prepare formatted_row from visible cells, skipping the first cell for Chevron icon + formatted_row = ' | '.join(cell.text.strip() for cell in cells[1:]) + + # Extract dev_id and freq from the visible row + dev_id = extract_dev_id(formatted_row) + freq = extract_freq(formatted_row) + + # Extract RSSI from the next hidden row + hidden_row = row.find_next_sibling('tr') + if hidden_row and 'display: none;' in hidden_row.get('style', ''): + hidden_data = hidden_row.td.text.strip() + rssi_match = re.search(r'"Rssi":(-?\d+)', hidden_data) + if rssi_match: + rssi = int(rssi_match.group(1)) else: rssi = None + else: + rssi = None - # Save data into the surveydata structure - if dev_id and freq is not None: - entry_identifier = f"{dev_id}_{freq}_{formatted_row}" - if entry_identifier not in parsed_entries: - parsed_entries.add(entry_identifier) - if dev_id not in surveydata: - surveydata[dev_id] = [] - surveydata[dev_id].append([freq, rssi, formatted_row]) + # Save data into the surveydata structure + if dev_id and freq is not None: + entry_identifier = f"{dev_id}_{freq}_{formatted_row}" + if entry_identifier not in parsed_entries: + parsed_entries.add(entry_identifier) + if dev_id not in surveydata: + surveydata[dev_id] = [] + surveydata[dev_id].append([freq, rssi, formatted_row]) + + print(f"Data parsed and stored from {url}.") + else: + print(f"Request to {url} failed with status code: {response.status_code}") + except Exception as e: + print(f"An error occurred while processing {url}: {e}") + # Schedule the next call to this function + Timer(30, parse_and_store_data).start() # Call this function every 30 seconds - print(f"Data parsed and stored from {url}.") - else: - print(f"Request to {url} failed with status code: {response.status_code}") - except Exception as e: - print(f"An error occurred while processing {url}: {e}") - # Schedule the next call to this function - Timer(30, parse_and_store_data).start() # Call this function every 30 seconds def extract_dev_id(formatted_row): @@ -406,24 +416,19 @@ def get_table_data(): @app.route('/set_gateways', methods=['POST']) def set_gateways(): global gateway_ips - global gateways_configured # Add this line data = request.form for key in [f'gateway{i}' for i in range(1, 11)]: input_ip = data.get(key, '').strip() - if input_ip: # Proceed only if the input is not empty + if input_ip: try: - # Validate the IP address ipaddress.ip_address(input_ip) - # Update the IP address if valid gateway_ips[key] = input_ip except ValueError: - # Return an error if the IP address is invalid return jsonify({"error": f"Invalid IP address provided for {key}"}), 400 for gateway, ip_address in gateway_ips.items(): print(f"Gateway {gateway} has IP address: {ip_address}") - gateways_configured = True # Set the flag to True after configuring gateways return jsonify({"message": "Gateway IPs updated successfully"}), 200