1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- -- Copyright 2018 Rosy Song <rosysong@rosinson.com>
- -- Licensed to the public under the Apache License 2.0.
- module("luci.controller.nft-qos", package.seeall)
- function index()
- if not nixio.fs.access("/etc/config/nft-qos") then
- return
- end
- local e
- e = entry({"admin", "status", "realtime", "rate"}, template("nft-qos/rate"), _("Rate"), 5)
- e.leaf = true
- e.acl_depends = { "luci-app-nft-qos" }
- e = entry({"admin", "status", "realtime", "rate_status"}, call("action_rate"))
- e.leaf = true
- e.acl_depends = { "luci-app-nft-qos" }
- e = entry({"admin", "services", "nft-qos"}, cbi("nft-qos/nft-qos"), _("QoS over Nftables"), 60)
- e.leaf = true
- e.acl_depends = { "luci-app-nft-qos" }
- end
- function _action_rate(rv, n)
- local c = nixio.fs.access("/proc/net/ipv6_route") and
- io.popen("nft list chain inet nft-qos-monitor " .. n .. " 2>/dev/null") or
- io.popen("nft list chain ip nft-qos-monitor " .. n .. " 2>/dev/null")
- if c then
- for l in c:lines() do
- local _, i, p, b = l:match(
- '^%s+ip ([^%s]+) ([^%s]+) counter packets (%d+) bytes (%d+)'
- )
- if i and p and b then
- -- handle expression
- rv[#rv + 1] = {
- rule = {
- family = "inet",
- table = "nft-qos-monitor",
- chain = n,
- handle = 0,
- expr = {
- { match = { right = i } },
- { counter = { packets = p, bytes = b } }
- }
- }
- }
- end
- end
- c:close()
- end
- end
- function action_rate()
- luci.http.prepare_content("application/json")
- local data = { nftables = {} }
- _action_rate(data.nftables, "upload")
- _action_rate(data.nftables, "download")
- luci.http.write_json(data)
- end
|