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