Note: "permalinks" may not be as permanent as we would like,
direct links of old sources may well be a few messages off.
Hello!
This is my second try. Some days ago this mail did not make it to the
list. The original poster mentioned that the information helped him a
lot, so I'm trying again to share with you all.
> If it cannot ping switches it means that all its ethernet cards or
> all switches are broken so it shutdown itself.
> If it can ping switches it means that other primary is broken so it
> tries to stonith it.
You probably will need linux-ha/heartbeat for this.
I run a similar setup, and cannot change the hardware or the way it
works for various reasons. So I wrote a linux-ha resource-agent some
time ago. You have to check if you can adapt it to your situation. It
basically behaves like:
1. We want to go primary and cannot reach our peer
2. Can we ping a gateway/router/switch?
If YES:
3. Return true and let heatbeat continue to initialize the services
If NO:
3. Return false and let heartbeat stop it's efforts to initialize the
services
You will have to familiarize yourself with heartbeat, but it can
supply the functionality that you're asking for.
hth,
juergen
The Script:
==============
#!/bin/bash
#
# ipcheck
#
#
# ATTENTION: IF YOU USE HEARTBEAT IN A NETWORK CONFIGURATION IN WHICH
# IT SEEMS AS IF YOU NEED THIS TYPE OF SUPPORT SCRIPT, IT IS
# HIGHLY ADVISED THAT YOU FIX YOUR NETWORK AND DO NOT USE
# THIS.
#
# This is a resource script for heartbeat. It is used to check if
routers
# or gateways are up/reachable via icmp ping when the heartbeats are
sent
# over an ip network.
# This should prevent the slave(s) to become active when the routers or
# gateways are unreachable.
#
#
#
# VERSION HISTORY
#
# 2007-03-16 Initial version
#
#
# Written by Juergen Scholz <juergen at kernkraft400.com>
# licenced under the GPL v3 or newer
#
# For information about the requirements of this script see:
# http://linux-ha.org/HeartbeatResourceAgent
##################
### CONFIGURATION#
##################
HARESOURCES=/etc/ha.d/haresources
PING=/bin/ping
DEBUG=off
##################
### FUNCTIONS #
##################
function get_primary_host {
cat $HARESOURCES | grep -v '#' | head -n 1 | cut -d" " -f1
}
function get_hostname {
# sed probably isn't necessary
hostname | sed -r s/[[:space:]]//
}
function test_address {
# Let's see if the network is reachable
# ping parameters:
# -One ping response to exit
# \- Unfortunately this does not work with GNU ping
# -Numeric output
# -i Wait
# -Count
# -Timeout
$PING -n -i 1 -c 3 -t 4 $1 > /dev/null 2>&1
PING_RET_VAL=$?
if [ $PING_RET_VAL != "0" ]; then
return 1
fi
return 0
}
function debug_echo {
# Print one argument at a time
while (($#))
do
echo -n "$1 "
shift
done
# Add the trailing new-line
echo
}
function check_ping {
# Check if $PING is set correctly
if [ ! -x $PING ]; then
echo
echo "The \$PING variable is set to to $PING, but the file does
not exist or is not executable."
echo
exit 1
fi
}
function check_arguments {
# Check amount of arguments
# We need at least one destination and a command
if [ $1 -lt 2 ]; then
help
exit 1
fi
}
function check_master_slave {
# Always exit this with 0 (success) if called on the primary machine
# since we want the master to be serving when the network to the
backup
# isn't functioning
if [ `get_hostname` = `get_primary_host` ]; then
if [ $DEBUG = "on" ]; then
echo This is the PRIMARY host. Exiting with 0.
fi
exit 0
else
if [ $DEBUG = "on" ]; then
echo This is a SECONDARY host. Checking network.
fi
fi
}
function help {
echo 'Usage: ipcheck destination [ destination ... ] (start|stop|
status)'
echo
echo ' destination: hostname or ip address'
echo
echo ' This will always return 0 for stop and status.'
}
##################
### MAIN ROUTINE #
##################
# Tell the user we're in debug mode
if [ $DEBUG = "on" ]; then
echo $0 in debug mode...
fi
# Little sanity checks
check_ping
check_arguments $#
# Get the command out of the last supplied argument
eval CMD='${'$#'}'
if [ $DEBUG = "on" ]; then
echo We have been called with command: $CMD
fi
# Look for the 'start', 'stop' or status argument
case "$CMD" in
# START
start)
if [ $DEBUG = "on" ]; then
echo Our hostname: `get_hostname`
echo The primary hostname: `get_primary_host`
fi
check_master_slave
# Test all the supplied addresses
let LAST_DEST_ARG=$#-1
for i in `seq 1 $LAST_DEST_ARG`; do
if [ $DEBUG = "on" ]; then
echo -n Testing address $i : $1
fi
test_address $1
TEST=$?
if [ $TEST -eq 0 ]; then
if [ $DEBUG = "on" ]; then
echo ' ...successful.'
fi
else
if [ $DEBUG = "on" ]; then
echo ' ...failed.'
echo Exiting with 1.
fi
exit 1
fi
# make the next argument available as $1
shift
done
# Since the for loop was executed we assume that everything is ok.
if [ $DEBUG = "on" ]; then
echo Everything seems to be reacheable.
echo Exiting with 0.
fi
exit 0
# end of start)
;;
# STOP
stop)
if [ $DEBUG = "on" ]; then
echo Exiting with 0.
fi
exit 0
;;
# end of stop
# STATUS
stop)
if [ $DEBUG = "on" ]; then
echo Exiting with 1.
fi
exit 1
;;
# end of status
# EVERYTHING ELSE
*)
help
exit 1
;;
esac