From 9c94561ca04ab5c812d1af54cf50d1f46ed4f5ed Mon Sep 17 00:00:00 2001 From: Nicholas Smith Date: Tue, 26 Jan 2021 10:35:57 +1000 Subject: [PATCH] watchcat: update to support procd Signed-off-by: Nicholas Smith (cherry picked from commit 399279b363b23a541753e69a89c2a68b4e04a3fe) --- utils/watchcat/Makefile | 14 +-- utils/watchcat/files/migrate-watchcat | 27 ++++++ utils/watchcat/files/uci_defaults_watchcat | 10 -- utils/watchcat/files/watchcat.config | 5 + .../files/{initd_watchcat => watchcat.init} | 94 ++++++++----------- 5 files changed, 78 insertions(+), 72 deletions(-) create mode 100644 utils/watchcat/files/migrate-watchcat delete mode 100644 utils/watchcat/files/uci_defaults_watchcat create mode 100644 utils/watchcat/files/watchcat.config rename utils/watchcat/files/{initd_watchcat => watchcat.init} (59%) diff --git a/utils/watchcat/Makefile b/utils/watchcat/Makefile index 0cbf11ddab..cb80a6a10e 100644 --- a/utils/watchcat/Makefile +++ b/utils/watchcat/Makefile @@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=watchcat PKG_VERSION:=1 -PKG_RELEASE:=11 +PKG_RELEASE:=12 PKG_MAINTAINER:=Roger D PKG_LICENSE:=GPL-2.0 @@ -19,16 +19,16 @@ include $(INCLUDE_DIR)/package.mk define Package/watchcat SECTION:=utils CATEGORY:=Utilities - TITLE:=Enable the configuration of programed reboots + TITLE:=Enable the configuration of programmed reboots or network interface restarts PKGARCH:=all endef define Package/watchcat/description -Allows to configure a periodically reboot, or after losing internet connectivity. Configured trough UCI /etc/config/system. +Restart network interfaces or reboot if pings to hosts fail, or set up periodic reboots. Configured via UCI /etc/config/watchcat endef define Package/watchcat/conffiles -/etc/config/system +/etc/config/watchcat endef define Build/Compile @@ -36,11 +36,13 @@ endef define Package/watchcat/install $(INSTALL_DIR) $(1)/etc/init.d - $(INSTALL_BIN) ./files/initd_watchcat $(1)/etc/init.d/watchcat + $(INSTALL_BIN) ./files/watchcat.init $(1)/etc/init.d/watchcat $(INSTALL_DIR) $(1)/usr/bin $(INSTALL_BIN) ./files/watchcat.sh $(1)/usr/bin/watchcat.sh + $(INSTALL_DIR) $(1)/etc/config + $(INSTALL_DATA) ./files/watchcat.config $(1)/etc/config/watchcat $(INSTALL_DIR) $(1)/etc/uci-defaults - $(INSTALL_BIN) ./files/uci_defaults_watchcat $(1)/etc/uci-defaults/50-watchcat + $(INSTALL_BIN) ./files/migrate-watchcat $(1)/etc/uci-defaults/migrate-watchcat endef $(eval $(call BuildPackage,watchcat)) diff --git a/utils/watchcat/files/migrate-watchcat b/utils/watchcat/files/migrate-watchcat new file mode 100644 index 0000000000..93b7ce2b31 --- /dev/null +++ b/utils/watchcat/files/migrate-watchcat @@ -0,0 +1,27 @@ +#!/bin/sh + +. /lib/functions.sh + +upgrade_watchcat() { + local cfg="$1" + + config_get period "$cfg" period + config_get mode "$cfg" mode + config_get pinghosts "$cfg" pinghosts + config_get forcedelay "$cfg" forcedelay + + [ -f "/etc/config/watchcat" ] || touch /etc/config/watchcat + uci_add watchcat watchcat + uci_set watchcat @watchcat[-1] period "$period" + uci_set watchcat @watchcat[-1] mode "$mode" + uci_set watchcat @watchcat[-1] pinghosts "$pinghosts" + uci_set watchcat @watchcat[-1] forcedelay "$forcedelay" + + uci_remove system "$cfg" +} + +config_load system +config_foreach upgrade_watchcat watchcat + +uci_commit watchcat +uci commit system diff --git a/utils/watchcat/files/uci_defaults_watchcat b/utils/watchcat/files/uci_defaults_watchcat deleted file mode 100644 index da4993230d..0000000000 --- a/utils/watchcat/files/uci_defaults_watchcat +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh - -uci -q show system.@watchcat[0] || { - uci add system watchcat - uci set system.@watchcat[0].period=6h - uci set system.@watchcat[0].mode=ping_reboot - uci set system.@watchcat[0].pinghosts=8.8.8.8 - uci set system.@watchcat[0].forcedelay=30 - uci commit -} diff --git a/utils/watchcat/files/watchcat.config b/utils/watchcat/files/watchcat.config new file mode 100644 index 0000000000..ed6544cc35 --- /dev/null +++ b/utils/watchcat/files/watchcat.config @@ -0,0 +1,5 @@ +config watchcat + option period '6h' + option mode 'ping_reboot' + option pinghosts '8.8.8.8' + option forcedelay '30' diff --git a/utils/watchcat/files/initd_watchcat b/utils/watchcat/files/watchcat.init similarity index 59% rename from utils/watchcat/files/initd_watchcat rename to utils/watchcat/files/watchcat.init index 95f59271f6..a48d3fdedc 100644 --- a/utils/watchcat/files/initd_watchcat +++ b/utils/watchcat/files/watchcat.init @@ -1,8 +1,9 @@ #!/bin/sh /etc/rc.common -START=97 +USE_PROCD=1 -PIDFILE="/tmp/run/watchcat" +START=97 +STOP=01 append_string() { varname="$1" @@ -29,25 +30,23 @@ time_to_seconds() { unset time } -load_watchcat() { +config_watchcat() { + # Read config config_get period "$1" period "120" - config_get mode "$1" mode "restart_iface" + config_get mode "$1" mode "ping_reboot" config_get pinghosts "$1" pinghosts "8.8.8.8" config_get pingperiod "$1" pingperiod "60" config_get forcedelay "$1" forcedelay "60" config_get pingsize "$1" pingsize "standard" config_get interface "$1" interface config_get mmifacename "$1" mmifacename - config_get unlockbands "$1" unlockbands "0" + config_get_bool unlockbands "$1" unlockbands "0" # Fix potential typo in mode and provide backward compatibility. [ "$mode" = "allways" ] && mode="periodic_reboot" [ "$mode" = "always" ] && mode="periodic_reboot" [ "$mode" = "ping" ] && mode="ping_reboot" - - error="" - warn="" - + # Checks for settings common to all operation modes if [ "$mode" != "periodic_reboot" ] && [ "$mode" != "ping_reboot" ] && [ "$mode" != "restart_iface" ]; then append_string "error" "mode must be 'periodic_reboot' or 'ping_reboot' or 'restart_iface'" "; " @@ -55,16 +54,14 @@ load_watchcat() { period="$(time_to_seconds "$period")" [ "$period" -ge 1 ] || - append_string "error" "period has invalid format! Use time value(ex: '30'; '4m'; '6h'; '2d')" "; " + append_string "error" "period has invalid format. Use time value(ex: '30'; '4m'; '6h'; '2d')" "; " # ping_reboot mode and restart_iface mode specific checks if [ "$mode" = "ping_reboot" ] || [ "$mode" = "restart_iface" ]; then - if [ -z "$error" ]; then - pingperiod_default="$((period / 5))" - pingperiod="$(time_to_seconds "$pingperiod")" + if [ "$pingperiod" -ge 0 ] && [ "$pingperiod" -ge "$period" ]; then pingperiod="$(time_to_seconds "$pingperiod_default")" append_string "warn" "pingperiod cannot be greater than $period. Defaulted to $pingperiod_default seconds (1/5 of period)" "; " @@ -90,53 +87,38 @@ load_watchcat() { logger -p user.err -t "watchcat" "reboot program $1 not started - $error" return } - + + # Need to conditionally run mode functions because they have different signatures case "$mode" in - periodic_reboot) - /usr/bin/watchcat.sh "periodic_reboot" "$period" "$forcedelay" & - logger -p user.info -t "watchcat" "started task (mode=$mode;period=$period;forcedelay=$forcedelay)" - ;; - ping_reboot) - /usr/bin/watchcat.sh "ping_reboot" "$period" "$forcedelay" "$pinghosts" "$pingperiod" "$pingsize" & - logger -p user.info -t "watchcat" "started task (mode=$mode;period=$period;pinghosts=$pinghosts;pingperiod=$pingperiod;forcedelay=$forcedelay;pingsize=$pingsize)" - ;; - restart_iface) - /usr/bin/watchcat.sh "restart_iface" "$period" "$pinghosts" "$pingperiod" "$pingsize" "$interface" "$mmifacename" & - logger -p user.info -t "watchcat" "started task (mode=$mode;period=$period;pinghosts=$pinghosts;pingperiod=$pingperiod;pingsize=$pingsize;interface=$interface;mmifacename=$mmifacename;unlockbands=$unlockbands)" - ;; - *) - echo "Error starting Watchcat service. Invalid mode selection: $mode" - ;; + periodic_reboot) + procd_open_instance "watchcat_${1}" + procd_set_param command /usr/bin/watchcat.sh "periodic_reboot" "$period" "$forcedelay" + procd_set_param respawn ${respawn_threshold:-3600} ${respawn_timeout:-5} ${respawn_retry:-5} + procd_close_instance + ;; + ping_reboot) + procd_open_instance "watchcat_${1}" + procd_set_param command /usr/bin/watchcat.sh "ping_reboot" "$period" "$forcedelay" "$pinghosts" "$pingperiod" "$pingsize" + procd_set_param respawn ${respawn_threshold:-3600} ${respawn_timeout:-5} ${respawn_retry:-5} + procd_close_instance + ;; + restart_iface) + procd_open_instance "watchcat_${1}" + procd_set_param command /usr/bin/watchcat.sh "restart_iface" "$period" "$pinghosts" "$pingperiod" "$pingsize" "$interface" "$mmifacename" + procd_set_param respawn ${respawn_threshold:-3600} ${respawn_timeout:-5} ${respawn_retry:-5} + procd_close_instance + ;; + *) + echo "Error starting Watchcat service. Invalid mode selection: $mode" + ;; esac - - echo $! >>"${PIDFILE}.pids" } -stop() { - if [ -f "${PIDFILE}.pids" ]; then - logger -p user.info -t "watchcat" "stopping all tasks" - - while read pid; do - kill -KILL "$pid" - done <"${PIDFILE}.pids" - - rm "${PIDFILE}.pids" - - logger -p user.info -t "watchcat" "all tasks stopped" - else - logger -p user.info -t "watchcat" "no tasks running" - fi +start_service() { + config_load watchcat + config_foreach config_watchcat watchcat } -start() { - [ -f "${PIDFILE}.pids" ] && stop - - config_load system - if [ -n "$(uci show system.@watchcat[0])" ]; then # at least one watchcat section exists - logger -p user.info -t "watchcat" "starting all tasks" - config_foreach load_watchcat watchcat - logger -p user.info -t "watchcat" "all tasks started" - else - logger -p user.info -t "watchcat" "no tasks defined" - fi +service_triggers() { + procd_add_reload_trigger "watchcat" }