* Major repository revision

This commit is contained in:
Steven Barth 2008-04-11 18:13:58 +00:00
parent b864e2933d
commit cd498aa924
93 changed files with 60 additions and 1918 deletions

View file

@ -1,42 +0,0 @@
LUAC = luac
LUAC_OPTIONS = -s
FILES = ffluci/debug.lua
CFILES = ffluci/util.lua ffluci/http.lua ffluci/fs.lua \
ffluci/sys.lua ffluci/model/uci.lua ffluci/model/ipkg.lua \
ffluci/config.lua ffluci/i18n.lua ffluci/template.lua \
ffluci/cbi.lua ffluci/dispatcher.lua ffluci/menu.lua ffluci/init.lua
DIRECTORIES = dist/ffluci/model/cbi dist/ffluci/model/menu dist/ffluci/controller dist/ffluci/i18n dist/ffluci/view
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 dist
dist-source: source dist
dist:
cp src/ffluci/controller/* dist/ffluci/controller/ -R
cp src/ffluci/i18n/* dist/ffluci/i18n/
cp src/ffluci/view/* dist/ffluci/view/ -R
cp src/ffluci/model/cbi/* dist/ffluci/model/cbi/ -R
cp src/ffluci/model/menu/* dist/ffluci/model/menu/ -R
compile:
mkdir -p $(DIRECTORIES)
$(LUAC) $(LUAC_OPTIONS) -o dist/$(OUTFILE) $(INFILES)
for i in $(CFILES); do [ -f dist/$$i ] || ln -s `dirname $$i | cut -s -d / -f 2- | sed -e 's/[^/]*\/*/..\//g'``basename $(OUTFILE)` dist/$$i; done
for i in $(FILES); do cp src/$$i dist/$$i; done
source:
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
clean:
rm dist -rf

View file

@ -1,88 +0,0 @@
#!/bin/sh
. /etc/functions.sh
# initialize defaults
RAMFS_COPY_BIN="" # extra programs for temporary ramfs root
RAMFS_COPY_DATA="" # extra data files
export KEEP_PATTERN=""
export VERBOSE=1
# parse options
while [ -n "$1" ]; do
case "$1" in
-k)
shift
export KEEP_PATTERN="$1"
;;
-*)
echo "Invalid option: $1"
exit 1
;;
*) break;;
esac
shift;
done
export CONFFILES=/tmp/sysupgrade.conffiles
export CONF_TAR=/tmp/sysupgrade.tgz
[ -f $CONFFILES ] && rm $CONFFILES
[ -f $CONF_TAR ] && rm $CONF_TAR
export ARGV="$*"
export ARGC="$#"
[ -z "$ARGV" ] && {
cat <<EOF
Usage: $0 [options] <image file or URL>
Options:
-k <"file 1, file 2, ..."> Files to be kept
EOF
exit 1
}
add_pattern_conffiles() {
local file="$1"
find $KEEP_PATTERN >> "$file" 2>/dev/null
return 0
}
# hooks
sysupgrade_image_check="platform_check_image"
sysupgrade_init_conffiles=""
[ -n "$KEEP_PATTERN" ] && append sysupgrade_init_conffiles "add_pattern_conffiles"
include /lib/upgrade
do_save_conffiles() {
[ -z "$(rootfs_type)" ] && {
echo "Cannot save config while running from ramdisk."
exit 3
return 0
}
run_hooks "$CONFFILES" $sysupgrade_init_conffiles
v "Saving config files..."
[ "$VERBOSE" -gt 1 ] && TAR_V="v" || TAR_V=""
tar c${TAR_V}zf "$CONF_TAR" -T "$CONFFILES" 2>/dev/null
}
type platform_check_image >/dev/null 2>/dev/null || {
echo "Firmware upgrade is not implemented for this platform."
exit 1
}
for check in $sysupgrade_image_check; do
( eval "$check \"\$ARGV\"" ) || {
echo "Image check '$check' failed."
exit 2
}
done
[ -n "$sysupgrade_init_conffiles" ] && do_save_conffiles
run_hooks "" $sysupgrade_pre_upgrade
v "Switching to ramdisk..."
run_ramfs '. /etc/functions.sh; include /lib/upgrade; do_upgrade'

View file

@ -1,121 +0,0 @@
#!/bin/sh /etc/rc.common
START=46
apply_portfw() {
local cfg="$1"
config_get proto "$cfg" proto
config_get dport "$cfg" dport
config_get iface "$cfg" iface
config_get to "$cfg" to
ports=$(echo $to | cut -sd: -f2)
if [ -n "$ports" ]; then
ports="--dport $(echo $ports | sed -e 's/-/:/')"
else
ports="--dport $dport"
fi
ip=$(echo $to | cut -d: -f1)
if ([ "$proto" == "tcpudp" ] || [ "$proto" == "tcp" ]); then
iptables -t nat -A luci_prerouting -i "$iface" -p tcp --dport "$dport" -j DNAT --to "$to"
iptables -A luci_forward -i "$iface" -p tcp -d "$ip" $ports -j ACCEPT
fi
if ([ "$proto" == "tcpudp" ] || [ "$proto" == "udp" ]); then
iptables -t nat -A luci_prerouting -i "$iface" -p udp --dport "$dport" -j DNAT --to "$to"
iptables -A luci_forward -i "$iface" -p udp -d "$ip" $ports -j ACCEPT
fi
}
apply_rule() {
local cfg="$1"
local cmd=""
config_get chain "$cfg" chain
[ -n "$chain" ] || return 0
[ "$chain" == "forward" ] && cmd="$cmd -A luci_forward"
[ "$chain" == "input" ] && cmd="$cmd -A luci_input"
[ "$chain" == "output" ] && cmd="$cmd -A luci_output"
[ "$chain" == "prerouting" ] && cmd="$cmd -t nat -A luci_prerouting"
[ "$chain" == "postrouting" ] && cmd="$cmd -t nat -A luci_postrouting"
config_get iface "$cfg" iface
[ -n "$iface" ] && cmd="$cmd -i $iface"
config_get oface "$cfg" oface
[ -n "$oface" ] && cmd="$cmd -o $oface"
config_get proto "$cfg" proto
[ -n "$proto" ] && cmd="$cmd -p $proto"
config_get source "$cfg" source
[ -n "$source" ] && cmd="$cmd -s $source"
config_get destination "$cfg" destination
[ -n "$destination" ] && cmd="$cmd -d $destination"
config_get sport "$cfg" sport
[ -n "$sport" ] && cmd="$cmd --sport $sport"
config_get dport "$cfg" dport
[ -n "$dport" ] && cmd="$cmd --dport $dport"
config_get todest "$cfg" todest
[ -n "$todest" ] && cmd="$cmd --to-destination $todest"
config_get tosrc "$cfg" tosrc
[ -n "$tosrc" ] && cmd="$cmd --to-source $tosrc"
config_get jump "$cfg" jump
[ -n "$jump" ] && cmd="$cmd -j $jump"
config_get command "$cfg" command
[ -n "$command" ] && cmd="$cmd $command"
iptables $cmd
}
start() {
### Create subchains
iptables -N luci_input
iptables -N luci_output
iptables -N luci_forward
iptables -t nat -N luci_prerouting
iptables -t nat -N luci_postrouting
### Hook in the chains
iptables -A input_rule -j luci_input
iptables -A output_rule -j luci_output
iptables -A forwarding_rule -j luci_forward
iptables -t nat -A prerouting_rule -j luci_prerouting
iptables -t nat -A postrouting_rule -j luci_postrouting
### Read chains from config
config_load luci_fw
config_foreach apply_portfw portfw
config_foreach apply_rule rule
}
stop() {
### Hook out the chains
iptables -D input_rule -j luci_input
iptables -D output_rule -j luci_output
iptables -D forwarding_rule -j luci_forward
iptables -t nat -D prerouting_rule -j luci_prerouting
iptables -t nat -D postrouting_rule -j luci_postrouting
### Clear subchains
iptables -F luci_input
iptables -F luci_output
iptables -F luci_forward
iptables -t nat -F luci_prerouting
iptables -t nat -F luci_postrouting
### Delete subchains
iptables -X luci_input
iptables -X luci_output
iptables -X luci_forward
iptables -t nat -X luci_prerouting
iptables -t nat -X luci_postrouting
}

