2 LuCI - Lua Configuration Interface
4 Copyright 2008 Steven Barth <steven@midlink.org>
5 Copyright 2008 Jo-Philipp Wich <xm@leipzig.freifunk.net>
6 Copyright 2011 Patrick Grimm <patrick@pberg.freifunk.net>
8 Licensed under the Apache License, Version 2.0 (the "License");
9 you may not use this file except in compliance with the License.
10 You may obtain a copy of the License at
12 http://www.apache.org/licenses/LICENSE-2.0
19 local uci = require "luci.model.uci".cursor()
20 local uci_state = require "luci.model.uci".cursor_state()
21 local tools = require "luci.tools.ffwizard"
22 local util = require "luci.util"
23 local sys = require "luci.sys"
24 local ip = require "luci.ip"
25 local fs = require "nixio.fs"
27 local has_pptp = fs.access("/usr/sbin/pptp")
28 local has_pppoe = fs.glob("/usr/lib/pppd/*/rp-pppoe.so")()
29 local has_l2gvpn = fs.access("/usr/sbin/node")
30 local has_radvd = fs.access("/etc/config/radvd")
31 local has_rom = fs.access("/rom/etc")
32 local has_autoipv6 = fs.access("/usr/bin/auto-ipv6")
33 local has_qos = fs.access("/etc/init.d/qos")
34 local has_ipv6 = fs.access("/proc/sys/net/ipv6")
36 luci.i18n.loadc("freifunk")
39 if string.find(ix, "radio") then
40 ix = string.gsub(ix,"radio", 'wlan')
42 local mac = fs.readfile("/sys/class/net/" .. ix .. "/address")
44 mac = luci.util.exec("ifconfig " .. ix)
45 mac = mac and mac:match(" ([A-F0-9:]+)%s*\n")
49 if mac and #mac > 0 then
54 function get_ula(imac)
55 if string.len(imac) == 17 then
56 local mac1 = string.sub(imac,4,8)
57 local mac2 = string.sub(imac,10,14)
58 local mac3 = string.sub(imac,16,17)
59 return 'fdca:ffee:babe::02'..mac1..'ff:fe'..mac2..mac3..'/64'
65 -------------------- View --------------------
66 f = SimpleForm("ffwizward", "Freifunkassistent",
67 "Dieser Assistent unterstützt Sie bei der Einrichtung des Routers für das Freifunknetz.")
69 local newpsswd = has_rom and sys.exec("diff /rom/etc/passwd /etc/passwd")
70 if newpsswd ~= "" then
71 pw = f:field(Flag, "pw", "Router Passwort", "Setzen Sie den Haken, um Ihr Passwort zu ändern.")
72 function pw.cfgvalue(self, section)
77 pw1 = f:field(Value, "pw1", translate("password"))
81 pw2 = f:field(Value, "pw2", translate("confirmation"))
85 function pw2.validate(self, value, section)
86 return pw1:formvalue(section) == value and value
89 if newpsswd ~= "" then
90 pw1:depends("pw", "1")
91 pw2:depends("pw", "1")
94 net = f:field(ListValue, "net", "Freifunk Community", "Nutzen Sie die Einstellungen der Freifunk Gemeinschaft in ihrer Nachbarschaft.")
97 uci:foreach("freifunk", "community", function(s)
98 net:value(s[".name"], "%s (%s)" % {s.name, s.mesh_network or "?"})
100 function net.cfgvalue(self, section)
101 return uci:get("freifunk", "wizard", "net")
103 function net.write(self, section, value)
104 uci:set("freifunk", "wizard", "net", value)
107 net_lat = f:field(ListValue, "net_lat", "", "")
108 net_lat:depends("net", "0")
109 net_lon = f:field(ListValue, "net_lon", "", "")
110 net_lon:depends("net", "0")
112 uci:foreach("freifunk", "community", function(s)
114 net_lat:value(s[".name"], "%s" % {s.latitude or "?"})
117 net_lon:value(s[".name"], "%s" % {s.longitude or "?"})
122 hostname = f:field(Value, "hostname", "Knoten Name", "Geben Sie Ihrem Freifunk Router einen Namen. Wenn Sie dieses Feld leer lassen, wird der Name automatisch aus der Mesh IP generiert.")
123 hostname.rmempty = true
124 hostname.optional = false
125 function hostname.cfgvalue(self, section)
126 return sys.hostname()
128 function hostname.write(self, section, value)
129 uci:set("freifunk", "wizard", "hostname", value)
132 function hostname.validate(self, value)
133 if (#value > 16) then
135 elseif (string.find(value, "[^%w%_%-]")) then
143 location = f:field(Value, "location", "Standort", "Geben Sie den Standort ihres Gerätes an")
144 location.rmempty = false
145 location.optional = false
146 function location.cfgvalue(self, section)
147 return uci:get("freifunk", "contact", "location")
149 function location.write(self, section, value)
150 uci:set("freifunk", "contact", "location", value)
155 mail = f:field(Value, "mail", "E-Mail", "Bitte hinterlegen Sie eine Kontaktadresse.")
157 mail.optional = false
158 function mail.cfgvalue(self, section)
159 return uci:get("freifunk", "contact", "mail")
161 function mail.write(self, section, value)
162 uci:set("freifunk", "contact", "mail", value)
166 main = f:field(Flag, "netconfig", "Netzwerk einrichten", "Setzen Sie den Haken, wenn Sie Ihr Freifunk Netzwerk einrichten wollen.")
167 uci:foreach("wireless", "wifi-device",
169 local device = section[".name"]
170 local dev = f:field(Flag, "device_" .. device , "<b>Drahtloses Netzwerk \"" .. device:upper() .. "\"</b> ", "Konfigurieren Sie Ihre drahtlose " .. device:upper() .. "Schnittstelle (WLAN).")
171 dev:depends("netconfig", "1")
173 function dev.cfgvalue(self, section)
174 return uci:get("freifunk", "wizard", "device_" .. device)
176 function dev.write(self, sec, value)
178 uci:set("freifunk", "wizard", "device_" .. device, value)
182 local chan = f:field(ListValue, "chan_" .. device, device:upper() .. " Freifunk Kanal einrichten", "Ihr Gerät und benachbarte Freifunk Knoten müssen auf demselben Kanal senden. Je nach Gerätetyp können Sie zwischen verschiedenen 2,4Ghz und 5Ghz Kanälen auswählen.")
183 chan:depends("device_" .. device, "1")
185 function chan.cfgvalue(self, section)
186 return uci:get("freifunk", "wizard", "chan_" .. device)
188 chan:value('default')
195 for i = 100, 140, 4 do
198 function chan.write(self, sec, value)
200 uci:set("freifunk", "wizard", "chan_" .. device, value)
204 local meship = f:field(Value, "meship_" .. device, device:upper() .. " Mesh IP Adresse einrichten", "Ihre Mesh IP Adresse erhalten Sie von der Freifunk Gemeinschaft in Ihrer Nachbarschaft. Es ist eine netzweit eindeutige Identifikation, z.B. 104.1.1.1.")
205 meship:depends("device_" .. device, "1")
206 meship.rmempty = true
207 function meship.cfgvalue(self, section)
208 return uci:get("freifunk", "wizard", "meship_" .. device)
210 function meship.validate(self, value)
211 local x = ip.IPv4(value)
212 return ( x and x:prefix() == 32 ) and x:string() or ""
214 function meship.write(self, sec, value)
215 uci:set("freifunk", "wizard", "meship_" .. device, value)
216 local new_ip = ip.IPv4(value)
218 local new_hostname = new_ip:string():gsub("%.", "-")
219 uci:set("freifunk", "wizard", "hostname", new_hostname)
224 local meship6 = f:field(Value, "meship6_" .. device, device:upper() .. " Mesh IPv6 Adresse einrichten", "Ihre Mesh IP Adresse wird automatisch berechnet")
225 meship6:depends("device_" .. device, "1")
226 meship6.rmempty = true
227 function meship6.cfgvalue(self, section)
228 return get_ula(get_mac(device))
232 local client = f:field(Flag, "client_" .. device, device:upper() .. " DHCP anbieten", "DHCP weist verbundenen Benutzern automatisch eine Adresse zu. Diese Option sollten Sie unbedingt aktivieren, wenn Sie Nutzer an der drahtlosen Schnittstelle erwarten.")
233 client:depends("device_" .. device, "1")
234 client.rmempty = false
235 function client.cfgvalue(self, section)
236 return uci:get("freifunk", "wizard", "client_" .. device)
238 function client.write(self, sec, value)
239 uci:set("freifunk", "wizard", "client_" .. device, value)
242 local dhcpmesh = f:field(Value, "dhcpmesh_" .. device, device:upper() .. " Mesh DHCP anbieten", "Bestimmen Sie den Adressbereich aus dem Ihre Nutzer IP Adressen erhalten. Es wird empfohlen einen Adressbereich aus Ihrer lokalen Freifunk Gemeinschaft zu nutzen. Der Adressbereich ist ein netzweit eindeutiger Netzbereich. z.B. 104.1.2.1/28")
243 dhcpmesh:depends("client_" .. device, "1")
244 dhcpmesh.rmempty = true
245 function dhcpmesh.cfgvalue(self, section)
246 return uci:get("freifunk", "wizard", "dhcpmesh_" .. device)
248 function dhcpmesh.validate(self, value)
249 local x = ip.IPv4(value)
250 return ( x and x:minhost()) and x:string() or ""
252 function dhcpmesh.write(self, sec, value)
253 uci:set("freifunk", "wizard", "dhcpmesh_" .. device, value)
256 local hwtype = section.type
257 if hwtype == "atheros" then
258 local vap = f:field(Flag, "vap_" .. device , "Virtueller Drahtloser Zugangspunkt", "Konfigurieren Sie Ihren Virtuellen AP")
259 vap:depends("client_" .. device, "1")
261 function vap.cfgvalue(self, section)
262 return uci:get("freifunk", "wizard", "vap_" .. device)
264 function vap.write(self, sec, value)
265 uci:set("freifunk", "wizard", "vap_" .. device, value)
271 uci:foreach("network", "interface",
273 local device = section[".name"]
274 local ifname = uci_state:get("network",device,"ifname")
275 if device ~= "loopback" and not string.find(device, "gvpn") and not string.find(device, "wifi") and not string.find(device, "wl") and not string.find(device, "wlan") and not string.find(device, "wireless") and not string.find(device, "radio") then
276 dev = f:field(Flag, "device_" .. device , "<b>Drahtgebundenes Netzwerk \"" .. device:upper() .. "\"</b>", "Konfigurieren Sie Ihre drahtgebunde " .. device:upper() .. " Schnittstelle (LAN).")
277 dev:depends("netconfig", "1")
279 function dev.cfgvalue(self, section)
280 return uci:get("freifunk", "wizard", "device_" .. device)
282 function dev.write(self, sec, value)
283 uci:set("freifunk", "wizard", "device_" .. device, value)
286 meship = f:field(Value, "meship_" .. device, device:upper() .. " Mesh IP Adresse einrichten", "Ihre Mesh IP Adresse erhalten Sie von der Freifunk Gemeinschaft in Ihrer Nachbarschaft. Es ist eine netzweit eindeutige Identifikation, z.B. 104.1.1.1.")
287 meship:depends("device_" .. device, "1")
288 meship.rmempty = true
289 function meship.cfgvalue(self, section)
290 return uci:get("freifunk", "wizard", "meship_" .. device)
292 function meship.validate(self, value)
293 local x = ip.IPv4(value)
294 return ( x and x:prefix() == 32 ) and x:string() or ""
296 function meship.write(self, sec, value)
297 uci:set("freifunk", "wizard", "meship_" .. device, value)
300 meship6 = f:field(Value, "meship6_" .. device, device:upper() .. " Mesh IPv6 Adresse einrichten", "Ihre Mesh IP Adresse wird automatisch berechnet")
301 meship6:depends("device_" .. device, "1")
302 meship6.rmempty = true
303 function meship6.cfgvalue(self, section)
304 return get_ula(get_mac(ifname))
308 client = f:field(Flag, "client_" .. device, device:upper() .. " DHCP anbieten","DHCP weist verbundenen Benutzern automatisch eine Adresse zu. Diese Option sollten Sie unbedingt aktivieren, wenn Sie Nutzer an der drahtlosen Schnittstelle erwarten.")
309 client:depends("device_" .. device, "1")
310 client.rmempty = false
311 function client.cfgvalue(self, section)
312 return uci:get("freifunk", "wizard", "client_" .. device)
314 function client.write(self, sec, value)
315 uci:set("freifunk", "wizard", "client_" .. device, value)
318 dhcpmesh = f:field(Value, "dhcpmesh_" .. device, device:upper() .. " Mesh DHCP anbieten ", "Bestimmen Sie den Adressbereich aus dem Ihre Nutzer IP Adressen erhalten. Es wird empfohlen einen Adressbereich aus Ihrer lokalen Freifunk Gemeinschaft zu nutzen. Der Adressbereich ist ein netzweit eindeutiger Netzbereich. z.B. 104.1.2.1/28")
319 dhcpmesh:depends("client_" .. device, "1")
320 dhcpmesh.rmempty = true
321 function dhcpmesh.cfgvalue(self, section)
322 return uci:get("freifunk", "wizard", "dhcpmesh_" .. device)
324 function dhcpmesh.validate(self, value)
325 local x = ip.IPv4(value)
326 return ( x and x:prefix() <= 30 and x:minhost()) and x:string() or ""
328 function dhcpmesh.write(self, sec, value)
329 uci:set("freifunk", "wizard", "dhcpmesh_" .. device, value)
336 local syslat = uci:get("freifunk", "wizard", "latitude") or 52
337 local syslon = uci:get("freifunk", "wizard", "longitude") or 10
338 uci:foreach("system", "system", function(s)
346 uci:foreach("olsrd", "LoadPlugin", function(s)
347 if s.library == "olsrd_nameservice.so.0.3" then
357 lat = f:field(Value, "lat", "geographischer Breitengrad", "Setzen Sie den Breitengrad (Latitude) Ihres Geräts.")
358 lat:depends("netconfig", "1")
359 function lat.cfgvalue(self, section)
362 function lat.write(self, section, value)
363 uci:set("freifunk", "wizard", "latitude", value)
367 lon = f:field(Value, "lon", "geograpischer Längengrad", "Setzen Sie den Längengrad (Longitude) Ihres Geräts.")
368 lon:depends("netconfig", "1")
369 function lon.cfgvalue(self, section)
372 function lon.write(self, section, value)
373 uci:set("freifunk", "wizard", "longitude", value)
378 *Opens an OpenStreetMap iframe or popup
379 *Makes use of resources/OSMLatLon.htm and htdocs/resources/osm.js
380 (is that the right place for files like these?)
383 local class = util.class
385 OpenStreetMapLonLat = class(AbstractValue)
387 function OpenStreetMapLonLat.__init__(self, ...)
388 AbstractValue.__init__(self, ...)
389 self.template = "cbi/osmll_value"
395 self.width = "100%" --popups will ignore the %-symbol, "100%" is interpreted as "100"
398 self.displaytext="OpenStreetMap" --text on button, that loads and displays the OSMap
399 self.hidetext="X" -- text on button, that hides OSMap
402 osm = f:field(OpenStreetMapLonLat, "latlon", "Geokoordinaten mit OpenStreetMap ermitteln:", "Klicken Sie auf Ihren Standort in der Karte. Diese Karte funktioniert nur, wenn das Gerät bereits eine Verbindung zum Internet hat.")
403 osm:depends("netconfig", "1")
406 osm.centerlat = syslat
407 osm.centerlon = syslon
411 syslatlengh = string.len(syslat)
412 if syslatlengh > 7 then
414 elseif syslatlengh > 5 then
419 osm.displaytext="OpenStreetMap anzeigen"
420 osm.hidetext="OpenStreetMap verbergen"
422 share = f:field(Flag, "sharenet", "Eigenen Internetzugang freigeben", "Geben Sie Ihren Internetzugang im Freifunknetz frei.")
423 share.rmempty = false
424 share:depends("netconfig", "1")
425 function share.cfgvalue(self, section)
426 return uci:get("freifunk", "wizard", "share")
428 function share.write(self, section, value)
429 uci:set("freifunk", "wizard", "share", value)
433 wanproto = f:field(ListValue, "wanproto", "Protokoll des Internetzugangs", "Geben Sie das Protokol an ueber das eine Internet verbindung hergestellt werden kann.")
434 wanproto:depends("sharenet", "1")
435 wanproto:value("static", translate("manual", "manual"))
436 wanproto:value("dhcp", translate("automatic", "automatic"))
437 if has_pppoe then wanproto:value("pppoe", "PPPoE") end
438 if has_pptp then wanproto:value("pptp", "PPTP") end
439 function wanproto.cfgvalue(self, section)
440 return uci:get("network", "wan", "proto") or "dhcp"
442 function wanproto.write(self, section, value)
443 uci:set("network", "wan", "proto", value)
446 wanip = f:field(Value, "wanipaddr", translate("ipaddress"))
447 wanip:depends("wanproto", "static")
448 function wanip.cfgvalue(self, section)
449 return uci:get("network", "wan", "ipaddr")
451 function wanip.write(self, section, value)
452 uci:set("network", "wan", "ipaddr", value)
455 wannm = f:field(Value, "wannetmask", translate("netmask"))
456 wannm:depends("wanproto", "static")
457 function wannm.cfgvalue(self, section)
458 return uci:get("network", "wan", "netmask")
460 function wannm.write(self, section, value)
461 uci:set("network", "wan", "netmask", value)
464 wangw = f:field(Value, "wangateway", translate("gateway"))
465 wangw:depends("wanproto", "static")
467 function wangw.cfgvalue(self, section)
468 return uci:get("network", "wan", "gateway")
470 function wangw.write(self, section, value)
471 uci:set("network", "wan", "gateway", value)
474 wandns = f:field(Value, "wandns", translate("dnsserver"))
475 wandns:depends("wanproto", "static")
476 wandns.rmempty = true
477 function wandns.cfgvalue(self, section)
478 return uci:get("network", "wan", "dns")
480 function wandns.write(self, section, value)
481 uci:set("network", "wan", "dns", value)
484 wanusr = f:field(Value, "wanusername", translate("username"))
485 wanusr:depends("wanproto", "pppoe")
486 wanusr:depends("wanproto", "pptp")
487 function wanusr.cfgvalue(self, section)
488 return uci:get("network", "wan", "username")
490 function wanusr.write(self, section, value)
491 uci:set("network", "wan", "username", value)
494 wanpwd = f:field(Value, "wanpassword", translate("password"))
495 wanpwd.password = true
496 wanpwd:depends("wanproto", "pppoe")
497 wanpwd:depends("wanproto", "pptp")
498 function wanpwd.cfgvalue(self, section)
499 return uci:get("network", "wan", "password")
501 function wanpwd.write(self, section, value)
502 uci:set("network", "wan", "password", value)
506 wansec = f:field(Flag, "wansec", "WAN-Zugriff auf Gateway beschränken", "Verbieten Sie Zugriffe auf Ihr lokales Netzwerk aus dem Freifunknetz.")
507 wansec.rmempty = false
508 wansec:depends("wanproto", "static")
509 wansec:depends("wanproto", "dhcp")
510 function wansec.cfgvalue(self, section)
511 return uci:get("freifunk", "wizard", "wan_security")
513 function wansec.write(self, section, value)
514 uci:set("freifunk", "wizard", "wan_security", value)
518 wanqosdown = f:field(Value, "wanqosdown", "Download Bandbreite begrenzen", "kb/s")
519 wanqosdown:depends("sharenet", "1")
520 function wanqosdown.cfgvalue(self, section)
521 return uci:get("qos", "wan", "download")
523 function wanqosdown.write(self, section, value)
524 uci:set("qos", "wan", "download", value)
527 wanqosup = f:field(Value, "wanqosup", "Upload Bandbreite begrenzen", "kb/s")
528 wanqosup:depends("sharenet", "1")
529 function wanqosup.cfgvalue(self, section)
530 return uci:get("qos", "wan", "upload")
532 function wanqosup.write(self, section, value)
533 uci:set("qos", "wan", "upload", value)
539 gvpn = f:field(Flag, "gvpn", "Freifunk Internet Tunnel", "Verbinden Sie ihren Router ueber das Internet mit anderen Freifunknetzen.")
541 gvpn:depends("sharenet", "1")
542 function gvpn.cfgvalue(self, section)
543 return uci:get("freifunk", "wizard", "gvpn")
545 function gvpn.write(self, section, value)
546 uci:set("freifunk", "wizard", "gvpn", value)
549 gvpnip = f:field(Value, "gvpnipaddr", translate("ipaddress"))
550 gvpnip:depends("gvpn", "1")
551 function gvpnip.cfgvalue(self, section)
552 return uci:get("l2gvpn", "bbb", "ip") or uci:get("network", "gvpn", "ipaddr")
554 function gvpnip.validate(self, value)
555 local x = ip.IPv4(value)
556 return ( x and x:prefix() == 32 ) and x:string() or ""
560 hb = f:field(Flag, "hb", "Heartbeat aktivieren","Dem Gerät erlauben anonyme Statistiken zu übertragen. (empfohlen)")
562 hb:depends("netconfig", "1")
563 function hb.cfgvalue(self, section)
564 return uci:get("freifunk", "wizard", "hb")
566 function hb.write(self, section, value)
567 uci:set("freifunk", "wizard", "hb", value)
571 -------------------- Control --------------------
572 function f.handle(self, state, data)
573 if state == FORM_VALID then
574 local debug = uci:get("freifunk", "wizard", "debug")
577 local stat = luci.sys.user.setpasswd("root", data.pw1) == 0
579 f.message = translate("a_s_changepw_changed")
581 f.errmessage = translate("unknownerror")
586 luci.http.redirect(luci.dispatcher.build_url(unpack(luci.dispatcher.context.requested.path), "system", "system"))
589 local stat = luci.sys.user.setpasswd("root", data.pw1) == 0
591 -- f.message = translate("a_s_changepw_changed")
593 -- f.errmessage = translate("unknownerror")
597 uci:commit("freifunk")
598 uci:commit("wireless")
599 uci:commit("network")
601 uci:commit("luci_splash")
602 uci:commit("firewall")
606 uci:commit("manager")
608 uci:commit("autoipv6")
619 -- the following line didn't work without admin-mini, for now i just replaced it with sys.exec... soma
620 -- luci.http.redirect(luci.dispatcher.build_url(unpack(luci.dispatcher.context.requested.path), "system", "reboot") .. "?reboot=1")
624 elseif state == FORM_INVALID then
625 self.errmessage = "Ungültige Eingabe: Bitte die Formularfelder auf Fehler prüfen."
630 local function _strip_internals(tbl)
632 for k, v in pairs(tbl) do
633 if k:sub(1, 1) == "." then
639 -- Configure Freifunk checked
640 function main.write(self, section, value)
642 uci:set("freifunk", "wizard", "netconfig", "0")
646 -- Collect IP-Address
647 local community = net:formvalue(section)
648 suffix = uci:get("freifunk", community, "suffix") or "olsr"
651 if not community then
652 net.tag_missing[section] = true
656 uci:set("freifunk", "wizard", "netconfig", "1")
660 external = uci:get("freifunk", community, "external") or ""
662 local netname = "wireless"
664 network = ip.IPv4(uci:get("freifunk", community, "mesh_network") or "104.0.0.0/8")
666 -- Tune community settings
667 if community and uci:get("freifunk", community) then
668 uci:tset("freifunk", "community", uci:get_all("freifunk", community))
672 uci:delete_all("firewall","zone", {name="freifunk"})
673 uci:delete_all("firewall","forwarding", {dest="freifunk"})
674 uci:delete_all("firewall","forwarding", {src="freifunk"})
675 uci:delete_all("firewall","rule", {dest="freifunk"})
676 uci:delete_all("firewall","rule", {src="freifunk"})
678 -- Create firewall zone and add default rules (first time)
679 -- firewall_create_zone("name" , "input" , "output", "forward ", Masqurade)
680 local newzone = tools.firewall_create_zone("freifunk", "ACCEPT", "ACCEPT", "REJECT" , true)
682 uci:foreach("freifunk", "fw_forwarding", function(section)
683 uci:section("firewall", "forwarding", nil, section)
685 uci:foreach(external, "fw_forwarding", function(section)
686 uci:section("firewall", "forwarding", nil, section)
689 uci:foreach("freifunk", "fw_rule", function(section)
690 uci:section("firewall", "rule", nil, section)
692 uci:foreach(external, "fw_rule", function(section)
693 uci:section("firewall", "rule", nil, section)
697 uci:delete("manager", "heartbeat", "interface")
700 uci:delete_all("olsrd", "olsrd")
702 olsrbase = uci:get_all("freifunk", "olsrd") or {}
703 util.update(olsrbase, uci:get_all(external, "olsrd") or {})
705 olsrbase.IpVersion='6and4'
707 olsrbase.IpVersion='4'
709 uci:section("olsrd", "olsrd", nil, olsrbase)
710 -- Delete olsrdv4 old p2pd settings
711 uci:delete_all("olsrd", "LoadPlugin", {library="olsrd_mdns.so.1.0.0"})
712 uci:delete_all("olsrd", "LoadPlugin", {library="olsrd_p2pd.so.0.1.0"})
713 -- Write olsrdv4 new p2pd settings
714 uci:section("olsrd", "LoadPlugin", nil, {
715 library = "olsrd_p2pd.so.0.1.0",
717 UdpDestPort = "224.0.0.251 5353",
720 -- Delete http plugin
721 uci:delete_all("olsrd", "LoadPlugin", {library="olsrd_httpinfo.so.0.1"})
723 -- Delete olsrdv4 old interface
724 uci:delete_all("olsrd", "Interface")
725 uci:delete_all("olsrd", "Hna4")
726 -- Create wireless ip4/ip6 and firewall config
727 uci:foreach("wireless", "wifi-device",
729 local device = sec[".name"]
730 if not luci.http.formvalue("cbid.ffwizward.1.device_" .. device) then
733 node_ip = luci.http.formvalue("cbid.ffwizward.1.meship_" .. device) and ip.IPv4(luci.http.formvalue("cbid.ffwizward.1.meship_" .. device))
735 node_ip6 = luci.http.formvalue("cbid.ffwizward.1.meship6_" .. device) and ip.IPv6(luci.http.formvalue("cbid.ffwizward.1.meship6_" .. device))
737 if not node_ip or not network or not network:contains(node_ip) then
738 meship.tag_missing[section] = true
742 -- rename the wireless interface s/wifi/wireless/
744 if string.find(device, "wifi") then
745 nif = string.gsub(device,"wifi", netname)
746 elseif string.find(device, "wl") then
747 nif = string.gsub(device,"wl", netname)
748 elseif string.find(device, "wlan") then
749 nif = string.gsub(device,"wlan", netname)
750 elseif string.find(device, "radio") then
751 nif = string.gsub(device,"radio", netname)
754 tools.wifi_delete_ifaces(device)
755 -- tools.network_remove_interface(device)
756 uci:delete("network", device .. "dhcp")
757 uci:delete("network", device)
758 tools.firewall_zone_remove_interface("freifunk", device)
759 -- tools.network_remove_interface(nif)
760 uci:delete("network", nif .. "dhcp")
761 uci:delete("network", nif)
762 tools.firewall_zone_remove_interface("freifunk", nif)
764 uci:delete("dhcp", device)
765 uci:delete("dhcp", device .. "dhcp")
766 uci:delete("dhcp", nif)
767 uci:delete("dhcp", nif .. "dhcp")
769 uci:delete_all("luci_splash", "iface", {network=device.."dhcp", zone="freifunk"})
770 uci:delete_all("luci_splash", "iface", {network=nif.."dhcp", zone="freifunk"})
773 uci:delete_all("radvd", "interface", {interface=nif.."dhcp"})
774 uci:delete_all("radvd", "interface", {interface=nif})
775 uci:delete_all("radvd", "prefix", {interface=nif.."dhcp"})
776 uci:delete_all("radvd", "prefix", {interface=nif})
780 local ssiduci = uci:get("freifunk", community, "ssid")
781 local ssiddot = string.find(ssiduci,'%..*')
784 ssidshort = string.sub(ssiduci,ssiddot)
788 local devconfig = uci:get_all("freifunk", "wifi_device")
789 util.update(devconfig, uci:get_all(external, "wifi_device") or {})
790 local ssid = uci:get("freifunk", community, "ssid")
791 local channel = luci.http.formvalue("cbid.ffwizward.1.chan_" .. device)
792 local hwmode = "11bg"
793 local bssid = "02:CA:FF:EE:BA:BE"
795 if channel and channel ~= "default" then
796 if devconfig.channel ~= channel then
797 devconfig.channel = channel
798 local chan = tonumber(channel)
799 if chan >= 0 and chan < 10 then
800 bssid = channel .. "2:CA:FF:EE:BA:BE"
801 ssid = "ch" .. channel .. ssidshort
802 elseif chan == 10 then
803 bssid = "02:CA:FF:EE:BA:BE"
804 ssid = "ch" .. channel .. ssidshort
805 elseif chan >= 11 and chan <= 14 then
806 bssid = string.format("%X",channel) .. "2:CA:FF:EE:BA:BE"
807 ssid = "ch" .. channel .. ssidshort
808 elseif chan >= 36 and chan <= 64 then
812 bssid = "00:" .. channel ..":CA:FF:EE:EE"
813 ssid = "ch" .. channel .. ssidshort
814 elseif chan >= 100 and chan <= 140 then
818 bssid = "01:" .. string.sub(channel, 2) .. ":CA:FF:EE:EE"
819 ssid = "ch" .. channel .. ssidshort
821 devconfig.hwmode = hwmode
822 devconfig.outdoor = outdoor
825 uci:tset("wireless", device, devconfig)
827 local ifconfig = uci:get_all("freifunk", "wifi_iface")
828 util.update(ifconfig, uci:get_all(external, "wifi_iface") or {})
829 ifconfig.device = device
830 ifconfig.network = nif
832 -- See Table https://kifuse02.pberg.freifunk.net/moin/channel-bssid-essid
835 ifconfig.ssid = "olsr.freifunk.net"
837 -- See Table https://kifuse02.pberg.freifunk.net/moin/channel-bssid-essid
838 ifconfig.bssid = bssid
839 ifconfig.encryption="none"
841 local netconfig = uci:get_all("freifunk", "interface")
842 util.update(netconfig, uci:get_all(external, "interface") or {})
843 netconfig.proto = "static"
844 netconfig.ipaddr = node_ip:string()
846 netconfig.ip6addr = node_ip6:string()
848 uci:section("network", "interface", nif, netconfig)
850 uci:section("radvd", "interface", nil, {
854 AdvOtherConfigFlag =0,
857 uci:section("radvd", "prefix", nil, {
866 local new_hostname = node_ip:string():gsub("%.", "-")
867 uci:set("freifunk", "wizard", "hostname", new_hostname)
869 tools.firewall_zone_add_interface("freifunk", nif)
871 -- Write new olsrv4 interface
872 local olsrifbase = uci:get_all("freifunk", "olsr_interface")
873 util.update(olsrifbase, uci:get_all(external, "olsr_interface") or {})
874 olsrifbase.interface = nif
875 olsrifbase.ignore = "0"
876 uci:section("olsrd", "Interface", nil, olsrifbase)
877 -- Collect MESH DHCP IP NET
878 local client = luci.http.formvalue("cbid.ffwizward.1.client_" .. device)
880 local dhcpmeshnet = luci.http.formvalue("cbid.ffwizward.1.dhcpmesh_" .. device) and ip.IPv4(luci.http.formvalue("cbid.ffwizward.1.dhcpmesh_" .. device))
881 local ifacelist = uci:get_list("manager", "heartbeat", "interface") or {}
882 table.insert(ifacelist,nif .. "dhcp")
883 uci:set_list("manager", "heartbeat", "interface", ifacelist)
886 if not dhcpmeshnet:minhost() or not dhcpmeshnet:mask() then
887 dhcpmesh.tag_missing[section] = true
891 dhcp_ip = dhcpmeshnet:minhost():string()
892 dhcp_mask = dhcpmeshnet:mask():string()
893 dhcp_network = dhcpmeshnet:network():string()
894 uci:section("olsrd", "Hna4", nil, {
896 netaddr = dhcp_network
898 uci:foreach("olsrd", "LoadPlugin",
900 if s.library == "olsrd_p2pd.so.0.1.0" then
901 uci:set("olsrd", s['.name'], "ignore", "0")
902 local nonolsr = uci:get("olsrd", s['.name'], "NonOlsrIf") or ""
903 vap = luci.http.formvalue("cbid.ffwizward.1.vap_" .. device)
905 nonolsr = nif.."dhcp "..nonolsr
907 nonolsr = nif.." "..nonolsr
909 uci:set("olsrd", s['.name'], "NonOlsrIf", nonolsr)
913 local subnet_prefix = tonumber(uci:get("freifunk", community, "splash_prefix")) or 27
914 local pool_network = uci:get("freifunk", community, "splash_network") or "10.104.0.0/16"
915 local pool = luci.ip.IPv4(pool_network)
916 local ip = tostring(node_ip)
918 local hosts_per_subnet = 2^(32 - subnet_prefix)
919 local number_of_subnets = (2^pool:prefix())/hosts_per_subnet
920 local seed1, seed2 = ip:match("(%d+)%.(%d+)$")
921 if seed1 and seed2 then
922 math.randomseed(seed1 * seed2)
924 local subnet = pool:add(hosts_per_subnet * math.random(number_of_subnets))
925 dhcp_ip = subnet:network(subnet_prefix):add(1):string()
926 dhcp_mask = subnet:mask(subnet_prefix):string()
929 if dhcp_ip and dhcp_mask then
931 local aliasbase = uci:get_all("freifunk", "alias")
932 util.update(aliasbase, uci:get_all(external, "alias") or {})
933 aliasbase.ipaddr = dhcp_ip
934 aliasbase.netmask = dhcp_mask
935 aliasbase.proto = "static"
936 vap = luci.http.formvalue("cbid.ffwizward.1.vap_" .. device)
938 uci:section("network", "interface", nif .. "dhcp", aliasbase)
939 uci:section("wireless", "wifi-iface", nil, {
943 network =nif.."dhcp",
944 ssid ="AP"..ssidshort
947 uci:section("radvd", "interface", nil, {
948 interface =nif .. "dhcp",
951 AdvOtherConfigFlag =0,
954 uci:section("radvd", "prefix", nil, {
955 interface =nif .. "dhcp",
963 tools.firewall_zone_add_interface("freifunk", nif .. "dhcp")
965 ifconfig.mcast_rate = nil
966 ifconfig.encryption="none"
968 aliasbase.interface = nif
969 uci:section("network", "alias", nif .. "dhcp", aliasbase)
972 local dhcpbase = uci:get_all("freifunk", "dhcp")
973 util.update(dhcpbase, uci:get_all(external, "dhcp") or {})
974 dhcpbase.interface = nif .. "dhcp"
976 uci:section("dhcp", "dhcp", nif .. "dhcp", dhcpbase)
977 uci:set_list("dhcp", nif .. "dhcp", "dhcp_option", "119,olsr")
978 -- Create firewall settings
979 uci:delete_all("firewall", "rule", {
984 uci:section("firewall", "rule", nil, {
990 uci:delete_all("firewall", "rule", {
996 uci:section("firewall", "rule", nil, {
1003 uci:delete_all("firewall", "rule", {
1008 uci:section("firewall", "rule", nil, {
1015 uci:section("luci_splash", "iface", nil, {network=nif.."dhcp", zone="freifunk"})
1016 uci:save("luci_splash")
1017 -- Make sure that luci_splash is enabled
1018 sys.init.enable("luci_splash")
1021 -- Delete old splash
1022 uci:delete_all("luci_splash", "iface", {network=device.."dhcp", zone="freifunk"})
1024 --Write Ad-Hoc wifi section after AP wifi section
1025 uci:section("wireless", "wifi-iface", nil, ifconfig)
1027 uci:save("wireless")
1029 uci:save("firewall")
1032 -- Create wired ip and firewall config
1033 uci:foreach("network", "interface",
1035 local device = sec[".name"]
1036 if not luci.http.formvalue("cbid.ffwizward.1.device_" .. device) then
1039 if device ~= "loopback" and not string.find(device, "wifi") and not string.find(device, "wl") and not string.find(device, "wlan") and not string.find(device, "wireless") and not string.find(device, "radio") then
1041 node_ip = luci.http.formvalue("cbid.ffwizward.1.meship_" .. device) and ip.IPv4(luci.http.formvalue("cbid.ffwizward.1.meship_" .. device))
1043 node_ip6 = luci.http.formvalue("cbid.ffwizward.1.meship6_" .. device) and ip.IPv6(luci.http.formvalue("cbid.ffwizward.1.meship6_" .. device))
1045 if not node_ip or not network or not network:contains(node_ip) then
1046 meship.tag_missing[section] = true
1051 tools.firewall_zone_remove_interface(device, device)
1052 uci:delete_all("firewall","zone", {name=device})
1053 uci:delete_all("firewall","forwarding", {src=device})
1054 uci:delete_all("firewall","forwarding", {dest=device})
1055 uci:delete("network", device .. "dhcp")
1057 uci:delete("dhcp", device)
1058 uci:delete("dhcp", device .. "dhcp")
1059 -- Delete old splash
1060 uci:delete_all("luci_splash", "iface", {network=device.."dhcp", zone="freifunk"})
1062 uci:delete_all("radvd", "interface", {interface=device.."dhcp"})
1063 uci:delete_all("radvd", "interface", {interface=device})
1064 uci:delete_all("radvd", "prefix", {interface=device.."dhcp"})
1065 uci:delete_all("radvd", "prefix", {interface=device})
1068 local netconfig = uci:get_all("freifunk", "interface")
1069 util.update(netconfig, uci:get_all(external, "interface") or {})
1070 netconfig.proto = "static"
1071 netconfig.ipaddr = node_ip:string()
1073 netconfig.ip6addr = node_ip6:string()
1075 uci:section("network", "interface", device, netconfig)
1078 uci:section("radvd", "interface", nil, {
1082 AdvOtherConfigFlag =0,
1085 uci:section("radvd", "prefix", nil, {
1094 local new_hostname = node_ip:string():gsub("%.", "-")
1095 uci:set("freifunk", "wizard", "hostname", new_hostname)
1096 uci:save("freifunk")
1097 tools.firewall_zone_add_interface("freifunk", device)
1098 uci:save("firewall")
1099 -- Write new olsrv4 interface
1100 local olsrifbase = uci:get_all("freifunk", "olsr_interface")
1101 util.update(olsrifbase, uci:get_all(external, "olsr_interface") or {})
1102 olsrifbase.interface = device
1103 olsrifbase.ignore = "0"
1104 uci:section("olsrd", "Interface", nil, olsrifbase)
1105 olsrifbase.Mode = 'ether'
1106 -- Collect MESH DHCP IP NET
1107 local client = luci.http.formvalue("cbid.ffwizward.1.client_" .. device)
1109 local dhcpmeshnet = luci.http.formvalue("cbid.ffwizward.1.dhcpmesh_" .. device) and ip.IPv4(luci.http.formvalue("cbid.ffwizward.1.dhcpmesh_" .. device))
1110 local ifacelist = uci:get_list("manager", "heartbeat", "interface") or {}
1111 table.insert(ifacelist,device .. "dhcp")
1112 uci:set_list("manager", "heartbeat", "interface", ifacelist)
1115 if not dhcpmeshnet:minhost() or not dhcpmeshnet:mask() then
1116 dhcpmesh.tag_missing[section] = true
1120 dhcp_ip = dhcpmeshnet:minhost():string()
1121 dhcp_mask = dhcpmeshnet:mask():string()
1122 dhcp_network = dhcpmeshnet:network():string()
1123 uci:section("olsrd", "Hna4", nil, {
1124 netmask = dhcp_mask,
1125 netaddr = dhcp_network
1127 uci:foreach("olsrd", "LoadPlugin",
1129 if s.library == "olsrd_p2pd.so.0.1.0" then
1130 uci:set("olsrd", s['.name'], "ignore", "0")
1131 local nonolsr = uci:get("olsrd", s['.name'], "NonOlsrIf") or ""
1132 uci:set("olsrd", s['.name'], "NonOlsrIf", device .." ".. nonolsr)
1136 local subnet_prefix = tonumber(uci:get("freifunk", community, "splash_prefix")) or 27
1137 local pool_network = uci:get("freifunk", community, "splash_network") or "10.104.0.0/16"
1138 local pool = luci.ip.IPv4(pool_network)
1139 local ip = tostring(node_ip)
1141 local hosts_per_subnet = 2^(32 - subnet_prefix)
1142 local number_of_subnets = (2^pool:prefix())/hosts_per_subnet
1143 local seed1, seed2 = ip:match("(%d+)%.(%d+)$")
1144 if seed1 and seed2 then
1145 math.randomseed(seed1 * seed2)
1147 local subnet = pool:add(hosts_per_subnet * math.random(number_of_subnets))
1148 dhcp_ip = subnet:network(subnet_prefix):add(1):string()
1149 dhcp_mask = subnet:mask(subnet_prefix):string()
1152 if dhcp_ip and dhcp_mask then
1154 local aliasbase = uci:get_all("freifunk", "alias")
1155 util.update(aliasbase, uci:get_all(external, "alias") or {})
1156 aliasbase.interface = device
1157 aliasbase.ipaddr = dhcp_ip
1158 aliasbase.netmask = dhcp_mask
1159 aliasbase.proto = "static"
1160 uci:section("network", "alias", device .. "dhcp", aliasbase)
1162 local dhcpbase = uci:get_all("freifunk", "dhcp")
1163 util.update(dhcpbase, uci:get_all(external, "dhcp") or {})
1164 dhcpbase.interface = device .. "dhcp"
1166 uci:section("dhcp", "dhcp", device .. "dhcp", dhcpbase)
1167 uci:set_list("dhcp", device .. "dhcp", "dhcp_option", "119,olsr")
1168 -- Create firewall settings
1169 uci:delete_all("firewall", "rule", {
1174 uci:section("firewall", "rule", nil, {
1180 uci:delete_all("firewall", "rule", {
1186 uci:section("firewall", "rule", nil, {
1193 uci:delete_all("firewall", "rule", {
1198 uci:section("firewall", "rule", nil, {
1205 uci:section("luci_splash", "iface", nil, {network=device.."dhcp", zone="freifunk"})
1206 uci:save("luci_splash")
1207 -- Make sure that luci_splash is enabled
1208 sys.init.enable("luci_splash")
1211 uci:save("wireless")
1213 uci:save("firewall")
1219 sys.init.enable("radvd")
1221 -- Enforce firewall include
1222 local has_include = false
1223 uci:foreach("firewall", "include",
1225 if section.path == "/etc/firewall.freifunk" then
1230 if not has_include then
1231 uci:section("firewall", "include", nil,
1232 { path = "/etc/firewall.freifunk" })
1234 -- Allow state: invalid packets
1235 uci:foreach("firewall", "defaults",
1237 uci:set("firewall", section[".name"], "drop_invalid", "0")
1240 -- Prepare advanced config
1241 local has_advanced = false
1242 uci:foreach("firewall", "advanced",
1243 function(section) has_advanced = true end)
1245 if not has_advanced then
1246 uci:section("firewall", "advanced", nil,
1247 { tcp_ecn = "0", ip_conntrack_max = "8192", tcp_westwood = "1" })
1249 uci:save("wireless")
1251 uci:save("firewall")
1254 local new_hostname = uci:get("freifunk", "wizard", "hostname")
1255 local old_hostname = sys.hostname()
1257 local dhcphb = hb:formvalue(section)
1259 uci:set("manager", "heartbeat", "enabled", "1")
1260 -- Make sure that heartbeat is enabled
1261 sys.init.enable("machash")
1264 uci:set("manager", "heartbeat", "enabled", "0")
1265 -- Make sure that heartbeat is enabled
1266 sys.init.disable("machash")
1270 local custom_hostname = hostname:formvalue(section)
1271 uci:foreach("system", "system",
1273 -- Make crond silent
1274 uci:set("system", s['.name'], "cronloglevel", "10")
1275 -- Make set timzone and zonename
1276 uci:set("system", s['.name'], "zonename", "Europe/Berlin")
1277 uci:set("system", s['.name'], "timezone", 'CET-1CEST,M3.5.0,M10.5.0/3')
1279 if custom_hostname then
1280 uci:set("system", s['.name'], "hostname", custom_hostname)
1281 sys.hostname(custom_hostname)
1283 if new_hostname then
1284 if old_hostname == "OpenWrt" or old_hostname:match("^%d+-%d+-%d+-%d+$") then
1285 uci:set("system", s['.name'], "hostname", new_hostname)
1286 sys.hostname(new_hostname)
1292 -- Create time rdate_servers
1293 local rdate = uci:get_all("freifunk", "time")
1294 uci:delete_all("system", "time")
1295 uci:section("system", "time", "rdate_servers", rdate)
1296 rdate.server = rdate.rdate_servers
1297 rdate.rdate_servers = ""
1298 uci:delete_all("system", "rdate", nil)
1299 uci:section("system", "rdate", nil, rdate)
1302 -- Create http splash port 8082
1303 uci:set_list("uhttpd","main","listen_http",{"80"})
1304 uci:set_list("uhttpd","main","listen_https",{"443"})
1308 local latval = tonumber(lat:formvalue(section))
1309 local lonval = tonumber(lon:formvalue(section))
1311 -- Save latlon to system too
1312 if latval and lonval then
1313 uci:foreach("system", "system", function(s)
1314 uci:set("system", s[".name"], "latlon",string.format("%.15f %.15f", latval, lonval))
1315 uci:set("system", s[".name"], "latitude",string.format("%.15f", latval))
1316 uci:set("system", s[".name"], "longitude",string.format("%.15f", lonval))
1319 uci:foreach("system", "system", function(s)
1320 uci:delete("system", s[".name"], "latlon")
1321 uci:delete("system", s[".name"], "latitude")
1322 uci:delete("system", s[".name"], "longitude")
1325 -- Delete old watchdog settings
1326 uci:delete_all("olsrd", "LoadPlugin", {library="olsrd_watchdog.so.0.1"})
1327 -- Write new watchdog settings
1328 uci:section("olsrd", "LoadPlugin", nil, {
1329 library = "olsrd_watchdog.so.0.1",
1330 file = "/var/run/olsrd.watchdog",
1334 -- Delete old nameservice settings
1335 uci:delete_all("olsrd", "LoadPlugin", {library="olsrd_nameservice.so.0.3"})
1336 -- Write new nameservice settings
1337 uci:section("olsrd", "LoadPlugin", nil, {
1338 library = "olsrd_nameservice.so.0.3",
1339 suffix = "." .. suffix ,
1340 hosts_file = "/var/etc/hosts.olsr",
1341 latlon_file = "/var/run/latlon.js",
1342 lat = latval and string.format("%.15f", latval) or "",
1343 lon = lonval and string.format("%.15f", lonval) or "",
1344 services_file = "/var/etc/services.olsr"
1347 -- Import hosts and set domain
1348 uci:foreach("dhcp", "dnsmasq", function(s)
1349 uci:set_list("dhcp", s[".name"], "addnhosts", "/var/etc/hosts.olsr")
1350 uci:set("dhcp", s[".name"], "local", "/" .. suffix .. "/")
1351 uci:set("dhcp", s[".name"], "domain", suffix)
1354 -- Make sure that OLSR is enabled
1355 sys.init.enable("olsrd")
1359 -- Import hosts and set domain
1361 uci:foreach("dhcp", "dnsmasq", function(s)
1362 uci:set_list("dhcp", s[".name"], "addnhosts", {"/var/etc/hosts.olsr","/var/etc/hosts.olsr.ipv6"})
1365 uci:foreach("dhcp", "dnsmasq", function(s)
1366 uci:set_list("dhcp", s[".name"], "addnhosts", "/var/etc/hosts.olsr")
1373 local share_value = share:formvalue(section)
1374 if share_value == "1" then
1375 uci:set("freifunk", "wizard", "netconfig", "1")
1376 uci:section("firewall", "forwarding", nil, {src="freifunk", dest="wan"})
1378 if has_autoipv6 then
1379 -- Set autoipv6 tunnel mode
1380 uci:set("autoipv6", "olsr_node", "enable", "0")
1381 uci:set("autoipv6", "tunnel", "enable", "1")
1382 uci:save("autoipv6")
1385 -- Delete/Disable gateway plugin
1386 uci:delete_all("olsrd", "LoadPlugin", {library="olsrd_dyn_gw.so.0.5"})
1387 uci:delete_all("olsrd", "LoadPlugin", {library="olsrd_dyn_gw_plain.so.0.4"})
1388 -- Enable gateway_plain plugin
1389 uci:section("olsrd", "LoadPlugin", nil, {library="olsrd_dyn_gw_plain.so.0.4"})
1390 sys.exec("chmod +x /etc/init.d/freifunk-p2pblock")
1391 sys.init.enable("freifunk-p2pblock")
1392 sys.init.enable("qos")
1393 sys.exec('grep wan /etc/crontabs/root >/dev/null || echo "0 6 * * * ifup wan" >> /etc/crontabs/root')
1395 if wansec:formvalue(section) == "1" then
1396 uci:foreach("firewall", "zone",
1398 if s.name == "wan" then
1399 uci:set("firewall", s['.name'], "local_restrict", "1")
1405 uci:set("freifunk", "wizard", "netconfig", "0")
1406 uci:save("freifunk")
1407 if has_autoipv6 then
1408 -- Set autoipv6 olsrd mode
1409 uci:set("autoipv6", "olsr_node", "enable", "1")
1410 uci:set("autoipv6", "tunnel", "enable", "0")
1411 uci:save("autoipv6")
1413 -- Delete gateway plugins
1414 uci:delete_all("olsrd", "LoadPlugin", {library="olsrd_dyn_gw.so.0.5"})
1415 uci:delete_all("olsrd", "LoadPlugin", {library="olsrd_dyn_gw_plain.so.0.4"})
1416 -- Disable gateway_plain plugin
1417 uci:section("olsrd", "LoadPlugin", nil, {
1418 library = "olsrd_dyn_gw_plain.so.0.4",
1421 sys.init.disable("freifunk-p2pblock")
1422 sys.init.disable("qos")
1423 sys.exec("chmod -x /etc/init.d/freifunk-p2pblock")
1424 uci:delete_all("firewall", "forwarding", {src="freifunk", dest="wan"})
1425 uci:foreach("firewall", "zone",
1427 if s.name == "wan" then
1428 uci:delete("firewall", s['.name'], "local_restrict")
1433 -- Write gvpn dummy interface
1436 local vpn = gvpn:formvalue(section)
1438 uci:delete_all("l2gvpn", "l2gvpn")
1439 uci:delete_all("l2gvpn", "node")
1440 uci:delete_all("l2gvpn", "supernode")
1441 -- Write olsr tunnel interface options
1442 local olsr_gvpnifbase = uci:get_all("freifunk", "olsr_gvpninterface")
1443 util.update(olsr_gvpnifbase, uci:get_all(external, "olsr_gvpninterface") or {})
1444 uci:section("olsrd", "Interface", nil, olsr_gvpnifbase)
1445 local vpnip = gvpnip:formvalue(section)
1446 local gvpnif = uci:get_all("freifunk", "gvpn_node")
1447 util.update(gvpnif, uci:get_all(external, "gvpn_node") or {})
1448 if gvpnif and gvpnif.tundev and vpnip then
1449 uci:section("network", "interface", gvpnif.tundev, {
1450 ifname =gvpnif.tundev ,
1453 netmask =gvpnif.subnet or "255.255.255.192" ,
1459 gvpnif.mac="00:00:48:"..string.format("%X",string.gsub( vpnip, ".*%." , "" ))..":00:00"
1460 tools.firewall_zone_add_interface("freifunk", gvpnif.tundev)
1461 uci:section("l2gvpn", "node" , gvpnif.community , gvpnif)
1464 uci:save("firewall")
1466 sys.init.enable("l2gvpn")
1470 sys.exec("/etc/init.d/l2gvpn stop")
1471 sys.init.disable("l2gvpn")
1476 uci:save("freifunk")
1477 uci:save("firewall")