From 09d9d60930fc907d0255aeeacb74f69c3ae84e69 Mon Sep 17 00:00:00 2001 From: John Kohl Date: Sat, 4 Jun 2022 20:56:56 -0400 Subject: [PATCH] watchcat: add support to run a script Signed-off-by: John Kohl (cherry picked from commit 5c96ee5b1bedb392cdd27578f7fdcc760ef7fe7b) --- utils/watchcat/Makefile | 2 +- utils/watchcat/files/watchcat.init | 17 +++++++++++++--- utils/watchcat/files/watchcat.sh | 32 ++++++++++++++++++++++-------- 3 files changed, 39 insertions(+), 12 deletions(-) diff --git a/utils/watchcat/Makefile b/utils/watchcat/Makefile index da5e70ace..8bdf864a4 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:=15 +PKG_RELEASE:=16 PKG_MAINTAINER:=Roger D PKG_LICENSE:=GPL-2.0 diff --git a/utils/watchcat/files/watchcat.init b/utils/watchcat/files/watchcat.init index ba047f31f..688b44bb8 100644 --- a/utils/watchcat/files/watchcat.init +++ b/utils/watchcat/files/watchcat.init @@ -42,6 +42,7 @@ config_watchcat() { config_get mmifacename "$1" mmifacename config_get_bool unlockbands "$1" unlockbands "0" config_get addressfamily "$1" addressfamily "any" + config_get script "$1" script # Fix potential typo in mode and provide backward compatibility. [ "$mode" = "allways" ] && mode="periodic_reboot" @@ -49,8 +50,8 @@ config_watchcat() { [ "$mode" = "ping" ] && mode="ping_reboot" # 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'" "; " + if [ "$mode" != "periodic_reboot" ] && [ "$mode" != "ping_reboot" ] && [ "$mode" != "restart_iface" ] && [ "$mode" != "run_script" ]; then + append_string "error" "mode must be 'periodic_reboot' or 'ping_reboot' or 'restart_iface' or 'run_script'" "; " fi period="$(time_to_seconds "$period")" @@ -58,7 +59,7 @@ config_watchcat() { 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 [ "$mode" = "ping_reboot" ] || [ "$mode" = "restart_iface" ] || [ "$mode" = "run_script" ]; then if [ -z "$error" ]; then pingperiod_default="$((period / 5))" pingperiod="$(time_to_seconds "$pingperiod")" @@ -78,6 +79,10 @@ config_watchcat() { fi fi + if [ "$mode" = "run_script" ] && [ -z "$script" ]; then + append_string "error" "run_script mode requires a script" + fi + # ping_reboot mode and periodic_reboot mode specific checks if [ "$mode" = "ping_reboot" ] || [ "$mode" = "periodic_reboot" ]; then forcedelay="$(time_to_seconds "$forcedelay")" @@ -109,6 +114,12 @@ config_watchcat() { procd_set_param respawn "${respawn_threshold:-3600}" "${respawn_timeout:-5}" "${respawn_retry:-5}" procd_close_instance ;; + run_script) + procd_open_instance "watchcat_${1}" + procd_set_param command /usr/bin/watchcat.sh "run_script" "$period" "$pinghosts" "$pingperiod" "$pingsize" "$interface" "$addressfamily" "$script" + 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" ;; diff --git a/utils/watchcat/files/watchcat.sh b/utils/watchcat/files/watchcat.sh index 9999defa8..dd0e9b27f 100644 --- a/utils/watchcat/files/watchcat.sh +++ b/utils/watchcat/files/watchcat.sh @@ -87,6 +87,11 @@ watchcat_restart_network_iface() { ip link set "$1" up } +watchcat_run_script() { + logger -p daemon.info -t "watchcat[$$]" "Running script \"$1\" for network interface: \"$2\"." + "$1" "$2" +} + watchcat_restart_all_network() { logger -p daemon.info -t "watchcat[$$]" "Restarting networking now by running: /etc/init.d/network restart" /etc/init.d/network restart @@ -101,6 +106,7 @@ watchcat_monitor_network() { mm_iface_name="$6" mm_iface_unlock_bands="$7" address_family="$8" + script="$9" time_now="$(cat /proc/uptime)" time_now="${time_now%%.*}" @@ -144,7 +150,9 @@ watchcat_monitor_network() { if [ "$ping_result" -eq 0 ]; then time_lastcheck_withinternet="$time_now" else - if [ "$iface" != "" ]; then + if [ "$script" != "" ]; then + logger -p daemon.info -t "watchcat[$$]" "Could not reach $host via \"$iface\" for \"$((time_now - time_lastcheck_withinternet))\" seconds. Running script after reaching \"$failure_period\" seconds" + elif [ "$iface" != "" ]; then logger -p daemon.info -t "watchcat[$$]" "Could not reach $host via \"$iface\" for \"$((time_now - time_lastcheck_withinternet))\" seconds. Restarting \"$iface\" after reaching \"$failure_period\" seconds" else logger -p daemon.info -t "watchcat[$$]" "Could not reach $host for \"$((time_now - time_lastcheck_withinternet))\" seconds. Restarting networking after reaching \"$failure_period\" seconds" @@ -153,13 +161,17 @@ watchcat_monitor_network() { done [ "$((time_now - time_lastcheck_withinternet))" -ge "$failure_period" ] && { - if [ "$mm_iface_name" != "" ]; then - watchcat_restart_modemmanager_iface "$mm_iface_name" "$mm_iface_unlock_bands" - fi - if [ "$iface" != "" ]; then - watchcat_restart_network_iface "$iface" + if [ "$script" != "" ]; then + watchcat_run_script "$script" "$iface" else - watchcat_restart_all_network + if [ "$mm_iface_name" != "" ]; then + watchcat_restart_modemmanager_iface "$mm_iface_name" "$mm_iface_unlock_bands" + fi + if [ "$iface" != "" ]; then + watchcat_restart_network_iface "$iface" + else + watchcat_restart_all_network + fi fi /etc/init.d/watchcat start # Restart timer cycle. @@ -245,7 +257,11 @@ ping_reboot) ;; restart_iface) # args from init script: period pinghosts pingperiod pingsize interface mmifacename unlockbands addressfamily - watchcat_monitor_network "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9" + watchcat_monitor_network "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9" "" + ;; +run_script) + # args from init script: period pinghosts pingperiod pingsize interface addressfamily script + watchcat_monitor_network "$2" "$3" "$4" "$5" "$6" "" "" "$7" "$8" ;; *) echo "Error: invalid mode selected: $mode"