View file

@ -1,256 +0,0 @@
@charset "utf-8";
body {
font-family: Verdana, Arial, sans-serif;
background-color: #aaaaaa;
}
h1 {
margin: 0%;
font-size: 1.4em;
font-weight: bold;
margin-bottom: 0.5em;
}
h2 {
margin: 0%;
font-size: 1.2em;
font-weight: bold;
}
h3 {
margin: 0%;
}
#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: 14em;
margin-right: 14em;
display: block;
position: relative;
padding: 2px;
font-size: 0.8em;
}
.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;
}
.hidden {
display: none;
}
.inline {
display: inline;
}
.code {
background: #f7f7f7;
border: 1px solid #d7d7d7;
margin: 1em 1.75em;
padding: 1em;
}
code {
display: block;
background: #f7f7f7;
border: 1px solid #d7d7d7;
margin: 1em 1.75em;
padding: 1em;
overflow: auto;
white-space: pre;
}
.cbi-section {
margin-top: 1em;
}
.cbi-section-remove {
text-align: right;
}
.cbi-value-title {
line-height: 1.75em;
width: 15em;
font-weight: bold;
}
.cbi-value-field {
text-align: left;
line-height: 1.75em;
}
.cbi-value-field input, .cbi-value-field select,
.cbi-optionals select, .cbi-optionals input,
.cbi-section-remove input, .cbi-section-create input {
font-size: 0.8em;
margin: 0%;
}
.cbi-value-description {
font-style: italic;
font-size: 0.8em;
margin-bottom: 0.5em;
}
.cbi-form-separator {
margin-top: 1em;
}
.cbi-section-node {
display: block;
background: #f7f7f7;
border: 1px solid #d7d7d7;
overflow: auto;
margn-bottom: 0%;
}
.cbi-section-node h3 {
margin-bottom: 0.5em;
}
.cbi-error {
color: red;
font-weight: bold;
font-size: 0.8em;
margin-bottom: 0.75em;
}
.cbi-optionals {
margin-top: 1em;
}
.cbi-optionals option {
font-size: 0.8em;
}
.error {
color: red;
font-weight: bold;
}
.ok {
color: green;
font-weight: bold;
}

View file

@ -1,36 +0,0 @@
var cbi_d = {};
function cbi_d_add(field, target, value) {
if (!cbi_d[target]) {
cbi_d[target] = {};
}
if (!cbi_d[target][value]) {
cbi_d[target][value] = [];
}
cbi_d[target][value].push(field);
}
function cbi_d_update(target) {
if (!cbi_d[target]) {
return;
}
for (var x in cbi_d[target]) {
for (var i=0; i<cbi_d[target][x].length; i++) {
document.getElementById(cbi_d[target][x][i]).style.display = "none";
}
}
var t = document.getElementById(target);
if (t && t.value && cbi_d[target][t.value]) {
for (var i=0; i<cbi_d[target][t.value].length; i++) {
document.getElementById(cbi_d[target][t.value][i]).style.display = "block";
}
}
}
function cbi_d_init() {
for (var x in cbi_d) {
cbi_d_update(x);
}
}

View file

