mirror of
https://github.com/lucaspalomodevelop/core.git
synced 2026-03-17 18:14:42 +00:00
another blob of madness in status_interfaces.php, for https://github.com/opnsense/core/issues/1662
This commit is contained in:
parent
17a9a26398
commit
3b3ebbbec2
73
src/opnsense/scripts/system/list_interrupts.py
Executable file
73
src/opnsense/scripts/system/list_interrupts.py
Executable file
@ -0,0 +1,73 @@
|
||||
#!/usr/local/bin/python2.7
|
||||
|
||||
"""
|
||||
Copyright (c) 2017 Ad Schellevis
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
||||
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
--------------------------------------------------------------------------------------
|
||||
list device interrupts stats
|
||||
"""
|
||||
import tempfile
|
||||
import subprocess
|
||||
import os
|
||||
import sys
|
||||
import ujson
|
||||
|
||||
if __name__ == '__main__':
|
||||
result = dict()
|
||||
with tempfile.NamedTemporaryFile() as output_stream:
|
||||
subprocess.call(['/usr/bin/vmstat', '-i'], stdout=output_stream, stderr=open(os.devnull, 'wb'))
|
||||
output_stream.seek(0)
|
||||
data = output_stream.read().strip()
|
||||
intf = None
|
||||
interrupts = dict()
|
||||
interrupt_map = dict()
|
||||
for line in data.split('\n'):
|
||||
if line.find(':') > -1:
|
||||
intrp = line.split(':')[0].strip()
|
||||
parts = line.split(':')[1].split()
|
||||
interrupts[intrp] = {'devices': [], 'total': None, 'rate': None}
|
||||
for part in parts:
|
||||
if not part.isdigit():
|
||||
interrupts[intrp]['devices'].append(part)
|
||||
interrupt_map[part] = intrp
|
||||
elif interrupts[intrp]['total'] is None:
|
||||
interrupts[intrp]['total'] = int(part)
|
||||
else:
|
||||
interrupts[intrp]['rate'] = int(part)
|
||||
result['interrupts'] = interrupts # interrupts as reported by vmstat
|
||||
result['interrupt_map'] = interrupt_map # link device to interrupt
|
||||
|
||||
# handle command line argument (type selection)
|
||||
if len(sys.argv) > 1 and sys.argv[1] == 'json':
|
||||
print(ujson.dumps(result))
|
||||
else:
|
||||
# output plain
|
||||
if 'interrupts' in result:
|
||||
for intr in result['interrupts']:
|
||||
print ('%-10s [%-20s] %-10d %d' % (intr,
|
||||
','.join(result['interrupts'][intr]['devices']),
|
||||
result['interrupts'][intr]['total'],
|
||||
result['interrupts'][intr]['rate']
|
||||
))
|
||||
@ -9,3 +9,10 @@ command:/usr/local/opnsense/scripts/system/ssl_ciphers.py
|
||||
parameters:
|
||||
type:script_output
|
||||
message:list ssl ciphers
|
||||
|
||||
[list.interrupts]
|
||||
command:/usr/local/opnsense/scripts/system/list_interrupts.py
|
||||
parameters: %s
|
||||
type:script_output
|
||||
message:request vmstat interrupt counters
|
||||
|
||||
|
||||
@ -65,6 +65,7 @@ include("head.inc");
|
||||
<?php
|
||||
$mac_man = json_decode(configd_run("interface list macdb json"), true);
|
||||
$pfctl_counters = json_decode(configd_run("filter list counters json"), true);
|
||||
$vmstat_interupts = json_decode(configd_run("system list interrupts json"), true);
|
||||
$ifsinfo = get_interfaces_info();
|
||||
foreach (get_configured_interface_with_descr(false, true) as $ifdescr => $ifname):
|
||||
$ifinfo = $ifsinfo[$ifdescr];
|
||||
@ -436,31 +437,21 @@ include("head.inc");
|
||||
</tr>
|
||||
<?php
|
||||
endif;
|
||||
if(file_exists("/usr/bin/vmstat")):
|
||||
$real_interface = "";
|
||||
$interrupt_total = "";
|
||||
$interrupt_sec = "";
|
||||
$real_interface = $ifinfo['if'];
|
||||
$interrupt_total = `vmstat -i | grep $real_interface | awk '{ print $3 }'`;
|
||||
$interrupt_sec = `vmstat -i | grep $real_interface | awk '{ print $4 }'`;
|
||||
if(strstr($interrupt_total, "hci")) {
|
||||
$interrupt_total = `vmstat -i | grep $real_interface | awk '{ print $4 }'`;
|
||||
$interrupt_sec = `vmstat -i | grep $real_interface | awk '{ print $5 }'`;
|
||||
}
|
||||
unset($interrupt_total); // XXX: FIX ME! Need a regex and parse correct data 100% of the time.
|
||||
if($interrupt_total): ?>
|
||||
if (!empty($vmstat_interupts['interrupt_map'][$ifinfo['if']])):
|
||||
$intrpt = $vmstat_interupts['interrupt_map'][$ifinfo['if']];
|
||||
$interrupt_total = $vmstat_interupts['interrupts'][$intrpt]['total'];
|
||||
$interrupt_rate = $vmstat_interupts['interrupts'][$intrpt]['rate'];?>
|
||||
<tr>
|
||||
<td><?= gettext("Interrupts per Second") ?></td>
|
||||
<td>
|
||||
<?php
|
||||
printf(gettext("%s total"),$interrupt_total);
|
||||
echo "<br />";
|
||||
printf(gettext("%s rate"),$interrupt_sec);
|
||||
printf(gettext("%s rate"),$interrupt_rate);
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
<?php
|
||||
endif;
|
||||
endif; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user