bbd2ff750a8e1522ed020b69c39861ea6921c70e
[project/luci.git] / contrib / package / iwinfo / src / iwinfo.lua
1 #!/usr/bin/lua
2
3 require "iwinfo"
4
5 function printf(fmt, ...)
6         print(string.format(fmt, ...))
7 end
8
9 function s(x)
10         if x == nil then
11                 return "?"
12         else
13                 return tostring(x)
14         end
15 end
16
17 function n(x)
18         if x == nil then
19                 return 0
20         else
21                 return tonumber(x)
22         end
23 end
24
25 function print_info(api, dev)
26         local iw = iwinfo[api]
27
28         printf("%-9s Type: %s  ESSID: \"%s\"", dev, api, iw.ssid(dev))
29         printf("          Access Point: %s", iw.bssid(dev))
30
31         printf("          Mode: %s  Channel: %d (%.3f GHz)",
32                 iw.mode(dev), iw.channel(dev), n(iw.frequency(dev)) / 1000)
33
34         printf("          Tx-Power: %s dBm  Link Quality: %s/%s",
35                 s(iw.txpower(dev)), s(iw.quality(dev)), s(iw.quality_max(dev)))
36
37         printf("          Signal: %s dBm  Noise: %s dBm",
38                 s(iw.signal(dev)), s(iw.noise(dev)))
39
40         printf("          Bit Rate: %.1f MBit/s",
41                 n(iw.bitrate(dev)) / 1000)
42
43         printf("          Encryption: %s",
44                 iw.encryption(dev).description)
45
46         print("")
47 end
48
49 function print_scan(api, dev)
50         local iw = iwinfo[api]
51         local sr = iw.scanlist(dev)
52         local si, se
53
54         if sr and #sr > 0 then
55                 for si, se in ipairs(sr) do
56                         printf("Cell %02d - Address: %s", si, se.bssid)
57                         printf("          ESSID: \"%s\"",
58                                 s(se.ssid))
59
60                         printf("          Mode: %s  Channel: %d",
61                                 s(se.mode), n(se.channel))
62
63                         printf("          Signal: %s dBm  Quality: %d/%d",
64                                 s(se.signal), n(se.quality), n(se.quality_max))
65
66                         printf("          Encryption: %s",
67                                 s(se.encryption.description))
68
69                         print("")
70                 end
71         else
72                 print("No scan results or scanning not possible")
73                 print("")
74         end
75 end
76
77 function print_txpwrlist(api, dev)
78         local iw = iwinfo[api]
79         local pl = iw.txpwrlist(dev)
80         local cp = n(iw.txpower(dev))
81         local pe
82
83         if pl and #pl > 0 then
84                 for _, pe in ipairs(pl) do
85                         printf("%s%3d dBm (%4d mW)",
86                                 (cp == pe.dbm) and "*" or " ",
87                                 pe.dbm, pe.mw)
88                 end
89         else
90                 print("No TX power information available")
91         end
92
93         print("")
94 end
95
96 function print_freqlist(api, dev)
97         local iw = iwinfo[api]
98         local fl = iw.freqlist(dev)
99         local cc = n(iw.channel(dev))
100         local fe
101
102         if fl and #fl > 0 then
103                 for _, fe in ipairs(fl) do
104                         printf("%s %.3f GHz (Channel %d)",
105                                 (cc == fe.channel) and "*" or " ",
106                                 n(fe.mhz) / 1000, n(fe.channel))
107                 end
108         else
109                 print("No frequency information available")
110         end
111
112         print("")
113 end
114
115 function print_assoclist(api, dev)
116         local iw = iwinfo[api]
117         local al = iw.assoclist(dev)
118         local ai, ae
119
120         if al and next(al) then
121                 for ai, ae in pairs(al) do
122                         printf("%s  %s dBm", ai, s(ae.signal))
123                 end
124         else
125                 print("No client connected or no information available")
126         end
127
128         print("")
129 end
130
131
132 if #arg ~= 2 then
133         print("Usage:")
134         print(" iwinfo <device> info")
135         print(" iwinfo <device> scan")
136         print(" iwinfo <device> txpowerlist")
137         print(" iwinfo <device> freqlist")
138         print(" iwinfo <device> assoclist")
139         os.exit(1)
140 end
141
142 local dev = arg[1]
143 local api = iwinfo.type(dev)
144 if not api then
145         print("No such wireless device: " .. dev)
146         os.exit(1)
147 end
148
149
150 if arg[2]:match("^i") then
151         print_info(api, dev)
152
153 elseif arg[2]:match("^s") then
154         print_scan(api, dev)
155
156 elseif arg[2]:match("^t") then
157         print_txpwrlist(api, dev)
158
159 elseif arg[2]:match("^f") then
160         print_freqlist(api, dev)
161
162 elseif arg[2]:match("^a") then
163         print_assoclist(api, dev)
164
165 else
166         print("Unknown command: " .. arg[2])
167 end