base-files: network.sh: gracefully handle missing network.interface ubus ns
authorJo-Philipp Wich <jo@mein.io>
Tue, 17 Jul 2018 05:47:33 +0000 (07:47 +0200)
committerJo-Philipp Wich <jo@mein.io>
Tue, 17 Jul 2018 06:10:20 +0000 (08:10 +0200)
When attempting to use any of the functions in network.sh while netifd is
not started yet, the ubus interface dump query will fail with "Not found",
yielding an empty response.

Subsequently, jsonfilter is invoked with an empty string instead of a valid
JSON document, causing it to emit a second "unexpected end of data" error.

This caused the dnsmasq init script to log the following errors during
early boot on some systems:

    procd: /etc/rc.d/S19dnsmasq: Command failed: Not found.
    procd: /etc/rc.d/S19dnsmasq: Failed to parse json data: unexpected end of data.

Fix the issue by allowing the ubus query to fail with "Not found" but still
logging other failures, and by passing an empty JSON object to jsonfilter
if the interface status cache is empty.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
package/base-files/Makefile
package/base-files/files/lib/functions/network.sh

index b58843163fd44638242d830764d2c849307c696f..ca1cb47a6cc554c3292aef02f7f86a1c0432f0f7 100644 (file)
@@ -12,7 +12,7 @@ include $(INCLUDE_DIR)/version.mk
 include $(INCLUDE_DIR)/feeds.mk
 
 PKG_NAME:=base-files
-PKG_RELEASE:=191
+PKG_RELEASE:=192
 PKG_FLAGS:=nonshared
 
 PKG_FILE_DEPENDS:=$(PLATFORM_DIR)/ $(GENERIC_PLATFORM_DIR)/base-files/
index 08cce49df22059c4b86c11b912caa4c7d112b799..d7fd2dea57308721425f89d4b8c38c7b8f1ccc70 100644 (file)
@@ -6,10 +6,16 @@
 __network_ifstatus() {
        local __tmp
 
-       [ -z "$__NETWORK_CACHE" ] && \
-               export __NETWORK_CACHE="$(ubus call network.interface dump)"
-
-       __tmp="$(jsonfilter ${4:+-F "$4"} ${5:+-l "$5"} -s "$__NETWORK_CACHE" -e "$1=@.interface${2:+[@.interface='$2']}$3")"
+       [ -z "$__NETWORK_CACHE" ] && {
+               __tmp="$(ubus call network.interface dump 2>&1)"
+               case "$?" in
+                       4) : ;;
+                       0) export __NETWORK_CACHE="$__tmp" ;;
+                       *) echo "$__tmp" >&2 ;;
+               esac
+       }
+
+       __tmp="$(jsonfilter ${4:+-F "$4"} ${5:+-l "$5"} -s "${__NETWORK_CACHE:-{}}" -e "$1=@.interface${2:+[@.interface='$2']}$3")"
 
        [ -z "$__tmp" ] && \
                unset "$1" && \