summaryrefslogtreecommitdiffstats
path: root/system/smokeping/rc.smokeping
diff options
context:
space:
mode:
Diffstat (limited to 'system/smokeping/rc.smokeping')
-rwxr-xr-xsystem/smokeping/rc.smokeping145
1 files changed, 145 insertions, 0 deletions
diff --git a/system/smokeping/rc.smokeping b/system/smokeping/rc.smokeping
new file mode 100755
index 0000000000..3ed71d2128
--- /dev/null
+++ b/system/smokeping/rc.smokeping
@@ -0,0 +1,145 @@
+#!/bin/bash
+
+#SMOKEPING_VERSION="2.8.3"
+SMOKEPING_PIDFILE="/run/smokeping/smokeping.pid"
+SMOKEPING_USER=@SMOKEPING_USER@
+SMOKEPING_PATH=@SMOKEPING_PATH@
+SMOKEPING_CONFIG_PATH=@SMOKEPING_CONFIG_PATH@
+SMOKEPING_LOG_PATH="/var/log/smokeping.nosyslog.log"
+
+get_child_pids() {
+ if [[ -z "$1" ]]; then echo "get_child_pids:error: \$1 is empty " 1>&2 ; exit 1 ; fi
+ local parent_pid=$1
+ ps -o pid --no-headers --ppid $parent_pid
+}
+
+# Function to recursively get all descendant PIDs
+get_descendant_pids() {
+ if [[ -z "$1" ]]; then echo "get_descendant_pids:error: \$1 is empty " 1>&2 ; exit 1 ; fi
+ local parent_pid=$1
+ local child_pids=$(get_child_pids $parent_pid)
+ for pid in $child_pids; do
+ echo $pid
+ get_descendant_pids $pid
+ done
+}
+
+function start
+{
+ export LC_ALL=C
+ # no idea why this is required
+ # https://github.com/oetiker/SmokePing/issues/29
+ cd /var/lib/smokeping
+
+ mkdir -p /run/smokeping/
+ chown $SMOKEPING_USER /run/smokeping/
+
+ touch "$SMOKEPING_LOG_PATH"
+ chown $SMOKEPING_USER "$SMOKEPING_LOG_PATH"
+
+ if [[ -e $SMOKEPING_PIDFILE && ( "" == "$(cat $SMOKEPING_PIDFILE)" ) ]]
+ then
+ printf "Pid file is empty: %s\n" "$SMOKEPING_PIDFILE" 1>&2
+ elif [[ -e $SMOKEPING_PIDFILE && ( "" != "$(cat $SMOKEPING_PIDFILE)" ) ]]
+ then
+ PID=$(cat "$SMOKEPING_PIDFILE")
+ printf "PID=%s\n" "$PID"
+ if ps --pid "$PID"
+ then
+ printf "Smokeping already running with pid %d.\n" "$PID" 1>&2
+ return 1
+ else
+ printf "You have bogus pid file!\n" 1>&2
+ rm "$SMOKEPING_PIDFILE"
+ fi
+ fi
+
+ /sbin/setcap 'CAP_NET_RAW+eip CAP_NET_ADMIN+eip' /usr/sbin/fping
+ if ! su smokeping -s/bin/sh -c "$SMOKEPING_PATH --config=$SMOKEPING_CONFIG_PATH --logfile=$SMOKEPING_LOG_PATH"
+ then
+ printf "Smokeping failed to start!\n" 1>&2
+ return 2
+ fi
+
+ if [[ ! -e $SMOKEPING_PIDFILE ]]
+ then
+ printf "Smokeping pidfile missing!\n" 1>&2
+ return 3
+ elif [[ "" == $(cat $SMOKEPING_PIDFILE | tr -d '\n' ) ]]
+ then
+ printf "Pid file %s empty.\n" $(cat $SMOKEPING_PIDFILE) 1>&2
+ else
+ PID=$(cat "$SMOKEPING_PIDFILE")
+ if ps --pid "$PID"
+ then
+ :
+ else
+ printf "Smokeping created pidfile, but is not running!\n" 1>&2
+ return 4
+ fi
+ fi
+ rm -f /run/smokeping-fcgi.sock
+ /usr/bin/spawn-fcgi -u $SMOKEPING_USER -s /run/smokeping-fcgi.sock -M 660 -U $SMOKEPING_USER -- /var/www/htdocs/smokeping/smokeping.fcgi
+ return 0
+}
+
+function stop()
+{
+ if [[ ! -e "$SMOKEPING_PIDFILE" ]]; then
+ printf "Pid file %s does not exist!\n" "$SMOKEPING_PIDFILE"
+ return 6
+ elif [[ "" == "$(cat "$SMOKEPING_PIDFILE")" ]] ; then
+ printf "Pid file %s empty!\n" "$SMOKEPING_PIDFILE"
+ return 6
+ fi
+ child_pids=$(get_descendant_pids $(cat "$SMOKEPING_PIDFILE"))
+ printf "Full pid list (smokeping+children):%s\n" "$(cat "$SMOKEPING_PIDFILE") $child_pids"
+ /bin/kill --timeout 3000 TERM --timeout 1000 KILL --signal QUIT $(cat "$SMOKEPING_PIDFILE") $child_pids
+
+ rm -f "$SMOKEPING_PIDFILE"
+
+ if pgrep -f 'bin/smokeping ' -la >/dev/null 2>&1 # the space is important
+ then
+ printf "Killing smokeping failed!\n" 1>&2
+ pgrep -f 'bin/smokeping' -la
+ fi
+ /bin/kill --timeout 3000 TERM --timeout 1000 KILL --signal QUIT $(/usr/sbin/ss -f unix -l -p | grep /run/smokeping-fcgi.sock | sed -E 's/.*pid=([[:digit:]]+),.*/\1/g')
+ rm /run/smokeping-fcgi.sock
+}
+
+case "$1" in
+ start)
+ printf "case up\n"
+ start
+ exit "$?"
+ ;;
+ stop)
+ printf "case down\n"
+ stop
+ exit "$?"
+ ;;
+ status)
+ if [[ -e "$SMOKEPING_PIDFILE" && "" != $(cat "$SMOKEPING_PIDFILE") ]] ; then
+ pstree -s -p $(cat "$SMOKEPING_PIDFILE")
+ else
+ printf "smokeping is not running or not running from this service.\n"
+ fi
+ cgi_pid=$(/usr/sbin/ss -f unix -l -p | grep /run/smokeping-fcgi.sock | sed -E 's/.*pid=([[:digit:]]+),.*/\1/g' 2>/dev/null)
+ if [[ "" == "$cgi_pid" ]] ; then
+ printf "smokeping_cgi is not running or not running from this service.\n"
+ else
+ pstree -s -p "$cgi_pid"
+ fi
+ ;;
+ restart)
+ if ! stop
+ then
+ exit "$?"
+ fi
+ if ! start
+ then
+ exit "$?"
+ fi
+ ;;
+ *) printf "usage: {up,down,restart,status}\n"
+esac