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