From 7a33291342d41b14fcc5d7bfea6bfaacf0d58938 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Gruszczy=C5=84ski?= Date: Mon, 3 Nov 2025 09:52:14 +0100 Subject: [PATCH] new options --- templates/index.html | 6 ++-- utils/stats_utils.py | 72 +++++++++++++++++++++++++++++++++++--------- 2 files changed, 60 insertions(+), 18 deletions(-) diff --git a/templates/index.html b/templates/index.html index 5a9ca60..6fdd959 100644 --- a/templates/index.html +++ b/templates/index.html @@ -124,12 +124,10 @@
- - + -
Full path to .pem file
+
Full path to .pem file, upload certs in /ssl/
diff --git a/utils/stats_utils.py b/utils/stats_utils.py index 503baf7..fd0f3b8 100644 --- a/utils/stats_utils.py +++ b/utils/stats_utils.py @@ -13,18 +13,62 @@ def fetch_haproxy_stats(): def parse_haproxy_stats(stats_data): data = [] - header_row = stats_data.splitlines()[0].replace('# ', '') - reader = csv.DictReader(stats_data.splitlines(), fieldnames=header_row.split(',')) - next(reader) + + # Skip empty lines and get header + lines = [line for line in stats_data.splitlines() if line.strip()] + if not lines: + return data + + header_row = lines[0].replace('# ', '') + + # Parse CSV + reader = csv.DictReader(lines, fieldnames=header_row.split(',')) + next(reader) # Skip header + for row in reader: - if row['svname'] != 'BACKEND': - data.append({ - 'frontend_name': row['pxname'], - 'server_name': row['svname'], - '4xx_errors': row['hrsp_4xx'], - '5xx_errors': row['hrsp_5xx'], - 'bytes_in_mb': f'{float(row["bin"]) / (1024 * 1024):.2f}', - 'bytes_out_mb': f'{float(row["bout"]) / (1024 * 1024):.2f}', - 'conn_tot': row['conn_tot'], - }) - return data \ No newline at end of file + # Only process servers, skip BACKEND summary rows + if row.get('svname') == 'BACKEND': + continue + + # Strip whitespace from values + row = {k: v.strip() if isinstance(v, str) else v for k, v in row.items()} + + # Safe conversion to int/float + try: + conn_tot = int(row.get('conn_tot', 0) or 0) + except (ValueError, TypeError): + conn_tot = 0 + + try: + hrsp_4xx = int(row.get('hrsp_4xx', 0) or 0) + except (ValueError, TypeError): + hrsp_4xx = 0 + + try: + hrsp_5xx = int(row.get('hrsp_5xx', 0) or 0) + except (ValueError, TypeError): + hrsp_5xx = 0 + + try: + bin_bytes = float(row.get('bin', 0) or 0) + bytes_in_mb = f'{bin_bytes / (1024 * 1024):.2f}' + except (ValueError, TypeError): + bytes_in_mb = '0.00' + + try: + bout_bytes = float(row.get('bout', 0) or 0) + bytes_out_mb = f'{bout_bytes / (1024 * 1024):.2f}' + except (ValueError, TypeError): + bytes_out_mb = '0.00' + + data.append({ + 'frontend_name': row.get('pxname', 'Unknown'), + 'server_name': row.get('svname', 'Unknown'), + '4xx_errors': hrsp_4xx, + '5xx_errors': hrsp_5xx, + 'bytes_in_mb': bytes_in_mb, + 'bytes_out_mb': bytes_out_mb, + 'conn_tot': conn_tot, # ✅ Teraz INT + }) + + return data