#!/bin/sh
#
# watchdog script to restart vdr after failure
# to stop watchdog temporarily touch /tmp/vdr-nowatchdog
#
#

#detach from terminal
exec < /dev/null
exec >/dev/null 2>&1

. /etc/conf.d/vdr.watchdogd

DEBUG=1
[ "$1" = "--debug" ] && DEBUG=1

if [ "${DEBUG}" = 1 ]; then
	exec >/tmp/vdr-watchdogd.log 2>&1
	date
	set -x
fi

exit_handler() {
	run=0
	enabled=0
}

on_handler() {
	log "Enabled by USR1"
	enabled=1
}

off_handler() {
	log "Disabled by USR2"
	enabled=0
}

noop() {
	:
}

trap exit_handler INT QUIT TERM
trap on_handler USR1
trap off_handler USR2
trap noop HUP

# hack to allow getting a signal handled immediately
run_child() {
	$@ &
	child_pid=$!
	wait || kill $child_pid
}

log() {
	logger -i -t vdrwatchdog -p local0.info	"$@"
}

trigger_restart() {
	log "restarting VDR"
	/etc/init.d/vdr watchdogrestart
	log "VDR has been restarted"
}

is_enabled() {
	[ $enabled = 0 ] && return 1
	[ -f /tmp/vdr-nowatchdog ] && return 1

	return 0
}

VDR=/usr/bin/vdr

main() {
	log "Starting vdrwatchdog"
	run=1
	enabled=1
	while [ "${run}" = "1" ]; do
		if ! is_enabled; then
			run_child sleep 10
			continue
		fi

		pid=$(pidof -s ${VDR})
		if [ -n "${pid}" ]; then
			run_child wait_on_pid "${pid}"
			# pid exited, check at next loop
		else
			trigger_restart
		fi
	done
	log "Exiting vdrwatchdog"
}

main
