1
0
awesomewm-config/external/network.lua
2023-06-04 15:59:49 +03:00

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