File: custom_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 (128 lines) | stat: -rw-r--r-- 3,840 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
--
-- (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 and maps host fields into custom fields
-- Example: curl -s -u admin:admin -H "Content-Type: application/json"  -H "Content-Type: application/json" -d '{"host": "192.168.2.222", "ifid":"0"}' http://localhost:3000/lua/rest/v1/get/host/custom_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 field_aliases = {}

local ifid = _GET["ifid"]
local fields = _GET["field_alias"]

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

interface.select(ifid)

-- Valid fields:
-- 1)     All: {"field_alias": "all"} - Dump all host stats.
--        -- Or --
--        All: Omit the "field_alias" parameter.
-- 2) Aliases: {"field_alias": "bytes.sent=tdb,packets.sent=tdp"}
-- 3)   Mixed: {"field_alias": "bytes.sent=tdb,packets.sent,ndpi=dpi"}
--
-- If the 'fields' parameter is missing 'all' host stat
-- fields will be dumped...
if (fields == nil) then
   field_aliases[#field_aliases + 1] = "all=all"
else
   --
   -- Invalid field alias...
   if isEmptyString(fields) then
      rest_utils.answer(rest_utils.consts.err.invalid_args)
      return
   end
   --
   -- Build host stats fields to use with potential aliases...
   local field = fields:split(",") or {fields}
   for _, fa in pairs(field) do
      local comp = fa:split("=")
      if (comp ~= nil) then
         --
         -- Field and alias...
         field_aliases[#field_aliases + 1] = comp[1] .. "=" .. comp[2]
      else
         --
         -- Alias same as field...
         field_aliases[#field_aliases + 1] = fa .. "=" .. fa
      end
   end
end

local hostparam = _GET["host"]
if ((hostparam ~= nil) or (not isEmptyString(hostparam))) then
   --
   -- Single host:
   local host_info = url2hostinfo(_GET)
   local host = interface.getHostInfo(host_info["host"], host_info["vlan"])
   if not host then
      rest_utils.answer(rest_utils.consts.err.not_found)
      return
   else
      --
      -- Check for 'all' host stat fields...
      if (field_aliases[1] == "all=all") then
         res = host
      else
         --
         -- Process selective host stat fields...
         for _, fa in pairs(field_aliases) do
            local comp = fa:split("=")
            local field = comp[1]
            local alias = comp[2]
            if (host[field] ~= nil) then
               --
               -- Add host field stat with potential alias name...
               res[alias] = host[field]
            end
         end
      end
      tracker.log("get_host_custom_data_json", {ifid, host_info["host"], host_info["vlan"], field_aliases})
      rest_utils.answer(rc, res)
      return
   end
else
   --
   -- All hosts:
   local hosts_stats = interface.getHostsInfo()
   hosts_stats = hosts_stats["hosts"]
   for key, value in pairs(hosts_stats) do
      local host = interface.getHostInfo(key)
      if (host ~= nil) then
         local hdata = {}
         if (field_aliases[1] == "all=all") then
            hdata = host
         else
            for _, fa in pairs(field_aliases) do
               local comp = fa:split("=")
               local field = comp[1]
               local alias = comp[2]
               if (host[field] ~= nil) then
                  hdata[alias] = host[field]
               end
            end
         end
         res[#res + 1] = hdata
      end
   end
   tracker.log("get_host_custom_data_json", {ifid, "All Hosts", field_aliases})
   rest_utils.answer(rc, res)
   return
end