From 5e2d2977cfd0bb78e52a2a292245e211750effaf Mon Sep 17 00:00:00 2001 From: cool-cool-sweat <35659567+cool-cool-sweat@users.noreply.github.com> Date: Mon, 22 Jan 2018 22:39:48 -0500 Subject: [PATCH] net.lua: support wifi/ethernet connection indicators --- widget/net.lua | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/widget/net.lua b/widget/net.lua index a72fc3d..1780d78 100644 --- a/widget/net.lua +++ b/widget/net.lua @@ -15,22 +15,23 @@ local string = { format = string.format, match = string.match } -- lain.widget.net local function factory(args) - local net = { widget = wibox.widget.textbox(), devices = {} } - local args = args or {} - local timeout = args.timeout or 2 - local units = args.units or 1024 -- KB - local notify = args.notify or "on" - local screen = args.screen or 1 - local settings = args.settings or function() end + local net = { widget = wibox.widget.textbox(), devices = {} } + local args = args or {} + local timeout = args.timeout or 2 + local units = args.units or 1024 -- KB + local notify = args.notify or "on" + local wifi_state = args.wifi_state or "off" + local eth_state = args.eth_state or "off" + local screen = args.screen or 1 + local settings = args.settings or function() end -- Compatibility with old API where iface was a string corresponding to 1 interface net.iface = (args.iface and (type(args.iface) == "string" and {args.iface}) or (type(args.iface) == "table" and args.iface)) or {} function net.get_device() - helpers.async(string.format("ip link show", device_cmd), function(ws) - ws = ws:match("(%w+): ") - net.iface = ws and { ws } or {} + helpers.line_callback("ip link", function(line) + net.iface[#net.iface + 1] = not string.match(line, "LOOPBACK") and string.match(line, "(%w+): <") or nil end) end @@ -45,7 +46,7 @@ local function factory(args) received = 0 } - for i, dev in ipairs(net.iface) do + for _, dev in ipairs(net.iface) do local dev_now = {} local dev_before = net.devices[dev] or { last_t = 0, last_r = 0 } local now_t = tonumber(helpers.first_line(string.format("/sys/class/net/%s/statistics/tx_bytes", dev)) or 0) @@ -66,9 +67,18 @@ local function factory(args) dev_now.last_t = now_t dev_now.last_r = now_r + if wifi_state == "on" and helpers.first_line(string.format("/sys/class/net/%s/uevent", dev)) == "DEVTYPE=wlan" and string.match(dev_now.carrier, "1") then + dev_now.wifi = true + dev_now.signal = tonumber(string.match(helpers.lines_from("/proc/net/wireless")[3], "(%-%d+%.)")) or nil + end + + if eth_state == "on" and helpers.first_line(string.format("/sys/class/net/%s/uevent", dev)) ~= "DEVTYPE=wlan" and string.match(dev_now.carrier, "1") then + dev_now.ethernet = true + end + net.devices[dev] = dev_now - -- Notify only once when connection is loss + -- Notify only once when connection is lost if string.match(dev_now.carrier, "0") and notify == "on" and helpers.get_map(dev) then naughty.notify { title = dev, @@ -84,7 +94,7 @@ local function factory(args) net_now.carrier = dev_now.carrier net_now.state = dev_now.state net_now.devices[dev] = dev_now - -- new_now.sent and net_now.received will be + -- net_now.sent and net_now.received will be -- the totals across all specified devices end -- 2.39.2