summaryrefslogtreecommitdiffhomepage
path: root/modules
diff options
context:
space:
mode:
authorSteven Barth <steven@midlink.org>2008-05-08 15:37:41 +0000
committerSteven Barth <steven@midlink.org>2008-05-08 15:37:41 +0000
commitaa9ccf77c6648515ba58c37b9345cdbd561028db (patch)
treeb0270202d47b6c5e179f8475302bb3ef0d1c9402 /modules
parenta3a51464fd8cffa6d18fa3f18be9c699901abd0d (diff)
* Mördercommit ;-)
* Major Repository Reorganisation * API 0.4 Softfreeze to come
Diffstat (limited to 'modules')
-rw-r--r--modules/admin-core/Makefile2
-rw-r--r--modules/admin-core/src/controller/admin/index.lua1
-rw-r--r--modules/admin-core/src/controller/admin/network.lua1
-rw-r--r--modules/admin-core/src/controller/admin/services.lua1
-rw-r--r--modules/admin-core/src/controller/admin/system.lua200
-rw-r--r--modules/admin-core/src/controller/admin/uci.lua61
-rw-r--r--modules/admin-core/src/controller/admin/wifi.lua1
-rw-r--r--modules/admin-core/src/i18n/admin_index.en24
-rw-r--r--modules/admin-core/src/i18n/admin_uci.en2
-rw-r--r--modules/admin-core/src/model/cbi/admin_index/luci.lua39
-rw-r--r--modules/admin-core/src/model/cbi/admin_network/dhcp.lua41
-rw-r--r--modules/admin-core/src/model/cbi/admin_network/ifaces.lua43
-rw-r--r--modules/admin-core/src/model/cbi/admin_network/ptp.lua33
-rw-r--r--modules/admin-core/src/model/cbi/admin_network/qos.lua56
-rw-r--r--modules/admin-core/src/model/cbi/admin_network/routes.lua23
-rw-r--r--modules/admin-core/src/model/cbi/admin_network/vlan.lua17
-rw-r--r--modules/admin-core/src/model/cbi/admin_services/dnsmasq.lua29
-rw-r--r--modules/admin-core/src/model/cbi/admin_services/dropbear.lua15
-rw-r--r--modules/admin-core/src/model/cbi/admin_services/httpd.lua18
-rw-r--r--modules/admin-core/src/model/cbi/admin_services/olsrd.lua89
-rw-r--r--modules/admin-core/src/model/cbi/admin_system/fstab.lua25
-rw-r--r--modules/admin-core/src/model/cbi/admin_system/hostname.lua9
-rw-r--r--modules/admin-core/src/model/cbi/admin_wifi/devices.lua52
-rw-r--r--modules/admin-core/src/model/cbi/admin_wifi/networks.lua77
-rw-r--r--modules/admin-core/src/model/menu/00admin.lua33
-rw-r--r--modules/admin-core/src/view/admin_index/index.htm11
-rw-r--r--modules/admin-core/src/view/admin_index/wizard.htm36
-rw-r--r--modules/admin-core/src/view/admin_network/index.htm11
-rw-r--r--modules/admin-core/src/view/admin_services/index.htm8
-rw-r--r--modules/admin-core/src/view/admin_system/editor.htm14
-rw-r--r--modules/admin-core/src/view/admin_system/index.htm9
-rw-r--r--modules/admin-core/src/view/admin_system/ipkg.htm26
-rw-r--r--modules/admin-core/src/view/admin_system/packages.htm77
-rw-r--r--modules/admin-core/src/view/admin_system/passwd.htm35
-rw-r--r--modules/admin-core/src/view/admin_system/reboot.htm11
-rw-r--r--modules/admin-core/src/view/admin_system/sshkeys.htm26
-rw-r--r--modules/admin-core/src/view/admin_system/upgrade.htm34
-rw-r--r--modules/admin-core/src/view/admin_uci/apply.htm6
-rw-r--r--modules/admin-core/src/view/admin_uci/changes.htm11
-rw-r--r--modules/admin-core/src/view/admin_uci/revert.htm5
-rw-r--r--modules/admin-core/src/view/admin_wifi/index.htm9
41 files changed, 1221 insertions, 0 deletions
diff --git a/modules/admin-core/Makefile b/modules/admin-core/Makefile
new file mode 100644
index 000000000..81a96f6a8
--- /dev/null
+++ b/modules/admin-core/Makefile
@@ -0,0 +1,2 @@
+include ../../build/config.mk
+include ../../build/module.mk \ No newline at end of file
diff --git a/modules/admin-core/src/controller/admin/index.lua b/modules/admin-core/src/controller/admin/index.lua
new file mode 100644
index 000000000..b4a7720f8
--- /dev/null
+++ b/modules/admin-core/src/controller/admin/index.lua
@@ -0,0 +1 @@
+module("ffluci.controller.admin.index", package.seeall) \ No newline at end of file
diff --git a/modules/admin-core/src/controller/admin/network.lua b/modules/admin-core/src/controller/admin/network.lua
new file mode 100644
index 000000000..0e3165f08
--- /dev/null
+++ b/modules/admin-core/src/controller/admin/network.lua
@@ -0,0 +1 @@
+module("ffluci.controller.admin.network", package.seeall) \ No newline at end of file
diff --git a/modules/admin-core/src/controller/admin/services.lua b/modules/admin-core/src/controller/admin/services.lua
new file mode 100644
index 000000000..42181212b
--- /dev/null
+++ b/modules/admin-core/src/controller/admin/services.lua
@@ -0,0 +1 @@
+module("ffluci.controller.admin.services", package.seeall) \ No newline at end of file
diff --git a/modules/admin-core/src/controller/admin/system.lua b/modules/admin-core/src/controller/admin/system.lua
new file mode 100644
index 000000000..7a927d604
--- /dev/null
+++ b/modules/admin-core/src/controller/admin/system.lua
@@ -0,0 +1,200 @@
+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 = submit and ffluci.http.formvaluetable("install")
+
+ -- 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 = submit and ffluci.http.formvaluetable("remove")
+ 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.sections("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 \ No newline at end of file
diff --git a/modules/admin-core/src/controller/admin/uci.lua b/modules/admin-core/src/controller/admin/uci.lua
new file mode 100644
index 000000000..cb4a95ba5
--- /dev/null
+++ b/modules/admin-core/src/controller/admin/uci.lua
@@ -0,0 +1,61 @@
+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 com = {}
+ local run = {}
+
+ -- Collect files to be applied and commit changes
+ for i, line in ipairs(ffluci.util.split(changes)) do
+ local r = line:match("^-?([^.]+)")
+ if r then
+ com[r] = true
+
+ if ffluci.config.uci_oncommit and ffluci.config.uci_oncommit[r] then
+ run[ffluci.config.uci_oncommit[r]] = true
+ end
+ end
+ end
+
+ -- Apply
+ for config, i in pairs(com) do
+ ffluci.model.uci.commit(config)
+ end
+
+ -- Search for post-commit commands
+ for cmd, i in pairs(run) do
+ output = output .. cmd .. ":" .. ffluci.sys.exec(cmd) .. "\n"
+ 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 \ No newline at end of file
diff --git a/modules/admin-core/src/controller/admin/wifi.lua b/modules/admin-core/src/controller/admin/wifi.lua
new file mode 100644
index 000000000..bc1040c71
--- /dev/null
+++ b/modules/admin-core/src/controller/admin/wifi.lua
@@ -0,0 +1 @@
+module("ffluci.controller.admin.wifi", package.seeall) \ No newline at end of file
diff --git a/modules/admin-core/src/i18n/admin_index.en b/modules/admin-core/src/i18n/admin_index.en
new file mode 100644
index 000000000..6a4877523
--- /dev/null
+++ b/modules/admin-core/src/i18n/admin_index.en
@@ -0,0 +1,24 @@
+luci = "User Interface"
+
+hello = "Hello!"
+admin1 = "This is the administration area of FFLuCI."
+admin2 = "FFLuCI is a free, flexible, and user friendly graphical interface for configuring OpenWRT Kamikaze."
+admin3 = "On the following pages you can adjust all important settings of your router."
+admin4 = "You will find a navigation leading to the different configuration pages on the left side."
+admin5 = [[As we are always want to improve this interface we are looking forward
+to your feedback and suggestions.]]
+admin6 = "And now have fun with your router!"
+team = "The FFLuCI Team"
+
+luci1 = "Here you can customize the settings and the functionality of FFLuCI."
+language = "Language"
+general = "General"
+catpriv = "Category Privileges"
+catpriv1 = [[To secure FFLuCI even further the user and group privileges of
+each category can be decreased. Therefore an attacker cannot takeover the whole system
+when a security exploit for any publicly available page is found.]]
+ucicommit = "Post-commit actions"
+ucicommit1 = [[These commands will be executed automatically when a given UCI configuration is committed allowing
+changes to be applied instantly.]]
+keepflash = "Files to be kept when flashing a new firmware"
+keepflash1 = "When flashing a new firmware with FFLuCI these files will be added to the new firmware installation." \ No newline at end of file
diff --git a/modules/admin-core/src/i18n/admin_uci.en b/modules/admin-core/src/i18n/admin_uci.en
new file mode 100644
index 000000000..00ac5f5ff
--- /dev/null
+++ b/modules/admin-core/src/i18n/admin_uci.en
@@ -0,0 +1,2 @@
+uci_applied = "The following changes were applied"
+uci_reverted = "The following changes were reverted" \ No newline at end of file
diff --git a/modules/admin-core/src/model/cbi/admin_index/luci.lua b/modules/admin-core/src/model/cbi/admin_index/luci.lua
new file mode 100644
index 000000000..4f6910eee
--- /dev/null
+++ b/modules/admin-core/src/model/cbi/admin_index/luci.lua
@@ -0,0 +1,39 @@
+-- ToDo: Translate
+require("ffluci.config")
+m = Map("luci", translate("luci", "Oberfläche"), translate("luci1",
+ "Hier können Eigenschaften und die Funktionalität der Oberfläche angepasst werden."))
+
+c = m:section(NamedSection, "main", "core", translate("general", "Allgemein"))
+
+l = c:option(ListValue, "lang", translate("language", "Sprache"))
+for k, v in pairs(ffluci.config.languages) do
+ if k:sub(1, 1) ~= "." then
+ l:value(k, v)
+ end
+end
+
+t = c:option(ListValue, "mediaurlbase", translate("design", "Design"))
+for k, v in pairs(ffluci.config.themes) do
+ if k:sub(1, 1) ~= "." then
+ t:value(v, k)
+ end
+end
+
+p = m:section(NamedSection, "category_privileges", "core", translate("catpriv", "Kategorieprivilegien"),
+ translate("catpriv1", [[Zur zusätzlichen Sicherung der Oberfläche gegen Angreifer, können hier die
+Ausführungsrechte der Seiten für einzelne Kategorien reduziert werden. So können z.B. Sicherheitslücken im
+ungeschützten Bereich der Oberfläche nicht mehr zur Übernahme des Routers genutzt werden.]]))
+p.dynamic = true
+
+u = m:section(NamedSection, "uci_oncommit", "event", translate("ucicommit", "UCI-Befehle beim Anwenden"),
+ translate("ucicommit1", [[Beim Anwenden
+der Konfiguration aus der Oberflächliche heraus können automatisch die relevanten Dienste neugestart werden,
+sodass Änderungen sofort nach dem Anwenden aktiv werden und der Router nicht erst neugestartet werden muss.]]))
+u.dynamic = true
+
+f = m:section(NamedSection, "flash_keep", "extern", translate("keepflash", "Zu übernehmende Dateien bei Firmwareupgrade"),
+ translate("keepflash1", [[Die folgenden Dateien und Verzeichnisse werden beim Aktualisieren der Firmware
+über die Oberfläche automatisch in die neue Firmware übernommen.]]))
+f.dynamic = true
+
+return m \ No newline at end of file
diff --git a/modules/admin-core/src/model/cbi/admin_network/dhcp.lua b/modules/admin-core/src/model/cbi/admin_network/dhcp.lua
new file mode 100644
index 000000000..caac277c4
--- /dev/null
+++ b/modules/admin-core/src/model/cbi/admin_network/dhcp.lua
@@ -0,0 +1,41 @@
+-- ToDo: Translate, Add descriptions and help texts
+require("ffluci.model.uci")
+require("ffluci.sys")
+
+m = Map("dhcp", "DHCP", [[Mit Hilfe von DHCP können Netzteilnehmer automatisch
+ihre Netzwerkkonfiguration (IP-Adresse, Netzmaske, DNS-Server, DHCP, ...) beziehen.]])
+
+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.sections("network")) do
+ if v[".type"] == "interface" and k ~= "loopback" then
+ iface:value(k)
+ s:depends("interface", k) -- Only change sections with existing interfaces
+ end
+end
+
+s:option(Value, "start", "Start", "Erste vergebene Adresse (letztes Oktett)").rmempty = true
+
+s:option(Value, "limit", "Limit", "Anzahl zu vergebender Adressen -1").rmempty = true
+
+s:option(Value, "leasetime", "Laufzeit").rmempty = true
+
+s:option(Flag, "dynamicdhcp", "Dynamisches DHCP").rmempty = true
+
+s:option(Value, "name", "Name").optional = true
+
+s:option(Flag, "ignore", "Schnittstelle ignorieren", "DHCP für dieses Netzwerk deaktivieren").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 \ No newline at end of file
diff --git a/modules/admin-core/src/model/cbi/admin_network/ifaces.lua b/modules/admin-core/src/model/cbi/admin_network/ifaces.lua
new file mode 100644
index 000000000..2dd190957
--- /dev/null
+++ b/modules/admin-core/src/model/cbi/admin_network/ifaces.lua
@@ -0,0 +1,43 @@
+-- ToDo: Translate, Add descriptions and help texts
+m = Map("network", "Schnittstellen", [[An dieser Stelle können die einzelnen Schnittstellen
+des Netzwerkes konfiguriert werden. Es können mehrere Schnittstellen zu einer Brücke zusammengefasst werden,
+indem diese durch Leerzeichen getrennt aufgezählt werden und ein entsprechender Haken im Feld Netzwerkbrücke
+gesetzt wird. Es können VLANs in der Notation SCHNITTSTELLE.VLANNR (z.B.: eth0.1) verwendet werden.]])
+
+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 \ No newline at end of file
diff --git a/modules/admin-core/src/model/cbi/admin_network/ptp.lua b/modules/admin-core/src/model/cbi/admin_network/ptp.lua
new file mode 100644
index 000000000..6a627f268
--- /dev/null
+++ b/modules/admin-core/src/model/cbi/admin_network/ptp.lua
@@ -0,0 +1,33 @@
+-- ToDo: Translate, Add descriptions and help texts
+m = Map("network", "Punkt-zu-Punkt Verbindungen", [[Punkt-zu-Punkt Verbindungen
+über PPPoE oder PPTP werden häufig dazu verwendet, um über DSL o.ä. Techniken eine
+Verbindung zum Internetgateway eines Internetzugangsanbieters aufzubauen.]])
+
+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", "Bei einer Verbindungstrennung automatisch neu verbinden").optional = true
+
+s:option(Value, "demand", "Dial on Demand (idle time)", "Zeit nach der die Verbindung bei Inaktivität getrennt wird").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 \ No newline at end of file
diff --git a/modules/admin-core/src/model/cbi/admin_network/qos.lua b/modules/admin-core/src/model/cbi/admin_network/qos.lua
new file mode 100644
index 000000000..d58130f10
--- /dev/null
+++ b/modules/admin-core/src/model/cbi/admin_network/qos.lua
@@ -0,0 +1,56 @@
+-- ToDo: Translate, Add descriptions and help texts
+m = Map("qos", "Quality of Service", [[Mit Hilfe von QoS kann einzelnen Rechnern oder Netzwerkdiensten
+eine höhere oder niedrigere Priorität zugewiesen werden.]])
+
+s = m:section(TypedSection, "interface", "Schnittstellen")
+s.addremove = true
+
+s:option(Flag, "enabled", "aktiviert")
+
+c = s:option(ListValue, "classgroup", "Klassifizierung")
+c:value("Default", "standard")
+c.default = "Default"
+
+s:option(Flag, "overhead", "Overheadberechnung")
+
+s:option(Value, "download", "Downlink", "kb/s")
+
+s:option(Value, "upload", "Uplink", "kb/s")
+
+s = m:section(TypedSection, "classify", "Klassifizierung")
+
+s.anonymous = true
+s.addremove = true
+
+t = s:option(ListValue, "target", "Klasse")
+t:value("Priority")
+t:value("Express")
+t:value("Normal")
+t:value("Bulk")
+t.default = "Normal"
+
+s:option(Value, "srchost", "Quelladresse", "Quellhost / Quellnetz").optional = true
+s:option(Value, "dsthost", "Zieladresse", "Zielhost / Zielnetz").optional = true
+s:option(Value, "layer7", "Layer 7").optional = true
+
+p2p = s:option(ListValue, "ipp2p", "P2P")
+p2p:value("")
+p2p:value("all", "Alle")
+p2p:value("bit", "Bittorrent")
+p2p:value("dc", "DirectConnect")
+p2p:value("edk", "eDonkey")
+p2p:value("gnu", "Gnutella")
+p2p:value("kazaa", "Kazaa")
+p2p.optional = true
+
+p = s:option(ListValue, "proto", "Protokoll")
+p:value("")
+p:value("tcp", "TCP")
+p:value("udp", "UDP")
+p:value("icmp", "ICMP")
+p.optional = true
+
+s:option(Value, "ports", "Port").optional = true
+s:option(Value, "portrange", "Portbereich").optional = true
+
+return m \ No newline at end of file
diff --git a/modules/admin-core/src/model/cbi/admin_network/routes.lua b/modules/admin-core/src/model/cbi/admin_network/routes.lua
new file mode 100644
index 000000000..49e432180
--- /dev/null
+++ b/modules/admin-core/src/model/cbi/admin_network/routes.lua
@@ -0,0 +1,23 @@
+-- ToDo: Translate, Add descriptions and help texts
+m = Map("network", "Statische Routen", [[Statische Routen geben an,
+über welche Schnittstelle und welches Gateway ein bestimmter Host
+oder ein bestimmtes Netzwerk erreicht werden kann.]])
+
+s = m:section(TypedSection, "route")
+s.addremove = true
+s.anonymous = true
+
+iface = s:option(ListValue, "interface", "Schnittstelle")
+for k, v in pairs(ffluci.model.uci.sections("network")) do
+ if v[".type"] == "interface" and k ~= "loopback" then
+ iface:value(k)
+ end
+end
+
+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 \ No newline at end of file
diff --git a/modules/admin-core/src/model/cbi/admin_network/vlan.lua b/modules/admin-core/src/model/cbi/admin_network/vlan.lua
new file mode 100644
index 000000000..7b493643b
--- /dev/null
+++ b/modules/admin-core/src/model/cbi/admin_network/vlan.lua
@@ -0,0 +1,17 @@
+-- ToDo: Autodetect things, maybe use MultiValue instead, Translate, Add descriptions
+m = Map("network", "VLAN", [[Die Netzwerkschnittstellen am Router
+können zu verschienden VLANs zusammengefasst werden, in denen Geräte miteinander direkt
+kommunizieren können. VLANs werden auch häufig dazu genutzt, um Netzwerke voneiander zu trennen.
+So ist oftmals eine Schnittstelle als Uplink zu einem größerem Netz, wie dem Internet vorkonfiguriert
+und die anderen Schnittstellen bilden ein VLAN für das lokale Netzwerk.]])
+
+s = m:section(TypedSection, "switch", nil, [[Die zu einem VLAN gehörenden Schnittstellen
+werden durch Leerzeichen getrennt. Die Schnittstelle mit der höchsten Nummer (meistens 5) bildet
+in der Regel die Verbindung zur internen Netzschnittstelle des Routers. Bei Geräten mit 5 Schnittstellen
+ist in der Regel die Schnittstelle mit der niedrigsten Nummer (0) die standardmäßige Uplinkschnittstelle des Routers.]])
+
+for i = 0, 15 do
+ s:option(Value, "vlan"..i, "vlan"..i).optional = true
+end
+
+return m \ No newline at end of file
diff --git a/modules/admin-core/src/model/cbi/admin_services/dnsmasq.lua b/modules/admin-core/src/model/cbi/admin_services/dnsmasq.lua
new file mode 100644
index 000000000..86716ff9f
--- /dev/null
+++ b/modules/admin-core/src/model/cbi/admin_services/dnsmasq.lua
@@ -0,0 +1,29 @@
+m = Map("dhcp", "Dnsmasq", "Dnsmasq ist ein kombinierter DHCP-Server und DNS-Forwarder für NAT-Firewalls.")
+
+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 \ No newline at end of file
diff --git a/modules/admin-core/src/model/cbi/admin_services/dropbear.lua b/modules/admin-core/src/model/cbi/admin_services/dropbear.lua
new file mode 100644
index 000000000..3ecf95335
--- /dev/null
+++ b/modules/admin-core/src/model/cbi/admin_services/dropbear.lua
@@ -0,0 +1,15 @@
+-- ToDo: Translate, Add descriptions
+m = Map("dropbear", "SSH-Server", [[Der SSH-Server ermöglicht Shell-Zugriff
+über das Netzwerk und bietet einen integrierten SCP-Dienst.]])
+
+s = m:section(TypedSection, "dropbear")
+s.anonymous = true
+
+port = s:option(Value, "Port", "Port")
+port.isinteger = true
+
+pwauth = s:option(Flag, "PasswordAuth", "Passwortanmeldung", "Erlaube Anmeldung per Passwort")
+pwauth.enabled = 'on'
+pwauth.disabled = 'off'
+
+return m \ No newline at end of file
diff --git a/modules/admin-core/src/model/cbi/admin_services/httpd.lua b/modules/admin-core/src/model/cbi/admin_services/httpd.lua
new file mode 100644
index 000000000..3bd49a2d7
--- /dev/null
+++ b/modules/admin-core/src/model/cbi/admin_services/httpd.lua
@@ -0,0 +1,18 @@
+-- ToDo: Translate, Add descriptions
+m = Map("httpd", "HTTP-Server", "Der HTTP-Server ist u.a. für die Bereitstellung dieser Obefläche zuständig.")
+
+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", "Aufforderungstext zum Anmelden im Administrationsbereich")
+realm.rmempty = true
+
+return m \ No newline at end of file
diff --git a/modules/admin-core/src/model/cbi/admin_services/olsrd.lua b/modules/admin-core/src/model/cbi/admin_services/olsrd.lua
new file mode 100644
index 000000000..8431a8104
--- /dev/null
+++ b/modules/admin-core/src/model/cbi/admin_services/olsrd.lua
@@ -0,0 +1,89 @@
+-- ToDo: Autodetect things, Translate, Add descriptions
+require("ffluci.fs")
+
+m = Map("olsr", "OLSR", [[OLSR ist ein flexibles Routingprotokoll,
+dass den Aufbau von mobilen Ad-Hoc Netzen unterstützt.]])
+
+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")
+
+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")
+
+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")
+
+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
+
+network = i:option(ListValue, "Interface", "Netzwerkschnittstellen")
+network:value("")
+for k, v in pairs(ffluci.model.uci.sections("network")) do
+ if v[".type"] == "interface" and k ~= "loopback" then
+ network:value(k)
+ end
+end
+
+i:option(Value, "HelloInterval", "Hello-Intervall")
+
+i:option(Value, "HelloValidityTime", "Hello-Gültigkeit")
+
+i:option(Value, "TcInterval", "TC-Intervall")
+
+i:option(Value, "TcValidityTime", "TC-Gültigkeit")
+
+i:option(Value, "MidInterval", "MID-Intervall")
+
+i:option(Value, "MidValidityTime", "MID-Gültigkeit")
+
+i:option(Value, "HnaInterval", "HNA-Intervall")
+
+i:option(Value, "HnaValidityTime", "HNA-Gültigkeit")
+
+
+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 \ No newline at end of file
diff --git a/modules/admin-core/src/model/cbi/admin_system/fstab.lua b/modules/admin-core/src/model/cbi/admin_system/fstab.lua
new file mode 100644
index 000000000..d705743a0
--- /dev/null
+++ b/modules/admin-core/src/model/cbi/admin_system/fstab.lua
@@ -0,0 +1,25 @@
+m = Map("fstab", "Einhängepunkte")
+
+mount = m:section(TypedSection, "mount", "Einhängepunkte", [[Einhängepunkte bestimmen, an welcher Stelle des Dateisystems
+bestimmte Laufwerke und Speicher zur Verwendung eingebunden werden.]])
+mount.anonymous = true
+mount.addremove = true
+
+mount:option(Flag, "enabled", "aktivieren")
+mount:option(Value, "device", "Gerät", "Die Gerätedatei des Speichers oder der Partition (z.B.: /dev/sda)")
+mount:option(Value, "target", "Einhängepunkt", "Die Stelle an der der Speicher in das Dateisystem eingehängt wird.")
+mount:option(Value, "fstype", "Dateisystem", "Das Dateisystem mit dem der Speicher formatiert ist (z.B.: ext3)")
+mount:option(Value, "options", "Optionen", "Weitere Optionen (siehe das Handbuch des Befehls 'mount')")
+
+
+swap = m:section(TypedSection, "swap", "SWAP", [[Falls der Arbeitsspeicher des Routers nicht ausreicht,
+kann dieser nicht benutzte Daten zeitweise auf einem SWAP-Laufwerk auslagern um so die
+effektive Größe des Arbeitsspeichers zu erhöhen. Die Auslagerung der Daten ist natürlich bedeutend langsamer
+als direkte Arbeitsspeicherzugriffe.]])
+swap.anonymous = true
+swap.addremove = true
+
+swap:option(Flag, "enabled", "aktivieren")
+swap:option(Value, "device", "Gerät", "Die Gerätedatei des Speichers oder der Partition (z.B.: /dev/sda)")
+
+return m
diff --git a/modules/admin-core/src/model/cbi/admin_system/hostname.lua b/modules/admin-core/src/model/cbi/admin_system/hostname.lua
new file mode 100644
index 000000000..c9e159d05
--- /dev/null
+++ b/modules/admin-core/src/model/cbi/admin_system/hostname.lua
@@ -0,0 +1,9 @@
+m = Map("system", "Hostname", [[Definiert den Hostnamen des Routers.
+Der Hostname ist eine im Netzwerk eindeutige Kennung, die dieses Gerät identifiziert.]])
+
+s = m:section(TypedSection, "system")
+s.anonymous = true
+
+s:option(Value, "hostname", "Hostname")
+
+return m \ No newline at end of file
diff --git a/modules/admin-core/src/model/cbi/admin_wifi/devices.lua b/modules/admin-core/src/model/cbi/admin_wifi/devices.lua
new file mode 100644
index 000000000..b612dd676
--- /dev/null
+++ b/modules/admin-core/src/model/cbi/admin_wifi/devices.lua
@@ -0,0 +1,52 @@
+-- ToDo: Translate, Add descriptions and help texts
+
+m = Map("wireless", "Geräte", [[An dieser Stelle können eingebaute WLAN-Geräte konfiguriert werden.]])
+
+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 \ No newline at end of file
diff --git a/modules/admin-core/src/model/cbi/admin_wifi/networks.lua b/modules/admin-core/src/model/cbi/admin_wifi/networks.lua
new file mode 100644
index 000000000..4a7ad12f6
--- /dev/null
+++ b/modules/admin-core/src/model/cbi/admin_wifi/networks.lua
@@ -0,0 +1,77 @@
+-- ToDo: Translate, Add descriptions and help texts
+m = Map("wireless", "Netze", [[Pro WLAN-Gerät können mehrere Netze bereitgestellt werden.
+Es sollte beachtet werden, dass es hardware- / treiberspezifische Einschränkungen gibt.
+So kann pro WLAN-Gerät in der Regel entweder 1 Ad-Hoc-Zugang ODER bis zu 3 Access-Point und 1 Client-Zugang
+gleichzeitig erstellt werden.]])
+
+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.sections("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", "WLAN-Netz zu Netzwerk hinzufügen")
+network:value("")
+for k, v in pairs(ffluci.model.uci.sections("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
+
+s:option(Flag, "frameburst", "Broadcom-Frameburst").optional = true
+s:option(Flag, "bursting", "Atheros-Frameburst").optional = 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/modules/admin-core/src/model/menu/00admin.lua b/modules/admin-core/src/model/menu/00admin.lua
new file mode 100644
index 000000000..c48db19bd
--- /dev/null
+++ b/modules/admin-core/src/model/menu/00admin.lua
@@ -0,0 +1,33 @@
+add("admin", "index", "Übersicht", 10)
+act("luci", "Oberfläche")
+
+add("admin", "system", "System", 30)
+act("packages", "Paketverwaltung")
+act("passwd", "Passwort ändern")
+act("sshkeys", "SSH-Schlüssel")
+act("hostname", "Hostname")
+act("fstab", "Einhängepunkte")
+act("upgrade", "Firmwareupgrade")
+act("reboot", "Neu starten")
+
+add("admin", "services", "Dienste", 40)
+if isfile("/etc/config/olsr") then
+ act("olsrd", "OLSR")
+end
+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")
+if isfile("/etc/config/qos") then
+ act("qos", "Quality of Service")
+end
+
+add("admin", "wifi", "Drahtlos", 60)
+act("devices", "Geräte")
+act("networks", "Netze") \ No newline at end of file
diff --git a/modules/admin-core/src/view/admin_index/index.htm b/modules/admin-core/src/view/admin_index/index.htm
new file mode 100644
index 000000000..27cdade52
--- /dev/null
+++ b/modules/admin-core/src/view/admin_index/index.htm
@@ -0,0 +1,11 @@
+<%+header%>
+<h1><%:hello Hallo!%></h1>
+<p><%:admin1 Dies ist der Administrationsbereich von FFLuCI.%></p>
+<p><%:admin2 FFLuCI ist eine freie, flexible und benutzerfreundliche grafische Oberfläche zur Konfiguration von OpenWRT Kamikaze.%><br />
+<%:admin3 Auf den folgenden Seiten können alle wichtigen Einstellungen des Routers vorgenommen werden.%></p>
+<p><%:admin4 Auf der linken Seite befindet sich eine Navigation, die zu den einzelnen Konfigurationsseiten führt.%></p>
+<p><%:admin5 Wir sind natürlich stets darum bemüht, diese Oberfläche
+noch besser und intuitiver zu Gestalten und freuen uns über jegliche Art von Feedback oder Verbesserungsvorschlägen.%></p>
+<p><%:admin6 Und nun wünschen wir viel Spaß mit dem Router!%></p>
+<p><em><strong><a href="http://luci.freifunk-halle.net"><%:team Das FFLuCI-Team%></a></strong></em></p>
+<%+footer%> \ No newline at end of file
diff --git a/modules/admin-core/src/view/admin_index/wizard.htm b/modules/admin-core/src/view/admin_index/wizard.htm
new file mode 100644
index 000000000..8c1a0952b
--- /dev/null
+++ b/modules/admin-core/src/view/admin_index/wizard.htm
@@ -0,0 +1,36 @@
+<%+header%>
+<h1><%:ffwizard Freifunkassistent%></h1>
+<p><%:ffwizard1 Dieser Assistent konfiguriert den Router für die Benutzung im Freifunknetz%></p>
+<br />
+<form method="post" action="<%=controller%>/admin/index/wizard">
+ <div class="cbi-section-node">
+ <div class="cbi-value">
+ <div class="cbi-value-title"><%:ip IP-Adresse%>:&nbsp;
+ <input type="text" size="20" name="ip" /></div>
+ </div>
+ <% for i, k in ipairs(ifaces) do %>
+ <div class="cbi-value">
+ <div class="cbi-value-title"><%:wificfg Drahtlosgerät einrichten%>: <%=k%></div>
+ <div class="cbi-value-field"><input type="checkbox" name="wifi.<%=k%>" value="1" checked="checked" /></div>
+ </div>
+ <% end %>
+ <div class="cbi-value">
+ <div class="cbi-value-title"><%:cfgolsr OLSR konfigurieren%></div>
+ <div class="cbi-value-field"><input type="checkbox" name="olsr" value="1" checked="checked" /></div>
+ </div>
+ <div class="cbi-value">
+ <div class="cbi-value-title"><%:cfgdhcp Drahtlos DHCP konfigurieren%></div>
+ <div class="cbi-value-field"><input type="checkbox" name="dhcp" value="1" checked="checked" /></div>
+ </div>
+ <div class="cbi-value">
+ <div class="cbi-value-title"><%:shareinet Internet teilen%></div>
+ <div class="cbi-value-field"><input type="checkbox" name="shareinet" value="1" checked="checked" /></div>
+ </div>
+ </div>
+ <br />
+ <div>
+ <input type="submit" value="<%:configure Konfigurieren%>" />
+ <input type="reset" value="<%:reset Zurücksetzen%>" />
+ </div>
+</form>
+<%+footer%> \ No newline at end of file
diff --git a/modules/admin-core/src/view/admin_network/index.htm b/modules/admin-core/src/view/admin_network/index.htm
new file mode 100644
index 000000000..7fa4f5565
--- /dev/null
+++ b/modules/admin-core/src/view/admin_network/index.htm
@@ -0,0 +1,11 @@
+<%+header%>
+<h1><%:network Netzwerk%></h1>
+<p><%:network1 In diesem Bereich finden sich alle netzwerkbezogenen Einstellungen.%></p>
+<p><%:network2 Der Netzwerkswitch kann bei den meisten Routern frei konfiguriert
+und in mehrere VLANs aufgeteilt werden. %></p>
+<p><%:network3 Schnittstellen und PPPoE/PPTP-Einstellungen ermöglichen
+die freie Organisation des Netzwerks und die Anbindung an ein WAN.%></p>
+<p><%:network4 DHCP ermöglichst die automatische Netzwerkkonfiguration von Rechnern im (W)LAN.%></p>
+<p><%:network5 Portweiterleitung und Firewall erlauben eine effektive Absicherung des Netzes, bei gleichzeitiger
+Bereitstellung von externen Diensten.%></p>
+<%+footer%> \ No newline at end of file
diff --git a/modules/admin-core/src/view/admin_services/index.htm b/modules/admin-core/src/view/admin_services/index.htm
new file mode 100644
index 000000000..a06fe1056
--- /dev/null
+++ b/modules/admin-core/src/view/admin_services/index.htm
@@ -0,0 +1,8 @@
+<%+header%>
+<h1><%:services Dienste%></h1>
+<p><%:services1 Dienste und Dämonen stellen bestimmte Funktionalitäten auf dem Router zur Verfügung.%></p>
+<p><%:services2 Es handelt sich hierbei meist um Netzwerkserver, die verschiedene Aufgaben auf dem Router erfüllen,
+beispielsweise Shell-Zugang ermöglichen oder diese Weboberfläche per HTTP anbieten.%></p>
+<p><%:servcies3 In diesen Bereich fallen auch die Meshnetzwerkdienste wie OLSR und BATMAN, die dabei helfen,
+ein autarkes Ad-Hoc Netzwerk aufzubauen.%></p>
+<%+footer%> \ No newline at end of file
diff --git a/modules/admin-core/src/view/admin_system/editor.htm b/modules/admin-core/src/view/admin_system/editor.htm
new file mode 100644
index 000000000..ef3e0d8ab
--- /dev/null
+++ b/modules/admin-core/src/view/admin_system/editor.htm
@@ -0,0 +1,14 @@
+<%+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%>" />
+<% if msg then %><span class="error"><%:error Fehler%>: <%=msg%></span><% end %></div>
+<br />
+<div><textarea style="width: 100%" rows="20" name="data"><%=cnt%></textarea></div>
+<br />
+<div>
+ <input type="submit" value="<%:save Speichern%>" />
+ <input type="reset" value="<%:reset Zurücksetzen%>" />
+</div>
+</form>
+<%+footer%> \ No newline at end of file
diff --git a/modules/admin-core/src/view/admin_system/index.htm b/modules/admin-core/src/view/admin_system/index.htm
new file mode 100644
index 000000000..3e9a28221
--- /dev/null
+++ b/modules/admin-core/src/view/admin_system/index.htm
@@ -0,0 +1,9 @@
+<%+header%>
+<h1><%:system System%></h1>
+<p><%:system1 Hier finden sich Einstellungen, die das System selbst, dessen Kennung,
+installierte Software und Hardware, Authentifizierung oder eingehängte Speicher betreffen.%></p>
+<p><%:system2 Diese Einstellungen definieren die Grundlage des Systems, auf dem die
+installierte Software aufbaut.%></p>
+<p><%:system3 Beachte bitte, dass eine fehlerhafte Konfiguration den Start
+des Routers verhindern oder dich vom Zugriff auf diesen ausschließen kann.%></p>
+<%+footer%> \ No newline at end of file
diff --git a/modules/admin-core/src/view/admin_system/ipkg.htm b/modules/admin-core/src/view/admin_system/ipkg.htm
new file mode 100644
index 000000000..9a88ee57b
--- /dev/null
+++ b/modules/admin-core/src/view/admin_system/ipkg.htm
@@ -0,0 +1,26 @@
+<%+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">
+ <div class="cbi-section-node" style="width: 100%">
+ <div class="cbi-value">
+ <div class="cbi-value-field">
+ <textarea style="width: 100%" rows="10" name="data"><%=cnt%></textarea>
+ </div>
+ </div>
+ </div>
+ <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 %>
+</form>
+<%+footer%> \ No newline at end of file
diff --git a/modules/admin-core/src/view/admin_system/packages.htm b/modules/admin-core/src/view/admin_system/packages.htm
new file mode 100644
index 000000000..52da37040
--- /dev/null
+++ b/modules/admin-core/src/view/admin_system/packages.htm
@@ -0,0 +1,77 @@
+<%+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%>" />
+ <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%></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%></td>
+ </tr>
+ <% end %>
+ </table>
+ </div>
+ <br />
+ <input type="submit" name="submit" value="<%:packages_do Aktionen ausführen%>" />
+</form>
+<%+footer%> \ No newline at end of file
diff --git a/modules/admin-core/src/view/admin_system/passwd.htm b/modules/admin-core/src/view/admin_system/passwd.htm
new file mode 100644
index 000000000..87b253368
--- /dev/null
+++ b/modules/admin-core/src/view/admin_system/passwd.htm
@@ -0,0 +1,35 @@
+<%+header%>
+<h1><%:system System%></h1>
+<h2><%:passwd Passwort ändern%></h2>
+<p><%:passwd1 Ändert das Passwort des Systemverwalters (Benutzer "root")%></p>
+<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">
+ <div class="cbi-section-node">
+ <div class="cbi-value">
+ <div class="cbi-value-title"><%:password Passwort%></div>
+ <div class="cbi-value-field"><input type="password" name="pwd1" /></div>
+ </div>
+ <div class="cbi-value">
+ <div class="cbi-value-title"><%: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>
+ </div>
+ </form>
+<% end %>
+</div>
+<%+footer%> \ No newline at end of file
diff --git a/modules/admin-core/src/view/admin_system/reboot.htm b/modules/admin-core/src/view/admin_system/reboot.htm
new file mode 100644
index 000000000..e81be408c
--- /dev/null
+++ b/modules/admin-core/src/view/admin_system/reboot.htm
@@ -0,0 +1,11 @@
+<%+header%>
+<h1><%:system System%></h1>
+<h2><%:reboot Neu starten%></h2>
+<p><%:reboot1 Startet das Betriebssystem des Routers neu.%></p>
+<% 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'", 60000)</script>
+<% end %>
+<%+footer%> \ No newline at end of file
diff --git a/modules/admin-core/src/view/admin_system/sshkeys.htm b/modules/admin-core/src/view/admin_system/sshkeys.htm
new file mode 100644
index 000000000..3765e1eea
--- /dev/null
+++ b/modules/admin-core/src/view/admin_system/sshkeys.htm
@@ -0,0 +1,26 @@
+<%+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">
+ <div class="cbi-section-node" style="width: 100%">
+ <div class="cbi-value">
+ <div class="cbi-value-field">
+ <textarea style="width: 100%" rows="10" name="data"><%=cnt%></textarea>
+ </div>
+ </div>
+ </div>
+ <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 %>
+</form>
+<%+footer%> \ No newline at end of file
diff --git a/modules/admin-core/src/view/admin_system/upgrade.htm b/modules/admin-core/src/view/admin_system/upgrade.htm
new file mode 100644
index 000000000..598002890
--- /dev/null
+++ b/modules/admin-core/src/view/admin_system/upgrade.htm
@@ -0,0 +1,34 @@
+<%+header%>
+<h1><%:system System%></h1>
+<h2><%:upgrade Upgrade%></h2>
+<p><%:upgrade1 Ersetzt die installierte Firmware (das Betriebssystem des Routers) durch ein neues.
+Das Format der Firmware ist plattformabhängig.%></p>
+<br />
+<% if sysupgrade and not ret then %>
+<form method="post" action="<%=controller%>-upload/admin/system/upgrade" enctype="multipart/form-data">
+ <div 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>
+ </div>
+</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%> \ No newline at end of file
diff --git a/modules/admin-core/src/view/admin_uci/apply.htm b/modules/admin-core/src/view/admin_uci/apply.htm
new file mode 100644
index 000000000..090967a2d
--- /dev/null
+++ b/modules/admin-core/src/view/admin_uci/apply.htm
@@ -0,0 +1,6 @@
+<%+header%>
+<h1><%:config Konfiguration%></h1>
+<p><%:uci_applied Die folgenden Änderungen wurden übernommen%>:</p>
+<code><%=(changes or "-")%>
+<%=output%></code>
+<%+footer%> \ No newline at end of file
diff --git a/modules/admin-core/src/view/admin_uci/changes.htm b/modules/admin-core/src/view/admin_uci/changes.htm
new file mode 100644
index 000000000..3bbcd0e5f
--- /dev/null
+++ b/modules/admin-core/src/view/admin_uci/changes.htm
@@ -0,0 +1,11 @@
+<%+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%> \ No newline at end of file
diff --git a/modules/admin-core/src/view/admin_uci/revert.htm b/modules/admin-core/src/view/admin_uci/revert.htm
new file mode 100644
index 000000000..39aaabcd8
--- /dev/null
+++ b/modules/admin-core/src/view/admin_uci/revert.htm
@@ -0,0 +1,5 @@
+<%+header%>
+<h1><%:config Konfiguration%></h1>
+<p><%:uci_reverted Die folgenden Änderungen wurden verworfen%>:</p>
+<code><%=(changes or "-")%></code>
+<%+footer%> \ No newline at end of file
diff --git a/modules/admin-core/src/view/admin_wifi/index.htm b/modules/admin-core/src/view/admin_wifi/index.htm
new file mode 100644
index 000000000..6a6059835
--- /dev/null
+++ b/modules/admin-core/src/view/admin_wifi/index.htm
@@ -0,0 +1,9 @@
+<%+header%>
+<h1><%:wifi Drahtlos%></h1>
+<p><%:wifi1 Hier finden sich Konfiugrationsmöglichkeiten für Drahtlos-Netzwerke nach dem WLAN-Standard.%></p>
+<p><%:wifi2 802.11b/g/a/n-Geräte können so einfach in das bestehende physische Netzwerk integriert werden.
+Die Unterstützung von virtuellen Adaptern ermöglicht auch den Einsatz als Wireless-Repeater oder von
+mehreren Netzwerken gleichzeitig auf einem Gerät.%></p>
+<p><%:wifi3 Es werden Managed, Client, Ad-Hoc und WDS-Modus unterstützt sowie WPA und WPA2-Verschlüsselung zur gesicherten
+Kommunikation.%></p>
+<%+footer%> \ No newline at end of file