From bd32a8aac5de9beb321b3cdfe180a8798c5a3379 Mon Sep 17 00:00:00 2001 From: Steven Barth Date: Fri, 28 Mar 2008 22:55:27 +0000 Subject: [PATCH] * CBI: improvements, bug fixes * admin: Introduced wifi, olsr, password pages --- contrib/media/cascade.css | 1 + src/ffluci/cbi.lua | 38 ++++++++--- src/ffluci/controller/admin/index.lua | 2 +- src/ffluci/controller/admin/mesh.lua | 9 +++ src/ffluci/controller/admin/network.lua | 4 +- src/ffluci/controller/admin/system.lua | 26 +++++++ src/ffluci/controller/admin/uci.lua | 2 +- src/ffluci/controller/admin/wifi.lua | 10 +++ src/ffluci/dispatcher.lua | 9 ++- src/ffluci/http.lua | 2 +- src/ffluci/model/cbi/admin_network/ifaces.lua | 7 ++ src/ffluci/model/cbi/admin_wifi/devices.lua | 52 ++++++++++++++ src/ffluci/model/cbi/admin_wifi/networks.lua | 67 +++++++++++++++++++ src/ffluci/sys.lua | 13 +++- src/ffluci/view/admin_system/index.htm | 2 + src/ffluci/view/admin_system/passwd.htm | 15 +++++ src/ffluci/view/admin_wifi/index.htm | 2 + src/ffluci/view/cbi/dvalue.htm | 12 ++++ src/ffluci/view/cbi/tsection.htm | 7 +- src/ffluci/view/cbi/value.htm | 2 +- 20 files changed, 260 insertions(+), 22 deletions(-) create mode 100644 src/ffluci/controller/admin/mesh.lua create mode 100644 src/ffluci/controller/admin/system.lua create mode 100644 src/ffluci/controller/admin/wifi.lua create mode 100644 src/ffluci/model/cbi/admin_wifi/devices.lua create mode 100644 src/ffluci/model/cbi/admin_wifi/networks.lua create mode 100644 src/ffluci/view/admin_system/index.htm create mode 100644 src/ffluci/view/admin_system/passwd.htm create mode 100644 src/ffluci/view/admin_wifi/index.htm create mode 100644 src/ffluci/view/cbi/dvalue.htm diff --git a/contrib/media/cascade.css b/contrib/media/cascade.css index 55d6f76bd..8555e3f82 100644 --- a/contrib/media/cascade.css +++ b/contrib/media/cascade.css @@ -198,6 +198,7 @@ code { .cbi-optionals select, .cbi-optionals input, .cbi-section-remove input, .cbi-section-create input { font-size: 0.8em; + margin: 0%; } .cbi-value-description { diff --git a/src/ffluci/cbi.lua b/src/ffluci/cbi.lua index 844f6c0bb..296a77b49 100644 --- a/src/ffluci/cbi.lua +++ b/src/ffluci/cbi.lua @@ -43,10 +43,11 @@ function load(cbimap) local func, err = loadfile(cbidir..cbimap..".lua") if not func then - error(err) return nil end + ffluci.i18n.loadc("cbi") + ffluci.util.resfenv(func) ffluci.util.updfenv(func, ffluci.cbi) ffluci.util.extfenv(func, "translate", ffluci.i18n.translate) @@ -58,8 +59,6 @@ function load(cbimap) return nil end - ffluci.i18n.loadc("cbi") - return map end @@ -131,7 +130,8 @@ end function Map.add(self, sectiontype) local name = self.uci:add(self.config, sectiontype) if name then - self.ucidata[name] = self.uci:show(self.config, name) + self.ucidata[name] = {} + self.ucidata[name][".type"] = sectiontype end return name end @@ -317,7 +317,9 @@ function NamedSection.parse(self) if active then AbstractSection.parse_dynamic(self, s) - Node.parse(self, s) + if ffluci.http.formvalue("cbi.submit") then + Node.parse(self, s) + end AbstractSection.parse_optionals(self, s) end end @@ -337,7 +339,7 @@ function TypedSection.__init__(self, ...) self.deps = {} self.excludes = {} - self.anonymous = false + self.anonymous = false end -- Return all matching UCI sections for this TypedSection @@ -420,7 +422,9 @@ function TypedSection.parse(self) for k, v in pairs(self:cfgsections()) do AbstractSection.parse_dynamic(self, k) - Node.parse(self, k) + if ffluci.http.formvalue("cbi.submit") then + Node.parse(self, k) + end AbstractSection.parse_optionals(self, k) end end @@ -518,7 +522,7 @@ function AbstractValue.parse(self, section) if fvalue and not (fvalue == self:cfgvalue(section)) then self:write(section, fvalue) end - elseif ffluci.http.formvalue("cbi.submit") then -- Unset the UCI or error + else -- Unset the UCI or error if self.rmempty or self.optional then self:remove(section) end @@ -583,6 +587,23 @@ function Value.validate(self, val) end +-- DummyValue - This does nothing except being there +DummyValue = class(AbstractValue) + +function DummyValue.__init__(self, map, ...) + AbstractValue.__init__(self, map, ...) + self.template = "cbi/dvalue" + self.value = nil +end + +function DummyValue.parse(self) + +end + +function DummyValue.render(self, s) + ffluci.template.render(self.template, {self=self, section=s}) +end + --[[ Flag - A flag being enabled or disabled @@ -599,7 +620,6 @@ end -- A flag can only have two states: set or unset function Flag.parse(self, section) - self.default = self.enabled local fvalue = self:formvalue(section) if fvalue then diff --git a/src/ffluci/controller/admin/index.lua b/src/ffluci/controller/admin/index.lua index 3ee564f64..d57e3fd9f 100644 --- a/src/ffluci/controller/admin/index.lua +++ b/src/ffluci/controller/admin/index.lua @@ -1,4 +1,4 @@ -module(..., package.seeall) +module("ffluci.controller.admin.index", package.seeall) menu = { descr = "Übersicht", diff --git a/src/ffluci/controller/admin/mesh.lua b/src/ffluci/controller/admin/mesh.lua new file mode 100644 index 000000000..fcdcdabb0 --- /dev/null +++ b/src/ffluci/controller/admin/mesh.lua @@ -0,0 +1,9 @@ +module("ffluci.controller.admin.mesh", package.seeall) + +menu = { + descr = "Mesh", + order = 50, + entries = { + {action = "olsrd", descr = "OLSR"}, + } +} \ No newline at end of file diff --git a/src/ffluci/controller/admin/network.lua b/src/ffluci/controller/admin/network.lua index 2774dfdb0..534193b4d 100644 --- a/src/ffluci/controller/admin/network.lua +++ b/src/ffluci/controller/admin/network.lua @@ -2,9 +2,9 @@ module(..., package.seeall) menu = { descr = "Netzwerk", - order = 20, + order = 30, entries = { - {action = "vlan", descr = "VLAN"}, + {action = "vlan", descr = "Switch"}, {action = "ifaces", descr = "Schnittstellen"}, {action = "ptp", descr = "PPPoE / PPTP"}, } diff --git a/src/ffluci/controller/admin/system.lua b/src/ffluci/controller/admin/system.lua new file mode 100644 index 000000000..df2d981e4 --- /dev/null +++ b/src/ffluci/controller/admin/system.lua @@ -0,0 +1,26 @@ +module("ffluci.controller.admin.system", package.seeall) + +require("ffluci.util") +require("ffluci.http") + +menu = { + descr = "System", + order = 20, + entries = { + {action = "passwd", descr = "Passwort"}, + } +} + +function action_passwd() + local p1 = ffluci.http.formvalue("pwd1") + local p2 = ffluci.http.formvalue("pwd2") + local msg = nil + local cm + + if p1 or p2 then + cm = "(echo '"..p1.."';sleep 1;echo '"..p2.."') | passwd root 2>&1" + msg = ffluci.util.exec(cm) + end + + ffluci.template.render("admin_system/passwd", {msg=msg}) +end \ No newline at end of file diff --git a/src/ffluci/controller/admin/uci.lua b/src/ffluci/controller/admin/uci.lua index a1eb0d7d7..9f8c12499 100644 --- a/src/ffluci/controller/admin/uci.lua +++ b/src/ffluci/controller/admin/uci.lua @@ -24,7 +24,7 @@ function action_apply() for k, v in pairs(apply) do local cmd = ffluci.config.uci_oncommit[k] if cmd then - output = output .. ffluci.util.exec(cmd) + output = output .. cmd .. ":" .. ffluci.util.exec(cmd) end end end diff --git a/src/ffluci/controller/admin/wifi.lua b/src/ffluci/controller/admin/wifi.lua new file mode 100644 index 000000000..54b6bfb20 --- /dev/null +++ b/src/ffluci/controller/admin/wifi.lua @@ -0,0 +1,10 @@ +module("ffluci.controller.admin.wifi", package.seeall) + +menu = { + descr = "Drahtlos", + order = 40, + entries = { + {action = "devices", descr = "Geräte"}, + {action = "networks", descr = "Netze"}, + } +} \ No newline at end of file diff --git a/src/ffluci/dispatcher.lua b/src/ffluci/dispatcher.lua index ee836043d..139b0e308 100644 --- a/src/ffluci/dispatcher.lua +++ b/src/ffluci/dispatcher.lua @@ -172,7 +172,7 @@ function cbi(request) i18n.loadc(request.module) local stat, map = pcall(cbi.load, path) - if stat then + if stat and map then local stat, err = pcall(map.parse, map) if not stat then disp.error500(err) @@ -181,6 +181,8 @@ function cbi(request) tmpl.render("cbi/header") map:render() tmpl.render("cbi/footer") + elseif not stat then + disp.error500(map) else disp.error404() end @@ -208,7 +210,7 @@ function dynamic(request) end local stat, map = pcall(cbi.load, path) - if stat then + if stat and map then local stat, err = pcall(map.parse, map) if not stat then disp.error500(err) @@ -218,6 +220,9 @@ function dynamic(request) map:render() tmpl.render("cbi/footer") return + elseif not stat then + disp.error500(map) + return end disp.error404() diff --git a/src/ffluci/http.lua b/src/ffluci/http.lua index bf9410573..81076233b 100644 --- a/src/ffluci/http.lua +++ b/src/ffluci/http.lua @@ -59,7 +59,7 @@ end function formvalue(key, default) local c = formvalues() - for match in key:gmatch("%w+") do + for match in key:gmatch("[%w-_]+") do c = c[match] if c == nil then return default diff --git a/src/ffluci/model/cbi/admin_network/ifaces.lua b/src/ffluci/model/cbi/admin_network/ifaces.lua index aaabe653e..193f83f51 100644 --- a/src/ffluci/model/cbi/admin_network/ifaces.lua +++ b/src/ffluci/model/cbi/admin_network/ifaces.lua @@ -12,6 +12,10 @@ p:value("static", "statisch") p:value("dhcp", "DHCP") p.default = "static" +br = s:option(Flag, "type", "Netzwerkbrücke", "überbrückt angegebene Schnittstelle(n)") +br.enabled = "bridge" +br.rmempty = true + s:option(Value, "ifname", "Schnittstelle") s:option(Value, "ipaddr", "IP-Adresse") @@ -30,4 +34,7 @@ mtu = s:option(Value, "mtu", "MTU") mtu.optional = true mtu.isinteger = true +mac = s:option(Value, "macaddr", "MAC-Adresse") +mac.optional = true + return m \ No newline at end of file diff --git a/src/ffluci/model/cbi/admin_wifi/devices.lua b/src/ffluci/model/cbi/admin_wifi/devices.lua new file mode 100644 index 000000000..7ef794c7e --- /dev/null +++ b/src/ffluci/model/cbi/admin_wifi/devices.lua @@ -0,0 +1,52 @@ +-- ToDo: Translate, Add descriptions and help texts +require("ffluci.util") + +m = Map("wireless", "Geräte") + +s = m:section(TypedSection, "wifi-device") +--s.addremove = true + +en = s:option(Flag, "disabled", "Aktivieren") +en.enabled = "0" +en.disabled = "1" + +t = s:option(ListValue, "type", "Typ") +t:value("broadcom") +t:value("atheros") +t:value("mac80211") +t:value("prism2") +--[[ +local c = ". /etc/functions.sh;for i in /lib/wifi/*;do . $i;done;echo $DRIVERS" +for driver in ffluci.util.execl(c)[1]:gmatch("[^ ]+") do + t:value(driver) +end +]]-- + +mode = s:option(ListValue, "mode", "Modus") +mode:value("", "standard") +mode:value("11b", "802.11b") +mode:value("11g", "802.11g") +mode:value("11a", "802.11a") +mode:value("11bg", "802.11b+g") +mode.rmempty = true + +s:option(Value, "channel", "Funkkanal") + +s:option(Value, "txantenna", "Sendeantenne").rmempty = true + +s:option(Value, "rxantenna", "Empfangsantenne").rmempty = true + +s:option(Value, "distance", "Distanz", + "Distanz zum am weitesten entfernten Funkpartner (m)").rmempty = true + +s:option(Value, "diversity", "Diversität"):depends("type", "atheros") + +country = s:option(Value, "country", "Ländercode") +country.optional = true +country:depends("type", "broadcom") + +maxassoc = s:option(Value, "maxassoc", "Verbindungslimit") +maxassoc:depends("type", "broadcom") +maxassoc.optional = true + +return m \ No newline at end of file diff --git a/src/ffluci/model/cbi/admin_wifi/networks.lua b/src/ffluci/model/cbi/admin_wifi/networks.lua new file mode 100644 index 000000000..ebc25715e --- /dev/null +++ b/src/ffluci/model/cbi/admin_wifi/networks.lua @@ -0,0 +1,67 @@ +-- ToDo: Translate, Add descriptions and help texts +m = Map("wireless", "Netze") + +s = m:section(TypedSection, "wifi-iface") +s.addremove = true +s.anonymous = true + +s:option(Value, "ssid", "Netzkennung (ESSID)").maxlength = 32 + +device = s:option(ListValue, "device", "Gerät") +for k, v in pairs(ffluci.model.uci.show("wireless").wireless) do + if v[".type"] == "wifi-device" then + device:value(k) + end +end + +network = s:option(ListValue, "network", "Netzwerk") +network:value("") +for k, v in pairs(ffluci.model.uci.show("network").network) do + if v[".type"] == "interface" then + network:value(k) + end +end + +mode = s:option(ListValue, "mode", "Modus") +mode:value("ap", "Access Point") +mode:value("adhoc", "Ad-Hoc") +mode:value("sta", "Client") +mode:value("wds", "WDS") + +s:option(Value, "bssid", "BSSID").optional = true + +s:option(Value, "txpower", "Sendeleistung", "dbm").rmempty = true + +encr = s:option(ListValue, "encryption", "Verschlüsselung") +encr:value("none", "keine") +encr:value("wep", "WEP") +encr:value("psk", "WPA-PSK") +encr:value("wpa", "WPA-Radius") +encr:value("psk2", "WPA2-PSK") +encr:value("wpa2", "WPA2-Radius") + +key = s:option(Value, "key", "Schlüssel") +key:depends("encryption", "wep") +key:depends("encryption", "psk") +key:depends("encryption", "wpa") +key:depends("encryption", "psk2") +key:depends("encryption", "wpa2") +key.rmempty = true + +server = s:option(Value, "server", "Radius-Server") +server:depends("encryption", "wpa") +server:depends("encryption", "wpa2") +server.rmempty = true + +port = s:option(Value, "port", "Radius-Port") +port:depends("encryption", "wpa") +port:depends("encryption", "wpa2") +port.rmempty = true + +s:option(Flag, "isolate", "AP-Isolation", "Unterbindet Client-Client-Verkehr").optional = true + +s:option(Flag, "hidden", "ESSID verstecken").optional = true + + + +return m \ No newline at end of file diff --git a/src/ffluci/sys.lua b/src/ffluci/sys.lua index 048f6d375..4ed2262c8 100644 --- a/src/ffluci/sys.lua +++ b/src/ffluci/sys.lua @@ -29,11 +29,20 @@ require("ffluci.fs") -- Returns the hostname function hostname() - return ffluci.fs.readfilel("/proc/sys/kernel/hostname")[1] + return io.lines("/proc/sys/kernel/hostname")() end -- Returns the load average function loadavg() - local loadavg = ffluci.fs.readfilel("/proc/loadavg")[1] + local loadavg = io.lines("/proc/loadavg")() return loadavg:match("^(.-) (.-) (.-) (.-) (.-)$") +end + +-- Returns all available network interfaces +function net_devices() + local devices = {} + for line in io.lines("/proc/net/dev") do + table.insert(devices, line:match(" *(.-):")) + end + return devices end \ No newline at end of file diff --git a/src/ffluci/view/admin_system/index.htm b/src/ffluci/view/admin_system/index.htm new file mode 100644 index 000000000..75aa02658 --- /dev/null +++ b/src/ffluci/view/admin_system/index.htm @@ -0,0 +1,2 @@ +<%+header%> +<%+footer%> \ No newline at end of file diff --git a/src/ffluci/view/admin_system/passwd.htm b/src/ffluci/view/admin_system/passwd.htm new file mode 100644 index 000000000..3458fef92 --- /dev/null +++ b/src/ffluci/view/admin_system/passwd.htm @@ -0,0 +1,15 @@ +<%+header%> +

<%:system System%>

+

<%:changepw Passwort ändern%>

+

+<% if msg then %> + <%=msg%> +<% else %> +
+ <%:password Passwort%>
+ <%:confirmation Bestätigung%>
+ +
+<% end %> +
+<%+footer%> \ No newline at end of file diff --git a/src/ffluci/view/admin_wifi/index.htm b/src/ffluci/view/admin_wifi/index.htm new file mode 100644 index 000000000..75aa02658 --- /dev/null +++ b/src/ffluci/view/admin_wifi/index.htm @@ -0,0 +1,2 @@ +<%+header%> +<%+footer%> \ No newline at end of file diff --git a/src/ffluci/view/cbi/dvalue.htm b/src/ffluci/view/cbi/dvalue.htm new file mode 100644 index 000000000..178f2e16a --- /dev/null +++ b/src/ffluci/view/cbi/dvalue.htm @@ -0,0 +1,12 @@ +<%+cbi/valueheader%> +<% if self.value then + if type(self.value) == "function" then %> + <%=self:value(section)%> +<% else %> + <%=self.value%> +<% end +else %> + <%=(self:cfgvalue(section) or "")%> +<% end %> +  +<%+cbi/valuefooter%> diff --git a/src/ffluci/view/cbi/tsection.htm b/src/ffluci/view/cbi/tsection.htm index 012ae063a..8da0b4a1d 100644 --- a/src/ffluci/view/cbi/tsection.htm +++ b/src/ffluci/view/cbi/tsection.htm @@ -12,9 +12,10 @@ <% if self.addremove then %>
<% if self.anonymous then %> - - <% else %> - + + <% else %> + + <% end %><% if self.err_invalid then %>
<%:cbi_invalid Fehler: Ungültige Eingabe%>
<% end %>
<% end %> diff --git a/src/ffluci/view/cbi/value.htm b/src/ffluci/view/cbi/value.htm index b994790d2..61033a0f5 100644 --- a/src/ffluci/view/cbi/value.htm +++ b/src/ffluci/view/cbi/value.htm @@ -1,3 +1,3 @@ <%+cbi/valueheader%> - size="<%=self.size%>" <% end %><% if self.maxlength then %>maxlength="<%=self.maxlength%>" <% end %>name="cbid.<%=self.config.."."..section.."."..self.option%>" value="<%=(self:cfgvalue(section) or "")%>" /> + size="<%=self.size%>" <% end %><% if self.maxlength then %>maxlength="<%=self.maxlength%>" <% end %>name="cbid.<%=self.config.."."..section.."."..self.option%>" id="cbid.<%=self.config.."."..section.."."..self.option%>" value="<%=(self:cfgvalue(section) or "")%>" /> <%+cbi/valuefooter%> -- 2.25.1