luci-base: add luci/getRealtimeStats and luci/getConntrackList rpc methods
authorJo-Philipp Wich <jo@mein.io>
Sat, 2 Nov 2019 21:47:25 +0000 (22:47 +0100)
committerJo-Philipp Wich <jo@mein.io>
Sun, 3 Nov 2019 16:56:58 +0000 (17:56 +0100)
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
modules/luci-base/root/usr/libexec/rpcd/luci

index 2601512da6b9617acf45ea5fd58353551a34ab32..10c1691b966858a10ff91414ed885345f29ff7a2 100755 (executable)
@@ -516,6 +516,72 @@ local methods = {
                                return { error = err }
                        end
                end
+       },
+
+       getRealtimeStats = {
+               args = { mode = "interface", device = "eth0" },
+               call = function(args)
+                       local util = require "luci.util"
+
+                       local flags
+                       if args.mode == "interface" then
+                               flags = "-i %s" % util.shellquote(args.device)
+                       elseif args.mode == "wireless" then
+                               flags = "-r %s" % util.shellquote(args.device)
+                       elseif args.mode == "conntrack" then
+                               flags = "-c"
+                       elseif args.mode == "load" then
+                               flags = "-l"
+                       else
+                               return { error = "Invalid mode" }
+                       end
+
+                       local fd, err = io.popen("luci-bwc %s" % flags, "r")
+                       if fd then
+                               local parse = json.new()
+                               local done
+
+                               parse:parse("[")
+
+                               while true do
+                                       local ln = fd:read("*l")
+                                       if not ln then
+                                               break
+                                       end
+
+                                       done, err = parse:parse((ln:gsub("%d+", "%1.0")))
+
+                                       if done then
+                                               err = "Unexpected JSON data"
+                                       end
+
+                                       if err then
+                                               break
+                                       end
+                               end
+
+                               fd:close()
+
+                               done, err = parse:parse("]")
+
+                               if err then
+                                       return { error = err }
+                               elseif not done then
+                                       return { error = "Incomplete JSON data" }
+                               else
+                                       return { result = parse:get() }
+                               end
+                       else
+                               return { error = err }
+                       end
+               end
+       },
+
+       getConntrackList = {
+               call = function()
+                       local sys = require "luci.sys"
+                       return { result = sys.net.conntrack() }
+               end
        }
 }