#!/bin/sh
#
# This script will attempt to request the db test page of a number of OpenACS
# servers. If a server doesn't respond then a configurable restart shell command will
# be executed. The restart command may for example send an email alert and/or log to some
# log file and then restart the server. The URLs of the servers to monitor and their
# restart commands are expected to be in a config file named keepalive-config.tcl 
# in the same directory as this script
#
# If you're having problems with this script, you should look at this thread:
# http://openacs.org/forums/message-view?message_id=260846
#
# @author Peter Marklund

# the next line restarts using tclsh, the trailing slash is intentional \
exec /usr/bin/tclsh "$0" "$@"

set script_dir [file dirname [info script]]

source $script_dir/keepalive-config.tcl

proc server_responds_p { server_url } {

    set script_dir [file dirname [info script]]
    set wget_file $script_dir/dbtest
    if { [file exists $wget_file] } {
        file delete -force $wget_file
    }

    catch {exec /usr/bin/wget -O $wget_file --tries=5 --timeout=7 ${server_url}/SYSTEM/dbtest}

    if { [file exists $wget_file] } {
          set wget_file_id [open $wget_file r]
          set wget_file_contents [read $wget_file_id]
          close $wget_file_id
          if { [regexp {success} $wget_file_contents] } {
              set responds_p 1
          } else {
              set responds_p 0
          }
      } else {
          set responds_p 0
      }

      return $responds_p
}

foreach {server_url restart_command} $servers_to_monitor {

    if { ![server_responds_p $server_url] } {
        if { [catch {eval exec $restart_command} errmsg] } {
	    catch { exec /bin/mail -s "${server_url} did not respond to a monitoring check and could not be restarted" $mailto }
        } else {
	    catch { exec /bin/mail -s "${server_url} did not respond to a monitoring check so it was restarted" $mailto }
	}
    }
}
