Browse Source

gluon-core: allow multiple domain names for next_node-feature

* change type of next_node.name
* create domain entry for each entry and add to dnsmasq configuration

[Matthias Schiffer: reword documentation]
Christof Schulze 2 years ago
parent
commit
9711afaf69

+ 1 - 0
docs/site-example/site.conf

@@ -83,6 +83,7 @@
   -- connected to using a known IP address.
   next_node = {
     -- anycast IPs of all nodes
+    -- name = { 'nextnode.location.community.example.org', 'nextnode', 'nn' },
     ip4 = '10.xxx.0.xxx',
     ip6 = 'fdxx:xxxx:xxxx::xxxx',
   },

+ 8 - 0
docs/user/site.rst

@@ -163,6 +163,7 @@ next_node \: package
     ::
 
       next_node = {
+        name = { 'nextnode.location.community.example.org', 'nextnode', 'nn' },
         ip4 = '10.23.42.1',
         ip6 = 'fdca:ffee:babe:1::1',
         mac = '16:41:95:40:f7:dc'
@@ -174,6 +175,13 @@ next_node \: package
     changed, but it can be adjusted to match existing deployments that use a
     different value.
 
+    When the nodes' next-node address is used as a DNS resolver by clients
+    (by passing it via DHCP or router advertisements), it may be useful to
+    allow resolving a next-node hostname without referring to an upstream DNS
+    server (e.g. to allow reaching the node using such a hostname via HTTP or SSH
+    in isolated mesh segments). This is possible by providing one or more names
+    in the ``name`` field.
+
 mesh \: optional
     Options specific to routing protocols.
 

+ 1 - 0
package/gluon-core/check_site.lua

@@ -70,6 +70,7 @@ if need_table({'dns'}, nil, false) then
 	need_number({'dns', 'cacheentries'}, false)
 end
 
+need_string_array(in_domain({'next_node', 'name'}), false)
 need_string_match(in_domain({'next_node', 'ip6'}), '^[%x:]+$', false)
 need_string_match(in_domain({'next_node', 'ip4'}), '^%d+.%d+.%d+.%d+$', false)
 

+ 12 - 13
package/gluon-core/luasrc/lib/gluon/upgrade/820-dns-config

@@ -25,22 +25,21 @@ if dns.servers then
 	})
 end
 
-if next_node.name and next_node.ip4 then
-	uci:section('dhcp', 'domain', 'nextnode4', {
-		name = next_node.name,
-		ip = next_node.ip4,
+local function set_dns_record(name, ip, sectionname)
+	if not ip then return end
+	uci:section('dhcp', 'domain', sectionname, {
+		name = name,
+		ip = ip,
 	})
-else
-	uci:delete('dhcp', 'domain', 'nextnode4')
 end
 
-if next_node.name and next_node.ip6 then
-	uci:section('dhcp', 'domain', 'nextnode6', {
-		name = next_node.name,
-		ip = next_node.ip6,
-	})
-else
-	uci:delete('dhcp', 'domain', 'nextnode6')
+uci:delete_all('dhcp', 'domain', function(s)
+	return (s['.name'] and string.match(s['.name'], "^nextnode[46]"))
+end)
+
+for i, name in ipairs(next_node.name or {}) do
+	set_dns_record(name, next_node.ip4, 'nextnode4_' .. i)
+	set_dns_record(name, next_node.ip6, 'nextnode6_' .. i)
 end
 
 uci:save('dhcp')