diff options
Diffstat (limited to '')
-rwxr-xr-x | heartbeat/WinPopup | 237 |
1 files changed, 237 insertions, 0 deletions
diff --git a/heartbeat/WinPopup b/heartbeat/WinPopup new file mode 100755 index 0000000..b48f3b9 --- /dev/null +++ b/heartbeat/WinPopup @@ -0,0 +1,237 @@ +#!/bin/sh +# +# Resource script for sending WinPopups using smbclient +# derived from Alan Robertson's MailTo script +# +# Author: Sandro Poppi <spoppi@gmx.de> +# +# Description: sends WinPopups to a sysadmin's workstation +# whenever a takeover occurs. +# +# OCF parameters are as below: +# OCF_RESKEY_hostfile +# +# where "hostfile" is a file containing the IPs/Workstation names +# one by line to be sent WinPopups +# +# License: GNU General Public License (GPL) + +WINPOPUPFILE=${HA_VARRUN}/WinPopup +####################################################################### +# Initialization: + +# Source function library. +: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat} +. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs + +# Parameter defaults + +OCF_RESKEY_hostfile_default="hosts" + +: ${OCF_RESKEY_hostfile=${OCF_RESKEY_hostfile_default}} + +####################################################################### + +us=`uname -n` + +usage() { + echo "Usage: $0 {start|stop|status|monitor|validate-all|meta-data}" +} + +meta_data() { + cat <<END +<?xml version="1.0"?> +<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd"> +<resource-agent name="WinPopup" version="1.0"> +<version>1.0</version> + +<longdesc lang="en"> +Resource script for WinPopup. It sends WinPopups message to a +sysadmin's workstation whenever a takeover occurs. +</longdesc> +<shortdesc lang="en">Sends an SMB notification message to selected hosts</shortdesc> + +<parameters> +<parameter name="hostfile" unique="0" required="1"> +<longdesc lang="en"> +The file containing the hosts to send WinPopup messages to. +</longdesc> +<shortdesc lang="en">Host file</shortdesc> +<content type="string" default="${OCF_RESKEY_hostfile_default}" /> +</parameter> +</parameters> + +<actions> +<action name="start" timeout="30s" /> +<action name="stop" timeout="30s" /> +<action name="status" depth="0" timeout="10s" interval="10s" /> +<action name="monitor" depth="0" timeout="10s" interval="10s" /> +<action name="validate-all" timeout="5s" /> +<action name="meta-data" timeout="5s" /> +</actions> +</resource-agent> +END +} + +sendWinPopup() { + # if workstation file exists and is not zero + if [ -s "$hostfile" ] ; then + subject=$1 + shift + + for i in `cat $hostfile` ; do + echo "$subject $*" | smbclient -M $i >/dev/null 2>&1 + done + else + ocf_log err "Workstation file $hostfile missing or corrupt!" + return $OCF_ERR_ARGS + fi + + return $? +} + +SubjectLine() { + case $1 in + ??*) echo $1;; + *) echo "Resource Group";; + esac +} + + +WinPopupStart() { + + Subject="`SubjectLine $2` Takeover in progress on $us" + + if sendWinPopup "$Subject" $1; then + touch $WINPOPUPFILE + return $? + else + return $? + fi + +} + +WinPopupStop () { + Subject="`SubjectLine $2` Reestablishing original master connection in progress on $us" + + if sendWinPopup "$Subject" $1; then + rm -f $WINPOPUPFILE + return $? + else + return $? + fi + +} + +WinPopupStatus () { + ocf_log warn "Don't stat/monitor me! WinPopup is a pseudo resource agent, so the status reported may be incorrect" + if [ -f $WINPOPUPFILE ]; then + echo "running" + return $OCF_SUCCESS + else + echo "stopped" + return $OCF_NOT_RUNNING + fi +} + +# A not reliable IP address checking function, which only picks up those _obvious_ violations... +# +# It accepts IPv4 address in dotted quad notation, for example "192.168.1.1" +# +# 100% confidence whenever it reports "negative", +# but may get false "positive" answer. +# +CheckIP() { + ip="$1" + case $ip in + *[!0-9.]*) #got invalid char + false;; + .*|*.) #begin or end by ".", which is invalid + false;; + *..*) #consecutive ".", which is invalid + false;; + *.*.*.*.*) #four decimal dots, which is too many + false;; + *.*.*.*) #exactly three decimal dots, candidate, evaluate each field + local IFS=. + set -- $ip + if + ( [ $1 -le 254 ] && [ $2 -le 254 ] && [ $3 -le 254 ] && [ $4 -le 254 ] ) + then + true + fi + ;; + *) #less than three decimal dots + false;; + esac + return $? # This return is unnecessary, this comment too :) +} + +WinPopupValidateAll () { + if [ ! -s "$hostfile" ] ; then + ocf_log err "Workstation file $hostfile missing or corrupt!" + return $OCF_ERR_ARGS + fi + + # What kind of hostfiles are valid? + # We stick to the definition that, a hostfile is valid if and only if it + # contains at least one valid host to send WinPopup message to. + +# have_valid_host=no + for host in `cat $hostfile`; do + nmblookup $host 2>&1 | grep -q "failed to find name $host\>" + if [ $? -ne 0 ]; then +# have_valid_host=yes + return $OCF_SUCCESS + fi + # $host is not a netbios name, an IP address maybe? + if CheckIP "$host"; then +# have_valid_host=yes + return $OCF_SUCCESS + fi + done + + ocf_log err "Workstation file $hostfile contains no valid host!" + return $OCF_ERR_CONFIGURED +} + +if + ( [ $# -ne 1 ] ) +then + usage + exit $OCF_ERR_ARGS +fi + +# See how the environment virables were set. +hostfile=${OCF_RESKEY_hostfile} + +case "$1" in + meta-data) + meta_data + exit $OCF_SUCCESS + ;; + start) + WinPopupStart + ;; + stop) + WinPopupStop + ;; + + # Not quite sure what to do with this one... + status|monitor) + WinPopupStatus + ;; + validate-all) + WinPopupValidateAll + ;; + usage) + usage + exit $OCF_SUCCESS + ;; + *) + usage + exit $OCF_ERR_UNIMPLEMENTED + ;; +esac + +exit $? |