diff options
author | Manuel Munz <freifunk@somakoma.de> | 2011-01-25 21:04:57 +0000 |
---|---|---|
committer | Manuel Munz <freifunk@somakoma.de> | 2011-01-25 21:04:57 +0000 |
commit | c36fd44de2db30c08848bf326365a1e372b7879c (patch) | |
tree | aa34a63d3270b4d9ba953c5bed9000aa961de745 /applications/luci-ffwizard-leipzig | |
parent | 9c03a76fc28dac4efe4714f0e61bb41bf2784ef7 (diff) |
applications/ffwizard: Massive changes to the ffwizard to make it more generic. Also introduces changes to the community profiles. ffwizard replaces ffwizard-leipzig now. It is not completely finished yet, but should work in most cases.
Diffstat (limited to 'applications/luci-ffwizard-leipzig')
4 files changed, 0 insertions, 667 deletions
diff --git a/applications/luci-ffwizard-leipzig/Makefile b/applications/luci-ffwizard-leipzig/Makefile deleted file mode 100644 index a4f7c76ef9..0000000000 --- a/applications/luci-ffwizard-leipzig/Makefile +++ /dev/null @@ -1,4 +0,0 @@ -PO = - -include ../../build/config.mk -include ../../build/module.mk diff --git a/applications/luci-ffwizard-leipzig/luasrc/controller/ffwizard.lua b/applications/luci-ffwizard-leipzig/luasrc/controller/ffwizard.lua deleted file mode 100644 index 9a9f883ef7..0000000000 --- a/applications/luci-ffwizard-leipzig/luasrc/controller/ffwizard.lua +++ /dev/null @@ -1,21 +0,0 @@ ---[[ -LuCI - Lua Configuration Interface - -Copyright 2008 Steven Barth <steven@midlink.org> -Copyright 2008 Jo-Philipp Wich <xm@leipzig.freifunk.net> - -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 - -$Id$ - -]]-- - -module "luci.controller.ffwizard" - -function index() - entry({"admin", "freifunk", "ffwizard"}, form("ffwizard"), "Freifunkassistent", 50) -end
\ No newline at end of file diff --git a/applications/luci-ffwizard-leipzig/luasrc/model/cbi/ffwizard.lua b/applications/luci-ffwizard-leipzig/luasrc/model/cbi/ffwizard.lua deleted file mode 100644 index 780316c4a0..0000000000 --- a/applications/luci-ffwizard-leipzig/luasrc/model/cbi/ffwizard.lua +++ /dev/null @@ -1,493 +0,0 @@ ---[[ -LuCI - Lua Configuration Interface - -Copyright 2008 Steven Barth <steven@midlink.org> -Copyright 2008 Jo-Philipp Wich <xm@leipzig.freifunk.net> - -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 - -$Id$ - -]]-- - - -local uci = require "luci.model.uci".cursor() -local tools = require "luci.tools.ffwizard" -local util = require "luci.util" -local sys = require "luci.sys" -local ip = require "luci.ip" - -local function mksubnet(community, meship) - local subnet_prefix = tonumber(uci:get("freifunk", community, "splash_prefix")) or 27 - local pool_network = uci:get("freifunk", community, "splash_network") or "10.104.0.0/16" - local pool = luci.ip.IPv4(pool_network) - - if pool then - local hosts_per_subnet = 2^(32 - subnet_prefix) - local number_of_subnets = (2^pool:prefix())/hosts_per_subnet - - local seed1, seed2 = meship:match("(%d+)%.(%d+)$") - math.randomseed(seed1 * seed2) - - local subnet = pool:add(hosts_per_subnet * math.random(number_of_subnets)) - - local subnet_ipaddr = subnet:network(subnet_prefix):add(1):string() - local subnet_netmask = subnet:mask(subnet_prefix):string() - - return subnet_ipaddr, subnet_netmask - end -end - - --------------------- View -------------------- -f = SimpleForm("ffwizward", "Freifunkassistent", - "Dieser Assistent unterstüzt bei der Einrichtung des Routers für das Freifunknetz.") - - -dev = f:field(ListValue, "device", "WLAN-Gerät") -uci:foreach("wireless", "wifi-device", - function(section) - dev:value(section[".name"]) - end) - - -main = f:field(Flag, "wifi", "Freifunkzugang einrichten") - -net = f:field(Value, "net", "Freifunk Community", "Mesh Netzbereich") -net.rmempty = true -net:depends("wifi", "1") -uci:foreach("freifunk", "community", function(s) - net:value(s[".name"], "%s (%s)" % {s.name, s.mesh_network or "?"}) -end) - -function net.cfgvalue(self, section) - return uci:get("freifunk", "wizard", "net") -end -function net.write(self, section, value) - uci:set("freifunk", "wizard", "net", value) - uci:save("freifunk") -end - -meship = f:field(Value, "meship", "Mesh IP Adresse", "Netzweit eindeutige Identifikation") -meship.rmempty = true -meship:depends("wifi", "1") -function meship.cfgvalue(self, section) - return uci:get("freifunk", "wizard", "meship") -end -function meship.write(self, section, value) - uci:set("freifunk", "wizard", "meship", value) - uci:save("freifunk") -end -function meship.validate(self, value) - local x = ip.IPv4(value) - return ( x and x:prefix() == 32 ) and x:string() or "" -end - -client = f:field(Flag, "client", "WLAN-DHCP anbieten") -client:depends("wifi", "1") -client.rmempty = false -function client.cfgvalue(self, section) - return uci:get("freifunk", "wizard", "dhcp_splash") or "0" -end - -olsr = f:field(Flag, "olsr", "OLSR einrichten") -olsr.rmempty = true - -lat = f:field(Value, "lat", "Latitude") -lat:depends("olsr", "1") -function lat.cfgvalue(self, section) - return uci:get("freifunk", "wizard", "latitude") -end -function lat.write(self, section, value) - uci:set("freifunk", "wizard", "latitude", value) - uci:save("freifunk") -end - -lon = f:field(Value, "lon", "Longitude") -lon:depends("olsr", "1") -function lon.cfgvalue(self, section) - return uci:get("freifunk", "wizard", "longitude") -end -function lon.write(self, section, value) - uci:set("freifunk", "wizard", "longitude", value) - uci:save("freifunk") -end - -share = f:field(Flag, "sharenet", "Eigenen Internetzugang freigeben") -share.rmempty = true - -wansec = f:field(Flag, "wansec", "WAN-Zugriff auf Gateway beschränken") -wansec.rmempty = false -wansec:depends("sharenet", "1") -function wansec.cfgvalue(self, section) - return uci:get("freifunk", "wizard", "wan_security") -end -function wansec.write(self, section, value) - uci:set("freifunk", "wizard", "wan_security", value) - uci:save("freifunk") -end - --------------------- Control -------------------- -function f.handle(self, state, data) - if state == FORM_VALID then - luci.http.redirect(luci.dispatcher.build_url("admin", "uci", "changes")) - return false - elseif state == FORM_INVALID then - self.errmessage = "Ungültige Eingabe: Bitte die Formularfelder auf Fehler prüfen." - end - return true -end - -local function _strip_internals(tbl) - tbl = tbl or {} - for k, v in pairs(tbl) do - if k:sub(1, 1) == "." then - tbl[k] = nil - end - end - return tbl -end - --- Configure Freifunk checked -function main.write(self, section, value) - if value == "0" then - return - end - - local device = dev:formvalue(section) - local node_ip, external - - -- Collect IP-Address - local community = net:formvalue(section) - - -- Invalidate fields - if not community then - net.tag_missing[section] = true - else - external = uci:get("freifunk", community, "external") or "" - network = ip.IPv4(uci:get("freifunk", community, "mesh_network") or "104.0.0.0/8") - node_ip = meship:formvalue(section) and ip.IPv4(meship:formvalue(section)) - - if not node_ip or not network or not network:contains(node_ip) then - meship.tag_missing[section] = true - node_ip = nil - end - end - - if not node_ip then return end - - - -- Cleanup - tools.wifi_delete_ifaces(device) - tools.network_remove_interface(device) - tools.firewall_zone_remove_interface("freifunk", device) - - -- Tune community settings - if community and uci:get("freifunk", community) then - uci:tset("freifunk", "community", uci:get_all("freifunk", community)) - end - - -- Tune wifi device - local devconfig = uci:get_all("freifunk", "wifi_device") - util.update(devconfig, uci:get_all(external, "wifi_device") or {}) - uci:tset("wireless", device, devconfig) - - -- Create wifi iface - local ifconfig = uci:get_all("freifunk", "wifi_iface") - util.update(ifconfig, uci:get_all(external, "wifi_iface") or {}) - ifconfig.device = device - ifconfig.network = device - ifconfig.ssid = uci:get("freifunk", community, "ssid") - uci:section("wireless", "wifi-iface", nil, ifconfig) - - -- Save wifi - uci:save("wireless") - - -- Create firewall zone and add default rules (first time) - local newzone = tools.firewall_create_zone("freifunk", "REJECT", "ACCEPT", "REJECT", true) - if newzone then - uci:foreach("freifunk", "fw_forwarding", function(section) - uci:section("firewall", "forwarding", nil, section) - end) - uci:foreach(external, "fw_forwarding", function(section) - uci:section("firewall", "forwarding", nil, section) - end) - - uci:foreach("freifunk", "fw_rule", function(section) - uci:section("firewall", "rule", nil, section) - end) - uci:foreach(external, "fw_rule", function(section) - uci:section("firewall", "rule", nil, section) - end) - end - - -- Enforce firewall include - local has_include = false - uci:foreach("firewall", "include", - function(section) - if section.path == "/etc/firewall.freifunk" then - has_include = true - end - end) - - if not has_include then - uci:section("firewall", "include", nil, - { path = "/etc/firewall.freifunk" }) - end - - -- Allow state: invalid packets - uci:foreach("firewall", "defaults", - function(section) - uci:set("firewall", section[".name"], "drop_invalid", "0") - end) - - -- Prepare advanced config - local has_advanced = false - uci:foreach("firewall", "advanced", - function(section) has_advanced = true end) - - if not has_advanced then - uci:section("firewall", "advanced", nil, - { tcp_ecn = "0", ip_conntrack_max = "8192", tcp_westwood = "1" }) - end - - uci:save("firewall") - - - -- Create network interface - local netconfig = uci:get_all("freifunk", "interface") - util.update(netconfig, uci:get_all(external, "interface") or {}) - netconfig.proto = "static" - netconfig.ipaddr = node_ip:string() - uci:section("network", "interface", device, netconfig) - - uci:save("network") - - tools.firewall_zone_add_interface("freifunk", device) - - - local new_hostname = node_ip:string():gsub("%.", "-") - local old_hostname = sys.hostname() - - uci:foreach("system", "system", - function(s) - -- Make crond silent - uci:set("system", s['.name'], "cronloglevel", "10") - - -- Set hostname - if old_hostname == "OpenWrt" or old_hostname:match("^%d+-%d+-%d+-%d+$") then - uci:set("system", s['.name'], "hostname", new_hostname) - sys.hostname(new_hostname) - end - end) - - uci:save("system") -end - - -function olsr.write(self, section, value) - if value == "0" then - return - end - - - local device = dev:formvalue(section) - - local community = net:formvalue(section) - local external = community and uci:get("freifunk", community, "external") or "" - - local latval = tonumber(lat:formvalue(section)) - local lonval = tonumber(lon:formvalue(section)) - - - -- Delete old interface - uci:delete_all("olsrd", "Interface", {interface=device}) - - -- Write new interface - local olsrbase = uci:get_all("freifunk", "olsr_interface") - util.update(olsrbase, uci:get_all(external, "olsr_interface") or {}) - olsrbase.interface = device - olsrbase.ignore = "0" - uci:section("olsrd", "Interface", nil, olsrbase) - - -- Delete old watchdog settings - uci:delete_all("olsrd", "LoadPlugin", {library="olsrd_watchdog.so.0.1"}) - - -- Write new watchdog settings - uci:section("olsrd", "LoadPlugin", nil, { - library = "olsrd_watchdog.so.0.1", - file = "/var/run/olsrd.watchdog", - interval = "30" - }) - - -- Delete old nameservice settings - uci:delete_all("olsrd", "LoadPlugin", {library="olsrd_nameservice.so.0.3"}) - - -- Write new nameservice settings - uci:section("olsrd", "LoadPlugin", nil, { - library = "olsrd_nameservice.so.0.3", - suffix = ".olsr", - hosts_file = "/var/etc/hosts.olsr", - latlon_file = "/var/run/latlon.js", - lat = latval and string.format("%.15f", latval) or "", - lon = lonval and string.format("%.15f", lonval) or "" - }) - - -- Save latlon to system too - if latval and lonval then - uci:foreach("system", "system", function(s) - uci:set("system", s[".name"], "latlon", - string.format("%.15f %.15f", latval, lonval)) - end) - else - uci:foreach("system", "system", function(s) - uci:delete("system", s[".name"], "latlon") - end) - end - - -- Import hosts - uci:foreach("dhcp", "dnsmasq", function(s) - uci:set("dhcp", s[".name"], "addnhosts", "/var/etc/hosts.olsr") - end) - - -- Make sure that OLSR is enabled - sys.exec("/etc/init.d/olsrd enable") - - uci:save("olsrd") - uci:save("dhcp") -end - - -function share.write(self, section, value) - uci:delete_all("firewall", "forwarding", {src="freifunk", dest="wan"}) - uci:delete_all("olsrd", "LoadPlugin", {library="olsrd_dyn_gw_plain.so.0.4"}) - uci:foreach("firewall", "zone", - function(s) - if s.name == "wan" then - uci:delete("firewall", s['.name'], "local_restrict") - return false - end - end) - - if value == "1" then - uci:section("firewall", "forwarding", nil, {src="freifunk", dest="wan"}) - uci:section("olsrd", "LoadPlugin", nil, {library="olsrd_dyn_gw_plain.so.0.4"}) - - if wansec:formvalue(section) == "1" then - uci:foreach("firewall", "zone", - function(s) - if s.name == "wan" then - uci:set("firewall", s['.name'], "local_restrict", "1") - return false - end - end) - end - end - - uci:save("firewall") - uci:save("olsrd") - uci:save("system") -end - - -function client.write(self, section, value) - if value == "0" then - uci:delete("freifunk", "wizard", "dhcp_splash") - uci:save("freifunk") - return - end - - local device = dev:formvalue(section) - - -- Collect IP-Address - local node_ip = meship:formvalue(section) - - if not node_ip then return end - - local community = net:formvalue(section) - local external = community and uci:get("freifunk", community, "external") or "" - local splash_ip, splash_mask = mksubnet(community, node_ip) - - -- Delete old alias - uci:delete("network", device .. "dhcp") - - -- Create alias - local aliasbase = uci:get_all("freifunk", "alias") - util.update(aliasbase, uci:get_all(external, "alias") or {}) - aliasbase.interface = device - aliasbase.ipaddr = splash_ip - aliasbase.netmask = splash_mask - aliasbase.proto = "static" - uci:section("network", "alias", device .. "dhcp", aliasbase) - uci:save("network") - - - -- Create dhcp - local dhcpbase = uci:get_all("freifunk", "dhcp") - util.update(dhcpbase, uci:get_all(external, "dhcp") or {}) - dhcpbase.interface = device .. "dhcp" - dhcpbase.start = dhcpbeg - dhcpbase.limit = limit - dhcpbase.force = 1 - - uci:section("dhcp", "dhcp", device .. "dhcp", dhcpbase) - uci:save("dhcp") - - uci:delete_all("firewall", "rule", { - src="freifunk", - proto="udp", - dest_port="53" - }) - uci:section("firewall", "rule", nil, { - src="freifunk", - proto="udp", - dest_port="53", - target="ACCEPT" - }) - uci:delete_all("firewall", "rule", { - src="freifunk", - proto="udp", - src_port="68", - dest_port="67" - }) - uci:section("firewall", "rule", nil, { - src="freifunk", - proto="udp", - src_port="68", - dest_port="67", - target="ACCEPT" - }) - uci:delete_all("firewall", "rule", { - src="freifunk", - proto="tcp", - dest_port="8082", - }) - uci:section("firewall", "rule", nil, { - src="freifunk", - proto="tcp", - dest_port="8082", - target="ACCEPT" - }) - - uci:save("firewall") - - -- Delete old splash - uci:delete_all("luci_splash", "iface", {network=device.."dhcp", zone="freifunk"}) - - -- Register splash - uci:section("luci_splash", "iface", nil, {network=device.."dhcp", zone="freifunk"}) - uci:save("luci_splash") - - -- Make sure that luci_splash is enabled - sys.exec("/etc/init.d/luci_splash enable") - - -- Remember state - uci:set("freifunk", "wizard", "dhcp_splash", "1") - uci:save("freifunk") -end - -return f diff --git a/applications/luci-ffwizard-leipzig/luasrc/tools/ffwizard.lua b/applications/luci-ffwizard-leipzig/luasrc/tools/ffwizard.lua deleted file mode 100644 index 217cd44bb8..0000000000 --- a/applications/luci-ffwizard-leipzig/luasrc/tools/ffwizard.lua +++ /dev/null @@ -1,149 +0,0 @@ ---[[ -LuCI - Lua Configuration Interface - -Copyright 2008 Steven Barth <steven@midlink.org> -Copyright 2008 Jo-Philipp Wich <xm@leipzig.freifunk.net> - -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 - -$Id$ - -]]-- - -local uci = require "luci.model.uci" -local util = require "luci.util" -local table = require "table" - -local type = type - -module "luci.tools.ffwizard" - --- Deletes all references of a wifi device -function wifi_delete_ifaces(device) - local cursor = uci.cursor() - cursor:delete_all("wireless", "wifi-iface", {device=device}) - cursor:save("wireless") -end - --- Deletes a network interface and all occurences of it in firewall zones and dhcp -function network_remove_interface(iface) - local cursor = uci.cursor() - - if not cursor:delete("network", iface) then - return false - end - - local aliases = {iface} - cursor:foreach("network", "alias", - function(section) - if section.interface == iface then - table.insert(aliases, section[".name"]) - end - end) - - -- Delete Aliases and Routes - cursor:delete_all("network", "route", {interface=iface}) - cursor:delete_all("network", "alias", {interface=iface}) - - -- Delete DHCP sections - cursor:delete_all("dhcp", "dhcp", - function(section) - return util.contains(aliases, section.interface) - end) - - -- Remove OLSR sections - cursor:delete_all("olsrd", "Interface", {Interface=iface}) - - -- Remove Splash sections - cursor:delete_all("luci-splash", "iface", {network=iface}) - - cursor:save("network") - cursor:save("olsr") - cursor:save("dhcp") - cursor:save("luci-splash") -end - --- Creates a firewall zone -function firewall_create_zone(zone, input, output, forward, masq) - local cursor = uci.cursor() - if not firewall_find_zone(zone) then - local stat = cursor:section("firewall", "zone", nil, { - input = input, - output = output, - forward = forward, - masq = masq and "1", - name = zone - }) - cursor:save("firewall") - return stat - end -end - --- Adds interface to zone, creates zone on-demand -function firewall_zone_add_interface(name, interface) - local cursor = uci.cursor() - local zone = firewall_find_zone(name) - local net = cursor:get("firewall", zone, "network") - local old = net or (cursor:get("network", name) and name) - cursor:set("firewall", zone, "network", (old and old .. " " or "") .. interface) - cursor:save("firewall") -end - --- Removes interface from zone -function firewall_zone_remove_interface(name, interface) - local cursor = uci.cursor() - local zone = firewall_find_zone(name) - if zone then - local net = cursor:get("firewall", zone, "network") - local new = remove_list_entry(net, interface) - if new then - if #new > 0 then - cursor:set("firewall", zone, "network", new) - else - cursor:delete("firewall", zone, "network") - end - cursor:save("firewall") - end - end -end - - --- Finds the firewall zone with given name -function firewall_find_zone(name) - local find - - uci.cursor():foreach("firewall", "zone", - function (section) - if section.name == name then - find = section[".name"] - end - end) - - return find -end - - - --- Helpers -- - --- Removes a listentry, handles real and pseduo lists transparently -function remove_list_entry(value, entry) - if type(value) == "nil" then - return nil - end - - local result = type(value) == "table" and value or util.split(value, " ") - local key = util.contains(result, entry) - - while key do - table.remove(result, key) - key = util.contains(result, entry) - end - - result = type(value) == "table" and result or table.concat(result, " ") - return result ~= value and result -end |