INFILES = $(CFILES:%=src/%)
OUTFILE = ffluci/init.lua
+.PHONY: all dist-compile dist-source examples-compile examples-source dist examples compile source clean
+
all: compile
-dist-compile: compile examples
-dist-source: source examples
+dist-compile: compile dist
+dist-source: source dist
-examples:
+examples-compile: compile examples
+examples-source: source examples
+
+
+dist:
cp src/ffluci/controller/public/* dist/ffluci/controller/public/
cp src/ffluci/controller/admin/* dist/ffluci/controller/admin/
cp src/ffluci/i18n/* dist/ffluci/i18n/
cp src/ffluci/view/* dist/ffluci/view/ -R
+
+examples:
+ cp examples/* dist/ -R
compile:
mkdir -p $(DIRECTORIES)
for i in $(CFILES); do cp src/$$i dist/$$i; done
for i in $(FILES); do cp src/$$i dist/$$i; done
-
-.PHONY: clean
clean:
rm dist -rf
#!/usr/bin/haserl --shell=luac
print("Status: 302 Found")
-print("Location: /cgi-bin/ffluci\n")
+print("Location: ffluci\n")
--- /dev/null
+body {
+ font-family: Verdana, Arial, sans-serif;
+ background-color: #aaaaaa;
+}
+
+#header {
+ padding: 0.2em;
+ height: 4.5em;
+ background-color: #262626;
+}
+
+#columns {
+ border-left: 10.1em solid #262626;
+ border-right: 10.1em solid #262626;
+ display: block;
+ background-color: white;
+ padding: 0.1em;
+}
+
+#columnswrapper {
+ display: block;
+ margin-left: -10em;
+ margin-right: -10em;
+}
+
+#content {
+ margin-left: 10em;
+ margin-right: 10em;
+ display: block;
+ position: relative;
+ padding: 2px;
+}
+
+.headerlogo {
+ height: 4em;
+ padding: 5px;
+}
+
+.headerlogo img {
+ height: 100%;
+}
+
+.headertitle {
+ font-size: 2.4em;
+ color: gray;
+ letter-spacing: 0.5em;
+ text-transform: lowercase;
+}
+
+.separator {
+ padding-left: 0.25em;
+ font-weight: bold;
+ font-size: 0.8em;
+ line-height: 1.4em;
+}
+
+.whitetext {
+ color: white;
+}
+
+.yellowtext {
+ color: #ffcb05;
+}
+
+.magentatext {
+ color: #dc0065;
+}
+
+.inheritcolor {
+ color: inherit;
+}
+
+.smalltext {
+ font-size: 0.8em;
+}
+
+.yellow {
+ background-color: #ffcb05;
+}
+
+.magenta {
+ background-color: #dc0065;
+}
+
+.nodeco {
+ text-decoration: none;
+}
+
+.redhover:hover {
+ color: red;
+}
+
+.bold {
+ font-weight: bold;
+}
+
+.sidebar {
+ position: relative;
+ padding: 0.25em;
+ color: gray;
+ width: 9em;
+ font-weight: bold;
+}
+
+.separator a, .sidebar a {
+ color: inherit;
+ text-decoration: inherit;
+}
+
+.separator a:hover, .sidebar a:hover {
+ color: red;
+}
+
+.sidebar div {
+ padding-bottom: 0.5em;
+}
+
+.sidebar ul {
+ font-size: 0.8em;
+ color: white;
+ list-style-type: none;
+ padding-left: 1em;
+ margin-top: 0%;
+}
+
+.left {
+ float: left;
+ text-align: left;
+}
+
+.right {
+ float: right;
+ text-align: right;
+}
+
+.clear {
+ clear: both;
+}
define Package/ffluci/install
$(INSTALL_DIR) $(1)/usr/lib/lua
$(INSTALL_DIR) $(1)/www/cgi-bin
+ $(INSTALL_DIR) $(1)/www/ffluci
$(CP) $(PKG_BUILD_DIR)/dist/* $(1)/usr/lib/lua/ -R
+ $(CP) $(PKG_BUILD_DIR)/contrib/media $(1)/www/ffluci/ -R
$(INSTALL_BIN) $(PKG_BUILD_DIR)/contrib/ffluci $(1)/www/cgi-bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/contrib/index.cgi $(1)/www/cgi-bin
$(CP) -a ./ipkg/ffluci.postinst $(1)/CONTROL/postinst
--- /dev/null
+module(..., package.seeall)
+
+function dispatcher(request)
+ require("ffluci.template").render("header")
+ print("Hello there, Mr. Administrator")
+ require("ffluci.template").render("footer")
+end
+
+menu = {
+ descr = "Administrative",
+ order = 10,
+ entries = {
+ {action = "index", descr = "Hello"}
+ }
+}
\ No newline at end of file
--- /dev/null
+-- This example demonstrates the action dispatcher which invokes
+-- an appropriate action function named action_"action"
+
+-- This example consists of:
+-- ffluci/controller/index/example-action.lua (this file)
+
+-- Try the following address(es) in your browser:
+-- ffluci/index/example-action
+-- ffluci/index/example-action/sp
+-- ffluci/index/example-action/redir
+
+module(..., package.seeall)
+
+dispatcher = require("ffluci.dispatcher").action
+
+menu = {
+ descr = "Example Action",
+ order = 30,
+ entries = {
+ {action = "index", descr = "Action-Dispatcher Example"},
+ {action = "sp", descr = "Simple View Template Stealing"},
+ {action = "redir", descr = "Hello World Redirector"}
+ }
+}
+
+function action_index()
+ require("ffluci.template").render("header")
+ local formvalue = require("ffluci.http").formvalue
+
+ local x = formvalue("x", nil, true)
+
+ print(x and "x*x: "..tostring(x*x) or "Set ?x= any number")
+ require("ffluci.template").render("footer")
+end
+
+function action_sp()
+ require("ffluci.http")
+ require("ffluci.i18n")
+ require("ffluci.config")
+ require("ffluci.template")
+
+ -- Try uncommenting the next line
+ -- ffluci.i18n.loadc("example-simpleview")
+ ffluci.template.render("example-simpleview/index")
+end
+
+function action_redir()
+ require("ffluci.http").request_redirect("public", "index", "foobar")
+end
\ No newline at end of file
--- /dev/null
+-- This example demonstrates the simple view dispatcher which is the
+-- most simple way to provide content as it directly renders the
+-- associated template
+
+-- This example consists of:
+-- ffluci/controller/index/example-simpleview.lua (this file)
+-- ffluci/view/example-simpleview/index.htm (the template for action "index")
+-- ffluci/view/example-simpleview/foo.htm (the template for action "foo")
+-- ffluci/i18n/example-simpleview.de (the german language file for this module)
+
+-- Try the following address(es) in your browser:
+-- ffluci/index/example-simpleview
+-- ffluci/index/example-simpleview/index
+-- ffluci/index/example-simpleview/foo
+
+module(..., package.seeall)
+
+dispatcher = require("ffluci.dispatcher").simpleview
+
+menu = {
+ descr = "Example Simpleview",
+ order = 20,
+ entries = {
+ {action = "index", descr = "Simpleview Index"},
+ {action = "foo", descr = "Simpleview Foo"}
+ }
+}
\ No newline at end of file
--- /dev/null
+-- This is a very simple example Hello World FFLuCI controller
+-- See the other examples for more automated controllers
+
+-- Initialise Lua module system
+module(..., package.seeall)
+
+-- This is the module dispatcher. It implements the last step of the
+-- dispatching process.
+function dispatcher(request)
+ require("ffluci.template").render("header")
+ print("<h2>Hello World!</h2>")
+ for k,v in pairs(request) do
+ print("<div>" .. k .. ": " .. v .. "</div>")
+ end
+ require("ffluci.template").render("footer")
+end
+
+-- The following part is optional it could be useful for menu generators
+-- An example menu generator is implemented in the template "menu"
+
+menu = {
+ -- This is the menu item description
+ descr = "Hello World",
+
+ -- This is the order level of the menu entry (lowest goes first)
+ order = 10,
+
+ -- A list of menu entries in the form action => "description"
+ entries = {
+ {action = "index", descr = "Hello World"},
+ }
+}
\ No newline at end of file
--- /dev/null
+<%+header%>
+<h1>bar</h1>
+<%+footer%>
\ No newline at end of file
--- /dev/null
+<%+header%>
+<p><%:descr This is the Simple View-Example.<br />
+This template is ffluci/view/example-simpleview/index.htm and belongs
+to the index-Action.%></p>
+<p><%:lan The router's LAN IP-Address is:%> <%~network.lan.ipaddr%></p>
+<%+footer%>
\ No newline at end of file
--- /dev/null
+A very little Hello <%=muh%>
+++ /dev/null
-module(..., package.seeall)
-
-function dispatcher(request)
- require("ffluci.template").render("header")
- print("Hello there, Mr. Administrator")
- require("ffluci.template").render("footer")
-end
-
-menu = {
- descr = "Administrative",
- order = 10,
- entries = {
- {action = "index", descr = "Hello"}
- }
-}
\ No newline at end of file
+++ /dev/null
--- This example demonstrates the action dispatcher which invokes
--- an appropriate action function named action_"action"
-
--- This example consists of:
--- ffluci/controller/index/example-action.lua (this file)
-
--- Try the following address(es) in your browser:
--- ffluci/index/example-action
--- ffluci/index/example-action/sp
--- ffluci/index/example-action/redir
-
-module(..., package.seeall)
-
-dispatcher = require("ffluci.dispatcher").action
-
-menu = {
- descr = "Example Action",
- order = 30,
- entries = {
- {action = "index", descr = "Action-Dispatcher Example"},
- {action = "sp", descr = "Simple View Template Stealing"},
- {action = "redir", descr = "Hello World Redirector"}
- }
-}
-
-function action_index()
- require("ffluci.template").render("header")
- local formvalue = require("ffluci.http").formvalue
-
- local x = formvalue("x", nil, true)
-
- print(x and "x*x: "..tostring(x*x) or "Set ?x= any number")
- require("ffluci.template").render("footer")
-end
-
-function action_sp()
- require("ffluci.http")
- require("ffluci.i18n")
- require("ffluci.config")
- require("ffluci.template")
-
- -- Try uncommenting the next line
- -- ffluci.i18n.loadc("example-simpleview")
- ffluci.template.render("example-simpleview/index")
-end
-
-function action_redir()
- require("ffluci.http").request_redirect("public", "index", "foobar")
-end
\ No newline at end of file
+++ /dev/null
--- This example demonstrates the simple view dispatcher which is the
--- most simple way to provide content as it directly renders the
--- associated template
-
--- This example consists of:
--- ffluci/controller/index/example-simpleview.lua (this file)
--- ffluci/view/example-simpleview/index.htm (the template for action "index")
--- ffluci/view/example-simpleview/foo.htm (the template for action "foo")
--- ffluci/i18n/example-simpleview.de (the german language file for this module)
-
--- Try the following address(es) in your browser:
--- ffluci/index/example-simpleview
--- ffluci/index/example-simpleview/index
--- ffluci/index/example-simpleview/foo
-
-module(..., package.seeall)
-
-dispatcher = require("ffluci.dispatcher").simpleview
-
-menu = {
- descr = "Example Simpleview",
- order = 20,
- entries = {
- {action = "index", descr = "Simpleview Index"},
- {action = "foo", descr = "Simpleview Foo"}
- }
-}
\ No newline at end of file
+++ /dev/null
--- This is a very simple example Hello World FFLuCI controller
--- See the other examples for more automated controllers
-
--- Initialise Lua module system
-module(..., package.seeall)
-
--- This is the module dispatcher. It implements the last step of the
--- dispatching process.
-function dispatcher(request)
- require("ffluci.template").render("header")
- print("<h2>Hello World!</h2>")
- for k,v in pairs(request) do
- print("<div>" .. k .. ": " .. v .. "</div>")
- end
- require("ffluci.template").render("footer")
-end
-
--- The following part is optional it could be useful for menu generators
--- An example menu generator is implemented in the template "menu"
-
-menu = {
- -- This is the menu item description
- descr = "Hello World",
-
- -- This is the order level of the menu entry (lowest goes first)
- order = 10,
-
- -- A list of menu entries in the form action => "description"
- entries = {
- {action = "index", descr = "Hello World"},
- }
-}
\ No newline at end of file
-- memory: Always compile, do not save compiled files, ignore precompiled
-- always: Same as "memory" but also saves compiled files
-- smart: Compile on demand, save compiled files, update precompiled
-compiler_mode = "smart"
+compiler_mode = "memory"
-- This applies to compiler modes "always" and "smart"
-- Now finally render the thing
return view()
-end
\ No newline at end of file
+end
+++ /dev/null
-<%+header%>
-<h1>bar</h1>
-<%+footer%>
\ No newline at end of file
+++ /dev/null
-<%+header%>
-<p><%:descr This is the Simple View-Example.<br />
-This template is ffluci/view/example-simpleview/index.htm and belongs
-to the index-Action.%></p>
-<p><%:lan The router's LAN IP-Address is:%> <%~network.lan.ipaddr%></p>
-<%+footer%>
\ No newline at end of file
-</div>
+ </div>
+ <div class="clear"></div>
+</div></div>
+
+<div class="separator magenta bold">FFLuCI 0.1 - Freifunk Lua Configuration Interface</div>
</body>
</html>
\ No newline at end of file
-<% require("ffluci.http").htmlheader() %>
-<html>
+<%
+local req = require("ffluci.dispatcher").request
+local menu = require("ffluci.menu").get()[req.category]
+require("ffluci.i18n").loadc("default")
+require("ffluci.http").htmlheader()
+%><?xml version="1.0" encoding="utf-8"?>
+<!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>
-<title>FFLuCI Examples</title>
+<link rel="stylesheet" type="text/css" href="<%=media%>/cascade.css" />
+<title>FFLuCI</title>
</head>
<body>
-<h1>FFLuCI</h1>
-<%+menu%>
-<div id="content">
\ No newline at end of file
+<div id="header">
+ <div class="headerlogo left"><img src="<%=media%>/logo.png" alt="Freifunk" /></div>
+ <div class="whitetext smalltext right">
+ OpenWRT Kamikaze<br />
+ Freifunk Firmware 2.0-dev<br />
+ Load average: 1.00 2.00 3.00<br />
+ 1.2.3.4 - host1
+ </div>
+ <div>
+ <span class="headertitle">Freifunk Kamikaze</span><br />
+ <span class="whitetext bold"><%:batmanedition Fledermausedition%></span>
+ </div>
+</div>
+
+<div class="separator yellow bold">
+<%:path Pfad%>: <a href="<%=controller .. "/" .. req.category%>"><%=req.category%></a>
+» <a href="<%=controller .. "/" .. req.category .. "/" .. req.module %>"><%=req.module%></a>
+» <a href="<%=controller .. "/" .. req.category .. "/" .. req.module .. "/" .. req.action %>"><%=req.action%></a>
+</div>
+
+<div id="columns"><div id="columnswrapper">
+ <div class="sidebar left">
+ <% for k,v in pairs(menu) do %>
+ <div<% if v[".contr"] == req.module then %> class="yellowtext"<% end %>><a href="<%=controller.."/"..req.category.."/"..v[".contr"]%>"><%=translate(v[".contr"], v[".descr"])%></a><%
+ if v[".contr"] == req.module then %>
+ <ul><% for key,val in ipairs(v) do %>
+ <li<% if val.action == req.action then %> class="yellowtext"<% end %>><a href="<%=controller.."/"..req.category.."/"..req.module.."/"..val.action%>"><%=translate(val.action, val.descr)%></a></li>
+ <% end %></ul>
+ <% end %></div>
+ <% end %>
+ </div>
+ <div class="sidebar right">
+ <div><%:webif Weboberfläche%>
+ <ul>
+ <li<% if "public" == req.category then %> class="yellowtext"<% end %>><a href="<%=controller%>/public"><%:public Public%></a></li>
+ <li<% if "admin" == req.category then %> class="yellowtext"<% end %>><a href="<%=controller%>/admin"><%:admin Admin%></a></li>
+ </ul>
+ </div>
+ <% if "admin" == req.category then %>
+ <div>Konfiguration<ul><li>x Änderungen</li><li>Anwenden</li><li>Zurücksetzen</li></ul></div>
+ <% end %>
+ </div>
+ <div id="content">
+++ /dev/null
-A very little Hello <%=muh%>
+++ /dev/null
-<%
-local req = require("ffluci.dispatcher").request
-local menu = require("ffluci.menu").get()[req.category]
-local menu_module = nil
-require("ffluci.i18n").loadc("default")
-%>
-<div id="menu" style="font-size: 0.8em; padding-bottom: 20px">
- <div id="menu_categories">
- <span style="<% if "public" == req.category then write("font-weight: bold") end %>"><a href="<%=controller%>/public"><%:public Public%></a></span>
- <span style="<% if "admin" == req.category then write("font-weight: bold") end %>"><a href="<%=controller%>/admin"><%:admin Admin%></a></span>
- </div>
- <div id="menu_modules">
-<% for k,v in pairs(menu) do
-if v[".contr"] == req.module then menu_module = v end %>
- <span style="<% if v[".contr"] == req.module then write("font-weight: bold") end %>"><a href="<%=controller.."/"..req.category.."/"..v[".contr"]%>"><%=translate(v[".contr"], v[".descr"])%></a></span>
-<% end %>
- </div>
-<% if menu_module then %>
- <div id="menu_actions">
-<% for k,v in ipairs(menu_module) do %>
- <span style="<% if v.action == req.action then write("font-weight: bold") end %>"><a href="<%=controller.."/"..req.category.."/"..req.module.."/"..v.action%>"><%=translate(v.action, v.descr)%></a></span>
-<% end %>
- </div>
-<% end %>
-</div>