mirror of
https://github.com/ntop/ntopng.git
synced 2026-04-30 07:59:35 +00:00
413 lines
14 KiB
Lua
413 lines
14 KiB
Lua
--
|
|
-- (C) 2013-18 - ntop.org
|
|
--
|
|
|
|
dirs = ntop.getDirs()
|
|
package.path = dirs.installdir .. "/scripts/lua/modules/?.lua;" .. package.path
|
|
package.path = dirs.installdir .. "/scripts/lua/pro/modules/?.lua;" .. package.path
|
|
|
|
require "lua_utils"
|
|
require "graph_utils"
|
|
local template = require "template_utils"
|
|
|
|
local host_pools_utils = require "host_pools_utils"
|
|
local template = require "template_utils"
|
|
local presets_utils = require "presets_utils"
|
|
local discover = require "discover_utils"
|
|
|
|
-- Administrator check
|
|
if not isAdministrator() then
|
|
return
|
|
end
|
|
|
|
local page = _GET["page"] or ""
|
|
local policy_filter = _GET["policy_filter"] or ""
|
|
local proto_filter = _GET["l7proto"] or ""
|
|
local device_type = _GET["device_type"] or "0" -- unknown by default
|
|
local category = _GET["category"] or ""
|
|
local is_nedge = ntop.isnEdge()
|
|
|
|
interface.select(ifname)
|
|
|
|
presets_utils.init()
|
|
|
|
local base_url = ""
|
|
if is_nedge then
|
|
base_url = "/lua/pro/nedge/admin/nf_edit_user.lua"
|
|
else
|
|
base_url = "/lua/admin/edit_device_protocols.lua"
|
|
end
|
|
|
|
-- ###################################################################
|
|
|
|
local page_params = {}
|
|
local filter_msg = ""
|
|
|
|
page_params["page"] = page
|
|
|
|
if not isEmptyString(policy_filter) then
|
|
page_params["policy_filter"] = policy_filter
|
|
local action = presets_utils.actionIDToAction(policy_filter)
|
|
filter_msg = action.text
|
|
end
|
|
|
|
if not isEmptyString(category) then
|
|
page_params["category"] = category
|
|
filter_msg = filter_msg.." "..category
|
|
end
|
|
|
|
|
|
if not isEmptyString(proto_filter) then
|
|
page_params["l7proto"] = proto_filter
|
|
end
|
|
|
|
if not isEmptyString(device_type) then
|
|
page_params["device_type"] = device_type
|
|
end
|
|
|
|
-- ###################################################################
|
|
|
|
function editDeviceProtocols()
|
|
local reload = false
|
|
for k,v in pairs(_POST) do
|
|
if starts(k, "client_policy_") then
|
|
local proto = split(k, "client_policy_")[2]
|
|
local action_id = v
|
|
presets_utils.updateDeviceProto(device_type, "client", proto, action_id)
|
|
reload = true
|
|
end
|
|
if starts(k, "server_policy_") then
|
|
local proto = split(k, "server_policy_")[2]
|
|
local action_id = v
|
|
presets_utils.updateDeviceProto(device_type, "server", proto, action_id)
|
|
reload = true
|
|
end
|
|
end
|
|
|
|
if reload then
|
|
presets_utils.reloadDevicePolicies(device_type)
|
|
end
|
|
end
|
|
|
|
-- ###################################################################
|
|
|
|
local function printDevicePolicyLegenda()
|
|
print[[<div style='float:left;'><ul style='display:inline; padding:0'>]]
|
|
|
|
for _, action in ipairs(presets_utils.actions) do
|
|
print("<li style='display:inline-block; margin-right: 14px;'>".. string.gsub(action.icon, "\"", "'") .. " " .. action.text .. "</li>")
|
|
end
|
|
|
|
print[[</ul></div>]]
|
|
end
|
|
|
|
-- ###################################################################
|
|
|
|
local function printDeviceProtocolsPage()
|
|
local form_id = "device-protocols-form"
|
|
local table_id = "device-protocols-table"
|
|
|
|
print[[ <h2 style="margin-top: 0; margin-bottom: 20px;">]]
|
|
if is_nedge then
|
|
local pool_name = host_pools_utils.DEFAULT_POOL_NAME
|
|
print(i18n("nedge.user_device_protocols", {user=pool_name}))
|
|
else
|
|
print(i18n("device_protocols.filter_device_protocols", {filter=filter_msg}))
|
|
end
|
|
print[[</h2>]]
|
|
|
|
if not is_nedge then
|
|
local device_protocols_alerts = ntop.getPref("ntopng.prefs.device_protocols_alerts")
|
|
|
|
if not ntop.getPrefs().are_alerts_enabled or device_protocols_alerts ~= "1" then
|
|
print('<div class="alert alert-info alert-dismissable"><a href="" class="close" data-dismiss="alert" aria-label="close">×</a>'..i18n('device_protocols.alerts_disabled_msg', {url = ntop.getHttpPrefix().."/lua/admin/prefs.lua?tab=alerts"})..'</div>')
|
|
end
|
|
end
|
|
|
|
print[[<table style="width:100%; margin-bottom: 20px;"><tbody>
|
|
<tr>
|
|
<td style="white-space:nowrap; padding-right:1em;">]]
|
|
|
|
-- Device type selector
|
|
print(i18n("details.device_type")) print(': <select id="device_type_selector" class="form-control device-type-selector" style="display:inline; width: 200px" onchange="document.location.href=\'?page=device_protocols&l7proto=') print(proto_filter) print('&device_type=\' + $(this).val()">')
|
|
discover.printDeviceTypeSelectorOptions(device_type, false)
|
|
print[[</select></td><td style="width:100%"></td>]]
|
|
|
|
-- Active protocol filter
|
|
if not isEmptyString(proto_filter) then
|
|
local proto_name = interface.getnDPIProtoName(tonumber(proto_filter))
|
|
|
|
local proto_filter_params = table.clone(page_params)
|
|
proto_filter_params.device_type = device_type
|
|
proto_filter_params.l7proto = nil
|
|
|
|
print[[<td style="padding-top: 15px;">
|
|
<form action="]] print(base_url) print[[">]]
|
|
for k,v in pairs(proto_filter_params) do
|
|
print[[<input type="hidden" name="]] print(k) print[[" value="]] print(v) print[[" />]]
|
|
end
|
|
print[[
|
|
<button type="button" class="btn btn-default btn-sm" style="margin-bottom: 18px;" onclick="$(this).closest('form').submit();">
|
|
<i class="fa fa-close fa-lg" aria-hidden="true" data-original-title="" title=""></i> ]] print(proto_name) print[[
|
|
</button>
|
|
</form>
|
|
</td>]]
|
|
end
|
|
|
|
print[[<td>]]
|
|
|
|
-- Remove policy filter on search
|
|
local after_search_params = table.clone(page_params)
|
|
after_search_params.device_type = device_type
|
|
after_search_params.l7proto = nil
|
|
after_search_params.policy_filter = nil
|
|
after_search_params.category = nil
|
|
|
|
-- Protocol search form
|
|
print(
|
|
template.gen("typeahead_input.html", {
|
|
typeahead={
|
|
base_id = "t_app",
|
|
action = base_url,
|
|
parameters = after_search_params,
|
|
json_key = "key",
|
|
query_field = "l7proto",
|
|
query_url = ntop.getHttpPrefix() .. "/lua/find_app.lua?skip_critical=true",
|
|
query_title = i18n("nedge.search_protocols"),
|
|
style = "margin-left:1em; width:25em;",
|
|
}
|
|
})
|
|
)
|
|
|
|
print[[</td></tr></tbody></table>]]
|
|
|
|
print(
|
|
template.gen("modal_confirm_dialog.html", {
|
|
dialog={
|
|
id = "presetsResetDefaults",
|
|
action = "presetsResetDefaults()",
|
|
title = i18n("users.reset_to_defaults"),
|
|
message = i18n("users.reset_to_defaults_confirm", {devtype="<span id='to_reset_devtype'></span>"}),
|
|
confirm = i18n("reset")
|
|
}
|
|
})
|
|
)
|
|
|
|
if is_nedge and (ntop.getPref("ntopng.prefs.device_protocols_policing") ~= "1") then
|
|
print([[
|
|
<div class="alert alert-warning alert-dismissible" style="margin-top:2em; margin-bottom:0em;">
|
|
<button type="button" class="close" data-dismiss="alert" aria-label="]]..i18n("close")..[[">
|
|
<span aria-hidden="true">×</span>
|
|
</button><b>]]..i18n("warning")..[[</b>: ]].. i18n("nedge.device_protocols_blocked_warning", {
|
|
device_protocols_policies = '<a href="'.. ntop.getHttpPrefix() ..
|
|
'/lua/pro/nedge/admin/nf_edit_user.lua?page=settings">'.. i18n("nedge.enable_device_protocols_policies") .. '</a>',
|
|
}) ..[[
|
|
</div><br>]])
|
|
end
|
|
|
|
-- Table form
|
|
print[[<form id="]] print(form_id) print[[" lass="form-inline" style="margin-bottom: 0px;" method="post">
|
|
<input type="hidden" name="csrf" value="]] print(ntop.getRandomCSRFValue()) print[[">
|
|
<div id="]] print(table_id) print[["></div>
|
|
<button class="btn btn-primary" style="float:right; margin-right:1em;" disabled="disabled" type="submit">]] print(i18n("save_settings")) print[[</button>
|
|
</form>
|
|
|
|
<button class="btn btn-default" onclick="$('#to_reset_devtype').html($('#device_type_selector option:selected').text()); $('#presetsResetDefaults').modal('show');" style="float:right; margin-right:1em;"><i class="fa fa-undo" aria-hidden="true" data-original-title="" title=""></i> ]] print(i18n("users.reset_to_defaults")) print[[</button>
|
|
|
|
<br>]]
|
|
|
|
print[[
|
|
<span>
|
|
<ul>]]
|
|
print("<b>"..i18n("notes").."</b>")
|
|
if is_nedge then
|
|
print [[
|
|
<li>]] print(i18n("nedge.device_protocol_policy_has_higher_priority")) print[[</li>
|
|
<li>]] print(i18n("nedge.protocol_policy_has_higher_priority")) print[[</li>]]
|
|
else
|
|
print [[
|
|
<li>]] print(i18n("device_protocols_description")) print[[</li>]]
|
|
end
|
|
print[[
|
|
</ul>
|
|
</span>]]
|
|
|
|
print[[
|
|
<script type="text/javascript">
|
|
function presetsResetDefaults() {
|
|
var params = {};
|
|
|
|
params.action = "reset";
|
|
params.device_type = $('#device_type_selector').val();
|
|
params.csrf = "]] print(ntop.getRandomCSRFValue()) print[[";
|
|
|
|
var form = paramsToForm('<form method="post"></form>', params);
|
|
form.appendTo('body').submit();
|
|
}
|
|
|
|
aysHandleForm("#]] print(form_id) print[[");
|
|
$("#]] print(form_id) print[[").submit(function() {
|
|
var form = $("#]] print(form_id) print[[");
|
|
|
|
// Serialize form data
|
|
var params = {};
|
|
params.csrf = "]] print(ntop.getRandomCSRFValue()) print[[";
|
|
params.edit_device_policy = "";
|
|
|
|
datatableForEachRow($("#]] print(table_id) print[["), function() {
|
|
var row = $(this);
|
|
var proto_id = $("td:nth-child(1)", row).html();
|
|
var client_action_id = $("td:nth-child(4)", row).find("input[type=radio]:checked").val();
|
|
var server_action_id = $("td:nth-child(5)", row).find("input[type=radio]:checked").val();
|
|
params["client_policy_" + proto_id] = client_action_id;
|
|
params["server_policy_" + proto_id] = server_action_id;
|
|
});
|
|
|
|
aysResetForm("#]] print(form_id) print[[");
|
|
paramsToForm('<form method="post"></form>', params).appendTo('body').submit();
|
|
return false;
|
|
});
|
|
|
|
var url_update = "]] print (ntop.getHttpPrefix())
|
|
print[[/lua/admin/get_device_protocols.lua?device_type=]] print(device_type)
|
|
if not isEmptyString(policy_filter) then print("&policy_filter=" .. policy_filter) end
|
|
if not isEmptyString(proto_filter) then print("&l7proto=" .. proto_filter) end
|
|
if not isEmptyString(category) then print("&category=" .. category) end
|
|
print[[";
|
|
|
|
var legend_appended = false;
|
|
|
|
$("#]] print(table_id) print[[").datatable({
|
|
url: url_update ,
|
|
class: "table table-striped table-bordered table-condensed",
|
|
]]
|
|
|
|
-- Table preferences
|
|
local preference = tablePreferences("rows_number_policies", _GET["perPage"])
|
|
if isEmptyString(preference) then preference = "10" end
|
|
print ('perPage: '..preference.. ",\n")
|
|
|
|
print[[
|
|
tableCallback: function(opts) {
|
|
if (! legend_appended) {
|
|
legend_appended = true;
|
|
$("#]] print(table_id) print[[ .dt-toolbar-container").append("]]
|
|
|
|
-- Legenda
|
|
printDevicePolicyLegenda()
|
|
|
|
print[[")};
|
|
datatableForEachRow($("#]] print(table_id) print[["), function() {
|
|
var row = $(this);
|
|
var proto_id = $("td:nth-child(1)", row).html();
|
|
});
|
|
|
|
aysResetForm("#]] print(form_id) print[[");
|
|
}, showPagination: true, title:"",
|
|
buttons: []]
|
|
|
|
-- 'Filter Policies' button
|
|
print('\'<div class="btn-group pull-right"><div class="btn btn-link dropdown-toggle" data-toggle="dropdown">'..
|
|
i18n("nedge.filter_policies") .. ternary(not isEmptyString(policy_filter), '<span class="glyphicon glyphicon-filter"></span>', '') ..
|
|
'<span class="caret"></span></div> <ul class="dropdown-menu" role="menu" style="min-width: 90px;">')
|
|
|
|
-- 'Filter Policies' dropdown menu
|
|
local entries = { {text=i18n("all"), id=""} }
|
|
entries[#entries + 1] = ""
|
|
for _, action in ipairs(presets_utils.actions) do
|
|
entries[#entries + 1] = {text=action.text, id=action.id, icon=action.icon .. " "}
|
|
end
|
|
for _, entry in pairs(entries) do
|
|
if entry ~= "" then
|
|
page_params["policy_filter"] = entry.id
|
|
print('<li' .. ternary(policy_filter == entry.id, ' class="active"', '') .. '><a href="' .. getPageUrl(base_url, page_params) .. '">' .. (entry.icon or "") .. entry.text .. '</a></li>')
|
|
else
|
|
print('<li role="separator" class="divider"></li>')
|
|
end
|
|
end
|
|
page_params["policy_filter"] = policy_filter
|
|
print('</ul></div>\', ')
|
|
|
|
-- Category filter
|
|
local device_policies = presets_utils.getDevicePolicies(device_type)
|
|
|
|
local function categoryCountCallback(cat_id, cat_name)
|
|
local cat_count = 0
|
|
for proto_id,p in pairs(device_policies) do
|
|
local cat = interface.getnDPIProtoCategory(tonumber(proto_id))
|
|
if cat.name == cat_name and (isEmptyString(policy_filter)
|
|
or policy_filter == p.clientActionId or policy_filter == p.serverActionId) then
|
|
cat_count = cat_count + 1
|
|
end
|
|
end
|
|
|
|
return cat_count
|
|
end
|
|
|
|
printCategoryDropdownButton(false, category, base_url, page_params, categoryCountCallback)
|
|
|
|
-- datatable columns definition
|
|
print[[],
|
|
columns: [
|
|
{
|
|
title: "",
|
|
field: "column_ndpi_application_id",
|
|
hidden: true,
|
|
sortable: false,
|
|
},{
|
|
title: "]] print(i18n("application")) print[[ ",
|
|
field: "column_ndpi_application",
|
|
sortable: true,
|
|
css: {
|
|
width: '35%',
|
|
textAlign: 'left',
|
|
verticalAlign: 'middle',
|
|
}
|
|
},{
|
|
title: "]] print(i18n("category")) print[[ ",
|
|
field: "column_ndpi_category",
|
|
sortable: true,
|
|
css: {
|
|
width: '30%',
|
|
textAlign: 'left',
|
|
verticalAlign: 'middle',
|
|
}
|
|
},{
|
|
title: "]] print(i18n("users.client_policy")) print[[",
|
|
field: "column_client_policy",
|
|
sortable: false,
|
|
css: {
|
|
width: '280',
|
|
textAlign: 'center',
|
|
verticalAlign: 'middle',
|
|
}
|
|
},
|
|
{
|
|
title: "]] print(i18n("users.server_policy")) print[[",
|
|
field: "column_server_policy",
|
|
sortable: false,
|
|
css: {
|
|
width: '280',
|
|
textAlign: 'center',
|
|
verticalAlign: 'middle',
|
|
}
|
|
},
|
|
]
|
|
});
|
|
</script>
|
|
]]
|
|
end
|
|
|
|
-- ###################################################################
|
|
|
|
if _POST["edit_device_policy"] ~= nil then
|
|
editDeviceProtocols()
|
|
elseif (_POST["action"] == "reset") and (_POST["device_type"] ~= nil) then
|
|
local device_type = tonumber(_POST["device_type"])
|
|
presets_utils.resetDevicePoliciesFromPresets(device_type)
|
|
presets_utils.reloadDevicePolicies(device_type)
|
|
end
|
|
|
|
printDeviceProtocolsPage()
|
|
|
|
|