File: data.lua

package info (click to toggle)
ntopng 5.2.1%2Bdfsg1-2
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 121,832 kB
  • sloc: javascript: 143,431; cpp: 71,175; ansic: 11,108; sh: 4,687; makefile: 911; python: 587; sql: 512; pascal: 234; perl: 118; ruby: 52; exp: 4
file content (131 lines) | stat: -rw-r--r-- 4,290 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
--
-- (C) 2013-22 - ntop.org
--

local dirs = ntop.getDirs()
package.path = dirs.installdir .. "/scripts/lua/modules/?.lua;" .. package.path

require "lua_utils"
local json = require ("dkjson")
local tracker = require("tracker")
local rest_utils = require("rest_utils")

--
-- Read information about a host
-- Example: curl -u admin:admin -H "Content-Type: application/json" -d '{"ifid": "1", "host" : "192.168.1.1"}' http://localhost:3000/lua/rest/v1/get/host/data.lua
--
-- NOTE: in case of invalid login, no error is returned but redirected to login
--

local rc = rest_utils.consts.success.ok
local res = {}

local ifid = _GET["ifid"]
local host_info = url2hostinfo(_GET)

-- whether to return host statistics: on by default
local host_stats           = _GET["host_stats"]

-- whether to return statistics regarding host flows: off by default
local host_stats_flows     = _GET["host_stats_flows"]
local host_stats_flows_num = _GET["limit"]

if isEmptyString(ifid) then
   rest_utils.answer(rest_utils.consts.err.invalid_interface)
   return
end

if isEmptyString(host_info["host"]) then
   rest_utils.answer(rest_utils.consts.err.invalid_args)
   return
end

interface.select(ifid)

local host = interface.getHostInfo(host_info["host"], host_info["vlan"])

if not host then
   rest_utils.answer(rest_utils.consts.err.not_found)
   return
end

local function flows2protocolthpt(flows)
   local protocol_thpt = {}
   for _, flow in pairs(flows) do
      local proto_ndpi = ""
      if flow["proto.ndpi"] == nil or flow["proto.ndpi"] == "" then
	 goto continue
      else
	 proto_ndpi = flow["proto.ndpi"]
      end

      if protocol_thpt[proto_ndpi] == nil then
	 protocol_thpt[proto_ndpi] =
	    {["cli2srv"]={["throughput_bps"]=0, ["throughput_pps"]=0},
	       ["srv2cli"]={["throughput_bps"]=0, ["throughput_pps"]=0}}
      end

      for _, dir in pairs({"cli2srv", "srv2cli"}) do
	 for _, dim in pairs({"bps", "pps"}) do
	    protocol_thpt[proto_ndpi][dir]["throughput_"..dim] =
	       protocol_thpt[proto_ndpi][dir]["throughput_"..dim] + flow[dir..".throughput_"..dim]
	 end
      end
      ::continue::
   end
   return protocol_thpt
end

-- hosts stats are on by default, one must explicitly disable them
if not (host_stats == nil or host_stats == "" or host_stats == "true" or host_stats == "1") then
   host = {}
end

-- host flow stats are off by default and must be explicitly enabled
if host_stats_flows ~= nil and host_stats_flows ~= "" then
   if host_stats_flows_num == nil or tonumber(host_stats_flows_num) == nil then
      -- default: do not limit the number of flows
      host_stats_flows_num = 99999
   else
      -- ... unless otherwise specified
      host_stats_flows_num = tonumber(host_stats_flows_num)
   end

   local total = 0

   local pageinfo = {["sortColumn"]="column_bytes", ["a2zSortOrder"]=false,
      ["maxHits"]=host_stats_flows_num, ["toSkip"]=0, ["detailedResults"]=true}

   --local flows = interface.getFlowsInfo(host_info["host"], nil, "column_bytes", host_stats_flows_num, 0, false)
   local flows = interface.getFlowsInfo(host_info["host"], pageinfo)
   flows = flows["flows"]
   for i, fl in ipairs(flows) do
      flows[i] = {
            ["srv.ip"] = fl["srv.ip"], ["cli.ip"] = fl["cli.ip"],
            ["srv.port"] = fl["srv.port"], ["cli.port"] = fl["cli.port"],
            ["proto.ndpi_id"] = fl["proto.ndpi_id"], ["proto.ndpi"] = fl["proto.ndpi"],
            ["bytes"] = fl["bytes"],
            ["cli2srv.throughput_bps"] = round(fl["throughput_cli2srv_bps"], 2),
            ["srv2cli.throughput_bps"] = round(fl["throughput_srv2cli_bps"], 2),
            ["cli2srv.throughput_pps"] = round(fl["throughput_cli2srv_pps"], 2),
            ["srv2cli.throughput_pps"] = round(fl["throughput_srv2cli_pps"], 2),
      }

      if fl["proto.l4"] == "TCP" then
         flows[i]["cli2srv.tcp_flags"] = TCPFlags2table(fl["cli2srv.tcp_flags"])
         flows[i]["srv2cli.tcp_flags"] = TCPFlags2table(fl["srv2cli.tcp_flags"])
         flows[i]["tcp_established"]   = fl["tcp_established"]
      end
   end

   host["ndpiThroughputStats"] = flows2protocolthpt(flows)
   host["flows"] = flows
   host["flows_count"] = total
end

res = host

tracker.log("host_get_json", {host_info["host"], host_info["vlan"]})

rest_utils.answer(rc, res)