@ -1,3 +0,0 @@
.contact th {
text-align: left;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

View file

@ -15,7 +15,7 @@ PKG_SOURCE:=$(PKG_SOURCE_SUBDIR).tar.gz
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
PKG_INSTALL_DIR:=$(PKG_BUILD_DIR)/ipkg-install
MAKE_ACTION:=dist-compile LUAC=$(BUILD_DIR_HOST)/lua-luci/luac
MAKE_ACTION:=compile LUAC=$(BUILD_DIR_HOST)/lua-luci/luac
include $(INCLUDE_DIR)/package.mk
@ -31,29 +31,38 @@ define Build/Configure
endef
define Build/Compile
$(MAKE) -C $(PKG_BUILD_DIR) $(MAKE_ACTION)
$(MAKE) -C $(PKG_BUILD_DIR)/core $(MAKE_ACTION)
$(MAKE) -C $(PKG_BUILD_DIR)/module/admin-core $(MAKE_ACTION)
$(MAKE) -C $(PKG_BUILD_DIR)/module/public-core $(MAKE_ACTION)
endef
define Package/ffluci/install
$(INSTALL_DIR) $(1)/usr/lib/lua
$(INSTALL_DIR) $(1)/usr/lib/lua/ffluci
$(INSTALL_DIR) $(1)/www/cgi-bin
$(INSTALL_DIR) $(1)/www/ffluci
$(INSTALL_DIR) $(1)/etc/config
$(INSTALL_DIR) $(1)/etc/init.d
$(INSTALL_DIR) $(1)/sbin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/contrib/init.d/luci_fw $(1)/etc/init.d/luci_fw
$(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/ffluci-upload $(1)/www/cgi-bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/contrib/index.cgi $(1)/www/cgi-bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/contrib/index.html $(1)/www
$(INSTALL_BIN) $(PKG_BUILD_DIR)/contrib/ffluci-flash $(1)/sbin
$(CP) $(PKG_BUILD_DIR)/contrib/uci/luci $(1)/etc/config/luci
$(CP) $(PKG_BUILD_DIR)/contrib/uci/luci_fw $(1)/etc/config/luci_fw
$(CP) $(PKG_BUILD_DIR)/core/dist/* $(1)/usr/lib/lua/ -R
$(CP) $(PKG_BUILD_DIR)/core/contrib/media $(1)/www/ffluci/ -R
$(CP) $(PKG_BUILD_DIR)/core/contrib/uci/luci $(1)/etc/config/luci
$(INSTALL_BIN) $(PKG_BUILD_DIR)/core/contrib/ffluci $(1)/www/cgi-bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/core/contrib/ffluci-upload $(1)/www/cgi-bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/core/contrib/index.cgi $(1)/www/cgi-bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/core/contrib/index.html $(1)/www
$(CP) $(PKG_BUILD_DIR)/module/admin-core/dist/* $(1)/usr/lib/lua/ffluci/ -R
$(CP) $(PKG_BUILD_DIR)/module/admin-core/contrib/uci/luci_fw $(1)/etc/config/luci_fw
$(INSTALL_BIN) $(PKG_BUILD_DIR)/modules/admin-core/contrib/init.d/luci_fw $(1)/etc/init.d/luci_fw
$(INSTALL_BIN) $(PKG_BUILD_DIR)/modules/admin-core/contrib/ffluci-flash $(1)/sbin
$(CP) $(PKG_BUILD_DIR)/module/public-core/dist/* $(1)/usr/lib/lua/ffluci/ -R
$(CP) $(PKG_BUILD_DIR)/module/public-core/contrib/media $(1)/www/ffluci/ -R
$(CP) -a ./ipkg/ffluci.postinst $(1)/CONTROL/postinst
$(CP) -a ./ipkg/conffiles $(1)/CONTROL/conffiles
rm $(DL_DIR)/$(PKG_SOURCE)
endef
$(eval $(call BuildPackage,ffluci))
$(eval $(call BuildPackage,ffluci))

View file

@ -1,2 +0,0 @@

37
core/Makefile Normal file
View file

@ -0,0 +1,37 @@
LUAC = luac
LUAC_OPTIONS = -s
FILES = ffluci/debug.lua ffluci/view/*.htm ffluci/view/cbi/*.htm
CFILES = ffluci/util.lua ffluci/http.lua ffluci/fs.lua \
ffluci/sys.lua ffluci/model/uci.lua ffluci/model/ipkg.lua \
ffluci/config.lua ffluci/i18n.lua ffluci/template.lua \
ffluci/cbi.lua ffluci/dispatcher.lua ffluci/menu.lua ffluci/init.lua
DIRECTORIES = ffluci/model/cbi ffluci/model/menu ffluci/controller ffluci/i18n ffluci/view/cbi
OUTDIRS = $(DIRECTORIES:%=dist/%)
INFILES = $(CFILES:%=src/%)
OUTFILE = ffluci/init.lua
CPFILES = $(FILES:%=src/%)
.PHONY: all compile source depends clean
all: compile
depends:
mkdir -p $(OUTDIRS)
for i in $(CPFILES); do [ -f "$$i" ] && (i=$$(echo $$i | cut -d/ -f2-); \
mkdir -p dist/$$(dirname $$i); cp src/$$i dist/$$i); done
compile: depends
$(LUAC) $(LUAC_OPTIONS) -o dist/$(OUTFILE) $(INFILES)
for i in $(CFILES); do [ -f dist/$$i ] || ln -s `dirname $$i | cut -s -d / -f 2- | sed -e 's/[^/]*\/*/..\//g'``basename $(OUTFILE)` dist/$$i; done
source: depends
for i in $(CFILES); do cp src/$$i dist/$$i; done
clean:
rm dist -rf

View file

@ -1 +0,0 @@
module("ffluci.controller.admin.index", package.seeall)

View file

@ -1 +0,0 @@
module(..., package.seeall)

View file

@ -1 +0,0 @@
module("ffluci.controller.admin.services", package.seeall)

View file

@ -1 +0,0 @@
module("ffluci.controller.admin.status", package.seeall)

View file

@ -1,202 +0,0 @@
module("ffluci.controller.admin.system", package.seeall)
require("ffluci.sys")
require("ffluci.http")
require("ffluci.util")
require("ffluci.fs")
require("ffluci.model.ipkg")
require("ffluci.model.uci")
function action_editor()
local file = ffluci.http.formvalue("file", "")
local data = ffluci.http.formvalue("data")
local err = nil
local msg = nil
local stat = true
if file and data then
stat, err = ffluci.fs.writefile(file, data)
end
if not stat then
err = ffluci.util.split(err, " ")
table.remove(err, 1)
msg = table.concat(err, " ")
end
local cnt, err = ffluci.fs.readfile(file)
if cnt then
cnt = ffluci.util.pcdata(cnt)
end
ffluci.template.render("admin_system/editor", {fn=file, cnt=cnt, msg=msg})
end
function action_ipkg()
local file = "/etc/ipkg.conf"
local data = ffluci.http.formvalue("data")
local stat = nil
local err = nil
if data then
stat, err = ffluci.fs.writefile(file, data)
end
local cnt = ffluci.fs.readfile(file)
if cnt then
cnt = ffluci.util.pcdata(cnt)
end
ffluci.template.render("admin_system/ipkg", {cnt=cnt, msg=err})
end
function action_packages()
local ipkg = ffluci.model.ipkg
local void = nil
local submit = ffluci.http.formvalue("submit")
-- Search query
local query = ffluci.http.formvalue("query")
query = (query ~= '') and query or nil
-- Packets to be installed
local install = ffluci.http.formvalue("install")
install = (type(install) == "table" and submit) and install or nil
-- Install from URL
local url = ffluci.http.formvalue("url")
if url and url ~= '' and submit then
if not install then
install = {}
end
install[url] = 1
end
-- Do install
if install then
for k, v in pairs(install) do
void, install[k] = ipkg.install(k)
end
end
-- Remove packets
local remove = ffluci.http.formvalue("remove")
remove = (type(remove) == "table" and submit) and remove or nil
if remove then
for k, v in pairs(remove) do
void, remove[k] = ipkg.remove(k)
end
end
-- Update all packets
local update = ffluci.http.formvalue("update")
if update then
void, update = ipkg.update()
end
-- Upgrade all packets
local upgrade = ffluci.http.formvalue("upgrade")
if upgrade then
void, upgrade = ipkg.upgrade()
end
-- Package info
local info = ffluci.model.ipkg.info(query)
info = info or {}
local pkgs = {}
-- Sort after status and name
for k, v in pairs(info) do
local x = 0
for i, j in pairs(pkgs) do
local vins = (v.Status and v.Status.installed)
local jins = (j.Status and j.Status.installed)
if vins ~= jins then
if vins then
break
end
else
if j.Package > v.Package then
break
end
end
x = i
end
table.insert(pkgs, x+1, v)
end
ffluci.template.render("admin_system/packages", {pkgs=pkgs, query=query,
install=install, remove=remove, update=update, upgrade=upgrade})
end
function action_passwd()
local p1 = ffluci.http.formvalue("pwd1")
local p2 = ffluci.http.formvalue("pwd2")
local stat = nil
if p1 or p2 then
if p1 == p2 then
stat = ffluci.sys.user.setpasswd("root", p1)
else
stat = 10
end
end
ffluci.template.render("admin_system/passwd", {stat=stat})
end
function action_reboot()
local reboot = ffluci.http.formvalue("reboot")
ffluci.template.render("admin_system/reboot", {reboot=reboot})
if reboot then
ffluci.sys.reboot()
end
end
function action_sshkeys()
local file = "/etc/dropbear/authorized_keys"
local data = ffluci.http.formvalue("data")
local stat = nil
local err = nil
if data then
stat, err = ffluci.fs.writefile(file, data)
end
local cnt = ffluci.fs.readfile(file)
if cnt then
cnt = ffluci.util.pcdata(cnt)
end
ffluci.template.render("admin_system/sshkeys", {cnt=cnt, msg=err})
end
function action_upgrade()
local ret = nil
local plat = ffluci.fs.mtime("/lib/upgrade/platform.sh")
local image = ffluci.http.formvalue("image")
local imgname = ffluci.http.formvalue("image_name")
local keepcfg = ffluci.http.formvalue("keepcfg")
if plat and imgname then
local kpattern = nil
if keepcfg then
local files = ffluci.model.uci.show("luci", "flash_keep")
if files.luci and files.luci.flash_keep then
kpattern = ""
for k,v in pairs(files.luci.flash_keep) do
kpattern = kpattern .. " " .. v
end
end
end
ret = ffluci.sys.flash(image, kpattern)
end
ffluci.template.render("admin_system/upgrade", {sysupgrade=plat, ret=ret})
end

View file

@ -1,59 +0,0 @@
module("ffluci.controller.admin.uci", package.seeall)
require("ffluci.util")
require("ffluci.sys")
-- This function has a higher priority than the admin_uci/apply template
function action_apply()
local changes = ffluci.model.uci.changes()
local output = ""
if changes then
local apply = {}
-- Collect files to be applied
for i, line in ipairs(ffluci.util.split(changes)) do
local r = line:match("^-?([^.]+)")
if r then
apply[r] = true
end
end
-- Commit changes
ffluci.model.uci.commit()
-- Search for post-commit commands
if ffluci.config.uci_oncommit then
for k, v in pairs(apply) do
local cmd = ffluci.config.uci_oncommit[k]
if cmd then
output = output .. cmd .. ":" .. ffluci.sys.exec(cmd)
end
end
end
end
ffluci.template.render("admin_uci/apply", {changes=changes, output=output})
end
function action_revert()
local changes = ffluci.model.uci.changes()
if changes then
local revert = {}
-- Collect files to be reverted
for i, line in ipairs(ffluci.util.split(changes)) do
local r = line:match("^-?([^.]+)")
if r then
revert[r] = true
end
end
-- Revert them
for k, v in pairs(revert) do
ffluci.model.uci.revert(k)
end
end
ffluci.template.render("admin_uci/revert", {changes=changes})
end

View file

@ -1 +0,0 @@
module("ffluci.controller.admin.wifi", package.seeall)

View file

@ -1 +0,0 @@
module(..., package.seeall)

View file

@ -1 +0,0 @@
hello = "Hello"

View file

@ -1,15 +0,0 @@
m = Map("luci", "Kontakt", [[Diese Daten sind auf der öffentlichen Kontaktseite
sichtbar. Alle Felder sind natürlich freiwillig. Du kannst soviel oder so wenig
über dich angeben, wie du möchtest.]])
c = m:section(NamedSection, "contact")
c:option(Value, "nickname", "Pseudonym")
c:option(Value, "name", "Name")
c:option(Value, "mail", "E-Mail")
c:option(Value, "phone", "Telefon")
c:option(Value, "location", "Standort")
c:option(Value, "geo", "Koordinaten", "Bitte als Breite;Länge angeben")
c:option(Value, "note", "Notiz")
return m

View file

@ -1,17 +0,0 @@
-- ToDo: Translate, Add descriptions and help texts
m = Map("luci", "FFLuCI")
c = m:section(NamedSection, "main", "core", "Allgemein")
c:option(Value, "lang", "Sprache")
c:option(Value, "mediaurlbase", "Mediaverzeichnis")
f = m:section(NamedSection, "flash", "extern", "Firmwareupgrade")
f:option(Value, "keep", "Übernehme Dateien").size = 64
p = m:section(NamedSection, "category_privileges", "core", "Kategorieprivilegien")
p.dynamic = true
u = m:section(NamedSection, "uci_oncommit", "event", "UCI-Befehle beim Anwenden")
u.dynamic = true
return m

View file

@ -1,37 +0,0 @@
-- ToDo: Translate, Add descriptions and help texts
require("ffluci.model.uci")
require("ffluci.sys")
m = Map("dhcp", "DHCP")
s = m:section(TypedSection, "dhcp")
s.addremove = true
s.anonymous = true
iface = s:option(ListValue, "interface", "Schnittstelle")
for k, v in pairs(ffluci.model.uci.show("network").network) do
if v[".type"] == "interface" and k ~= "loopback" then
iface:value(k)
end
end
s:option(Value, "start", "Start").rmempty = true
s:option(Value, "limit", "Limit").rmempty = true
s:option(Flag, "dynamicdhcp", "Dynamisches DHCP").rmempty = true
s:option(Value, "name", "Name").optional = true
s:option(Flag, "ignore", "Schnittstelle ignorieren").optional = true
s:option(Value, "netmask", "Netzmaske").optional = true
s:option(Flag, "force", "Start erzwingen").optional = true
for i, line in pairs(ffluci.sys.execl("dnsmasq --help dhcp")) do
k, v = line:match("([^ ]+) +([^ ]+)")
s:option(Value, "dhcp"..k, v).optional = true
end
return m

View file

@ -1,61 +0,0 @@
-- ToDo: Translate, Add descriptions and help texts
m = Map("luci_fw", "Firewall")
s = m:section(TypedSection, "rule")
s.addremove = true
s.anonymous = true
chain = s:option(ListValue, "chain", "Kette")
chain:value("forward", "Forward")
chain:value("input", "Input")
chain:value("output", "Output")
chain:value("prerouting", "Prerouting")
chain:value("postrouting", "Postrouting")
s:option(Value, "iface", "Eingangsschnittstelle").optional = true
s:option(Value, "oface", "Ausgangsschnittstelle").optional = true
proto = s:option(ListValue, "proto", "Protokoll")
proto.optional = true
proto:value("")
proto:value("tcp", "TCP")
proto:value("udp", "UDP")
s:option(Value, "source", "Quelladresse").optional = true
s:option(Value, "destination", "Zieladresse").optional = true
sport = s:option(Value, "sport", "Quellport")
sport.optional = true
sport:depends("proto", "tcp")
sport:depends("proto", "udp")
dport = s:option(Value, "dport", "Zielport")
dport.optional = true
dport:depends("proto", "tcp")
dport:depends("proto", "udp")
tosrc = s:option(Value, "tosrc", "Neue Quelladresse [SNAT]")
tosrc.optional = true
tosrc:depends("jump", "SNAT")
tosrc = s:option(Value, "todest", "Neue Zieladresse [DNAT]")
tosrc.optional = true
tosrc:depends("jump", "DNAT")
jump = s:option(ListValue, "jump", "Aktion")
jump.rmempty = true
jump:value("", "")
jump:value("ACCEPT", "annehmen (ACCEPT)")
jump:value("REJECT", "zurückweisen (REJECT)")
jump:value("DROP", "verwerfen (DROP)")
jump:value("LOG", "protokollieren (LOG)")
jump:value("DNAT", "Ziel umschreiben (DNAT) [nur Prerouting]")
jump:value("MASQUERADE", "maskieren (MASQUERADE) [nur Postrouting]")
jump:value("SNAT", "Quelle umschreiben (SNAT) [nur Postrouting]")
add = s:option(Value, "command", "Eigener Befehl")
add.size = 50
add.rmempty = true
return m

View file

@ -1,40 +0,0 @@
-- ToDo: Translate, Add descriptions and help texts
m = Map("network", "Schnittstellen")
s = m:section(TypedSection, "interface")
s.addremove = true
s:exclude("loopback")
s:depends("proto", "static")
s:depends("proto", "dhcp")
p = s:option(ListValue, "proto", "Protokoll")
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")
s:option(Value, "netmask", "Netzmaske"):depends("proto", "static")
gw = s:option(Value, "gateway", "Gateway")
gw:depends("proto", "static")
gw.rmempty = true
dns = s:option(Value, "dns", "DNS-Server")
dns:depends("proto", "static")
dns.optional = true
mtu = s:option(Value, "mtu", "MTU")
mtu.optional = true
mtu.isinteger = true
mac = s:option(Value, "macaddr", "MAC-Adresse")
mac.optional = true
return m

View file

@ -1,24 +0,0 @@
-- ToDo: Translate, Add descriptions and help texts
require("ffluci.sys")
m = Map("luci_fw", "Portweiterleitung")
s = m:section(TypedSection, "portfw")
s.addremove = true
s.anonymous = true
iface = s:option(ListValue, "iface", "Externes Interface")
iface:value("")
for k,v in pairs(ffluci.sys.net.devices()) do
iface:value(v)
end
proto = s:option(ListValue, "proto", "Protokoll")
proto:value("tcp", "TCP")
proto:value("udp", "UDP")
proto:value("tcpudp", "TCP+UDP")
dport = s:option(Value, "dport", "Externer Port", "Port[:Endport]")
to = s:option(Value, "to", "Interne Adresse", "IP-Adresse[:Zielport[-Zielendport]]")
return m

View file

@ -1,31 +0,0 @@
-- ToDo: Translate, Add descriptions and help texts
m = Map("network", "Punkt-zu-Punkt Verbindungen")
s = m:section(TypedSection, "interface")
s.addremove = true
s:depends("proto", "pppoe")
s:depends("proto", "pptp")
p = s:option(ListValue, "proto", "Protokoll")
p:value("pppoe", "PPPoE")
p:value("pptp", "PPTP")
p.default = "pppoe"
s:option(Value, "ifname", "Schnittstelle")
s:option(Value, "username", "Benutzername")
s:option(Value, "password", "Passwort")
s:option(Value, "keepalive", "Keep-Alive").optional = true
s:option(Value, "demand", "Dial on Demand (idle time)").optional = true
srv = s:option(Value, "server", "PPTP-Server")
srv:depends("proto", "pptp")
srv.optional = true
mtu = s:option(Value, "mtu", "MTU")
mtu.optional = true
mtu.isinteger = true
return m

View file

@ -1,16 +0,0 @@
-- ToDo: Translate, Add descriptions and help texts
m = Map("network", "Statische Routen")
s = m:section(TypedSection, "route")
s.addremove = true
s.anonymous = true
s:option(Value, "interface", "Schnittstelle")
s:option(Value, "target", "Ziel", "Host-IP oder Netzwerk")
s:option(Value, "netmask", "Netzmaske", "falls Ziel ein Netzwerk ist").rmemepty = true
s:option(Value, "gateway", "Gateway")
return m

View file

@ -1,10 +0,0 @@
-- ToDo: Autodetect things, maybe use MultiValue instead, Translate, Add descriptions
m = Map("network", "VLAN", "Konfguriert den Switch des Routers.")
s = m:section(TypedSection, "switch")
for i = 0, 15 do
s:option(Value, "vlan"..i, "vlan"..i).optional = true
end
return m

View file

@ -1,29 +0,0 @@
m = Map("dhcp", "Dnsmasq")
s = m:section(TypedSection, "dnsmasq", "Einstellungen")
s.anonymous = true
s:option(Flag, "domainneeded", "Anfragen nur mit Domain", "Anfragen ohne Domainnamen nicht weiterleiten")
s:option(Flag, "authoritative", "Authoritativ", "Dies ist der einzige DHCP im lokalen Netz")
s:option(Flag, "boguspriv", "Private Anfragen filtern", "Reverse DNS-Anfragen für lokalen Netze nicht weiterleiten")
s:option(Flag, "filterwin2k", "Windowsanfragen filtern", "nutzlose DNS-Anfragen aktueller Windowssysteme filtern")
s:option(Flag, "localise_queries", "Lokalisiere Anfragen", "Gibt die Adresse eines Hostnamen entsprechend seines Subnetzes zurück")
s:option(Value, "local", "Lokale Server")
s:option(Value, "domain", "Lokale Domain")
s:option(Flag, "expandhosts", "Erweitere Hosts", "Fügt Domainnamen zu einfachen Hosteinträgen in der Resolvdatei hinzu")
s:option(Flag, "nonegcache", "Unbekannte nicht cachen", "Negative DNS-Antworten nicht zwischenspeichern")
s:option(Flag, "readethers", "Verwende /etc/ethers", "Lese Informationen aus /etc/ethers um den DHCP-Server zu konfigurieren")
s:option(Value, "leasefile", "Leasedatei", "Speicherort für vergebenen DHCP-Adressen")
s:option(Value, "resolvfile", "Resolvdatei", "Lokale DNS-Datei")
s:option(Flag, "nohosts", "Ignoriere /etc/hosts").optional = true
s:option(Flag, "strictorder", "Strikte Reihenfolge", "DNS-Server werden strikt der Reihenfolge in der Resolvdatei nach abgefragt").optional = true
s:option(Flag, "logqueries", "Schreibe Abfragelog").optional = true
s:option(Flag, "noresolv", "Ignoriere Resolvdatei").optional = true
s:option(Value, "dnsforwardmax", "gleichzeitige Abfragen").optional = true
s:option(Value, "port", "DNS-Port").optional = true
s:option(Value, "ednspacket_max", "max. EDNS.0 Paketgröße").optional = true
s:option(Value, "dhcpleasemax", "max. DHCP-Leases").optional = true
s:option(Value, "addnhosts", "Zusätzliche Hostdatei").optional = true
s:option(Value, "queryport", "Abfrageport").optional = true
return m

View file

@ -1,14 +0,0 @@
-- ToDo: Translate, Add descriptions
m = Map("dropbear", "SSH-Server")
s = m:section(TypedSection, "dropbear")
s.anonymous = true
port = s:option(Value, "Port", "Port")
port.isinteger = true
pwauth = s:option(Flag, "PasswordAuth", "Passwortanmeldung")
pwauth.enabled = 'on'
pwauth.disabled = 'off'
return m

View file

@ -1,18 +0,0 @@
-- ToDo: Translate, Add descriptions
m = Map("httpd", "HTTP-Server")
s = m:section(TypedSection, "httpd")
s.anonymous = true
port = s:option(Value, "port", "Port")
port.isinteger = true
s:option(Value, "home", "Wurzelverzeichnis")
config = s:option(Value, "c_file", "Konfigurationsdatei", "/etc/httpd.conf wenn leer")
config.rmempty = true
realm = s:option(Value, "realm", "Anmeldeaufforderung")
realm.rmempty = true
return m

View file

@ -1,82 +0,0 @@
-- ToDo: Autodetect things, Translate, Add descriptions
require("ffluci.fs")
m = Map("olsr", "OLSR")
s = m:section(NamedSection, "general", "olsr", "Allgemeine Einstellungen")
debug = s:option(ListValue, "DebugLevel", "Debugmodus")
for i=0, 9 do
debug:value(i)
end
ipv = s:option(ListValue, "IpVersion", "Internet Protokoll")
ipv:value("4", "IPv4")
ipv:value("6", "IPv6")
noint = s:option(Flag, "AllowNoInt", "Start ohne Netzwerk")
noint.enabled = "yes"
noint.disabled = "no"
s:option(Value, "Pollrate", "Abfragerate (Pollrate)", "s").isnumber = true
tcr = s:option(ListValue, "TcRedundancy", "TC-Redundanz")
tcr:value("0", "MPR-Selektoren")
tcr:value("1", "MPR-Selektoren und MPR")
tcr:value("2", "Alle Nachbarn")
s:option(Value, "MprCoverage", "MPR-Erfassung").isinteger = true
lql = s:option(ListValue, "LinkQualityLevel", "VQ-Level")
lql:value("0", "deaktiviert")
lql:value("1", "MPR-Auswahl")
lql:value("2", "MPR-Auswahl und Routing")
lqfish = s:option(Flag, "LinkQualityFishEye", "VQ-Fisheye")
s:option(Value, "LinkQualityWinSize", "VQ-Fenstergröße").isinteger = true
s:option(Value, "LinkQualityDijkstraLimit", "VQ-Dijkstralimit")
hyst = s:option(Flag, "UseHysteresis", "Hysterese aktivieren")
hyst.enabled = "yes"
hyst.disabled = "no"
i = m:section(TypedSection, "Interface", "Schnittstellen")
i.anonymous = true
i.addremove = true
i.dynamic = true
i:option(Value, "Interface", "Netzwerkschnittstellen")
i:option(Value, "HelloInterval", "Hello-Intervall").isnumber = true
i:option(Value, "HelloValidityTime", "Hello-Gültigkeit").isnumber = true
i:option(Value, "TcInterval", "TC-Intervall").isnumber = true
i:option(Value, "TcValidityTime", "TC-Gültigkeit").isnumber = true
i:option(Value, "MidInterval", "MID-Intervall").isnumber = true
i:option(Value, "MidValidityTime", "MID-Gültigkeit").isnumber = true
i:option(Value, "HnaInterval", "HNA-Intervall").isnumber = true
i:option(Value, "HnaValidityTime", "HNA-Gültigkeit").isnumber = true
p = m:section(TypedSection, "LoadPlugin", "Plugins")
p.addremove = true
p.dynamic = true
lib = p:option(ListValue, "Library", "Bibliothek")
lib:value("")
for k, v in pairs(ffluci.fs.dir("/usr/lib")) do
if v:sub(1, 6) == "olsrd_" then
lib:value(v)
end
end
return m

View file

@ -1,21 +0,0 @@
m = Map("fstab", "Einhängepunkte")
mount = m:section(TypedSection, "mount", "Einhängepunkte")
mount.anonymous = true
mount.addremove = true
mount:option(Flag, "enabled", "aktivieren")
mount:option(Value, "device", "Gerät")
mount:option(Value, "target", "Einhängepunkt")
mount:option(Value, "fstype", "Dateisystem")
mount:option(Value, "options", "Optionen")
swap = m:section(TypedSection, "swap", "SWAP")
swap.anonymous = true
swap.addremove = true
swap:option(Flag, "enabled", "aktivieren")
swap:option(Value, "device", "Gerät")
return m

View file

@ -1,52 +0,0 @@
-- ToDo: Translate, Add descriptions and help texts
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")
--[[
require("ffluci.sys")
local c = ". /etc/functions.sh;for i in /lib/wifi/*;do . $i;done;echo $DRIVERS"
for driver in ffluci.sys.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

View file

@ -1,70 +0,0 @@
-- 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")
local d = ffluci.model.uci.show("wireless").wireless
if d then
for k, v in pairs(d) do
if v[".type"] == "wifi-device" then
device:value(k)
end
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" and k ~= "loopback" 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

View file

@ -1,38 +0,0 @@
-- General menu definition
add("public", "index", "Übersicht", 10)
act("contact", "Kontakt")
add("admin", "index", "Übersicht", 10)
act("contact", "Kontakt")
act("luci", "FFLuCI")
add("admin", "status", "Status", 20)
act("system", "System")
add("admin", "system", "System", 30)
act("packages", "Paketverwaltung")
act("passwd", "Passwort ändern")
act("sshkeys", "SSH-Schlüssel")
act("fstab", "Einhängepunkte")
act("upgrade", "Firmwareupgrade")
act("reboot", "Neu starten")
add("admin", "services", "Dienste", 40)
act("olsrd", "OLSR")
act("httpd", "HTTP-Server")
act("dropbear", "SSH-Server")
act("dnsmasq", "Dnsmasq")
add("admin", "network", "Netzwerk", 50)
act("vlan", "Switch")
act("ifaces", "Schnittstellen")
act("dhcp", "DHCP-Server")
act("ptp", "PPPoE / PPTP")
act("routes", "Statische Routen")
act("portfw", "Portweiterleitung")
act("firewall", "Firewall")
add("admin", "wifi", "Drahtlos", 60)
act("devices", "Geräte")
act("networks", "Netze")

View file

@ -1,5 +0,0 @@
<%+header%>
<h1><%:hello Hallo!%></h1>
<p><%:admin1 Dies ist der Administrationsbereich. %>
<p><em>ToDo: Intelligenter Einleitungstext</em></p>
<%+footer%>

View file

@ -1,2 +0,0 @@
<%+header%>
<%+footer%>

View file

@ -1,2 +0,0 @@
<%+header%>
<%+footer%>

View file

@ -1,2 +0,0 @@
<%+header%>
<%+footer%>

View file

@ -1,2 +0,0 @@
<%+header%>
<%+footer%>

View file

@ -1,2 +0,0 @@
<%+header%>
<%+footer%>

View file

@ -1,14 +0,0 @@
<%+header%>
<h1><%:texteditor Texteditor%></h1>
<form method="post" action="<%=controller%>/admin/system/editor">
<div><%:file Datei%>: <input type="text" name="file" size="30" value="<%=(fn or '')%>" />
<% if msg then %><span class="error"><%:error Fehler%>: <%=msg%></span><% end %></div>
<br />
<div><textarea style="width: 100%" rows="20" name="data"><%=(cnt or '')%></textarea></div>
<br />
<div>
<input type="submit" value="<%:save Speichern%>" />
<input type="reset" value="<%:reset Zurücksetzen%>" />
</div>
</form>
<%+footer%>

View file

@ -1,2 +0,0 @@
<%+header%>
<%+footer%>

View file

@ -1,23 +0,0 @@
<%+header%>
<h1><%:system System%></h1>
<h2><%:ipkg IPKG-Konfiguration%></h2>
<br />
<div><strong><%:ipkg_pkglists Paketlisten%>:</strong><code>src <em>Name</em> <em>URL</em></code></div>
<div><strong><%:ipkg_targets Installationsziele%>:</strong><code>dest <em>Name</em> <em>Pfad</em></code></div>
<br />
<form method="post" action="<%=controller%>/admin/system/ipkg">
<fieldset class="cbi-section-node">
<div><textarea style="width: 100%" rows="10" name="data"><%=(cnt or '')%></textarea></div>
<br />
<div>
<input type="submit" value="<%:save Speichern%>" />
<input type="reset" value="<%:reset Zurücksetzen%>" />
</div>
<% if msg then %><br /><div class="error"><%:error Fehler%>: <%=msg%></div><% end %>
</fieldset>
</form>
<%+footer%>

View file

@ -1,77 +0,0 @@
<%+header%>
<h1><%:system System%></h1>
<h2><%:packages Paketverwaltung%></h2>
<br />
<% if install or remove or update or upgrade then %>
<div class="code"><strong><%:status Status%>:</strong><br />
<% if update then %>
<%:packages_update Paketlisten aktualisieren%>: <% if update == 0 then %><span class="ok"><%:ok OK%></span><% else %><span class="error"><%:error Fehler%> (<%:code Code%> <%=update%>)</span><% end %><br />
<% end %>
<% if upgrade then%>
<%:packages_upgrade Installierte Pakete aktualisieren%>: <% if upgrade == 0 then %><span class="ok"><%:ok OK%></span><% else %><span class="error"><%:error Fehler%> (<%:code Code%> <%=upgrade%>)</span><% end %><br />
<% end %>
<% if install then for k,v in pairs(install) do %>
<%:packages_install Installation von%> '<%=k%>': <% if v == 0 then %><span class="ok"><%:ok OK%></span><% else %><span class="error"><%:error Fehler%> (<%:code Code%> <%=v%>)</span><% end %><br />
<% end end %>
<% if remove then for k,v in pairs(remove) do %>
<%:packages_remove Deinstallation von%> '<%=k%>': <% if v == 0 then %><span class="ok"><%:ok OK%></span><% else %><span class="error"><%:error Fehler%> (<%:code Code%> <%=v%>)</span><% end %><br />
<% end end %>
</div>
<br />
<% end %>
<div>
<a href="<%=controller%>/admin/system/ipkg"><%:packages_ipkg Paketlisten und Installationsziele bearbeiten%></a><br />
<a href="<%=controller%>/admin/system/packages?update=1"><%:packages_updatelist Paketlisten aktualisieren%></a><br />
<a href="<%=controller%>/admin/system/packages?upgrade=1"><%:packages_upgrade Installierte Pakete aktualisieren%></a>
</div>
<br />
<br />
<form method="post" action="<%=controller%>/admin/system/packages">
<div>
<span class="bold"><%:packages_installurl Paket herunterladen und installieren%>:</span><br />
<input type="text" name="url" size="30" value="" />
<input type="submit" name="submit" value="<%:ok OK%>" />
</div>
<br />
<br />
<div>
<span class="bold"><%:filter Filter%>:</span>
<input type="text" name="query" size="20" value="<%=(query or '')%>" />
<input type="submit" name="search" value="<%:packages_search Paket suchen%>" />
<input type="submit" name="submit" value="<%:packages_do Aktionen ausführen%>" />
</div>
<br />
<br />
<div>
<table style="font-size: 0.8em">
<tr>
<th><%:packages_name Paketname%></th>
<th><%:version Version%></th>
<th><%:install Installieren%></th>
<th><%:delete Löschen%></th>
<th><%:descr Beschreibung%></th>
</tr>
<% for k, pkg in pairs(pkgs) do %>
<tr>
<td><%=pkg.Package%></td>
<td><%=(pkg.Version or '')%></td>
<td><% if not pkg.Status or not pkg.Status.installed then %><input type="checkbox" name="install.<%=pkg.Package%>" value="1" /><% else %><%:installed installiert%><% end %></td>
<td><% if pkg.Status and pkg.Status.installed then %><input type="checkbox" name="remove.<%=pkg.Package%>" value="1" /><% else %><%:notinstalled nicht installiert%><% end %></td>
<td><%=(pkg.Description or '')%></td>
</tr>
<% end %>
</table>
</div>
<br />
<input type="submit" name="submit" value="<%:packages_do Aktionen ausführen%>" />
</form>
<%+footer%>

View file

@ -1,34 +0,0 @@
<%+header%>
<h1><%:system System%></h1>
<h2><%:passwd Passwort ändern%></h2>
<div><br />
<% if stat then %>
<% if stat == 0 then %>
<code><%:password_changed Passwort erfolgreich geändert!%></code>
<% elseif stat == 10 then %>
<code class="error"><%:password_nomatch Passwörter stimmen nicht überein! %></code>
<% else %>
<code class="error"><%:unknown_error Unbekannter Fehler!%></code>
<% end %>
<% end %>
<% if not stat or stat == 10 then %>
<form method="post" action="<%=controller%>/admin/system/passwd">
<fieldset class="cbi-section-node">
<div class="cbi-value clear">
<div class="cbi-value-title left"><%:password Passwort%></div>
<div class="cbi-value-field"><input type="password" name="pwd1" /></div>
</div>
<div class="cbi-value clear">
<div class="cbi-value-title left"><%:confirmation Bestätigung%></div>
<div class="cbi-value-field"><input type="password" name="pwd2" /></div>
</div>
<br />
<div>
<input type="submit" value="<%:save Speichern%>" />
<input type="reset" value="<%:reset Zurücksetzen%>" />
</div>
</fieldset>
</form>
<% end %>
</div>
<%+footer%>

View file

@ -1,10 +0,0 @@
<%+header%>
<h1><%:system System%></h1>
<h2><%:reboot Neu starten%></h2>
<% if not reboot then %>
<p><a href="<%=controller%>/admin/system/reboot?reboot=1"><%:reboot_do Neustart durchführen%></a></p>
<% else %>
<p><%:reboot_running Bitte warten: Neustart wird durchgeführt...%></p>
<script type="text/javascript">setTimeout("location='<%=controller%>/admin'", 30000)</script>
<% end %>
<%+footer%>

View file

@ -1,23 +0,0 @@
<%+header%>
<h1><%:system System%></h1>
<h2><%:sshkeys SSH-Schlüssel%></h2>
<br />
<div><%:sshkeys_descr Hier können öffentliche SSH-Schlüssel (einer pro Zeile)
zur Authentifizierung abgelegt werden.%></div>
<br />
<form method="post" action="<%=controller%>/admin/system/sshkeys">
<fieldset class="cbi-section-node">
<div><textarea style="width: 100%" rows="10" name="data"><%=(cnt or '')%></textarea></div>
<br />
<div>
<input type="submit" value="<%:save Speichern%>" />
<input type="reset" value="<%:reset Zurücksetzen%>" />
</div>
<% if msg then %><br /><div class="error"><%:error Fehler%>: <%=msg%></div><% end %>
</fieldset>
</form>
<%+footer%>

View file

@ -1,32 +0,0 @@
<%+header%>
<h1><%:system System%></h1>
<h2><%:upgrade Upgrade%></h2>
<br />
<% if sysupgrade and not ret then %>
<form method="post" action="<%=controller%>-upload/admin/system/upgrade" enctype="multipart/form-data">
<fieldset class="cbi-section-node">
<div class="cbi-value clear">
<div class="cbi-value-title left"><%:fwimage Firmwareimage%></div>
<div class="cbi-value-field"><input type="file" size="30" name="image" /></div>
</div>
<br />
<div class="cbi-value clear">
<input type="checkbox" name="keepcfg" value="1" checked="checked" />
<span class="bold"><%:keepcfg Konfigurationsdateien übernehmen%></span>
</div>
<br />
<div>
<input type="submit" value="<%:fwupgrade Firmware aktualisieren%>" />
</div>
</fieldset>
</form>
<% elseif ret then %>
<% if ret == 0 then %>
<div class="ok"><%:flashed Flashvorgang erfolgreich. Router startet neu...%></div>
<% else %>
<div class="error"><%:flasherr Flashvorgang fehlgeschlagen!%> (<%:code Code%> <%=ret%>)</div>
<% end %>
<% else %>
<div class="error"><%:notimplemented Diese Funktion steht leider (noch) nicht zur Verfügung.%></div>
<% end %>
<%+footer%>

View file

@ -1,6 +0,0 @@
<%+header%>
<h1><%:config Konfiguration%></h1>
<p><%:uci_applied Die folgenden Änderungen wurden übernommen:%></p>
<code><%=(changes or "-")%>
<%=output%></code>
<%+footer%>

View file

@ -1,11 +0,0 @@
<%+header%>
<h1><%:config Konfiguration%></h1>
<h2><%:changes Änderungen%></h2>
<code><%=(ffluci.model.uci.changes() or "-")%></code>
<form class="inline" method="get" action="<%=controller%>/admin/uci/apply">
<input type="submit" value="<%:apply Anwenden%>" />
</form>
<form class="inline" method="get" action="<%=controller%>/admin/uci/revert">
<input type="submit" value="<%:revert Verwerfen%>" />
</form>
<%+footer%>

View file

@ -1,5 +0,0 @@
<%+header%>
<h1><%:config Konfiguration%></h1>
<p><%:uci_reverted Die folgenden Änderungen wurden verworfen:%></p>
<code><%=(changes or "-")%></code>
<%+footer%>

View file

@ -1,2 +0,0 @@
<%+header%>
<%+footer%>

View file

@ -1,12 +0,0 @@
<%+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 %>
&nbsp;
<%+cbi/valuefooter%>

View file

@ -1,7 +0,0 @@
<div>
<input type="submit" value="<%:save Speichern%>" />
<input type="reset" value="<%:reset Zurücksetzen%>" />
<script type="text/javascript">cbi_d_init();</script>
</div>
</form>
<%+footer%>

View file

@ -1,3 +0,0 @@
<%+cbi/valueheader%>
<input onchange="cbi_d_update(this.id)" type="checkbox" id="cbid.<%=self.config.."."..section.."."..self.option%>" name="cbid.<%=self.config.."."..section.."."..self.option%>"<% if self:cfgvalue(section) == self.enabled then %> checked="checked"<% end %> value="1" />
<%+cbi/valuefooter%>

View file

@ -1,7 +0,0 @@
<%+header%>
<form method="post" action="<%=os.getenv("REQUEST_URI")%>">
<div>
<script type="text/javascript" src="<%=media%>/cbi.js"></script>
<input type="hidden" name="cbi.submit" value="1" />
<input type="submit" value="<%:cbi_save Speichern%>" class="hidden" />
</div>

View file

@ -1,16 +0,0 @@
<%+cbi/valueheader%>
<% if self.widget == "select" then %>
<select onchange="cbi_d_update(this.id)" id="cbid.<%=self.config.."."..section.."."..self.option%>" name="cbid.<%=self.config.."."..section.."."..self.option%>"<% if self.size then %> size="<%=self.size%>"<% end %>>
<%for i, key in pairs(self.keylist) do%>
<option<% if self:cfgvalue(section) == key then %> selected="selected"<% end %> value="<%=key%>"><%=self.vallist[i]%></option>
<% end %>
</select>
<% elseif self.widget == "radio" then
local c = 0;
for i, key in pairs(self.keylist) do
c = c + 1%>
<%=self.vallist[i]%><input type="radio" name="cbid.<%=self.config.."."..section.."."..self.option%>"<% if self:cfgvalue(section) == key then %> checked="checked"<% end %> value="<%=key%>" />
<% if c == self.size then c = 0 %><br />
<% end end %>
<% end %>
<%+cbi/valuefooter%>

View file

@ -1,7 +0,0 @@
<div class="cbi-map" id="cbi-<%=self.config%>">
<h1><%=self.title%></h1>
<div class="cbi-map-descr"><%=self.description%></div>
<br />
<% self:render_children() %>
<br />
</div>

View file

@ -1,19 +0,0 @@
<%
local v = self:valuelist(section)
%>
<%+cbi/valueheader%>
<% if self.widget == "select" then %>
<select multiple="multiple" name="cbid.<%=self.config.."."..section.."."..self.option%>[]"<% if self.size then %> size="<%=self.size%>"<% end %>>
<%for i, key in pairs(self.keylist) do %>
<option<% if ffluci.util.contains(v, key) then %> selected="selected"<% end %> value="<%=key%>"><%=self.vallist[i]%></option>
<% end %>
</select>
<% elseif self.widget == "checkbox" then
local c = 0;
for i, key in pairs(self.keylist) do
c = c + 1%>
<%=self.vallist[i]%><input type="checkbox" name="cbid.<%=self.config.."."..section.."."..self.option%>[]"<% if ffluci.util.contains(v, key) then %> checked="checked"<% end %> value="<%=key%>" />
<% if c == self.size then c = 0 %><br />
<% end end %>
<% end %>
<%+cbi/valuefooter%>

View file

@ -1,17 +0,0 @@
<% if self:cfgvalue(self.section) then
section = self.section %>
<div class="cbi-section" id="cbi-<%=self.config%>-<%=section%>">
<h2><%=self.title%></h2>
<div class="cbi-section-descr"><%=self.description%></div>
<% if self.addremove then %><div class="cbi-section-remove">
<input type="submit" name="cbi.rns.<%=self.config%>.<%=section%>" value="<%:cbi_del Eintrag entfernen%>" />
</div><% end %>
<%+cbi/ucisection%>
</div>
<% elseif self.addremove then %>
<div class="cbi-section" id="cbi-<%=self.config%>-<%=self.section%>">
<h2><%=self.title%></h2>
<div class="cbi-section-descr"><%=self.description%></div>
<input type="submit" name="cbi.cns.<%=self.config%>.<%=self.section%>" value="<%:cbi_cns Eintrag anlegen%>" />
</div>
<% end %>

View file

@ -1,22 +0,0 @@
<div class="cbi-section" id="cbi-<%=self.config%>-<%=self.sectiontype%>">
<h2><%=self.title%></h2>
<div class="cbi-section-descr"><%=self.description%></div>
<% for k, v in pairs(self:cfgsections()) do%>
<% if self.addremove then %><div class="cbi-section-remove right">
<input type="submit" name="cbi.rts.<%=self.config%>.<%=k%>" value="<%:cbi_del Eintrag entfernen%>" />
</div><% end %>
<% if not self.anonymous then %><h3><%=k%></h3><% end %>
<% section = k %>
<%+cbi/ucisection%>
<% end %>
<% if self.addremove then %>
<div class="cbi-section-create">
<% if self.anonymous then %>
<input type="submit" name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>" value="<%:cbi_add Eintrag hinzufügen%>" />
<% else %>
<input type="text" class="cbi-section-create-name" name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>" />
<input type="submit" value="<%:cbi_add Eintrag hinzufügen%>" />
<% end %><% if self.err_invalid then %><div class="cbi-error"><%:cbi_invalid Fehler: Ungültige Eingabe%></div><% end %>
</div>
<% end %>
</div>

View file

@ -1,23 +0,0 @@
<fieldset class="cbi-section-node" id="cbi-<%=self.config%>-<%=section%>">
<% self:render_children(section) %>
<% if #self.optionals[section] > 0 or self.dynamic then %>
<div class="cbi-optionals">
<% if self.dynamic then %>
<input type="text" name="cbi.opt.<%=self.config%>.<%=section%>" />
<% else %>
<select name="cbi.opt.<%=self.config%>.<%=section%>">
<option><%:cbi_addopt -- Feld --%></option>
<% for key, val in pairs(self.optionals[section]) do %>
<option id="cbi-<%=self.config.."-"..section.."-"..val.option%>" value="<%=val.option%>"><%=val.title%></option>
<% end %>
</select>
<script type="text/javascript"><% for key, val in pairs(self.optionals[section]) do %>
<% if #val.deps > 0 then %><% for j, d in ipairs(val.deps) do %>cbi_d_add("cbi-<%=self.config.."-"..section.."-"..val.option%>", "cbid.<%=self.config.."."..section.."."..d.field%>", "<%=d.value%>");
<% end %><% end %>
<% end %></script>
<% end %>
<input type="submit" value="<%:add hinzufügen%>" />
</div>
<% end %>
</fieldset>
<br />

View file

@ -1,3 +0,0 @@
<%+cbi/valueheader%>
<input type="text" onchange="cbi_d_update(this.id)" <% if self.size then %>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%>

View file

@ -1,8 +0,0 @@
<div class="cbi-value-description inline"><%=self.description%></div>
</div>
<% if self.tag_invalid[section] then %><div class="cbi-error"><%:cbi_invalid Fehler: Ungültige Eingabe%></div><% end %>
</div>
<% if #self.deps > 0 then %><script type="text/javascript">
<% for j, d in ipairs(self.deps) do %>cbi_d_add("cbi-<%=self.config.."-"..section.."-"..self.option%>", "cbid.<%=self.config.."."..section.."."..d.field%>", "<%=d.value%>");
<% end %>
</script><% end %>

View file

@ -1,3 +0,0 @@
<div class="cbi-value clear" id="cbi-<%=self.config.."-"..section.."-"..self.option%>">
<div class="cbi-value-title left"><%=self.title%></div>
<div class="cbi-value-field">

View file

@ -1,5 +0,0 @@
<%+header%>
<h1>404 Not Found</h1>
<p>Sorry, the object you requested was not found.</p>
<tt>Unable to dispatch: <%=os.getenv("PATH_INFO")%></tt>
<%+footer%>

View file

@ -1,5 +0,0 @@
<%+header%>
<h1>500 Internal Server Error</h1>
<p>Sorry, the server encountered an unexpected error.</p>
<tt><%=message%></tt>
<%+footer%>

View file

@ -1,7 +0,0 @@
</div>
<div class="clear"></div>
</div></div>
<div class="separator magenta bold">FFLuCI 0.2 - Freifunk Lua Configuration Interface</div>
</body>
</html>

View file

@ -1,78 +0,0 @@
<%
require("ffluci.sys")
local load1, load5, load15 = ffluci.sys.loadavg()
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>
<link rel="stylesheet" type="text/css" href="<%=media%>/cascade.css" />
<link rel="stylesheet" type="text/css" href="<%=media%>/css/<%=req.category%>_<%=req.module%>.css" />
<meta http-equiv="content-type" content="text/xhtml+xml; charset=utf-8" />
<meta http-equiv="content-script-type" content="text/javascript" />
<title>FFLuCI</title>
</head>
<body>
<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 Last%>: <%=load1%> <%=load5%> <%=load15%><br />
<%:hostname Hostname%>: <%=ffluci.sys.hostname()%>
</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%>"><%=translate(req.category, req.category)%></a>
&#187; <a href="<%=controller .. "/" .. req.category .. "/" .. req.module %>"><%=translate(req.module, req.module)%></a>
&#187; <a href="<%=controller .. "/" .. req.category .. "/" .. req.module .. "/" .. req.action %>"><%=translate(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 Öffentlich%></a></li>
<li<% if "admin" == req.category then %> class="yellowtext"<% end %>><a href="<%=controller%>/admin"><%:admin Verwaltung%></a></li>
</ul>
</div>
<%
if "admin" == req.category then
require("ffluci.model.uci")
local ucic = ffluci.model.uci.changes()
if ucic then
ucic = #ffluci.util.split(ucic)
end
%>
<div><%:config Konfiguration%>
<ul>
<% if ucic then %>
<li><a href="<%=controller%>/admin/uci/changes"><%:changes Änderungen:%> <%=ucic%></a></li>
<li><a href="<%=controller%>/admin/uci/apply"><%:apply Anwenden%></a></li>
<li><a href="<%=controller%>/admin/uci/revert"><%:revert Verwerfen%></a></li>
<% else %>
<li><%:changes Änderungen: %> 0</li>
<% end %>
</ul>
</div>
<% end %>
</div>
<div id="content">

View file

@ -1,12 +0,0 @@
<%+header%>
<h1><%:contact Kontakt%></h1>
<table class="contact">
<tr><th><%:nickname Pseudonym%>:</th><td><%~luci.contact.nickname%></td></tr>
<tr><th><%:name Name%>:</th><td><%~luci.contact.name%></td></tr>
<tr><th><%:mail E-Mail%>:</th><td><%~luci.contact.mail%></td></tr>
<tr><th><%:phone Telefon%>:</th><td><%~luci.contact.phone%></td></tr>
<tr><th><%:location Standort%>:</th><td><%~luci.contact.location%></td></tr>
<tr><th><%:geocoord Geokoordinaten%>:</th><td><%~luci.contact.geo%></td></tr>
<tr><th><%:note Notiz%>:</th><td><%~luci.contact.note%></td></tr>
</table>
<%+footer%>

View file

@ -1,5 +0,0 @@
<%+header%>
<h1><%:hello Hallo!%></h1>
<p><%:admin1 Dies ist der Administrationsbereich. %>
<p><em>ToDo: Intelligenter Einleitungstext</em></p>
<%+footer%>