1de43faafea9c369ba0753c952dc3fbaac4efdee
[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         local enc = iw.encryption(dev)
28
29         local function hwmode()
30                 local m = iw.hwmodelist(dev)
31                 if m then
32                         local s = "802.11"
33                         if m.a then s = s.."a" end
34                         if m.b then s = s.."b" end
35                         if m.g then s = s.."g" end
36                         if m.n then s = s.."n" end
37                         return s
38                 else
39                         return "?"
40                 end
41         end
42
43         printf("%-9s ESSID: \"%s\"",
44                 dev, s(iw.ssid(dev)))
45
46         printf("          Access Point: %s",
47                 s(iw.bssid(dev)))
48
49         printf("          Type: %s  HW Mode(s): %s",
50                 api, hwmode())
51
52         printf("          Mode: %s  Channel: %d (%.3f GHz)",
53                 s(iw.mode(dev)), n(iw.channel(dev)), n(iw.frequency(dev)) / 1000)
54
55         printf("          Tx-Power: %s dBm  Link Quality: %s/%s",
56                 s(iw.txpower(dev)), s(iw.quality(dev)), s(iw.quality_max(dev)))
57
58         printf("          Signal: %s dBm  Noise: %s dBm",
59                 s(iw.signal(dev)), s(iw.noise(dev)))
60
61         printf("          Bit Rate: %.1f MBit/s",
62                 n(iw.bitrate(dev)) / 1000)
63
64         printf("          Encryption: %s",
65                 s(enc and enc.description))
66
67         print("")
68 end
69
70 function print_scan(api, dev)
71         local iw = iwinfo[api]
72         local sr = iw.scanlist(dev)
73         local si, se
74
75         if sr and #sr > 0 then
76                 for si, se in ipairs(sr) do
77                         printf("Cell %02d - Address: %s", si, se.bssid)
78                         printf("          ESSID: \"%s\"",
79                                 s(se.ssid))
80
81                         printf("          Mode: %s  Channel: %d",
82                                 s(se.mode), n(se.channel))
83
84                         printf("          Signal: %s dBm  Quality: %d/%d",
85                                 s(se.signal), n(se.quality), n(se.quality_max))
86
87                         printf("          Encryption: %s",
88                                 s(se.encryption.description))
89
90                         print("")
91                 end
92         else
93                 print("No scan results or scanning not possible")
94                 print("")
95         end
96 end
97
98 function print_txpwrlist(api, dev)
99         local iw = iwinfo[api]
100         local pl = iw.txpwrlist(dev)
101         local cp = n(iw.txpower(dev))
102         local pe
103
104         if pl and #pl > 0 then
105                 for _, pe in ipairs(pl) do
106                         printf("%s%3d dBm (%4d mW)",
107                                 (cp == pe.dbm) and "*" or " ",
108                                 n(pe.dbm), n(pe.mw))
109                 end
110         else
111                 print("No TX power information available")
112         end
113
114         print("")
115 end
116
117 function print_freqlist(api, dev)
118         local iw = iwinfo[api]
119         local fl = iw.freqlist(dev)
120         local cc = n(iw.channel(dev))
121         local fe
122
123         if fl and #fl > 0 then
124                 for _, fe in ipairs(fl) do
125                         printf("%s %.3f GHz (Channel %d)%s",
126                                 (cc == fe.channel) and "*" or " ",
127                                 n(fe.mhz) / 1000, n(fe.channel),
128                                 fe.restricted and " [restricted]" or "")
129                 end
130         else
131                 print("No frequency information available")
132         end
133
134         print("")
135 end
136
137 function print_assoclist(api, dev)
138         local iw = iwinfo[api]
139         local al = iw.assoclist(dev)
140         local ai, ae
141
142         if al and next(al) then
143                 for ai, ae in pairs(al) do
144                         printf("%s  %s dBm", ai, s(ae.signal))
145                 end
146         else
147                 print("No client connected or no information available")
148         end
149
150         print("")
151 end
152
153 function print_countrylist(api, dev)
154         local iw = iwinfo[api]
155         local cl = iw.countrylist(dev)
156         local cc = iw.country(dev)
157         local ce
158
159         if cl and #cl > 0 then
160                 for _, ce in ipairs(cl) do
161                         printf("%s %4s  %s",
162                                 (cc == ce.alpha2) and "*" or " ",
163                                 ce.ccode, ce.name)
164                 end
165         else
166                 print("No country code information available")
167         end
168
169         print("")
170 end
171
172
173 if #arg ~= 2 then
174         print("Usage:")
175         print(" iwinfo <device> info")
176         print(" iwinfo <device> scan")
177         print(" iwinfo <device> txpowerlist")
178         print(" iwinfo <device> freqlist")
179         print(" iwinfo <device> assoclist")
180         print(" iwinfo <device> countrylist")
181         os.exit(1)
182 end
183
184 local dev = arg[1]
185 local api = iwinfo.type(dev)
186 if not api then
187         print("No such wireless device: " .. dev)
188         os.exit(1)
189 end
190
191
192 if arg[2]:match("^i") then
193         print_info(api, dev)
194
195 elseif arg[2]:match("^s") then
196         print_scan(api, dev)
197
198 elseif arg[2]:match("^t") then
199         print_txpwrlist(api, dev)
200
201 elseif arg[2]:match("^f") then
202         print_freqlist(api, dev)
203
204 elseif arg[2]:match("^a") then
205         print_assoclist(api, dev)
206
207 elseif arg[2]:match("^c") then
208         print_countrylist(api, dev)
209
210 else
211         print("Unknown command: " .. arg[2])
212 end