Parcourir la source

uhttpd: restart when interface to listen becomes available

Currently uhttpd won't start with a listening interface configured if
the interface isn't already up at the time uhttpd starts. Make sure we
attempt to start uhttpd when it comes up.

Signed-off-by: Daniel Golle <[email protected]>
Daniel Golle il y a 2 ans
Parent
commit
7b1c3068b7
1 fichiers modifiés avec 66 ajouts et 0 suppressions
  1. 66 0
      package/network/services/uhttpd/files/uhttpd.init

+ 66 - 0
package/network/services/uhttpd/files/uhttpd.init

@@ -219,10 +219,76 @@ start_instance()
 	procd_close_instance
 }
 
+uhttpd_interfaces()
+{
+	local cfg="$1"
+	local http https listen ips
+
+	config_get http "$cfg" listen_http
+	config_get https "$cfg" listen_https
+	for listen in $http $https; do
+		case "$listen" in
+		"" |\
+		"0.0.0.0:"* |\
+		"[::]:"* )
+			continue
+			;;
+		*.*.*.*:*)
+			ips="$ips ${listen%%:*}
+"
+			;;
+		\[*\]:* )
+			listen="${listen:1}"
+			ips="$ips ${listen%%]:*}
+"
+			;;
+		esac
+	done
+	ips="$( echo "$ips" | sort -u )"
+	echo "$ips"
+}
+
+resolve_iface()
+{
+	local cfg="$1"
+	local ipaddr ipaddrs testip="$2"
+
+	config_get ipaddrs "$cfg" ipaddr
+	for ipaddr in $ipaddrs; do
+		[ "$ipaddr" = "$testip" ] && echo "$cfg"
+	done
+}
+
+get_interface_by_ip()
+{
+	config_load network
+	config_foreach resolve_iface interface "$@"
+}
+
 service_triggers()
 {
+	local iface ifaces all=0
+
 	procd_add_reload_trigger "uhttpd"
 	procd_add_raw_trigger acme.renew 5000 /etc/init.d/uhttpd reload
+
+	config_load uhttpd
+	ips="$(config_foreach uhttpd_interfaces uhttpd)"
+	[ -z "$ips" ] && return 0
+
+	for ip in $ips; do
+		iface="$(get_interface_by_ip $ip)"
+		[ -z "$iface" ] && all=1
+		ifaces="$ifaces $iface"
+	done
+
+	if [ "$all" = "1" ]; then
+		procd_add_raw_trigger "interface.*.up" 1000 /etc/init.d/uhttpd start
+	else
+		for iface in $ifaces; do
+			procd_add_raw_trigger "interface.$iface.up" 1000 /etc/init.d/uhttpd start
+		done
+	fi
 }
 
 start_service() {