From: cool-cool-sweat <35659567+cool-cool-sweat@users.noreply.github.com>
Date: Tue, 23 Jan 2018 03:39:48 +0000 (-0500)
Subject: net.lua: support wifi/ethernet connection indicators
X-Git-Url: https://git.madduck.net/etc/awesome.git/commitdiff_plain/5e2d2977cfd0bb78e52a2a292245e211750effaf

net.lua: support wifi/ethernet connection indicators
---

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+): <BROADCAST,MULTICAST,.-UP,LOWER_UP>")
-            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