From 0f84667e37c9a819abb5a00030dd3a490c4315cc Mon Sep 17 00:00:00 2001 From: kulikov-a <36099472+kulikov-a@users.noreply.github.com> Date: Tue, 13 Sep 2022 17:42:17 +0300 Subject: [PATCH 1/2] parse pftop internal data conversion --- .../views/OPNsense/Diagnostics/fw_pftop.volt | 4 ++-- src/opnsense/scripts/filter/lib/states.py | 23 ++++++++++++++++--- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/opnsense/mvc/app/views/OPNsense/Diagnostics/fw_pftop.volt b/src/opnsense/mvc/app/views/OPNsense/Diagnostics/fw_pftop.volt index 74b9bcde0..c7483c2b6 100644 --- a/src/opnsense/mvc/app/views/OPNsense/Diagnostics/fw_pftop.volt +++ b/src/opnsense/mvc/app/views/OPNsense/Diagnostics/fw_pftop.volt @@ -64,9 +64,9 @@ bytes: function(column, row) { if (!isNaN(row[column.id]) && row[column.id] > 0) { let fileSizeTypes = ["", "K", "M", "G", "T", "P", "E", "Z", "Y"]; - let ndx = Math.floor(Math.log(row[column.id]) / Math.log(1000) ); + let ndx = Math.floor(Math.log(row[column.id]) / Math.log(1024) ); if (ndx > 0) { - return (row[column.id] / Math.pow(1000, ndx)).toFixed(2) + ' ' + fileSizeTypes[ndx]; + return (row[column.id] / Math.pow(1024, ndx)).toFixed(2) + ' ' + fileSizeTypes[ndx]; } else { return row[column.id].toFixed(2); } diff --git a/src/opnsense/scripts/filter/lib/states.py b/src/opnsense/scripts/filter/lib/states.py index 2c7621850..eb2e43da3 100755 --- a/src/opnsense/scripts/filter/lib/states.py +++ b/src/opnsense/scripts/filter/lib/states.py @@ -190,11 +190,21 @@ def query_top(rule_label, filter_str): else: idx = 4 + pows = { + 'K': 1, + 'M': 2, + 'G': 3, + } + time_marks = { + 'm': 60, + 'h': 3600, + 'd': 86400, + } record['state'] = parts[idx] record['age'] = parts[idx+1] record['expire'] = parts[idx+2] record['pkts'] = int(parts[idx+3]) if parts[idx+3].isdigit() else 0 - record['bytes'] = int(parts[idx+4]) if parts[idx+4].isdigit() else 0 + record['bytes'] = int(parts[idx+4]) if parts[idx+4].isdigit() else 0 if parts[idx+4] == '*' else int(parts[idx+4][:-1])*pow(1024, pows[parts[idx+4][-1]]) record['avg'] = int(parts[idx+5]) if parts[idx+5].isdigit() else 0 record['rule'] = parts[idx+6] if record['rule'] in rule_labels: @@ -204,8 +214,15 @@ def query_top(rule_label, filter_str): record['label'] = None record['descr'] = None for timefield in ['age', 'expire']: - tmp = record[timefield].split(':') - record[timefield] = int(tmp[0]) * 3600 + int(tmp[1]) * 60 + int(tmp[2]) if len(tmp) > 2 else 0 + if ':' in record[timefield]: + tmp = record[timefield].split(':') + record[timefield] = int(tmp[0]) * 3600 + int(tmp[1]) * 60 + int(tmp[2]) if len(tmp) > 2 else 0 + elif record[timefield].isdigit(): + record[timefield] = int(record[timefield]) + elif any(time_mark in record[timefield] for time_mark in list(time_marks.keys())): + record[timefield] = int(record[timefield][:-1])*time_marks[record[timefield][-1]] + else: + record[timefield] = 0 search_line = " ".join(str(item) for item in filter(None, record.values())) if rule_label != "" and record['label'].lower().find(rule_label) == -1: From f22c05ec61fa429b29e5d16e289ec3945d3ac78c Mon Sep 17 00:00:00 2001 From: Ad Schellevis Date: Wed, 14 Sep 2022 11:13:55 +0200 Subject: [PATCH 2/2] Firewall/Diagnostics/Sessions: parse pftop internal data conversion (minor cleanups for https://github.com/opnsense/core/pull/6020) --- src/opnsense/scripts/filter/lib/states.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/opnsense/scripts/filter/lib/states.py b/src/opnsense/scripts/filter/lib/states.py index eb2e43da3..b4f1750b4 100755 --- a/src/opnsense/scripts/filter/lib/states.py +++ b/src/opnsense/scripts/filter/lib/states.py @@ -204,7 +204,12 @@ def query_top(rule_label, filter_str): record['age'] = parts[idx+1] record['expire'] = parts[idx+2] record['pkts'] = int(parts[idx+3]) if parts[idx+3].isdigit() else 0 - record['bytes'] = int(parts[idx+4]) if parts[idx+4].isdigit() else 0 if parts[idx+4] == '*' else int(parts[idx+4][:-1])*pow(1024, pows[parts[idx+4][-1]]) + if parts[idx+4].isdigit(): + record['bytes'] = int(parts[idx+4]) + elif parts[idx+4][:-1].isdigit() and parts[idx+4][-1] in pows: + record['bytes'] = int(parts[idx+4][:-1])*pow(1024, pows[parts[idx+4][-1]]) + else: + record['bytes'] = 0 record['avg'] = int(parts[idx+5]) if parts[idx+5].isdigit() else 0 record['rule'] = parts[idx+6] if record['rule'] in rule_labels: @@ -219,7 +224,7 @@ def query_top(rule_label, filter_str): record[timefield] = int(tmp[0]) * 3600 + int(tmp[1]) * 60 + int(tmp[2]) if len(tmp) > 2 else 0 elif record[timefield].isdigit(): record[timefield] = int(record[timefield]) - elif any(time_mark in record[timefield] for time_mark in list(time_marks.keys())): + elif record[timefield][-1] in time_marks and record[timefield][:-1].isdigit(): record[timefield] = int(record[timefield][:-1])*time_marks[record[timefield][-1]] else: record[timefield] = 0