]> git.madduck.net Git - etc/awesome.git/blob - widget/net.lua

madduck's git repository

Every one of the projects in this repository is available at the canonical URL git://git.madduck.net/madduck/pub/<projectpath> — see each project's metadata for the exact URL.

All patches and comments are welcome. Please squash your changes to logical commits before using git-format-patch and git-send-email to patches@git.madduck.net. If you'd read over the Git project's submission guidelines and adhered to them, I'd be especially grateful.

SSH access, as well as push access can be individually arranged.

If you use my repositories frequently, consider adding the following snippet to ~/.gitconfig and using the third clone URL listed for each project:

[url "git://git.madduck.net/madduck/"]
  insteadOf = madduck:

Merge pull request #344 from 2009/patch-5
[etc/awesome.git] / widget / net.lua
1
2 --[[
3                                                   
4      Licensed under GNU General Public License v2 
5       * (c) 2013,      Luke Bonham                
6       * (c) 2010-2012, Peter Hofmann              
7                                                   
8 --]]
9
10 local helpers = require("lain.helpers")
11 local naughty = require("naughty")
12 local wibox   = require("wibox")
13 local string  = { format = string.format, match = string.match }
14
15 -- Network infos
16 -- lain.widget.net
17
18 local function factory(args)
19     local net      = { widget = wibox.widget.textbox(), devices = {} }
20     local args     = args or {}
21     local timeout  = args.timeout or 2
22     local units    = args.units or 1024 -- KB
23     local notify   = args.notify or "on"
24     local screen   = args.screen or 1
25     local settings = args.settings or function() end
26
27     -- Compatibility with old API where iface was a string corresponding to 1 interface
28     net.iface = (args.iface and (type(args.iface) == "string" and {args.iface}) or
29                 (type(args.iface) == "table" and args.iface)) or {}
30
31     function net.get_device()
32         helpers.async(string.format("ip link show", device_cmd), function(ws)
33             ws = ws:match("(%w+): <BROADCAST,MULTICAST,.-UP,LOWER_UP>")
34             net.iface = ws and { ws } or {}
35         end)
36     end
37
38     if #net.iface == 0 then net.get_device() end
39
40     function net.update()
41         -- These are the totals over all specified interfaces
42         net_now = {
43             devices  = {},
44             -- Bytes since last iteration
45             sent     = 0,
46             received = 0
47         }
48
49         for i, dev in ipairs(net.iface) do
50             local dev_now    = {}
51             local dev_before = net.devices[dev] or { last_t = 0, last_r = 0 }
52             local now_t      = tonumber(helpers.first_line(string.format("/sys/class/net/%s/statistics/tx_bytes", dev)) or 0)
53             local now_r      = tonumber(helpers.first_line(string.format("/sys/class/net/%s/statistics/rx_bytes", dev)) or 0)
54
55             dev_now.carrier  = helpers.first_line(string.format("/sys/class/net/%s/carrier", dev)) or "0"
56             dev_now.state    = helpers.first_line(string.format("/sys/class/net/%s/operstate", dev)) or "down"
57
58             dev_now.sent     = (now_t - dev_before.last_t) / timeout / units
59             dev_now.received = (now_r - dev_before.last_r) / timeout / units
60
61             net_now.sent     = net_now.sent + dev_now.sent
62             net_now.received = net_now.received + dev_now.received
63
64             dev_now.sent     = string.format("%.1f", dev_now.sent)
65             dev_now.received = string.format("%.1f", dev_now.received)
66
67             dev_now.last_t   = now_t
68             dev_now.last_r   = now_r
69
70             net.devices[dev] = dev_now
71
72             -- Notify only once when connection is loss
73             if string.match(dev_now.carrier, "0") and notify == "on" and helpers.get_map(dev) then
74                 naughty.notify {
75                     title    = dev,
76                     text     = "No carrier",
77                     icon     = helpers.icons_dir .. "no_net.png",
78                     screen   = screen
79                 }
80                 helpers.set_map(dev, false)
81             elseif string.match(dev_now.carrier, "1") then
82                 helpers.set_map(dev, true)
83             end
84
85             net_now.carrier = dev_now.carrier
86             net_now.state = dev_now.state
87             net_now.devices[dev] = dev_now
88             -- new_now.sent and net_now.received will be
89             -- the totals across all specified devices
90         end
91
92         net_now.sent = string.format("%.1f", net_now.sent)
93         net_now.received = string.format("%.1f", net_now.received)
94
95         widget = net.widget
96         settings()
97     end
98
99     helpers.newtimer("network", timeout, net.update)
100
101     return net
102 end
103
104 return factory