aboutsummaryrefslogtreecommitdiff
path: root/wifi.lua
blob: 0e284c80be85521838d3ea4e63b100cfdf79a745 (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
----------------------------------------------------------
-- Licensed under the GNU General Public License version 2
--  * Copyright (C) 2009 Adrian C. <anrxc_sysphere_org>
----------------------------------------------------------

-- {{{ Grab environment
local io = { popen = io.popen }
local setmetatable = setmetatable
local string = {
    find = string.find,
    match = string.match
}
-- }}}


-- Wifi: provides wireless information for a requested interface
module("vicious.wifi")


-- {{{ Wireless widget type
function worker(format, iface)
    -- Get data from iwconfig, on distributions where it is executable
    -- by users, and /sbin or /usr/sbin is in their path
    local f = io.popen("iwconfig " .. iface)
    local iw = f:read("*all")
    f:close()

    -- Setup tables
    local winfo = {
        ["{ssid}"] = "N/A",
        ["{mode}"] = "N/A",
        ["{chan}"] = "N/A",
        ["{rate}"] = "N/A",
        ["{link}"] = "N/A",
        ["{sign}"] = "N/A"
    }

    -- Check if iwconfig wasn't found, can't be executed or the
    -- interface is not a wireless one
    if iw == nil or string.find(iw, "No such device") then
        return winfo
    else
        -- The output differs from system to system, some stats can
        -- be separated by =, and not all drivers report all stats
        winfo["{ssid}"] =  -- SSID can have almost anything in it
          string.match(iw, 'ESSID[=:]"([%w]+[%s]*[%w]*]*)"') or winfo["{ssid}"]
        winfo["{mode}"] =  -- Modes are simple, but also match the "-" in Ad-Hoc
          string.match(iw, "Mode[=:]([%w%-]*)") or winfo["{mode}"]
        winfo["{chan}"] =  -- Channels are plain digits
          string.match(iw, "Channel[=:]([%d]+)") or winfo["{chan}"]
        winfo["{rate}"] =  -- Bitrate can start with a space and we want to display Mb/s
          string.match(iw, "Bit Rate[=:]([%s]?[%d%.]*[%s][%/%a]+)") or winfo["{rate}"]
--      winfo["{link}"] =  -- Link quality can contain a slash: 32/100
--        string.match(iw, "Link Quality[=:]([%d]+[%/%d]*)") or winfo["{link}"]
        winfo["{link}"] =  --  * match only the first number, great data for a progressbar
          string.match(iw, "Link Quality[=:]([%d]+)") or winfo["{link}"]
        winfo["{sign}"] =  -- Signal level can be a negative value, also display decibel notation
          string.match(iw, "Signal level[=:]([%-%d]+[%s][%a]*)") or winfo["{sign}"]
    end

    return winfo
end
-- }}}

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