diff --git a/modules/ping-monitor b/modules/ping-monitor new file mode 100644 index 0000000..4c79e02 --- /dev/null +++ b/modules/ping-monitor @@ -0,0 +1,201 @@ +#!/bin/bash /usr/lib/turtle/turtle_module + +VERSION="1.0" +DESCRIPTION="Sends ping response data to a remote host via SSHFS" +CONF=/tmp/ping-monitor.form + +: ${DIALOG_OK=0} +: ${DIALOG_CANCEL=1} +: ${DIALOG_HELP=2} +: ${DIALOG_EXTRA=3} +: ${DIALOG_ITEM_HELP=4} +: ${DIALOG_ESC=255} + +sp="/root/ping_monitor.output" +pf="/var/run/ping-monitor.pid" + +function set_globals { + if [ -s /etc/config/ping-monitor ] + then + target=$(uci get ping-monitor.target) + else + touch /etc/config/ping-monitor + echo "ping-monitor not configured" + return 1 + fi +} + +function stop_ping { + pingpid=$(ps | grep -v grep | grep 'ping '"${target}" | awk '{print $1}') + kill -2 ${pingpid} + while kill -0 ${pingpid} > /dev/null 2>&1; do sleep 0.1; done +} + +function start_ping { + case "$(status)" in + 1) + # Already running + return 1 + ;; + *) + : + ;; + esac + + check_sshfs > /dev/null 2>&1 + if [ $? -eq 0 ]; then + find /root -type f -name "ping_monitor.*" -exec mv {} /sshfs \; + fi + + ping ${target} | while read pong; do echo "$(date '+%Y-%m-%d %H:%M:%S') ${pong}"; done > ${sp} & + local pid=$! + echo ${pid} > ${pf} + + echo "ping-monitor started with pid: ${pid}" + + return 0 +} + +function check_sshfs { + cat /etc/mtab | awk '{print $2}' | grep -e '^/sshfs' + return $? +} + +function move { + local dt="$(date +%Y%d%d-%H%M%S)" + local dp="/root/ping_monitor.${dt}" + + if [ -f ${sp} ]; then + mv ${sp} ${dp} # atomic? + fi + + check_sshfs > /dev/null 2>&1 + if [ $? -eq 0 ]; then + test -f ${dp} && mv ${dp} /sshfs + fi + +} + +function rotate { + stop_ping + move + start_ping +} + +function start { + set_globals || exit 1 + start_ping + case $? in + 2) + exit 1 + ;; + 1) + # It's already running. Let's sigint and rotate. + rotate + ;; + *) + : + ;; + esac + if [ -f /var/spool/cron/crontabs/root ]; then + grep '\*/5 \* \* \* \* /etc/turtle/modules/ping-monitor start' /var/spool/cron/crontabs/root > /dev/null || { + echo '*/5 * * * * /etc/turtle/modules/ping-monitor start' >> /var/spool/cron/crontabs/root + /etc/init.d/cron reload + } + fi + + check_sshfs > /dev/null 2>&1 + if [ $? -ne 0 ]; then + >&2 echo "sshfs is not mounted" + if [ "$(/etc/turtle/modules/sshfs status)" != "Running." ]; then + /etc/turtle/modules/sshfs start + fi + fi +} + +function stop { + set_globals || exit 1 + + sed -i '/\*\/5 \* \* \* \* \/etc\/turtle\/modules\/ping-monitor start/d' /var/spool/cron/crontabs/root + /etc/init.d/cron reload + + stop_ping + + # Attempt to move the last log + move +} + +function status { + if [ -f ${pf} ]; then + pid="$(head -n1 ${pf})" + + kill -0 ${pid} > /dev/null 2>&1 + if [ $? -eq 0 ]; then + if [ "ping-monitor" == "$(cat /proc/${pid}/comm)" ]; then + echo "1"; + return 0 + fi + fi + fi + echo "0" +} + +function configure { + if [ ! -f /etc/turtle/modules/sshfs ]; then + echo "dependency module sshfs is not installed." + return 1 + fi + check_sshfs > /dev/null 2>&1 + if [ $? -ne 0 ]; then + echo "sshfs is not mounted." + return 1 + fi + if [ -s /etc/config/ping-monitor ] + then + target=$(uci get ping-monitor.target) + else + touch /etc/config/ping-monitor + fi + + dialog --ok-label "Submit" \ + --help-button \ + --title "ping-monitor configuration" \ + --form "Send ping data to a remote host (requires sshfs module)\n\n\ +Target: host to ping.\n" 16 60 1\ + "Target:" 1 1 "${target}" 1 9 54 0 \ + 2>$CONF + + return=$? + + case $return in + $DIALOG_OK) + cat $CONF | { + read -r target + + if [ -z "$target" ]; then + target="8.8.8.8" + fi + touch /etc/config/ping-monitor + uci set ping-monitor.target="$target" + uci commit ping-monitor + rm $CONF + clear + };; + $DIALOG_CANCEL) + rm $CONF + clear + exit;; + $DIALOG_HELP) + dialog --title "Help" \ + --msgbox " \ +ping-monitor will send continuous ping requests to a target host and record the responses to the \ +local filesystem. Every 5 minutes, it will attempt to move the log of response data from the \ +local filesystem to a remote filesystem over sshfs. Therefore, this module requires that the \ +sshfs module be installed, configured, and started. \ +" 20 60 + configure + ;; + $DIALOG_ESC) + clear;; + esac +} \ No newline at end of file