summaryrefslogtreecommitdiff
path: root/lain/widgets/net.lua
blob: 2585ad4b4e083372c7e8aee7596c93e711a9874e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109

--[[
                                                  
     Licensed under GNU General Public License v2 
      * (c) 2013,      Luke Bonham                
      * (c) 2010-2012, Peter Hofmann              
                                                  
--]]

local helpers      = require("lain.helpers")

local notify_fg    = require("beautiful").fg_focus
local naughty      = require("naughty")
local wibox        = require("wibox")

local io           = { popen  = io.popen }
local string       = { format = string.format,
                       gsub   = string.gsub,
                       match  = string.match }

local setmetatable = setmetatable

-- Network infos
-- lain.widgets.net
local net = {
    last_t = 0,
    last_r = 0
}

function net.get_device()
    f = io.popen("ip link show | cut -d' ' -f2,9")
    ws = f:read("*a")
    f:close()
    ws = ws:match("%w+: UP") or ws:match("ppp%w+: UNKNOWN")
    if ws ~= nil then
        return ws:match("(%w+):")
    else
        return "network off"
    end
end

local function worker(args)
    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

    iface = args.iface or net.get_device()

    net.widget = wibox.widget.textbox('')

    helpers.set_map(iface, true)

    function update()
        net_now = {}

        if iface == "" or string.match(iface, "network off")
        then
            iface = net.get_device()
        end

        net_now.carrier = helpers.first_line('/sys/class/net/' .. iface ..
                                           '/carrier') or "0"
        net_now.state = helpers.first_line('/sys/class/net/' .. iface ..
                                           '/operstate') or "down"
        local now_t = helpers.first_line('/sys/class/net/' .. iface ..
                                           '/statistics/tx_bytes') or 0
        local now_r = helpers.first_line('/sys/class/net/' .. iface ..
                                           '/statistics/rx_bytes') or 0

        net_now.sent = (now_t - net.last_t) / timeout / units
        net_now.sent = string.gsub(string.format('%.1f', net_now.sent), ",", ".")

        net_now.received = (now_r - net.last_r) / timeout / units
        net_now.received = string.gsub(string.format('%.1f', net_now.received), ",", ".")

        widget = net.widget
        settings()

        net.last_t = now_t
        net.last_r = now_r

        if net_now.carrier ~= "1" and notify == "on"
        then
            if helpers.get_map(iface)
            then
                naughty.notify({
                    title    = iface,
                    text     = "no carrier",
                    timeout  = 7,
                    position = "top_left",
                    icon     = helpers.icons_dir .. "no_net.png",
                    fg       = notify_fg or "#FFFFFF",
                    screen   = screen
                })
                helpers.set_map(iface, false)
            end
        else
            helpers.set_map(iface, true)
        end
    end

    helpers.newtimer(iface, timeout, update)
    return net.widget
end

return setmetatable(net, { __call = function(_, ...) return worker(...) end })