101 lines
2.6 KiB
Lua
101 lines
2.6 KiB
Lua
local network = {}
|
|
|
|
local DEFAULT_SIGNAL = "network::usage"
|
|
|
|
local units = "KiB"
|
|
local units_scalar = 1024
|
|
local ignored_devices = {"lo", "docker"}
|
|
|
|
local easy_timer = require("helpers").easy_timer
|
|
|
|
local function isIgnored(name)
|
|
if not ignored_devices then return false end
|
|
|
|
for _, pattern in ipairs(ignored_devices) do
|
|
if name:find(pattern) then
|
|
return true
|
|
end
|
|
end
|
|
|
|
return false
|
|
end
|
|
|
|
function network.get()
|
|
local statistics = {
|
|
total_received = 0,
|
|
total_sent = 0,
|
|
devices = {}
|
|
}
|
|
|
|
local file = io.open("/proc/net/dev", "r")
|
|
if not file then return statistics end
|
|
|
|
-- Skip first 2 line that describe the format
|
|
local _ = file:read("*l")
|
|
local _ = file:read("*l")
|
|
-- Read every devices. 1 device per line
|
|
for line in file:lines() do
|
|
-- Parse line, only extract total sent and received
|
|
local name, total_received, total_sent = line:match("^%s*([^%s]+):%s+(%d+)%s+%d+%s+%d+%s+%d+%s+%d+%s+%d+%s+%d+%s+%d+%s+(%d+)")
|
|
|
|
if not isIgnored(name) then
|
|
total_sent = tonumber(total_sent)
|
|
total_received = tonumber(total_received)
|
|
|
|
-- Save parsed data
|
|
statistics.devices[name] = {
|
|
total_sent = total_sent,
|
|
total_received = total_received
|
|
}
|
|
statistics.total_received = statistics.total_received + total_received
|
|
statistics.total_sent = statistics.total_sent + total_sent
|
|
end
|
|
end
|
|
|
|
file:close()
|
|
return statistics, units
|
|
end
|
|
|
|
local last_stats
|
|
function network.emit(signal_name)
|
|
local current_stats = network.get()
|
|
|
|
current_stats.total_received = current_stats.total_received / units_scalar
|
|
current_stats.total_sent = current_stats.total_sent / units_scalar
|
|
|
|
if last_stats then
|
|
current_stats.received = current_stats.total_received - last_stats.total_received
|
|
current_stats.sent = current_stats.total_sent - last_stats.total_sent
|
|
else
|
|
current_stats.received = 0
|
|
current_stats.sent = 0
|
|
end
|
|
|
|
for name, device in pairs(current_stats.devices) do
|
|
device.total_received = device.total_received / units_scalar
|
|
device.total_sent = device.total_sent / units_scalar
|
|
|
|
if last_stats then
|
|
device.received = device.total_received - last_stats.devices[name].total_received
|
|
device.sent = device.total_sent - last_stats.devices[name].total_sent
|
|
else
|
|
current_stats.received = 0
|
|
current_stats.sent = 0
|
|
end
|
|
end
|
|
|
|
awesome.emit_signal(signal_name or DEFAULT_SIGNAL, current_stats, units)
|
|
last_stats = current_stats
|
|
end
|
|
|
|
function network.register_signal(signal_name, update_interval)
|
|
gears.timer {
|
|
timeout = update_interval or 5,
|
|
call_now = true,
|
|
autostart = true,
|
|
callback = function() network.emit(signal_name) end
|
|
}
|
|
end
|
|
|
|
return network
|