From 6d2fa2b14506bda780f3f7692b4963e751edcd07 Mon Sep 17 00:00:00 2001 From: Ad Schellevis Date: Sun, 28 May 2017 11:46:39 +0200 Subject: [PATCH] add missing file, https://github.com/opnsense/core/issues/1662 --- src/opnsense/scripts/filter/list_counters.py | 81 ++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100755 src/opnsense/scripts/filter/list_counters.py diff --git a/src/opnsense/scripts/filter/list_counters.py b/src/opnsense/scripts/filter/list_counters.py new file mode 100755 index 000000000..a7d88815b --- /dev/null +++ b/src/opnsense/scripts/filter/list_counters.py @@ -0,0 +1,81 @@ +#!/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 pf byte/packet counter +""" +import tempfile +import subprocess +import os +import sys +import ujson + +if __name__ == '__main__': + result = dict() + with tempfile.NamedTemporaryFile() as output_stream: + subprocess.call(['/sbin/pfctl', '-vvsI'], stdout=output_stream, stderr=open(os.devnull, 'wb')) + output_stream.seek(0) + data = output_stream.read().strip() + intf = None + for line in data.split('\n'): + if line.find('[') == -1 and line[0] not in (' ', '\t'): + intf = line.strip() + result[intf] = {'inbytespass': 0, 'outbytespass': 0, 'inpktspass': 0, 'outpktspass': 0, + 'inbytesblock': 0, 'outbytesblock': 0, 'inpktsblock': 0, 'outpktsblock': 0, + 'inpkts':0, 'inbytes': 0, 'outpkts': 0, 'outbytes': 0} + if intf is not None and line.find('[') > -1: + packets = int(line.split(' Packets:')[-1].strip().split()[0]) + bytes = int(line.split(' Bytes:')[-1].strip().split()[0]) + if line.find('In4/Pass:') > -1 or line.find('In6/Pass:') > -1: + result[intf]['inpktspass'] += packets + result[intf]['inbytespass'] += bytes + result[intf]['inpkts'] += packets + result[intf]['inbytes'] += bytes + elif line.find('In4/Block:') > -1 or line.find('In6/Block:') > -1: + result[intf]['inbytesblock'] += packets + result[intf]['inpktsblock'] += bytes + result[intf]['inpkts'] += packets + result[intf]['inbytes'] += bytes + elif line.find('Out4/Pass:') > -1 or line.find('Out6/Pass:') > -1: + result[intf]['outpktspass'] += packets + result[intf]['outbytespass'] += bytes + result[intf]['outpkts'] += packets + result[intf]['outbytes'] += bytes + elif line.find('Out4/Block:') > -1 or line.find('Out6/Block:') > -1: + result[intf]['outpktsblock'] += packets + result[intf]['outbytesblock'] += bytes + result[intf]['outpkts'] += packets + result[intf]['outbytes'] += bytes + + # handle command line argument (type selection) + if len(sys.argv) > 1 and sys.argv[1] == 'json': + print(ujson.dumps(result)) + else: + # output plain + print ('------------------------- COUNTERS -------------------------') + for intf in result: + print ('[%s] %s' % (intf, unicode(result[intf])))