nut: Fix procd crashloop no interfaces
authorDaniel F. Dickinson <redacted>
Tue, 1 Jan 2019 08:12:29 +0000 (03:12 -0500)
committerDaniel F. Dickinson <redacted>
Mon, 7 Jan 2019 07:03:31 +0000 (02:03 -0500)
Fix a crashloop under procd when attempting to bind
to any address when no interfaces are yet available.

Signed-off-by: Daniel F. Dickinson <redacted>
net/nut/Makefile
net/nut/files/nut-monitor.init
net/nut/files/nut-server.init

index 985feae5da512458a1c6faa53e4973f9d5a357c6..5dd635c2725691bab3906836cbfc678eda0597b8 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=nut
 PKG_VERSION:=2.7.4
-PKG_RELEASE:=13
+PKG_RELEASE:=14
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=http://www.networkupstools.org/source/2.7/
index 21e7002eaad4ab3db2ea71724b6c28cac4ee7a15..e1448c7fa5c7f485f47eab648aeb8fefb6325b74 100755 (executable)
@@ -163,12 +163,39 @@ build_config() {
        [ -s "$UPSMON_C" ] && chgrp $(id -gn ${runas:-root}) "$UPSMON_C"
 }
 
+interface_triggers() {
+       local action="$1"
+       local triggerlist trigger
+
+       config_get triggerlist "upsmon" triggerlist
+
+       . /lib/functions/network.sh
+
+       if [ -n "$triggerlist" ]; then
+               for trigger in $triggerlist; do
+                       if [ "$action" = "add_trigger" ]; then
+                               procd_add_interface_trigger "interface.*" "$trigger" /etc/init.d/nut-monitor reload
+                       else
+                               network_is_up "$trigger" && return 0
+                       fi
+               done
+       else
+               if [ "$action" = "add_trigger" ]; then
+                       procd_add_raw_trigger "interface.*.up" 2000 /etc/init.d/nut-monitor reload
+               else
+                       ubus call network.device status | grep -q '"up": true' && return 0
+               fi
+       fi
+       [ "$action" = "add_trigger" ] || return 1
+}
+
 start_service() {
        local havemon havems
        build_config
 
        [ "$havemon" != 1 ] && return
        [ "$havems" != 1 ] && return
+       interface_triggers "check_interface_up" || return
 
        procd_open_instance "upsmon"
        procd_set_param respawn
@@ -190,5 +217,7 @@ reload_service() {
 }
 
 service_triggers() {
+       confg_load nut_monitor
+       interface_triggers "add_trigger"
        procd_add_reload_trigger "nut_monitor"
 }
index a1df01645428b0c67ee99b5cefbf8d5f52edfc29..730437bd67794ceda07a19652f8a20f380fcc463 100755 (executable)
@@ -279,11 +279,39 @@ start_driver_instance() {
        procd_close_instance
 }
 
+interface_triggers() {
+       local action="$1"
+       local triggerlist trigger
+
+       config_get triggerlist "upsd" triggerlist
+
+       . /lib/functions/network.sh
+
+       if [ -n "$triggerlist" ]; then
+               for trigger in $triggerlist; do
+                       if [ "$action" = "add_trigger" ]; then
+                               procd_add_interface_trigger "interface.*" "$trigger" /etc/init.d/nut-server reload
+                       else
+                               network_is_up "$trigger" && return 0
+                       fi
+               done
+       else
+               if [ "$action" = "add_trigger" ]; then
+                       procd_add_raw_trigger "interface.*.up" 2000 /etc/init.d/nut-server reload
+               else
+                       ubus call network.device status | grep -q '"up": true' && return 0
+               fi
+       fi
+       [ "$action" = "add_trigger" ] || return 1
+}
+
 start_server_instance() {
        local RUNAS=nut
        build_config
 
        [ "$haveserver" != 1 ] && return
+       interface_triggers "check_interface_up" || return
+
 
        procd_open_instance "upsd"
        procd_set_param respawn
@@ -318,5 +346,8 @@ reload_service() {
 }
 
 service_triggers() {
+       config_load nut_server
+
+       interface_triggers "add_trigger"
        procd_add_reload_trigger "nut_server"
 }
git clone https://git.99rst.org/PROJECT