From 6ca3b275fc9bd83ccc9a4decf6d04d819f0efcf9 Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Sun, 24 May 2009 19:28:04 +0000 Subject: [PATCH 1/1] modules/freifunk: implement map update for GlobalMap applications/luci-ffwizard-leipzig: add lat and lon fields --- .../luasrc/model/cbi/ffwizard.lua | 35 +++++++++++++++- modules/freifunk/root/etc/init.d/freifunk | 4 ++ modules/freifunk/root/usr/sbin/ff_mapupdate | 49 ++++++++++++++++++++++ 3 files changed, 87 insertions(+), 1 deletion(-) create mode 100755 modules/freifunk/root/usr/sbin/ff_mapupdate diff --git a/applications/luci-ffwizard-leipzig/luasrc/model/cbi/ffwizard.lua b/applications/luci-ffwizard-leipzig/luasrc/model/cbi/ffwizard.lua index fa88f0150..e82353031 100644 --- a/applications/luci-ffwizard-leipzig/luasrc/model/cbi/ffwizard.lua +++ b/applications/luci-ffwizard-leipzig/luasrc/model/cbi/ffwizard.lua @@ -80,10 +80,15 @@ client = f:field(Flag, "client", "WLAN-DHCP anbieten") client:depends("wifi", "1") client.rmempty = true - olsr = f:field(Flag, "olsr", "OLSR einrichten") olsr.rmempty = true +lat = f:field(Value, "lat", "Latitude") +lat:depends("olsr", "1") + +lon = f:field(Value, "lon", "Longitude") +lon:depends("olsr", "1") + share = f:field(Flag, "sharenet", "Eigenen Internetzugang freigeben") share.rmempty = true @@ -265,6 +270,10 @@ function olsr.write(self, section, value) 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}) @@ -285,6 +294,29 @@ function olsr.write(self, section, value) 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", + 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") @@ -305,6 +337,7 @@ function share.write(self, section, value) end uci:save("firewall") uci:save("olsrd") + uci:save("system") end diff --git a/modules/freifunk/root/etc/init.d/freifunk b/modules/freifunk/root/etc/init.d/freifunk index d90e3ff5e..3a668b11f 100755 --- a/modules/freifunk/root/etc/init.d/freifunk +++ b/modules/freifunk/root/etc/init.d/freifunk @@ -23,6 +23,10 @@ boot() { echo "0 */4 * * * /usr/sbin/ff_rdate" >> /etc/crontabs/root } + grep -q '/usr/sbin/ff_mapupdate' /etc/crontabs/root || { + echo "17 * * * * /usr/sbin/ff_mapupdate >> /etc/crontabs/root + } + [ -f /etc/rc.local ] && . /etc/rc.local [ -d /etc/rc.local.d ] && { for file in /etc/rc.local.d/*; do diff --git a/modules/freifunk/root/usr/sbin/ff_mapupdate b/modules/freifunk/root/usr/sbin/ff_mapupdate new file mode 100755 index 000000000..132546c6b --- /dev/null +++ b/modules/freifunk/root/usr/sbin/ff_mapupdate @@ -0,0 +1,49 @@ +#!/usr/bin/lua + +local uci = require "luci.model.uci" +local x = uci.cursor() + +local update_url = "http://www.layereight.de/freifunkmap.php?update=%.15f,%.15f&olsrip=%s¬e=%s&robot=%s" +local update_all = ( arg[1] and arg[1] == "all" ) and true or false + +local file +x:foreach("olsrd", "LoadPlugin", function(s) + if s.library == "olsrd_nameservice.so.0.3" then + file = io.open(s.latlon_file) + end +end) + +if file then + local ln + local count = 0 + while true do + ln = file:read("*l") + if not ln then break end + if update_all and ln:match("^Node%(") then + local ip, lat, lon, note = ln:match("Node%('(%S+)',([%d%.]+),([%d%.]+),%d+,'%S+','(%S+)'%)") + lat = tonumber(lat) + lon = tonumber(lon) + + if ip and lat ~= 0.0 and lon ~= 0.0 and note then + note = note:gsub("[^%w%-%.]+", "_") + os.execute("wget -qO/dev/null %q" % string.format(update_url, lat, lon, ip, note, "luci-massupdate")) + count = count + 1 + end + + elseif ln:match("^Self%(") then + local ip, lat, lon, note = ln:match("Self%('(%S+)',([%d%.]+),([%d%.]+),%d+,'%S+','(%S+)'%)") + lat = tonumber(lat) + lot = tonumber(lon) + + if ip and lat ~= 0.0 and lon ~= 0.0 and note then + note = note:gsub("[^%w%-%.]+", "_") + os.execute("wget -qO/dev/null %q" % string.format(update_url, lat, lon, ip, note, "luci-selfupdate")) + count = count + 1 + end + end + end + + os.execute("logger -t 'mapupdate' 'Updated %d entries in freifunk map'" % count) + + file:close() +end -- 2.11.0