modules/admin-full: Network interface configuration optimization part #1

This commit is contained in:
Steven Barth 2008-08-13 01:24:44 +00:00
parent 0e3fda59e0
commit 07fdaa87db
14 changed files with 184 additions and 124 deletions

View file

@ -25,6 +25,7 @@ disable = "disable"
distance = "Distance"
dnsserver = "DNS-Server"
edit = "Edit"
enable = "enable"
encryption = "Encryption"
error = "Error"

View file

@ -25,6 +25,7 @@ disable = "deaktivieren"
distance = "Distanz"
dnsserver = "DNS-Server"
edit = "Bearbeiten"
enable = "aktivieren"
encryption = "Verschlüsselung"
error = "Fehler"

Binary file not shown.

After

Width:  |  Height:  |  Size: 280 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 385 B

View file

@ -1,18 +0,0 @@
<%#
LuCI - Lua Configuration Interface
Copyright 2008 Steven Barth <steven@midlink.org>
Copyright 2008 Jo-Philipp Wich <xm@leipzig.freifunk.net>
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
$Id$
-%>
<%+cbi/valueheader%>
<a href="<%=REQUEST_URI%>/<%=section%>"><%:edit%></a>
<%+cbi/valuefooter%>

View file

@ -21,36 +21,52 @@ $Id$
<%- local count = 0 -%>
<table class="cbi-section-table">
<tr class="cbi-section-table-titles">
<%- if not self.anonymous then -%>
<th>&nbsp;</th>
<%- end -%>
<%- for i, k in pairs(self.children) do -%>
<th class="cbi-section-table-cell"><%=k.title%></th>
<%- count = count + 1; end; if self.extedit then -%>
<th class="cbi-section-table-cell">&nbsp;</th>
<%- count = count + 1; end; if self.addremove then -%>
<th class="cbi-section-table-cell">&nbsp;</th>
<%- count = count + 1; end -%>
</tr>
<tr class="cbi-section-table-descr">
<%- if not self.anonymous then -%>
<th>&nbsp;</th>
<%- end -%>
<%- for i, k in pairs(self.children) do -%>
<th class="cbi-section-table-cell"><%=k.description%></th>
<%- end; if self.extedit then -%>
<th class="cbi-section-table-cell">&nbsp;</th>
<%- end; if self.addremove then -%>
<th class="cbi-section-table-cell">&nbsp;</th>
<%- end -%>
</tr>
<%- local isempty = true
for i, k in ipairs(self:cfgsections()) do
if not self.anonymous then
-%>
<tr class="cbi-section-table-title">
<th colspan="<%=count%>"><h3><%=k%></h3></th>
</tr>
<%- end
section = k
isempty = false
scope = { valueheader = "cbi/cell_valueheader", valuefooter = "cbi/cell_valuefooter" }
-%>
<tr class="cbi-section-table-row" id="cbi-<%=self.config%>-<%=section%>">
<% if not self.anonymous then -%>
<th><h3><%=k%></h3></th>
<%- end %>
<%-+cbi/ucisection-%>
<%- if self.extedit or self.addremove then -%>
<td class="cbi-section-table-cell">
<%- if self.extedit then -%>
<a href="<%=self.extedit:format(section)%>"><img style="border: none" src="<%=resource%>/cbi/edit.gif" alt="<%:edit%>" /></a>
<%- end; if self.addremove then %>
<button class="clean" type="submit" value="1" name="cbi.rts.<%=self.config%>.<%=k%>" title="<%:delete%>"><img src="<%=resource%>/cbi/remove.gif" alt="<%:delete%>" /></button>
<%- end -%>
</td>
<%- end -%>
<%- if self.addremove then -%>
<td class="cbi-section-table-cell">
<input type="submit" name="cbi.rts.<%=self.config%>.<%=k%>" value="X" title="<%:delete%>" />
</td>
<%- end -%>
</tr>
@ -61,9 +77,10 @@ $Id$
<td colspan="<%=count%>"><em><br /><%:cbi_sectempty%></em></td>
</tr>
<%- end -%>
</table>
<%- if self.addremove then -%>
<tr class="cbi-section-table-row">
<br />
<div class="cbi-section-table-row">
<td colspan="<%=count%>" class="cbi-section-table-optionals">
<div class="cbi-section-create">
<% if self.anonymous then %>
@ -78,9 +95,8 @@ $Id$
<% end %>
</div>
</td>
</tr>
</div>
<%- end -%>
</table>
</div>
</div>
<!-- /tblsection -->

