summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/ffluci/cbi.lua50
-rw-r--r--src/ffluci/dispatcher.lua16
-rw-r--r--src/ffluci/fs.lua7
-rw-r--r--src/ffluci/util.lua2
-rw-r--r--src/ffluci/view/cbi/footer.htm1
-rw-r--r--src/ffluci/view/cbi/map.htm1
-rw-r--r--src/ffluci/view/error500.htm5
-rw-r--r--src/ffluci/view/header.htm8
8 files changed, 71 insertions, 19 deletions
diff --git a/src/ffluci/cbi.lua b/src/ffluci/cbi.lua
index 85b9f49e9d..0c2718ea8e 100644
--- a/src/ffluci/cbi.lua
+++ b/src/ffluci/cbi.lua
@@ -104,6 +104,26 @@ function Map.__init__(self, config, ...)
self.template = "cbi/map"
end
+function Map.parse(self)
+ self.ucidata = ffluci.model.uci.show(self.config)
+ if not self.ucidata then
+ error("Unable to read UCI data: " .. self.config)
+ else
+ self.ucidata = self.ucidata[self.config]
+ end
+ Node.parse(self)
+end
+
+function Map.render(self)
+ self.ucidata = ffluci.model.uci.show(self.config)
+ if not self.ucidata then
+ error("Unable to read UCI data: " .. self.config)
+ else
+ self.ucidata = self.ucidata[self.config]
+ end
+ Node.render(self)
+end
+
function Map.section(self, class, ...)
if instanceof(class, AbstractSection) then
local obj = class(...)
@@ -116,11 +136,6 @@ function Map.section(self, class, ...)
end
end
-function Map.read(self)
- self.ucidata = self.ucidata or ffluci.model.uci.show(self.config)[self.config]
- return self.ucidata
-end
-
--[[
AbstractSection
]]--
@@ -181,6 +196,15 @@ function TypedSection.__init__(self, ...)
self.valid = nil
end
+function TypedSection.parse(self)
+ for k, v in pairs(self:ucisections()) do
+ for i, node in ipairs(self.children) do
+ node.section = k
+ node:parse()
+ end
+ end
+end
+
function TypedSection.render_children(self, section)
for k, node in ipairs(self.children) do
node.section = section
@@ -190,7 +214,7 @@ end
function TypedSection.ucisections(self)
local sections = {}
- for k, v in pairs(self.map:read()) do
+ for k, v in pairs(self.map.ucidata) do
if v[".type"] == self.sectiontype then
sections[k] = v
end
@@ -217,14 +241,20 @@ function AbstractValue.__init__(self, option, ...)
self.default = nil
end
-
function AbstractValue.formvalue(self)
- local key = "uci."..self.map.config.."."..self.section.."."..self.option
+ local key = "cbid."..self.map.config.."."..self.section.."."..self.option
return ffluci.http.formvalue(key)
end
+function AbstractValue.parse(self)
+ local fvalue = self:validate(self:formvalue())
+ if fvalue and not (fvalue == self:ucivalue()) then
+ self:write(fvalue)
+ end
+end
+
function AbstractValue.ucivalue(self)
- return self.map:read()[self.section][self.option]
+ return self.map.ucidata[self.section][self.option]
end
function AbstractValue.validate(self, value)
@@ -232,7 +262,7 @@ function AbstractValue.validate(self, value)
end
function AbstractValue.write(self, value)
- ffluci.model.uci.set(self.config, self.section, self.option, value)
+ return ffluci.model.uci.set(self.config, self.section, self.option, value)
end
diff --git a/src/ffluci/dispatcher.lua b/src/ffluci/dispatcher.lua
index f3a62bb193..ee836043d2 100644
--- a/src/ffluci/dispatcher.lua
+++ b/src/ffluci/dispatcher.lua
@@ -116,7 +116,7 @@ end
function error500(message)
ffluci.http.status(500, "Internal Server Error")
- if not pcall(ffluci.template.render, "error500") then
+ if not pcall(ffluci.template.render, "error500", {message=message}) then
ffluci.http.textheader()
print(message)
end
@@ -171,8 +171,13 @@ function cbi(request)
i18n.loadc(request.module)
- stat, map = pcall(cbi.load, path)
+ local stat, map = pcall(cbi.load, path)
if stat then
+ local stat, err = pcall(map.parse, map)
+ if not stat then
+ disp.error500(err)
+ return
+ end
tmpl.render("cbi/header")
map:render()
tmpl.render("cbi/footer")
@@ -202,8 +207,13 @@ function dynamic(request)
return
end
- stat, map = pcall(cbi.load, path)
+ local stat, map = pcall(cbi.load, path)
if stat then
+ local stat, err = pcall(map.parse, map)
+ if not stat then
+ disp.error500(err)
+ return
+ end
tmpl.render("cbi/header")
map:render()
tmpl.render("cbi/footer")
diff --git a/src/ffluci/fs.lua b/src/ffluci/fs.lua
index 55da9b8dce..fb9a9c1c95 100644
--- a/src/ffluci/fs.lua
+++ b/src/ffluci/fs.lua
@@ -28,6 +28,13 @@ module("ffluci.fs", package.seeall)
require("lfs")
+-- Checks whether a file exists
+function isfile(filename)
+ local fp = io.open(path, "r")
+ if file then file:close() end
+ return file ~= nil
+end
+
-- Returns the content of file
function readfile(filename)
local fp = io.open(filename)
diff --git a/src/ffluci/util.lua b/src/ffluci/util.lua
index b219be130e..8a526173d7 100644
--- a/src/ffluci/util.lua
+++ b/src/ffluci/util.lua
@@ -161,7 +161,7 @@ function validate(value, cast_number, cast_int, valid)
if type(valid) == "function" then
value = valid(value)
elseif type(valid) == "table" then
- if not ffluci.util.contains(valid, value) then
+ if not contains(valid, value) then
value = nil
end
end
diff --git a/src/ffluci/view/cbi/footer.htm b/src/ffluci/view/cbi/footer.htm
index e8ef8fef5e..8fc212b88b 100644
--- a/src/ffluci/view/cbi/footer.htm
+++ b/src/ffluci/view/cbi/footer.htm
@@ -1,2 +1,3 @@
+ <input type="submit" /> <input type="reset" />
</form>
<%+footer%> \ No newline at end of file
diff --git a/src/ffluci/view/cbi/map.htm b/src/ffluci/view/cbi/map.htm
index e6884f1045..83c377fb86 100644
--- a/src/ffluci/view/cbi/map.htm
+++ b/src/ffluci/view/cbi/map.htm
@@ -4,5 +4,4 @@
<br />
<% self:render_children() %>
<br />
- <input type="submit" /> <input type="reset" />
</div>
diff --git a/src/ffluci/view/error500.htm b/src/ffluci/view/error500.htm
new file mode 100644
index 0000000000..8af22e8f20
--- /dev/null
+++ b/src/ffluci/view/error500.htm
@@ -0,0 +1,5 @@
+<%+header%>
+<h1>500 Internal Server Error</h1>
+<p>Sorry, the server encountered an unexpected error.</p>
+<tt><%=message%></tt>
+<%+footer%> \ No newline at end of file
diff --git a/src/ffluci/view/header.htm b/src/ffluci/view/header.htm
index 2af577a078..cd2a64b55c 100644
--- a/src/ffluci/view/header.htm
+++ b/src/ffluci/view/header.htm
@@ -9,10 +9,10 @@ require("ffluci.http").htmlheader()
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
-<link rel="stylesheet" type="text/css" href="<%=media%>/cascade.css" />
-<link rel="stylesheet" type="text/css" href="<%=media%>/css/<%=req.category%>_<%=req.module%>.css" />
-<title>FFLuCI</title>
-<% if addheaders then write(addheaders) end %>
+ <link rel="stylesheet" type="text/css" href="<%=media%>/cascade.css" />
+ <link rel="stylesheet" type="text/css" href="<%=media%>/css/<%=req.category%>_<%=req.module%>.css" />
+ <link rel="stylesheet" type="text/css" href="<%=media%>/css/<%=req.category%>_<%=req.module%>/<%=req.action%>.css" />
+ <title>FFLuCI</title>
</head>
<body>
<div id="header">