diff --git a/ffho/ffho-site-generate/Makefile b/ffho/ffho-site-generate/Makefile index abeec075fe32b305234b707d71ae9ff3a39dd8c7..a463f2577ef56e2efa919f915557ef28c0d5564d 100644 --- a/ffho/ffho-site-generate/Makefile +++ b/ffho/ffho-site-generate/Makefile @@ -1,7 +1,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=ffho-site-generate -PKG_VERSION:=1 +PKG_VERSION:=2 PKG_RELEASE:=$(GLUON_VERSION).$(GLUON_SITE_CODE)-$(GLUON_RELEASE).$(GLUON_CONFIG_VERSION) PFG_BUILD_DEPENDS := lua-cjson/host @@ -36,7 +36,7 @@ endef define Package/ffho-site-generate/install $(CP) ./files/* $(1)/ $(CP) $(PKG_BUILD_DIR)/luadest/* $(1)/ - lua -e 'print(require("cjson").encode(assert(dofile("$(GLUONDIR)/scripts/site_config.lua"))))' > $(1)/lib/gluon/site-select/default.json + lua -e 'print(require("cjson").encode(assert(dofile("./scripts/template.lua"))))' > $(1)/lib/gluon/site-select/template.json lua -e 'print(require("cjson").encode(assert(dofile("./scripts/sites.lua"))))' > $(1)/lib/gluon/site-select/sites.json if [ -e $(GLUON_SITEDIR)/extra/groups.conf ]; then lua -e 'print(require("cjson").encode(assert(dofile("./scripts/groupes.lua"))))' > $(1)/lib/gluon/site-select/groups.json; fi endef diff --git a/ffho/ffho-site-generate/ReadMe.md b/ffho/ffho-site-generate/ReadMe.md index 03c4108ddef8aa9a5d62a2b62fc7f7431070216b..127e309bd9a27ae95793716326f4e6d7413f6bc3 100644 --- a/ffho/ffho-site-generate/ReadMe.md +++ b/ffho/ffho-site-generate/ReadMe.md @@ -3,8 +3,11 @@ ffho-site-generate This package generates the needed `site.json` directly on the node after firmware upgrad has been performed. This can be used, to support different sites/regions -within one firmware image. The default `site.json` is partially overridden by the -variables defined in `site/extra/sites.conf` and `site/extra/groups.conf`. +within one firmware image. The default `site.json` will be replaced by +`site/extra/template.conf` which is patly replacte by values defined in +`site/extra/sites.conf` and `site/extra/groups.conf`. + +One can generate the `site.conf` before build with: `GLUON_SITEDIR=$PATH ./scripts/gen-site-conf.lua` This does not belong to the `site.mk`. @@ -36,15 +39,9 @@ can be done here. { site_name = 'Freifunk Hochstift - Altenbeken', site_code = 'ffho_abn', - wifi24 = { - ap = { - ssid = 'hochstift.freifunk.net/altenbkn', - }, - }, - wifi5 = { - ap = { - ssid = 'hochstift.freifunk.net/altenbkn', - }, + subst = { + ['%%ID'] = 1, + ['%%CD'] = 'abn', }, site_select = { group = 'ffho_ost', @@ -64,43 +61,27 @@ site.conf. Same configuration as in the site.conf can be done here. ``` { ffho_ost = { - prefix4 = '10.132.xxx.0/21', - prefix6 = '2a03:2260:2342:2303::/64', - wifi24 = { - ibss = { - ssid = 'ffho-mesh-ost', - bssid = '02:ff:03:ff:00:24', - }, - }, - wifi5 = { - ibss = { - ssid = 'ffho-mesh-ost', - bssid = '02:ff:03:ff:00:05', - }, - }, - next_node = { - ip4 = '10.132.xxx.1', - ip6 = '2a03:2260:2342:2303::1', - mac = '02:ff:03:ff:00:00', - }, - fastd_mesh_vpn = { - groups = { - backbone = { - peers = { - gw01 = { - key = 'GW01_KEY', - remotes = { - '"gw01.ffho.net" port 10003', - ... - }, - }, - ... - }, - }, - }, + subst = { + ['%%V4'] = '10.132.xxx.0/21', + ['%%V6'] = '2a03:2260:2342:2303::/64', + ... }, }, ... } ``` +site/extra/default.conf +----------------------- + +An array, containing the default configuration, to create site.conf out of template.conf before build. + +### example +``` +subst = { + ['%%SN'] = 'Bitte wählen', + ['%%SC'] = 'ffho', + ['%%SS'] = 'paderborn.freifunk.net', + ... +} +``` diff --git a/ffho/ffho-site-generate/luasrc/lib/gluon/upgrade/005-set-site-config b/ffho/ffho-site-generate/luasrc/lib/gluon/upgrade/005-set-site-config index 2df85e159390ab613ea32219a2af971784199315..e499fb844582466a3a174a6b6d6477a1c3186dd7 100755 --- a/ffho/ffho-site-generate/luasrc/lib/gluon/upgrade/005-set-site-config +++ b/ffho/ffho-site-generate/luasrc/lib/gluon/upgrade/005-set-site-config @@ -5,20 +5,9 @@ local json = require 'luci.json' local site_code = require('gluon.site_config').site_code local tools = require 'gluon.site_generate' -function add_var_to_table(table, var) - if type(var) == "table" and type(table) == "table" then - for name, value in pairs(var) do - if table[name] and type(value) == "table" then - table[name] = add_var_to_table(table[name], value) - else - table[name]=value - end - end - end - return table -end - -local default = tools.get_config('/lib/gluon/site-select/default.json') +local template = io.open('/lib/gluon/site-select/template.json', 'r') +local config = template:read("*a") +default:close() local groups = tools.get_config('/lib/gluon/site-select/groups.json') local sites = tools.get_config('/lib/gluon/site-select/sites.json') local currentsite = uci:get("currentsite", "current", "name") @@ -27,14 +16,23 @@ if site_code ~= currentsite then local configured = false for _, site in pairs(sites) do if site.site_code == currentsite then - if site.site_select and site.site_select.group and groups and groups[site.site_select.group] then - default = add_var_to_table(default, groups[site.site_select.group]) + if site.subst then + config = tools.replace_patterns(config, site.subst) + end + if (site.site_select or {}).group and groups and groups[site.site_select.group] then + group = groups[site.site_select.group] + if group.subst then + config = tools.replace_patterns(config, group.subst) + end end - default = add_var_to_table(default, site) + local subst = {} + subst['%%SN'] = site.site_name + subst['%%SC'] = site.site_code + config = tools.replace_patterns(config, subst) local file = '/lib/gluon/site.json' local f = io.open(file, "w") - f:write(json.encode(default)) + f:write(config) f:close() configured = true diff --git a/ffho/ffho-site-generate/luasrc/usr/lib/lua/gluon/site_generate.lua b/ffho/ffho-site-generate/luasrc/usr/lib/lua/gluon/site_generate.lua index 642d557dd9a3070a6c4e3a9c71539d94d297274a..4ccf38c56996d13da578c616c74946a48bd7098e 100644 --- a/ffho/ffho-site-generate/luasrc/usr/lib/lua/gluon/site_generate.lua +++ b/ffho/ffho-site-generate/luasrc/usr/lib/lua/gluon/site_generate.lua @@ -52,3 +52,9 @@ function set_site_code(site_code) return false end +function replace_patterns(value, subst) + for k, v in pairs(subst) do + value = value:gsub(k, v) + end + return value +end diff --git a/ffho/ffho-site-generate/scripts/gen-site-conf.lua b/ffho/ffho-site-generate/scripts/gen-site-conf.lua new file mode 100755 index 0000000000000000000000000000000000000000..2da2549ba5d10a0ac3d2331cc95217107ad91ede --- /dev/null +++ b/ffho/ffho-site-generate/scripts/gen-site-conf.lua @@ -0,0 +1,17 @@ +#!/usr/bin/lua + +function replace_patterns(value, subst) + for k, v in pairs(subst) do + value = value:gsub(k, v) + end + return value +end + +dofile(os.getenv('GLUON_SITEDIR') ..'/extra/default.conf') +local template = os.getenv('GLUON_SITEDIR') ..'/extra/template.conf' +local site = os.getenv('GLUON_SITEDIR') ..'/site.conf' + +local config = io.open(template):read('*a') +config = replace_patterns(config, subst) + +io.open(site, 'w'):write(config) diff --git a/ffho/ffho-site-generate/scripts/template.lua b/ffho/ffho-site-generate/scripts/template.lua new file mode 100644 index 0000000000000000000000000000000000000000..a7ed28886a162883075a63490891e3cad6a3bf80 --- /dev/null +++ b/ffho/ffho-site-generate/scripts/template.lua @@ -0,0 +1,9 @@ +local config = os.getenv('GLUON_SITEDIR') .. '/extra/template.conf' + +local function loader() + coroutine.yield('return ') + coroutine.yield(io.open(config):read('*a')) +end + +-- setfenv doesn't work with Lua 5.2 anymore, but we're using 5.1 +return setfenv(assert(load(coroutine.wrap(loader), 'template.conf')), {})()