[openwrt/openwrt] dnsmasq: distinct Ubus names for multiple instances

LEDE Commits lede-commits at lists.infradead.org
Tue Jun 29 03:27:45 PDT 2021


ldir pushed a commit to openwrt/openwrt.git, branch master:
https://git.openwrt.org/ba5bd8e556b2e7573d27b16e005ba287e066f795

commit ba5bd8e556b2e7573d27b16e005ba287e066f795
Author: Etan Kissling <etan.kissling at gmail.com>
AuthorDate: Sun Jun 27 22:02:46 2021 +0000

    dnsmasq: distinct Ubus names for multiple instances
    
    Currently, when using multiple dnsmasq instances they are all assigned
    to the same Ubus instance name. This does not work, as only a single
    instance can register with Ubus at a time. In the log, this leads to
    `Cannot add object to UBus: Invalid argument` error messages.
    Furthermore, upstream 3c93e8eb41952a9c91699386132d6fe83050e9be changes
    behaviour so that instead of the log, dnsmasq exits at start instead.
    
    With this patch, all dnsmasq instances are assigned unique names so that
    they can register with Ubus concurrently. One of the enabled instances
    is always assigned the previous default name "dnsmasq" to avoid breaking
    backwards compatibility with other software relying on that default.
    Previously, a random instance got assigned that name (while the others
    produced error logs). Now, the first unnamed dnsmasq config section is
    assigned the default name. If there are no unnamed dnsmasq sections the
    first encountered named dnsmasq config section is assigned instead.
    
    A similar issue exists for Dbus and was similarly addressed.
    
    Signed-off-by: Etan Kissling <etan.kissling at gmail.com>
    [tweaked commit message] dnsmasq was not crashing it is exiting
    Signed-off-by: Kevin Darbyshire-Bryant <ldir at darbyshire-bryant.me.uk>
---
 .../network/services/dnsmasq/files/dnsmasq.init    | 32 ++++++++++++++++++++--
 1 file changed, 29 insertions(+), 3 deletions(-)

diff --git a/package/network/services/dnsmasq/files/dnsmasq.init b/package/network/services/dnsmasq/files/dnsmasq.init
index 44e7d2d4f9..c4c262ad69 100644
--- a/package/network/services/dnsmasq/files/dnsmasq.init
+++ b/package/network/services/dnsmasq/files/dnsmasq.init
@@ -161,7 +161,7 @@ append_server() {
 }
 
 append_rev_server() {
-        xappend "--rev-server=$1"
+	xappend "--rev-server=$1"
 }
 
 append_address() {
@@ -878,8 +878,16 @@ dnsmasq_start()
 	append_bool "$cfg" noresolv "--no-resolv"
 	append_bool "$cfg" localise_queries "--localise-queries"
 	append_bool "$cfg" readethers "--read-ethers"
-	append_bool "$cfg" dbus "--enable-dbus"
-	append_bool "$cfg" ubus "--enable-ubus"	1
+
+	local instance_name="dnsmasq.$cfg"
+	if [ "$cfg" = "$DEFAULT_INSTANCE" ]; then
+		instance_name="dnsmasq"
+	fi
+	config_get_bool dbus "$cfg" "dbus" 0
+	[ $dbus -gt 0 ] && xappend "--enable-dbus=uk.org.thekelleys.$instance_name"
+	config_get_bool ubus "$cfg" "ubus" 1
+	[ $ubus -gt 0 ] && xappend "--enable-ubus=$instance_name"
+
 	append_bool "$cfg" expandhosts "--expand-hosts"
 	config_get tftp_root "$cfg" "tftp_root"
 	[ -n "$tftp_root" ] && mkdir -p "$tftp_root" && append_bool "$cfg" enable_tftp "--enable-tftp"
@@ -1160,6 +1168,7 @@ boot()
 start_service() {
 	local instance="$1"
 	local instance_found=0
+	local first_instance=""
 
 	. /lib/functions/network.sh
 
@@ -1170,10 +1179,27 @@ start_service() {
 			if [ -n "$instance" ] && [ "$instance" = "$name" ]; then
 				instance_found=1
 			fi
+			if [ -z "$DEFAULT_INSTANCE" ]; then
+				local disabled
+				config_get_bool disabled "$name" disabled 0
+				if [ "$disabled" -eq 0 ]; then
+					# First enabled section will be assigned default instance name.
+					# Unnamed sections get precedence over named sections.
+					if expr "$cfg" : 'cfg[0-9a-f]*$' >/dev/null = "9"; then # See uci_fixup_section.
+						DEFAULT_INSTANCE="$name" # Unnamed config section.
+					elif [ -z "$first_instance" ]; then
+						first_instance="$name"
+					fi
+				fi
+			fi
 		fi
 	}
 
+	DEFAULT_INSTANCE=""
 	config_load dhcp
+	if [ -z "$DEFAULT_INSTANCE" ]; then
+		DEFAULT_INSTANCE="$first_instance" # No unnamed config section was found.
+	fi
 
 	if [ -n "$instance" ]; then
 		[ "$instance_found" -gt 0 ] || return



More information about the lede-commits mailing list