summaryrefslogtreecommitdiffhomepage
path: root/applications/luci-meshwizard
diff options
context:
space:
mode:
authorManuel Munz <freifunk@somakoma.de>2011-06-23 15:52:00 +0000
committerManuel Munz <freifunk@somakoma.de>2011-06-23 15:52:00 +0000
commitab87896104be09072ccccad305588d46370ab5ad (patch)
treefc3c5a5db319668cf1185c671268bc8cdae7316b /applications/luci-meshwizard
parente88fd858a1c0d3dbac4703224dc63cb498839432 (diff)
Add new meshwizard (WIP)
Diffstat (limited to 'applications/luci-meshwizard')
-rw-r--r--applications/luci-meshwizard/Makefile4
-rw-r--r--applications/luci-meshwizard/ipkg/postinst8
-rw-r--r--applications/luci-meshwizard/luasrc/controller/meshwizard.lua21
-rw-r--r--applications/luci-meshwizard/luasrc/model/cbi/freifunk/meshwizard.lua149
4 files changed, 182 insertions, 0 deletions
diff --git a/applications/luci-meshwizard/Makefile b/applications/luci-meshwizard/Makefile
new file mode 100644
index 000000000..7ff62bb98
--- /dev/null
+++ b/applications/luci-meshwizard/Makefile
@@ -0,0 +1,4 @@
+PO = mesh-wizard
+
+include ../../build/config.mk
+include ../../build/module.mk
diff --git a/applications/luci-meshwizard/ipkg/postinst b/applications/luci-meshwizard/ipkg/postinst
new file mode 100644
index 000000000..ac4e1d122
--- /dev/null
+++ b/applications/luci-meshwizard/ipkg/postinst
@@ -0,0 +1,8 @@
+#!/bin/sh
+[ -n "${IPKG_INSTROOT}" ] || {
+ uci set ucitrack.meshwizard="meshwizard"
+ uci set ucitrack.meshwizard.exec="/etc/init.d/wizard restart"
+ uci commit
+ exit 0
+}
+
diff --git a/applications/luci-meshwizard/luasrc/controller/meshwizard.lua b/applications/luci-meshwizard/luasrc/controller/meshwizard.lua
new file mode 100644
index 000000000..4e930cc50
--- /dev/null
+++ b/applications/luci-meshwizard/luasrc/controller/meshwizard.lua
@@ -0,0 +1,21 @@
+--[[
+LuCI - Lua Configuration Interface
+
+Copyright 2011 Manuel Munz <freifunk somakoma de>
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+]]--
+
+module "luci.controller.meshwizard"
+
+function index()
+ require("luci.i18n").loadc("meshwizard")
+ local i18n = luci.i18n.translate
+ entry({"admin", "freifunk", "meshwizard"}, cbi("freifunk/meshwizard"), i18n("Mesh Wizard"), 40)
+end
+
diff --git a/applications/luci-meshwizard/luasrc/model/cbi/freifunk/meshwizard.lua b/applications/luci-meshwizard/luasrc/model/cbi/freifunk/meshwizard.lua
new file mode 100644
index 000000000..48fb90600
--- /dev/null
+++ b/applications/luci-meshwizard/luasrc/model/cbi/freifunk/meshwizard.lua
@@ -0,0 +1,149 @@
+-- wizard rewrite wip
+
+local uci = require "luci.model.uci".cursor()
+local sys = require "luci.sys"
+local util = require "luci.util"
+local ip = require "luci.ip"
+
+local community = "profile_" .. (uci:get("freifunk", "community", "name") or "Freifunk")
+mesh_network = ip.IPv4(uci:get_first(community, "community", "mesh_network") or "10.0.0.0/8")
+
+m = Map("meshwizard", translate("Wizard"), translate("This wizard will assist you in setting up your router for Freifunk " ..
+ "or another similar wireless community network."))
+--m:chain("meshwizard")
+
+n = m:section(TypedSection, "netconfig", translate("Interfaces"))
+n.anonymous = true
+
+-- common functions
+
+function cbi_configure(device)
+ local configure = n:taboption(device, Flag, device .. "_config", translate("Configure this interface"))
+end
+
+function cbi_ip4addr(device)
+ local ip4addr = n:taboption(device, Value, device .. "_ip4addr", translate("Mesh IP address"),
+ translate("This is a unique address in the mesh (e.g. 10.1.1.1) and has to be registered at your local community."))
+ ip4addr:depends(device .. "_config", 1)
+ ip4addr.datatype = "ip4addr"
+ function ip4addr.validate(self, value)
+ local x = ip.IPv4(value)
+ if mesh_network:contains(x) then
+ return value
+ else
+ return nil, translate("The given IP address is not inside the mesh network range ") ..
+ "(" .. mesh_network:string() .. ")."
+ end
+ end
+end
+
+function cbi_dhcp(device)
+ local dhcp = n:taboption(device, Flag, device .. "_dhcp", translate("Enable DHCP"),
+ translate("DHCP will automatically assign ip addresses to clients"))
+ dhcp:depends(device .. "_config", 1)
+ dhcp.rmempty = true
+end
+
+function cbi_dhcprange(device)
+ local dhcprange = n:taboption(device, Value, device .. "_dhcprange", translate("DHCP IP range"),
+ translate("The IP range from which clients are assigned ip addresses (e.g. 10.1.2.1/28). " ..
+ "If this is a range inside your mesh network range, then it will be announced as HNA. Any other range will use NAT. " ..
+ "If left empty then the defaults from the community profile will be used."))
+ dhcprange:depends(device .. "_dhcp", "1")
+ dhcprange.rmempty = true
+ dhcprange.datatype = "ip4addr"
+end
+-- create tabs and config for wireless
+local nets={}
+uci:foreach("wireless", "wifi-device", function(section)
+ local device = section[".name"]
+ table.insert(nets, device)
+end)
+
+local wired_nets = {}
+uci:foreach("network", "interface", function(section)
+ local device = section[".name"]
+ if not util.contains(nets, device) and device ~= "loopback" then
+ table.insert(nets, device)
+ table.insert(wired_nets, device)
+ end
+end)
+
+for _, net in util.spairs(nets, function(a,b) return (nets[a] < nets[b]) end) do
+ n:tab(net, net)
+end
+
+-- create cbi config for wireless
+uci:foreach("wireless", "wifi-device", function(section)
+ local device = section[".name"]
+ local hwtype = section.type
+ local syscc = section.country or uci:get(community, "wifi_device", "country") or
+ uci:get("freifunk", "wifi_device", "country")
+
+ cbi_configure(device)
+
+ -- Channel selection
+
+ if hwtype == "atheros" then
+ local cc = util.trim(sys.exec("grep -i '" .. syscc .. "' /lib/wifi/cc_translate.txt |cut -d ' ' -f 2")) or 0
+ sys.exec('"echo " .. cc .. " > /proc/sys/dev/" .. device .. "/countrycode"')
+ elseif hwtype == "mac80211" then
+ sys.exec("iw reg set " .. syscc)
+ elseif hwtype == "broadcom" then
+ sys.exec ("wlc country " .. syscc)
+ end
+
+ local chan = n:taboption(device, ListValue, device .. "_channel", translate("Channel"),
+ translate("Your device and neighbouring nodes have to use the same channel."))
+ chan:depends(device .. "_config", 1)
+ chan:value('default')
+
+ for _, f in ipairs(sys.wifi.channels(device)) do
+ if not f.restricted then
+ chan:value(f.channel)
+ end
+ end
+ -- IPv4 address
+ cbi_ip4addr(device)
+
+ -- DHCP enable
+ cbi_dhcp(device)
+
+ -- DHCP range
+ cbi_dhcprange(device)
+
+ -- Enable VAP
+ if hwtype == "atheros" then
+ local vap = n:taboption(device, Flag, device .. "_vap", translate("Virtual Access Point (VAP)"),
+ translate("This will setup a new virtual wireless interface in Access Point mode."))
+ vap:depends(device .. "_dhcp", "1")
+ vap.rmempty = true
+ end
+end)
+
+for _, device in pairs(wired_nets) do
+ cbi_configure(device)
+ cbi_ip4addr(device)
+ cbi_dhcp(device)
+ cbi_dhcprange(device)
+end
+
+g = m:section(TypedSection, "general", translate("General Settings"))
+g.anonymous = true
+
+local cleanup = g:option(Flag, "cleanup", translate("Cleanup config"),
+ translate("If this is selected then config is cleaned before setting new config options."))
+cleanup.default = "1"
+
+local restrict = g:option(Flag, "local_restrict", translate("Protect LAN"),
+ translate("Check this to protect your LAN from other nodes or clients") .. " (" .. translate("recommended") .. ").")
+
+local share = g:option(Flag, "sharenet", translate("Share your internet connection"),
+ translate("Select this to allow others to use your connection to access the internet."))
+ share.rmempty = true
+
+--function m.on_after_commit (self)
+-- sys.call("/usr/bin/mesh-wizard/wizard.sh >/dev/null")
+--end
+
+return m