new_functions_and_fixes #1

Merged
gru merged 33 commits from new_functions_and_fixes into master 2025-11-03 14:35:20 +01:00
2 changed files with 60 additions and 18 deletions
Showing only changes of commit 7a33291342 - Show all commits

View File

@@ -124,12 +124,10 @@
<div class="row g-3 mb-3 d-none" id="ssl_fields"> <div class="row g-3 mb-3 d-none" id="ssl_fields">
<div class="col-md-12"> <div class="col-md-12">
<label for="ssl_cert_path" class="form-label">SSL Certificate Path <label for="ssl_cert_path" class="form-label">SSL Certificate Path</label>
<small>Upload certs in /ssl/</small></label>
<input type="text" class="form-control" id="ssl_cert_path" name="ssl_cert_path" <input type="text" class="form-control" id="ssl_cert_path" name="ssl_cert_path"
value="/app/ssl/haproxy-configurator.pem"> value="/app/ssl/haproxy-configurator.pem">
<div class="form-text">Full path to .pem file</div> <div class="form-text">Full path to .pem file, upload certs in /ssl/</div>
</div> </div>
<div class="col-md-12"> <div class="col-md-12">
<div class="form-check"> <div class="form-check">

View File

@@ -13,18 +13,62 @@ def fetch_haproxy_stats():
def parse_haproxy_stats(stats_data): def parse_haproxy_stats(stats_data):
data = [] data = []
header_row = stats_data.splitlines()[0].replace('# ', '')
reader = csv.DictReader(stats_data.splitlines(), fieldnames=header_row.split(',')) # Skip empty lines and get header
next(reader) lines = [line for line in stats_data.splitlines() if line.strip()]
for row in reader: if not lines:
if row['svname'] != 'BACKEND': return data
data.append({
'frontend_name': row['pxname'], header_row = lines[0].replace('# ', '')
'server_name': row['svname'],
'4xx_errors': row['hrsp_4xx'], # Parse CSV
'5xx_errors': row['hrsp_5xx'], reader = csv.DictReader(lines, fieldnames=header_row.split(','))
'bytes_in_mb': f'{float(row["bin"]) / (1024 * 1024):.2f}', next(reader) # Skip header
'bytes_out_mb': f'{float(row["bout"]) / (1024 * 1024):.2f}',
'conn_tot': row['conn_tot'], for row in reader:
}) # 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 return data