diff --git a/src/opnsense/mvc/app/controllers/OPNsense/Diagnostics/Api/InterfaceController.php b/src/opnsense/mvc/app/controllers/OPNsense/Diagnostics/Api/InterfaceController.php
index d4edce5fc..611e1d3ff 100644
--- a/src/opnsense/mvc/app/controllers/OPNsense/Diagnostics/Api/InterfaceController.php
+++ b/src/opnsense/mvc/app/controllers/OPNsense/Diagnostics/Api/InterfaceController.php
@@ -154,4 +154,22 @@ class InterfaceController extends ApiControllerBase
}
return $routingtable;
}
+
+ /**
+ * drop route
+ * @return mixed
+ */
+ public function delRouteAction()
+ {
+ if ($this->request->isPost() && $this->request->hasPost("destination")
+ && $this->request->hasPost("gateway")) {
+ $backend = new Backend();
+ $dest = $this->request->getPost("destination", "striptags", null);
+ $gw = $this->request->getPost("gateway", "striptags", null);
+ $response = trim($backend->configdpRun("interface route del", array($dest, $gw)));
+ return array("message" => $response);
+ } else {
+ return array("message" => "error");
+ }
+ }
}
diff --git a/src/opnsense/mvc/app/views/OPNsense/Diagnostics/routes.volt b/src/opnsense/mvc/app/views/OPNsense/Diagnostics/routes.volt
index 0771db944..1788e76f6 100644
--- a/src/opnsense/mvc/app/views/OPNsense/Diagnostics/routes.volt
+++ b/src/opnsense/mvc/app/views/OPNsense/Diagnostics/routes.volt
@@ -31,8 +31,16 @@ POSSIBILITY OF SUCH DAMAGE.
var gridopt = {
ajax: false,
selection: false,
- multiSelect: false
+ multiSelect: false,
+ formatters: {
+ "commands": function (column, row) {
+ return "";
+ }
+ }
};
+
$("#grid-routes").bootgrid('destroy');
$("#grid-routes").bootgrid(gridopt);
@@ -61,7 +69,21 @@ POSSIBILITY OF SUCH DAMAGE.
html.push(tr_str);
});
$("#grid-routes > tbody").html(html.join(''));
- $("#grid-routes").bootgrid(gridopt);
+ var grid = $("#grid-routes").bootgrid(gridopt).on("loaded.rs.jquery.bootgrid", function(){
+ grid.find(".command-delete").on("click", function(e){
+ let route=$(this).data("row-id").split(',');
+ stdDialogConfirm('{{ lang._('Remove static route') }}' + ' ('+$(this).data("row-id")+')',
+ '{{ lang._('Are you sure you want to remove this route? Caution, this could potentially lead to loss of connectivity') }}',
+ '{{ lang._('Yes') }}',
+ '{{ lang._('No') }}',
+ function() {
+ ajaxCall('/api/diagnostics/interface/delRoute/', {'destination': route[0], 'gateway': route[1]},function(data,status){
+ // reload grid after delete
+ $("#update").click();
+ });
+ });
+ });
+ });
}
$('#processing-dialog').modal('hide');
}
@@ -90,6 +112,7 @@ POSSIBILITY OF SUCH DAMAGE.
{{ lang._('Netif') }}
{{ lang._('Netif (name)') }}
{{ lang._('Expire') }}
+
{{ lang._('Action') }}
diff --git a/src/opnsense/scripts/routes/del_route.py b/src/opnsense/scripts/routes/del_route.py
new file mode 100755
index 000000000..0d9cfd6b2
--- /dev/null
+++ b/src/opnsense/scripts/routes/del_route.py
@@ -0,0 +1,54 @@
+#!/usr/local/bin/python3
+
+"""
+ Copyright (c) 2019 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.
+
+ --------------------------------------------------------------------------------------
+ manually delete a static route, when found in the routing table (by number or name)
+"""
+import subprocess
+import sys
+import ujson
+import argparse
+
+if __name__ == '__main__':
+ # parse input arguments
+ parser = argparse.ArgumentParser()
+ parser.add_argument('--destination', help='destination', required=True)
+ parser.add_argument('--gateway', help='gateway', required=True)
+ inputargs = parser.parse_args()
+
+ for flags in ['-rWn', '-rW']:
+ sp = subprocess.run(['/usr/bin/netstat', flags], capture_output=True, text=True)
+ for line in sp.stdout.split("\n"):
+ parts = line.split()
+ if len(parts) > 2 and parts[0] == inputargs.destination and parts[1] == inputargs.gateway:
+ # route entry found, try to delete
+ print ("found")
+ subprocess.run(['/sbin/route', 'delete', parts[0], parts[1]], capture_output=True)
+ sys.exit(0)
+
+ # not found
+ print ("not_found")
diff --git a/src/opnsense/service/conf/actions.d/actions_interface.conf b/src/opnsense/service/conf/actions.d/actions_interface.conf
index 76016e00f..cc58113de 100644
--- a/src/opnsense/service/conf/actions.d/actions_interface.conf
+++ b/src/opnsense/service/conf/actions.d/actions_interface.conf
@@ -82,6 +82,13 @@ command: /usr/local/etc/rc.routing_configure
message: Reconfiguring routing
type: script
+[route.del]
+command: /usr/local/opnsense/scripts/routes/del_route.py
+parameters: --destination %s --gateway %s
+message: Remove route %s %s
+type: script_output
+
+
[gateways.list]
command:/usr/local/opnsense/scripts/routes/gateways.php
type:script_output