%PDF- %PDF-
Direktori : /backups/router/usr/local/opnsense/mvc/app/views/OPNsense/Diagnostics/ |
Current File : //backups/router/usr/local/opnsense/mvc/app/views/OPNsense/Diagnostics/fw_states.volt |
{# # Copyright (c) 2021 Deciso B.V. # 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. #} <script> 'use strict'; $( document ).ready(function() { /************************************************************************************************************* * link grid actions *************************************************************************************************************/ let grid_states = $("#grid-states").UIBootgrid( { search:'/api/diagnostics/firewall/query_states', del:'/api/diagnostics/firewall/del_state/', options:{ formatters:{ commands: function (column, row) { return '<button type="button" class="btn btn-xs btn-default command-delete bootgrid-tooltip" title="{{ lang._('Drop') }}" data-row-id="' + row.id + '"><span class="fa fa-trash-o fa-fw"></span></button>'; }, rule: function (column, row) { if (row.label !== "") { return "<a target=\"_blank\" href=\"/firewall_rule_lookup.php?rid=" + row.label + "\">"+row[column.id]+"</a>"; } else { return row[column.id]; } }, direction: function (column, row) { if (row[column.id] == 'out') { return "<span class=\"fa fa-arrow-left\" title=\"{{lang._('out')}}\" data-toggle=\"tooltip\"></span>"; } else { return "<span class=\"fa fa-arrow-right\" title=\"{{lang._('in')}}\" data-toggle=\"tooltip\"></span>"; } }, address: function (column, row) { if (row[column.id+"_addr"]) { let addr_txt = row[column.id+"_addr"]; if (addr_txt.includes(":")) { addr_txt = addr_txt + ":[" + row[column.id+"_port"] + "]"; } else { addr_txt = addr_txt + ":" + row[column.id+"_port"]; } return addr_txt; } return ""; } }, requestHandler:function(request){ if ($("#ruleid").val() != "") { request['ruleid'] = $("#ruleid").val(); } return request; }, } } ); grid_states.on('loaded.rs.jquery.bootgrid', function() { $('[data-toggle="tooltip"]').tooltip(); if ($(".search-field").val() !== "" || $("#ruleid").val() !== "") { $("#actKillStates").show(); } else { $("#actKillStates").hide(); } }); // collect rule id's ajaxGet("/api/diagnostics/firewall/list_rule_ids", {}, function(data, status){ if (data.items) { for (let i=0; i < data.items.length ; ++i) { $("#ruleid").append($("<option/>").val(data.items[i]['id']).text(data.items[i]['descr'])); } $("#service_status_container").append($("#ruleid")); $("#ruleid").show(); $("#ruleid").change(function(){ $("#grid-states").bootgrid("reload"); }); $("#ruleid").selectpicker(); let init_state = window.location.hash.substr(1); if (init_state) { $("#ruleid").val(init_state); $("#ruleid").change(); } } }); $("#actKillStates").click(function(){ BootstrapDialog.show({ type:BootstrapDialog.TYPE_DANGER, title: "{{ lang._('Delete all filtered states') }}", message: "{{ lang._('Are you sure you do want to kill all states matching the provided search criteria?') }}", buttons: [{ label: "{{ lang._('No') }}", action: function(dialogRef) { dialogRef.close(); }}, { label: "{{ lang._('Yes') }}", action: function(dialogRef) { let params = {'filter': $(".search-field").val()}; if ($("#ruleid").val() != "") { params['ruleid'] = $("#ruleid").val(); } ajaxCall('/api/diagnostics/firewall/kill_states/', params, function(data, status){ $("#grid-states").bootgrid("reload"); dialogRef.close(); }); } }] }); }); // move kill states button $("div.search.form-group").before($("#actKillStates")); $("#reset_states").click(function(){ BootstrapDialog.show({ type:BootstrapDialog.TYPE_DANGER, title: $("#reset_states").html(), message: $("#msg_statetable").html(), buttons: [{ label: "{{ lang._('Close') }}", action: function(dialogRef) { dialogRef.close(); }}, { label: "{{ lang._('Reset') }}", action: function(dialogRef) { ajaxCall('/api/diagnostics/firewall/flush_states/', {}, function(data, status){ }); dialogRef.close(); } }] }); }); $("#reset_sources").click(function(){ BootstrapDialog.show({ type:BootstrapDialog.TYPE_DANGER, title: $("#reset_sources").html(), message: $("#msg_sourcetracking").html(), buttons: [{ label: "{{ lang._('Close') }}", action: function(dialogRef) { dialogRef.close(); }}, { label: "{{ lang._('Reset') }}", action: function(dialogRef) { ajaxCall('/api/diagnostics/firewall/flush_sources/', {}, function(data, status){ }); dialogRef.close(); } }] }); }); }); </script> <div id="msg_statetable" style="display:none;"> <?=gettext("Resetting the state tables will remove all entries from " . "the corresponding tables. This means that all open connections " . "will be broken and will have to be re-established. This " . "may be necessary after making substantial changes to the " . "firewall and/or NAT rules, especially if there are IP protocol " . "mappings (e.g. for PPTP or IPv6) with open connections."); ?> <br /> <?=gettext("The firewall will normally leave " . "the state tables intact when changing rules."); ?> <br /> <?=gettext('Note: If you reset the firewall state table, the browser ' . 'session may appear to be hung after clicking "Reset". ' . 'Simply refresh the page to continue.'); ?> </div> <div id="msg_sourcetracking" style="display:none;"> <?=gettext("Resetting the source tracking table will remove all source/destination associations. " . "This means that the \"sticky\" source/destination association " . "will be cleared for all clients."); ?><br/><br/> <?=gettext("This does not clear active connection states, only source tracking."); ?> </div> <div style="display:none"> <div class="btn-group" id="actKillStates" style="margin-right:20px; display:none;"> <button class="btn btn-danger" style="cursor: pointer;" data-toggle="tooltip" title="{{ lang._('kill all matched states') }}"> <span class="fa fa-remove"></span> </button> </div> </div> <select id="ruleid" style="display:none" data-size="5" data-live-search="true"> <option value="">{{ lang._("Select rule") }}</option> </select> <ul class="nav nav-tabs" data-tabs="tabs" id="maintabs"> <li class="active"><a data-toggle="tab" href="#categories">{{ lang._('States') }}</a></li> <li><a data-toggle="tab" href="#actions">{{ lang._('Actions') }}</a></li> </ul> <div class="tab-content content-box"> <div id="categories" class="tab-pane fade in active"> <table id="grid-states" class="table table-condensed table-hover table-striped table-responsive" data-editDialog="DialogEdit"> <thead> <tr> <th data-column-id="id" data-type="string" data-sortable="false" data-identifier="true" data-visible="false" >{{ lang._('state id') }}</th> <th data-column-id="interface" data-type="string" data-width="6em">{{ lang._('Int') }}</th> <th data-column-id="direction" data-type="string" data-width="4em" data-formatter="direction">{{ lang._('Dir') }}</th> <th data-column-id="proto" data-type="string" data-width="6em">{{ lang._('Proto') }}</th> <th data-column-id="src" data-type="string" data-formatter="address" data-sortable="false">{{ lang._('Source') }}</th> <th data-column-id="nat" data-type="string" data-formatter="address" data-sortable="false">{{ lang._('Nat') }}</th> <th data-column-id="dst" data-type="string" data-formatter="address" data-sortable="false">{{ lang._('Destination') }}</th> <th data-column-id="gateway" data-type="string" data-sortable="false">{{ lang._('Gateway') }}</th> <th data-column-id="state" data-type="string">{{ lang._('State') }}</th> <th data-column-id="descr" data-type="string" data-formatter="rule">{{ lang._('Rule') }}</th> <th data-column-id="commands" data-width="7em" data-formatter="commands" data-sortable="false">{{ lang._('Commands') }}</th> </tr> </thead> <tbody> </tbody> <tfoot> <tr> <td></td> <td> <button data-action="deleteSelected" type="button" class="btn btn-xs btn-default"><span class="fa fa-trash-o fa-fw"></span></button> </td> </tr> </tfoot> </table> </div> <div id="actions" class="tab-pane fade in"> <table class="table table-condensed"> <thead> <tr> <th>{{ lang._('Action') }}</th> </tr> </thead> <tbody> <tr> <td> <button id="reset_states" type="button" class="btn btn-primary"><span class="fa fa-trash-o fa-fw"></span> {{ lang._('Reset state table') }}</button> </td> </tr> <tr> <td> <button id="reset_sources" type="button" class="btn btn-primary"><span class="fa fa-trash-o fa-fw"></span> {{ lang._('Reset source tracking') }}</button> </td> </tr> </tbody> </table> </div> </div>