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');
-
?>
+
+
+ =gettext("Enable this to attempt to resolve names when displaying the tables.");?>
+ = gettext('Note:') ?> =gettext("By enabling name resolution, the query should take a bit longer. You can stop it at any time by clicking the Stop button in your browser.");?>
+
+
+