2023-05-22 22:08:29 +08:00

194 lines
4.7 KiB
Lua

#!/usr/bin/lua
dirname = '/tmp/bwmon/data'
filepost = "-mac_data.js.bk"
bw = {}
maclist = {}
devices = {}
totaldevices = 0
totaldown = 0
totalup = 0
total = 0
printf = function(s,...)
local ss = s:format(...)
os.execute("/usr/lib/rooter/logprint.sh " .. ss)
end
function ltrim(s)
return s:match'^%s*(.*)'
end
function calc(total)
if total < 1000 then
tstr = string.format("%.2f", total)
tfm = " K"
else
if total < 1000000 then
tstr = string.format("%.2f", total/1000)
tfm = " MB"
else
tstr = string.format("%.2f", total/1000000)
tfm = " GB"
end
end
str = tstr .. tfm
return ltrim(str)
end
function monthly(datafile)
file = io.open(datafile, "r")
i = 0
dayx = 0
repeat
line = file:read("*line")
if line == nil then
break
end
s, e = line:find("start day")
if s ~= nil then
dayx = dayx + 1
repeat
line = file:read("*line")
s, e = line:find("end day")
if s ~= nil then
break
end
s, e = line:find("\"mac\":\"")
bs, be = line:find("\"", e+1)
mac = line:sub(e+1, bs-1)
if bw[mac] == nil then
maclist[i] = mac
i = i + 1
bw[mac] = {}
bw[mac]['down'] = 0
bw[mac]['offdown'] = 0
bw[mac]['up'] = 0
bw[mac]['offup'] = 0
end
s, e = line:find("\"down\":\"")
bs, be = line:find("\"", e+1)
down = tonumber(line:sub(e+1, bs-1))
bw[mac]['down'] = bw[mac]['down'] + down
s, e = line:find("\"up\":\"")
bs, be = line:find("\"", e+1)
up = tonumber(line:sub(e+1, bs-1))
bw[mac]['up'] = bw[mac]['up'] + up
s, e = line:find("\"offdown\":\"")
bs, be = line:find("\"", e+1)
offdown = tonumber(line:sub(e+1, bs-1))
bw[mac]['offdown'] = bw[mac]['offdown'] + offdown
s, e = line:find("\"offup\":\"")
bs, be = line:find("\"", e+1)
offup = tonumber(line:sub(e+1, bs-1))
bw[mac]['offup'] = bw[mac]['offup'] + offup
s, e = line:find("\"ip\":\"")
bs, be = line:find("\"", e+1)
bw[mac]['ip'] = line:sub(e+1, bs-1)
s, e = line:find("\"name\":\"")
bs, be = line:find("\"", e+1)
bw[mac]['name'] = line:sub(e+1, bs-1)
until 1==0
end
until 1==0
file:close()
return dayx
end
function totals(bw, maclist, dayz)
totaldown = 0
totalup = 0
utotaldown = 0
utotalup = 0
j=0
while maclist[j] ~= nil do
totaldown = totaldown + bw[maclist[j]]['down']
totalup = totalup + bw[maclist[j]]['up']
utotaldown = utotaldown + bw[maclist[j]]['offdown']
utotalup = utotalup + bw[maclist[j]]['offup']
j = j + 1
end
total = totalup + totaldown
ptotal = (total / dayz) * 30
end
function showdevices(bw, maclist)
k = 0
while maclist[k] ~= nil do
k = k + 1
end
if k > 0 then
j = 0
while maclist[j] ~= nil do
dtot = bw[maclist[j]]['down'] + bw[maclist[j]]['up']
devices[j] = bw[maclist[j]]['ip'] .."|" .. maclist[j]
devices[j] = devices[j] .. "|" .. calc(bw[maclist[j]]['down']) .. "|" .. calc(bw[maclist[j]]['up'])
devices[j] = devices[j] .. "|" .. calc(dtot) .. "|" .. bw[maclist[j]]['name']
j = j + 1
end
end
totaldevices = j
end
os.execute("echo 0 > /tmp/lockbw")
dataname = nil
f = io.popen('/bin/ls ' .. dirname)
for name in f:lines() do
s, e = name:find(filepost)
if s ~= nil then
dataname = dirname .. "/" .. name
end
end
f:close()
if dataname ~= nil then
days = monthly(dataname)
totals(bw, maclist, days)
tfile = io.open("/tmp/bwdata", "w")
tfile:write(days, "\n")
tfile:write(tostring(total), "\n")
tfile:write(calc(total), "\n")
tfile:write(tostring(totaldown), "\n")
tfile:write(calc(totaldown), "\n")
tfile:write(tostring(totalup), "\n")
tfile:write(calc(totalup), "\n")
tfile:write(tostring(ptotal), "\n")
tfile:write(calc(ptotal), "\n")
--
-- allocated bandwidth in K
--
bwallo='rm -f /tmp/bwallo; x=$(uci -q get custom.bwallocate.allocate); echo $x >> /tmp/bwallo; x=$(uci -q get custom.bwallocate.password); echo $x >> /tmp/bwallo'
os.execute(bwallo)
file = io.open("/tmp/bwallo", "r")
if file == nil then
allo = 1000000000
passw = "password"
else
allos = file:read("*line")
allo = tonumber(allos) * 1000000
passw = file:read("*line")
file:close()
end
tfile:write(tostring(allo), "\n")
tfile:write(calc(allo), "\n")
tfile:write(passw, "\n")
showdevices(bw, maclist)
tfile:write(tostring(totaldevices), "\n")
if totaldevices > 0 then
for i=0, totaldevices-1 do
tfile:write(devices[i], "\n")
end
end
tfile:close()
else
tfile = io.open("/tmp/bwdata", "w")
tfile:write("0\n")
tfile:write("0\n")
tfile:close()
end
os.execute("rm -f /tmp/lockbw")
os.execute("/usr/lib/bwmon/excede.sh " .. tostring(total) .. " " .. tostring(allo) .. " " .. tostring(ptotal))
os.execute("/usr/lib/bwmon/savetot.sh \"" .. calc(total) .. "\"")
os.execute("/usr/lib/bwmon/perday.lua")