View file

@ -212,6 +212,21 @@ function net.devices()
return devices
end
--- Return information about available network interfaces.
-- @return Table containing all current interface names and their information
function net.deviceinfo()
local devices = {}
for line in io.lines("/proc/net/dev") do
local name, data = line:match("^ *(.-): *(.*)$")
if name and data then
devices[name] = luci.util.split(data, " +", nil, true)
end
end
return devices
end
-- Determine the MAC address belonging to the given IP address.
-- @param ip IPv4 address
-- @return String containing the MAC address or nil if it cannot be found

View file

@ -28,35 +28,32 @@ function index()
page.title = i18n("a_n_switch", "Switch")
page.order = 10
local page = node("admin", "network", "ifaces")
page.target = cbi("admin_network/ifaces")
local page = node("admin", "network", "network")
page.target = cbi("admin_network/network")
page.title = i18n("interfaces", "Schnittstellen")
page.order = 20
page.leaf = true
luci.model.uci.foreach("network", "interface",
function (section)
local ifc = section[".name"]
if ifc ~= "loopback" then
entry({"admin", "network", "ifaces", ifc},
page.target, ifc:upper())
entry({"admin", "network", "network", ifc},
alias("admin", "network", "ifaces", ifc),
ifc:upper())
end
end
)
local page = node("admin", "network", "ifaces")
page.target = cbi("admin_network/ifaces")
page.leaf = true
local page = node("admin", "network", "dhcp")
page.target = cbi("admin_network/dhcp")
page.title = "DHCP"
page.order = 30
local page = node("admin", "network", "ptp")
page.target = cbi("admin_network/ptp")
page.title = "PPPoE / PPTP"
page.order = 40
local page = node("admin", "network", "routes")
page.target = cbi("admin_network/routes")
page.title = i18n("a_n_routes", "Routen")
page.order = 50
page.order = 40
end

View file

@ -2,6 +2,7 @@
LuCI - Lua Configuration Interface
Copyright 2008 Steven Barth <steven@midlink.org>
Copyright 2008 Jo-Philipp Wich <xm@leipzig.freifunk.net>
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@ -11,33 +12,18 @@ You may obtain a copy of the License at
$Id$
]]--
arg[1] = arg[1] or ""
m = Map("network", translate("interfaces"), translate("a_n_ifaces1"))
arg = arg or {}
s = m:section(TypedSection, "interface", translate("interfaces"))
function s.create(self, section)
local stat = TypedSection.create(self, section)
if stat then
arg = {section or stat}
end
return stat
end
function s.filter(self, section)
return section ~= "loopback" and
(not arg or not arg[1] or arg[1] == section)
end
if not arg or not arg[1] then
s = m:section(NamedSection, arg[1], "interface", translate("interfaces"))
s.addremove = true
end
s:depends("proto", "static")
s:depends("proto", "dhcp")
p = s:option(ListValue, "proto", translate("protocol"))
p:value("static", translate("static"))
p:value("dhcp", "DHCP")
p:value("pppoe", "PPPoE")
p:value("pptp", "PPTP")
p.default = "static"
br = s:option(Flag, "type", translate("a_n_i_bridge"), translate("a_n_i_bridge1"))
@ -91,25 +77,38 @@ mtu.isinteger = true
mac = s:option(Value, "macaddr", translate("macaddress"))
mac.optional = true
user = s:option(Value, "username", translate("username"))
user.rmempty = true
user:depends("proto", "pptp")
user:depends("proto", "ppoe")
pass = s:option(Value, "password", translate("password"))
pass.rmempty = true
pass:depends("proto", "pptp")
pass:depends("proto", "ppoe")
ka = s:option(Value, "keepalive")
ka.rmempty = true
ka:depends("proto", "pptp")
ka:depends("proto", "ppoe")
demand = s:option(Value, "demand")
demand.rmempty = true
demand:depends("proto", "pptp")
demand:depends("proto", "ppoe")
srv = s:option(Value, "server")
srv:depends("proto", "pptp")
srv.rmempty = true
s2 = m:section(TypedSection, "alias", translate("aliases"))
s2.addremove = true
if arg and arg[1] then
s2:depends("interface", arg[1])
s2.defaults.interface = arg[1]
else
parent = s2:option(ListValue, "interface", translate("interface"))
luci.model.uci.foreach("network", "interface",
function (section)
if section[".name"] ~= "loopback" then
parent:value(section[".name"])
end
end
)
end
s2.defaults.proto = "static"

