From 6e7f1432f6f2f3c2cf8cd654e2f539634dcb0cf8 Mon Sep 17 00:00:00 2001 From: Ad Schellevis Date: Fri, 11 Mar 2016 23:07:56 +0100 Subject: [PATCH] refactor diag_routes.php --- src/opnsense/scripts/routes/show_routes.py | 79 ++++ .../conf/actions.d/actions_system.conf | 7 + src/www/diag_routes.php | 345 +++++++----------- 3 files changed, 219 insertions(+), 212 deletions(-) create mode 100755 src/opnsense/scripts/routes/show_routes.py diff --git a/src/opnsense/scripts/routes/show_routes.py b/src/opnsense/scripts/routes/show_routes.py new file mode 100755 index 0000000000..767ccca789 --- /dev/null +++ b/src/opnsense/scripts/routes/show_routes.py @@ -0,0 +1,79 @@ +#!/usr/local/bin/python2.7 + +""" + Copyright (c) 2016 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. + + -------------------------------------------------------------------------------------- + returns the system routing table +""" +import tempfile +import subprocess +import os +import sys +import ujson + +if __name__ == '__main__': + result = [] + fieldnames=[] + with tempfile.NamedTemporaryFile() as output_stream: + if '-n' in sys.argv: + resolv = '-n' + else: + resolv = '' + subprocess.call(['/usr/bin/netstat', '-rW', resolv], stdout=output_stream, stderr=open(os.devnull, 'wb')) + output_stream.seek(0) + current_proto = "" + for line in output_stream.read().strip().split('\n'): + fields = line.split() + if len(fields) == 0: + continue + elif len(fields) == 1 and fields[0] == 'Internet:': + current_proto = 'ipv4' + elif len(fields) == 1 and fields[0] == 'Internet6:': + current_proto = 'ipv6' + elif len(fields) > 2 and fields[0] == 'Destination' and fields[1] == 'Gateway': + fieldnames = map(lambda x : x.lower(), fields) + elif len(fields) > 2: + record = {'proto': current_proto} + for fieldid in range(len(fields)): + if len(fieldnames) > fieldid: + record[fieldnames[fieldid]] = fields[fieldid] + # space out missing fields + for fieldname in fieldnames: + if fieldname not in record: + record[fieldname] = "" + result.append(record) + + # handle command line argument (type selection) + if len(sys.argv) > 1 and 'json' in sys.argv: + print(ujson.dumps(result)) + else: + # output plain + print ('\t\t'.join(fieldnames)) + frmt = "%(proto)s\t" + for fieldname in fieldnames: + frmt = frmt + "%("+fieldname+")s\t" + for record in result: + print (frmt%record) diff --git a/src/opnsense/service/conf/actions.d/actions_system.conf b/src/opnsense/service/conf/actions.d/actions_system.conf index e8813849ab..2f3379f66c 100644 --- a/src/opnsense/service/conf/actions.d/actions_system.conf +++ b/src/opnsense/service/conf/actions.d/actions_system.conf @@ -3,3 +3,10 @@ command:/usr/local/opnsense/scripts/systemhealth/activity.py parameters:%s type:script_output message:show system activity + +[routes.list] +command:/usr/local/opnsense/scripts/routes/show_routes.py +parameters:%s %s +type:script_output +message:show system routing table + diff --git a/src/www/diag_routes.php b/src/www/diag_routes.php index 71eae1551e..20a5f00edb 100644 --- a/src/www/diag_routes.php +++ b/src/www/diag_routes.php @@ -1,240 +1,161 @@ 0) - $netstat .= " | /usr/bin/head -n {$_REQUEST['limit']}"; - - echo htmlspecialchars_decode(shell_exec($netstat)); - - exit; +if ($_SERVER['REQUEST_METHOD'] === 'POST') { + if (empty($_POST['resolve'])) { + $resolve = '-n'; + } else { + $resolve = ''; + } + echo configd_run("system routes list {$resolve} json"); + exit; } include('head.inc'); - ?> + + - - - - -
-
-
- -
- - 0) print_input_errors($input_errors); ?> - -
-
-
- - - - - - - - - - - - - - - - - - - - -
/>  -


-

-
-

-
- -

-
  - " /> -
-
-
-
-
- -
- -
- -
-

IPv4

-
- - - - - -
-
-
- -
- -
- -
-

IPv6

-
- - - - - -
-
-
-
-
+
+
+
+
+
+ + + + + + + + + + + + + + + +
+ + +

+ + +
+ +
+
+

+
+ " /> +
+
+
+ + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
- - +include('foot.inc');?>