From 3b3ebbbec2730de3eace49e7c9fcf3a9c2a90238 Mon Sep 17 00:00:00 2001 From: Ad Schellevis Date: Sun, 28 May 2017 14:30:21 +0200 Subject: [PATCH] another blob of madness in status_interfaces.php, for https://github.com/opnsense/core/issues/1662 --- .../scripts/system/list_interrupts.py | 73 +++++++++++++++++++ .../conf/actions.d/actions_system.conf | 7 ++ src/www/status_interfaces.php | 21 ++---- 3 files changed, 86 insertions(+), 15 deletions(-) create mode 100755 src/opnsense/scripts/system/list_interrupts.py diff --git a/src/opnsense/scripts/system/list_interrupts.py b/src/opnsense/scripts/system/list_interrupts.py new file mode 100755 index 000000000..13afa2926 --- /dev/null +++ b/src/opnsense/scripts/system/list_interrupts.py @@ -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'] + )) diff --git a/src/opnsense/service/conf/actions.d/actions_system.conf b/src/opnsense/service/conf/actions.d/actions_system.conf index d2a8bab51..faee2c394 100644 --- a/src/opnsense/service/conf/actions.d/actions_system.conf +++ b/src/opnsense/service/conf/actions.d/actions_system.conf @@ -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 + diff --git a/src/www/status_interfaces.php b/src/www/status_interfaces.php index bfa4be29b..8904a6f15 100644 --- a/src/www/status_interfaces.php +++ b/src/www/status_interfaces.php @@ -65,6 +65,7 @@ include("head.inc"); $ifname): $ifinfo = $ifsinfo[$ifdescr]; @@ -436,31 +437,21 @@ include("head.inc"); + 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'];?> "; - printf(gettext("%s rate"),$interrupt_sec); + printf(gettext("%s rate"),$interrupt_rate); ?>