View file

@ -0,0 +1,79 @@
--[[
LuCI - Lua Configuration Interface
Copyright 2008 Steven Barth <steven@midlink.org>
Copyright 2008 Jo-Philipp Wich <xm@leipzig.freifunk.net>
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
$Id$
]]--
require("luci.sys")
m = Map("network", translate("interfaces"), translate("a_n_ifaces1"))
local created
local netstat = luci.sys.net.deviceinfo()
s = m:section(TypedSection, "interface", translate("interfaces"))
s.addremove = true
s.extedit = luci.http.getenv("REQUEST_URI") .. "/%s"
s.template = "cbi/tblsection"
function s.filter(self, section)
return section ~= "loopback" and section
end
function s.create(self, section)
if TypedSection.create(self, section) then
created = section
end
end
function s.parse(self, ...)
TypedSection.parse(self, ...)
if created then
luci.http.redirect(luci.http.getenv("REQUEST_URI") .. "/" .. created)
end
end
up = s:option(Flag, "up")
up.stateful = true
function up.write(self, section, value)
local call = value == "1" and "ifdown" or "ifup"
os.execute(call .. " " .. section)
end
ipaddr = s:option(DummyValue, "ipaddr", translate("ipaddress"))
ipaddr.stateful = true
function ipaddr.cfgvalue(self, section)
local ip = self.map:stateget(section, "ipaddr")
local nm = self.map:stateget(section, "netmask")
local parsed = ip and luci.ip.IPv4(ip, nm)
return parsed and parsed:string() or ""
end
rx = s:option(DummyValue, "_rx")
function rx.cfgvalue(self, section)
local ix = self.map:stateget(section, "ifname")
local bt = netstat and netstat[ix] and netstat[ix][1]
return bt and string.format("%.2f MB", tonumber(bt) / 1024 / 1024)
end
tx = s:option(DummyValue, "_tx")
function tx.cfgvalue(self, section)
local ix = self.map:stateget(section, "ifname")
local bt = netstat and netstat[ix] and netstat[ix][9]
return bt and string.format("%.2f MB", tonumber(bt) / 1024 / 1024)
end
return m

View file

@ -1,48 +0,0 @@
--[[
LuCI - Lua Configuration Interface
Copyright 2008 Steven Barth <steven@midlink.org>
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
$Id$
]]--
m = Map("network", translate("a_n_ptp"), translate("a_n_ptp1"))
s = m:section(TypedSection, "interface", "")
s.addremove = true
s:depends("proto", "pppoe")
s:depends("proto", "pptp")
p = s:option(ListValue, "proto", translate("protocol"))
p:value("pppoe", "PPPoE")
p:value("pptp", "PPTP")
p.default = "pppoe"
ifname = s:option(Value, "ifname", translate("interface"))
for i,d in ipairs(luci.sys.net.devices()) do
if d ~= "lo" then
ifname:value(d)
end
end
s:option(Value, "username", translate("username"))
s:option(Value, "password", translate("password"))
s:option(Value, "keepalive").optional = true
s:option(Value, "demand").optional = true
srv = s:option(Value, "server")
srv:depends("proto", "pptp")
srv.rmempty = true
mtu = s:option(Value, "mtu", "MTU")
mtu.optional = true
mtu.isinteger = true
return m

View file

@ -252,6 +252,12 @@ td input[type=password] {
width: 99%;
}
button.clean {
cursor: pointer;
border: none;
background-color: inherit;
}
textarea {
margin-left: -1px;
margin-bottom: 0.5em;

View file

@ -237,6 +237,12 @@ td input[type=password] {
width: 99%;
}
button.clean {
cursor: pointer;
border: none;
background-color: inherit;
}
textarea {
margin-left: -1px;
margin-bottom: 0.5em;

View file

@ -245,6 +245,12 @@ td input[type=password] {
width: 99%;
}
button.clean {
cursor: pointer;
border: none;
background-color: inherit;
}
textarea {
margin-left: -1px;
margin-bottom: 0.5em;