5358caeae63e390d6d1c8592be76cd0693d2c1b4
[project/luci.git] / modules / admin-full / luasrc / view / admin_status / interfaces.htm
1 <%#
2 LuCI - Lua Configuration Interface
3 Copyright 2008-2009 Steven Barth <steven@midlink.org>
4 Copyright 2008-2009 Jo-Philipp Wich <xm@leipzig.freifunk.net>
5
6 Licensed under the Apache License, Version 2.0 (the "License");
7 you may not use this file except in compliance with the License.
8 You may obtain a copy of the License at
9
10 http://www.apache.org/licenses/LICENSE-2.0
11
12 $Id$
13
14 -%>
15
16 <%-
17
18 require "luci.tools.webadmin"
19
20 local wba = luci.tools.webadmin
21 local uci = luci.model.uci.cursor_state()
22
23 local bridge_ifs = { }
24 local single_ifs = { }
25 local wifi_ifs = { }
26 local devinfo = luci.sys.net.deviceinfo()
27
28 uci:foreach("network", "interface",
29 function(s)
30 if s['.name'] ~= "loopback" then
31 if s.type == "bridge" then
32 bridge_ifs[#bridge_ifs+1] = s
33 else
34 single_ifs[#single_ifs+1] = s
35 end
36 end
37 end)
38
39 uci:foreach("wireless", "wifi-iface",
40 function(s)
41 wifi_ifs[s.network or s.device] = true
42 end)
43
44 function is_wifi(i)
45 return wifi_ifs[i]
46 or i:match("^wl%d+")
47 or i:match("^ath%d+")
48 or i:match("^wlan%d+")
49 end
50
51 function get_ifname(s)
52 return s.ifname and s.ifname:match("%S+")
53 end
54
55 function get_ifnames(s)
56 local l = { }
57 if s.ifname then
58 for n in s.ifname:gmatch("%S+") do
59 l[#l+1] = n
60 end
61 end
62 return l
63 end
64
65 function get_vlan(i)
66 return i and i:match("^%w+%.(%d+)$")
67 end
68
69 function get_vlan_ports(i)
70 local x = get_vlan(i)
71 local d = i:match("(%d+)%.%d+$")
72 local p = { }
73
74 uci:foreach("network", "switch",
75 function(s)
76 local d2 = s['.name']:match("%d+$")
77 if d2 == d and s["vlan"..x] then
78 for pt in s["vlan"..x]:gmatch("%S+") do
79 p[#p+1] = pt
80 end
81 end
82 end)
83
84 return p
85 end
86
87 function get_switch_driver(i)
88 local n, d = i:match("([a-z]+)(%d+)%.%d+$")
89 local hw = luci.fs.readfile("/proc/switch/%s%s/driver" %{ n, d })
90 or luci.fs.readfile("/proc/switch/%s/driver" % d )
91
92 return hw and hw:match("%S+")
93 end
94
95 function get_mac(i)
96 for l in luci.util.execi("ifconfig %q" % i) do
97 if l:find("HWaddr ") then
98 return l:match("HWaddr (%S+)")
99 end
100 end
101 return "00:00:00:00:00:00"
102 end
103
104 function get_aliases(s)
105 local a = { }
106 uci:foreach("network", "alias",
107 function(s2)
108 if s2.interface == s['.name'] then
109 a[#a+1] = s2
110 end
111 end)
112 return a
113 end
114
115 function get_iwinfo(i)
116 local w = { }
117 uci:foreach("wireless", "wifi-iface",
118 function(s)
119 if s.ifname == i then
120 w.type = uci:get("wireless", s.device, "type")
121 w.channel = uci:get("wireless", s.device, "channel")
122 w.mode = ( s.wds == "1" ) and s.mode .. "wds" or s.mode
123 w.ssid = s.ssid
124 w.type = w.type and w.type:gsub("^([a-z])", string.upper)
125 end
126 end)
127 return w
128 end
129
130 function get_iwmode(w)
131 local m = {
132 ap = translate("a_s_if_iwmode_ap", "Master"),
133 sta = translate("a_s_if_iwmode_sta", "Client"),
134 wds = translate("a_s_if_iwmode_wds", "WDS"),
135 stawds = translate("a_s_if_iwmode_stawds", "Client + WDS"),
136 apwds = translate("a_s_if_iwmode_apwds", "Master + WDS"),
137 adhoc = translate("a_s_if_iwmode_adhoc", "Ad-Hoc"),
138 ahdemo = translate("a_s_if_iwmode_ahdemo", "Pseudo Ad-Hoc")
139 }
140
141 return m[w.mode] or w.mode
142 end
143
144 function get_brinfo(s)
145 local b = { }
146 local m = false
147 for l in luci.util.execi("brctl show") do
148 if not l:match("STP") then
149 if m and l:match("^[a-z]") then
150 break
151 elseif m or l:match("^br%%-%s" % s['.name']) then
152 m = true
153 local r = luci.util.split(l, "%s+", nil, true)
154 if #r > 2 then
155 b.name = r[1]
156 b.id = r[2]
157 b.stp = r[3] == "yes"
158 b.ifnames = { r[4] }
159 else
160 b.ifnames[#b.ifnames+1] = r[2]
161 end
162 end
163 end
164 end
165 return b
166 end
167
168 -%>
169
170 <%+header%>
171
172 <h2><a id="content" name="content"><%:a_s_if_status Interface Status%></a></h2>
173
174 <form method="post" action="<%=REQUEST_URI%>">
175 <div class="cbi-map">
176 <fieldset class="cbi-section">
177 <% for _, i in ipairs(single_ifs) do
178 dev = get_ifname(i)
179 vlan = get_vlan(dev)
180
181 if dev and devinfo and devinfo[dev] then
182 %>
183 <h3><%:a_s_if_interface Interface%> <%=i['.name']%></h3>
184 <p style="font-size:90%;padding-left:1em">
185
186 <strong><%:a_s_if_device Device%>:</strong>
187 <%=dev%> (<%:a_s_if_mac MAC%> <%=get_mac(dev)%>)<br />
188
189 <strong><%:a_s_if_type Type%>:</strong>
190 <% if is_wifi(dev) then iw = get_iwinfo(dev) -%>
191 <%:a_s_if_wifidev Wireless Adapter%> (<%=iw.type%>)<br />
192 <% if iw then %>
193 &nbsp; &#x2514; <strong><%:a_s_if_iwmode Mode%>:</strong> <%=get_iwmode(iw)%><br />
194 &nbsp; &#x2514; <strong><%:a_s_if_iwssid SSID%>:</strong> <%=iw.ssid%><br />
195 &nbsp; &#x2514; <strong><%:a_s_if_iwchannel Channel%>:</strong> <%=iw.channel%>
196 <% end %>
197 <% else -%>
198 <% if vlan then %>
199 <%:a_s_if_ethswitch Ethernet Switch%> (<%=get_switch_driver(dev)%>)<br />
200 &nbsp; &#x2514; <strong><%:a_s_if_vlan VLAN%>:</strong> <%=get_vlan(dev)%> (<%:a_s_if_vlanports Ports%> <%=table.concat(get_vlan_ports(dev), ", ")%>)
201 <% else %>
202 <%:a_s_if_ethdev Ethernet Adapter%>
203 <% end %>
204 <% end -%><br />
205
206 <strong><%:a_s_if_transfer Transfer%></strong><br />
207 &nbsp; &#x2514; <strong><%:a_s_if_transfer_rx RX%>:</strong> <%=devinfo[dev][2]%> <%:a_s_if_pkts Pkts.%> (<%=wba.byte_format(tonumber(devinfo[dev][1]))%>)<br />
208 &nbsp; &#x2514; <strong><%:a_s_if_transfer_tx TX%>:</strong> <%=devinfo[dev][10]%> <%:a_s_if_pkts Pkts.%> (<%=wba.byte_format(tonumber(devinfo[dev][9]))%>)<br />
209
210 <%- if ( i.ipaddr and #i.ipaddr > 0 ) or ( i.ip6addr and #i.ip6addr > 0 ) then -%>
211 <strong><%:a_s_if_ipconfig IP Configuration%></strong><br />
212 &nbsp; &#x2514; <strong><%:a_s_if_ipconfig_primary Primary%>:</strong>
213 <% if i.ipaddr and #i.ipaddr > 0 then %>
214 <%=i.ipaddr%>/<%=i.netmask%>
215 <% if i.proto == "dhcp" then -%>
216 (<%:a_s_if_ipconfig_dhcp DHCP assigned%>)
217 <%- end %>
218 <% else %>
219 <em><%:a_s_if_ipconfig_none Not configured%></em>
220 <% end %><br />
221
222 <% for i, a in ipairs(get_aliases(i)) do %>
223 &nbsp; &#x2514; <strong><%:a_s_if_ipconfig_alias Alias%> #<%=i%>:</strong>
224 <%=a.ipaddr%>/<%=a.netmask%> (<%:a_s_if_device Device%> <%=dev%>:<%=i%>) <br />
225 <% end %>
226
227 <% if i.ip6addr and #i.ip6addr > 0 then %>
228 &nbsp; &#x2514; <strong><%:a_s_if_ipconfig_ipv6 IPv6%>:</strong> <%=i.ip6addr%><br />
229 <% end %>
230 <%- end -%>
231 <br /></p>
232 <% end end %>
233
234
235 <% for _, b in ipairs(bridge_ifs) do
236 br = get_brinfo(b)
237 dev = br and br.name
238
239 if br and devinfo and devinfo[dev] then
240 %>
241 <h3><%:a_s_if_bridge Bridge%> <%=br.name%></h3>
242 <p style="font-size:90%;padding-left:1em">
243
244 <strong><%:a_s_if_device Device%>:</strong>
245 <%=dev%> (<%:a_s_if_mac MAC%> <%=get_mac(dev)%>)<br />
246
247 <strong><%:a_s_if_type Type%>:</strong>
248 <%:a_s_if_ethbridge Ethernet Bridge%><br />
249
250 &nbsp; &#x2514; <strong><%:a_s_if_bridge_id ID%>:</strong> <%=br.id%><br />
251 &nbsp; &#x2514; <strong><%:a_s_if_bridge_stp STP%>:</strong> <%=br.stp and "enabled" or "disabled"%><br />
252
253 <strong><%:a_s_if_transfer Transfer%></strong><br />
254 &nbsp; &#x2514; <strong><%:a_s_if_transfer_rx RX%>:</strong> <%=devinfo[dev][2]%> Pkts. (<%=wba.byte_format(tonumber(devinfo[dev][1]))%>)<br />
255 &nbsp; &#x2514; <strong><%:a_s_if_transfer_tx TX%>:</strong> <%=devinfo[dev][10]%> Pkts. (<%=wba.byte_format(tonumber(devinfo[dev][9]))%>)<br />
256
257 <%- if ( b.ipaddr and #b.ipaddr > 0 ) or ( b.ip6addr and #b.ip6addr > 0 ) then -%>
258 <strong><%:a_s_if_ipconfig IP Configuration%></strong><br />
259 &nbsp; &#x2514; <strong><%:a_s_if_ipconfig_primary Primary%>:</strong>
260 <% if b.ipaddr and #b.ipaddr > 0 then %>
261 <%=b.ipaddr%>/<%=b.netmask%>
262 <% if b.proto == "dhcp" then -%>
263 (<%:a_s_if_ipconfig_dhcp DHCP assigned%>)
264 <%- end %>
265 <% else %>
266 <em><%:a_s_if_ipconfig_none Not configured%></em>
267 <% end %><br />
268
269 <% for i, a in ipairs(get_aliases(b)) do %>
270 &nbsp; &#x2514; <strong><%:a_s_if_ipconfig_alias Alias%> #<%=i%>:</strong>
271 <%=a.ipaddr%>/<%=a.netmask%> (<%:a_s_if_device Device%> <%=dev%>:<%=i%>) <br />
272 <% end %>
273
274 <% if b.ip6addr and #b.ip6addr > 0 then %>
275 &nbsp; &#x2514; <strong><%:a_s_if_ipconfig_ipv6 IPv6%>:</strong> <%=b.ip6addr%><br />
276 <% end %>
277 <%- end -%>
278
279 <% for n, i in ipairs(br.ifnames) do
280 dev = i
281 vlan = get_vlan(dev)
282 %>
283 <strong><%:a_s_if_bridge_port Bridge Port%> <%=n%></strong><br />
284
285 &nbsp; &#x2514; <strong><%:a_s_if_device Device%>:</strong>
286 <%=dev%> (<%:a_s_if_mac MAC%> <%=get_mac(dev)%>)<br />
287
288 &nbsp; &#x2514; <strong><%:a_s_if_type Type%>:</strong>
289 <% if is_wifi(dev) then iw = get_iwinfo(dev) -%>
290 <%:a_s_if_wifidev Wireless Adapter%> (<%=iw.type%>)<br />
291 <% if iw then %>
292 &nbsp; &nbsp; &nbsp; &#x2514; <strong><%:a_s_if_iwmode Mode%>:</strong> <%=get_iwmode(iw)%><br />
293 &nbsp; &nbsp; &nbsp; &#x2514; <strong><%:a_s_if_iwssid SSID%>:</strong> <%=iw.ssid%><br />
294 &nbsp; &nbsp; &nbsp; &#x2514; <strong><%:a_s_if_iwchannel Channel%>:</strong> <%=iw.channel%>
295 <% end %>
296 <% else -%>
297 <% if vlan then %>
298 <%:a_s_if_ethswitch Ethernet Switch%> (<%=get_switch_driver(dev)%>)<br />
299 &nbsp; &nbsp; &nbsp; &#x2514; <strong><%:a_s_if_vlan VLAN%>:</strong>
300 <%=get_vlan(dev)%> (<%:a_s_if_vlan_ports Ports%> <%=table.concat(get_vlan_ports(dev), ", ")%>)
301 <% else %>
302 <%:a_s_if_ethdev Ethernet Adapter%>
303 <% end %>
304 <% end -%><br />
305 <% end %>
306 <br /></p>
307 <% end end %>
308 </fieldset>
309 </div>
310 </form>
311
312 <%+footer%>