Hi Karl,

On Tue, Sep 22, 2009 at 12:06:06PM -0400, Karl W. Lewis wrote:
> As attachments, then.

Thanks.

A few comments on the implementation:

1. The logic for reboot and the subsequent status check doesn't
look entirely correct to me. On reboot, the node status goes
through the UP-DOWN-UP cycle. However, the get_status waits until
the host is UP. Now, depending on timing that may sometimes work
and sometimes not. In case the reboot operation is not quick
enough, the status check would immediately return. And if for
whatever reason reboot failed, i.e. the host never rebooted, the
status check would return success as well. So, I think you'd have
to wait for the status to be DOWN. And that is enough: it is not
up to stonith to guarantee that the node will be back (though
hopefully it should be).

2. is_host_up and is_host_down functions are the same. They
should invoke a common function to return/check the status. Also,
if you invoke them with parameter ($h) then that parameter should
be used.

3. The interface to get_status.sh is somewhat strange. The
expected status is passed in order to check the current status.
Why should the status depend on whatever one expects?

Finally, I edited the plugin a bit: the code to check the
prerequisites is consolidated and moved to the top; some
superfluous exit commands are removed; two if statements joined
in one; and probably some other minor stuff. The resulting script
is attached.

Cheers,

Dejan



> Karl
> 
> 
> On Tue, Sep 22, 2009 at 10:51 AM, Dejan Muhamedagic 
> <[email protected]>wrote:
> 
> > Hi,
> >
> > On Tue, Sep 22, 2009 at 09:39:00AM -0400, Karl W. Lewis wrote:
> > > On Mon, Sep 7, 2009 at 11:23 AM, Karl W. Lewis <[email protected]
> > >wrote:
> > >
> > > >
> > > >
> > > > On Mon, Sep 7, 2009 at 10:16 AM, Dejan Muhamedagic <
> > [email protected]>wrote:
> > > >
> > > >> Hi,
> > > >>
> > > >> On Wed, Aug 26, 2009 at 01:11:24PM -0400, Karl W. Lewis wrote:
> > > >> > On Wed, Aug 26, 2009 at 10:58 AM, Dejan Muhamedagic <
> > > >> [email protected]>wrote:
> > > >> >
> > > >> > > Hi,
> > > >> > >
> > > >> > > On Mon, Aug 24, 2009 at 11:35:15AM -0400, Karl W. Lewis wrote:
> > > >> > > > I don't know if anyone else is running Heartbeat/Pacemaker on an
> > > >> Egenera
> > > >> > > > BladeFrame, but if they are, these scripts might be useful to
> > help
> > > >> set up
> > > >> > > > stonith.
> > > >> > > >
> > > >> > > > The Egeneras use an IPMI arrangement to control the various
> > > >> processor
> > > >> > > > blades, and these routines take advantage of that.
> > > >> > >
> > > >> > > Did you try ipmilan or external/ipmi too?
> > > >> >
> > > >> >
> > > >> > I did not, but a quick review leads me to believe that the egenera
> > frame
> > > >> > does not count as an impi "device".   One might be able to make that
> > > >> work,
> > > >> > but you'd have to modify the ipmi script until it looked much like
> > this
> > > >> > example, or, you'd have to play very. very hard with the egnera
> > > >> c-blades,
> > > >> > and I can't imagine anyone would want to do that.
> > > >>
> > > >> Well, either they are IPMI compliant or not, i.e. our ipmi
> > > >> stonith modules should work without modifications. I think it's
> > > >> worth trying. At any rate, I think that this is a different
> > > >> solution worth pursuing, since it would reduce the configuration
> > > >> quite a bit.
> > > >>
> > > >
> > > > I've not forgotten this task, but it's been very busy at work and I'm
> > doing
> > > > more research.  The ipmi commands do not work the way I expected them
> > to,
> > > > (writing to "off" just resets the blade), so I'm looking at the native
> > > > Egenera PAN Manager commands.
> > > >
> > > >>
> > > >> > > > This may not be the best method of doing it, but it does appear
> > to
> > > >> work.
> > > >> > > > It is not fast.  What it lacks in speed, however, it makes up
> > for in
> > > >> > > > flexibility.  It can figure out which c-blade is the master, and
> > > >> then
> > > >> > > figure
> > > >> > > > out which p-blade is running the server to be stonithed, and
> > then
> > > >> > > stonith,
> > > >> > > > it.  The framework for this was an existing external stonith
> > script
> > > >> that
> > > >> > > I
> > > >> > > > simply modified to meet my needs.
> > > >> > > >
> > > >> > > > The two short shell scripts at the top need to live in
> > /root/bin/ on
> > > >> both
> > > >> > >
> > > >> > > I guess you wanted to say $HOME/bin. Note that the root user may
> > > >> > > not always have the same home directory. Perhaps it would be
> > > >> > > better to go with an absolute path such as /usr/local/bin.
> > > >> >
> > > >> >
> > > >> > I actually put them in root's directory with malice aforethought,
> > but
> > > >> now
> > > >> > that you've asked the question... I guess I can't defend that
> > decision.
> > > >>  I
> > > >> > use the user root because that's the only user on the c-blades under
> > > >> > egenera's setup.  One could add another user, but I can't advocate
> > > >> changing
> > > >> > the config of the c-blades.
> > > >> >
> > > >> >
> > > >> > >
> > > >> > >
> > > >> > > > control blades.  The cluster servers need to have ssh keys and
> > any
> > > >> > > required
> > > >> > > > firewall rules setup such that root on the cluster servers can
> > ssh
> > > >> to the
> > > >> > > > c-blades.
> > > >> > >
> > > >> > > There can be more than one? Is that covered in any way by the
> > > >> > > script, i.e. does it try all available?
> > > >> >
> > > >> >
> > > >> > Yes.  Just so.  There are two c-baldes; one is master and one is
> > > >> standby.  I
> > > >> > *think* that the master is the only one that can issue the ipmi
> > commands
> > > >> and
> > > >> > get a reaction.  I've not experimented with that, however.  (I hit a
> > > >> > solution that worked, and I stopped experimenting.)
> > > >>
> > > >> It would be good if you do some :) You don't want any surprises
> > > >> when it comes to fencing.
> > > >>
> > > >
> > > > Right.  Surprises are for Birthday Parties, presents, and such, not so
> > much
> > > > for servers.
> > > >
> > > > Karl
> > > >
> > > >
> > > >
> > > >>
> > > >> > The script tracks down
> > > >> > which of the two is  master and then talks to that server.  One
> > could
> > > >> avoid
> > > >> > that by giving both c-blades the same set of rsa host keys, and then
> > > >> just
> > > >> > talking to the virtual IP Address that the master blade, which ever
> > of
> > > >> the
> > > >> > two it is, is answering on.  Again, I am disinclined to modify the
> > > >> egenera
> > > >> > setup that way.  I tried telling ssh to ignore the key verification,
> > but
> > > >> it
> > > >> > still updates the knownhosts file when the script logs in, so it'll
> > > >> throw
> > > >> > errors the next time it tries if the master has moved.
> > > >>
> > > >> Right. Isn't there an option to tell ssh not to update the
> > > >> knownhosts file.
> > > >>
> > > >> > > > If anyone else is already doing this and has a better way, I'd
> > be
> > > >> happy
> > > >> > > to
> > > >> > > > hear about it.
> > > >> > > >
> > > >> > > > Karl
> > > >> > >
> > > >> > > > ### THESE TWO SHELL SCRIPTS ARE EXPECTED IN /root/bin ON BOTH
> > > >> c-blades
> > > >> > > > ### THAT WAY THE SCRPIT THAT FOLLOWS WILL WORK REGARDLESS OF
> > WHICH
> > > >> > > > ### EGENERA c-blade IS PAN-MASTER
> > > >> > > >
> > > >> > > > #!/bin/bash
> > > >> > > > # get_master.sh -  returns the name of the master control blade
> > in
> > > >> the
> > > >> > > > PAN.
> > > >> > > >
> > > >> > > > MASTER=`/opt/panmgr/bin/esh pan | grep ^c | grep Master | cut -c
> > 2`
> > > >> > > > echo "cblade-${MASTER}"
> > > >> > > > #CUT HERE
> > > >> #############################################################
> > > >> > > >
> > > >> > > > #!/bin/bash
> > > >> > > >
> > > >> > > > # get_processor_blade.sh - identifies the blade running a given
> > > >> pserver.
> > > >> > >
> > > >> > > This name doesn't exactly match the references in the script.
> > > >> >
> > > >> >
> > > >> >
> > > >> > :%s/_blade/-blade/
> > > >> >
> > > >> > I'm a lousy typist....
> > > >> >
> > > >> >
> > > >> >
> > > >> > >
> > > >> > >
> > > >> > > > BLADE=`/opt/panmgr/bin/esh pan | grep ^${1}`
> > > >> > > > echo ${BLADE} | sed -e "s/^.*MyBladeFrame\/\(.\)\(.\)
> > .*/a\1-\2/"
> > > >> > > > #CUT HERE
> > > >> #############################################################
> > > >> > > >
> > > >> > > > #!/bin/bash
> > > >> > > > #
> > > >> > > > # External STONITH module for Egenera.
> > > >> > > > #
> > > >> > > > # Copyright (c) 2004 SUSE LINUX AG - Lars Marowsky-Bree <
> > > >> [email protected]>
> > > >> > > > # Copyright (c) 2009 Karl W. Lewis <[email protected]>
> > > >> > > > # This program is free software; you can redistribute
> > > >> > > > #it and/or modify # it under the terms of version 2 of the GNU
> > > >> General
> > > >> > > > #Public License as # published by the Free Software Foundation.
> > > >> > > > #
> > > >> > > > # This program is distributed in the hope that it would be
> > useful,
> > > >> but
> > > >> > > > # WITHOUT ANY WARRANTY; without even the implied warranty of
> > > >> > > > # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
> > > >> > > > #
> > > >> > > > # Further, this software is distributed without any warranty
> > that it
> > > >> is
> > > >> > > > # free of the rightful claim of any third person regarding
> > > >> infringement
> > > >> > > > # or the like.  Any license provided herein, whether implied or
> > > >> > > > # otherwise, applies only to this software file.  Patent
> > licenses,
> > > >> if
> > > >> > > > # any, provided herein do not apply to combinations of this
> > program
> > > >> with
> > > >> > > > # other software, or any other product whatsoever.
> > > >> > > > #
> > > >> > > > # You should have received a copy of the GNU General Public
> > License
> > > >> > > > # along with this program; if not, write the Free Software
> > > >> Foundation,
> > > >> > > > # Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
> > > >> > > > #
> > > >> > > >
> > > >> > > > SSH_COMMAND="/usr/bin/ssh"
> > > >> > > >
> > > >> > > > #LOG=/var/log/egenera-stonith.log
> > > >> > > > #echo `date` >> $LOG
> > > >> > > > #echo $hostlist >> $LOG
> > > >> > > > #echo $1 >> $LOG
> > > >> > > > #echo $2 >> $LOG
> > > >> > > > #echo "executing--------------" >> $LOG
> > > >> > > >
> > > >> > > > # Rewrite the hostlist to accept "," as a delimeter for
> > hostnames
> > > >> too.
> > > >> > > > hostlist=`echo $hostlist | tr ',' ' '`
> > > >> > > >
> > > >> > > > is_host_up() {
> > > >> > > >   for j in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
> > > >> > > >   do
> > > >> > > >     if
> > > >> > > >       ping -w1 -c1 "$1" >/dev/null 2>&1
> > > >> > > >     then
> > > >> > > >       sleep 10
> > > >> > > >     else
> > > >> > > >       return 1
> > > >> > > >     fi
> > > >> > > >   done
> > > >> > > >   return 0
> > > >> > > > }
> > > >> > >
> > > >> > > This is from external/ssh and used only if the parameter
> > > >> > > livedangerously is set to yes. Doesn't strike me as a very robust
> > > >> > > way to check if a node is running. Is there another way? Using
> > > >> > > the cblades sounds like a most natural way.
> > > >> >
> > > >> >
> > > >> > Yes.  You're clearly right.  By way of excuse I'd claim I was rather
> > > >> > narrowly focused on getting a server fenced and therefore I ignored
> > > >> other
> > > >> > functions.  If you'll tolerate a "version 2, (or, I suppose v0.02),
> > I'll
> > > >> try
> > > >> > again.  It'll take me a few hours to fix and test, I'll try again.
> >  (A
> > > >> quick
> > > >> > experiment reveals that yes, the master blade does indeed know the
> > > >> status of
> > > >> > a given processor blade.)
> > > >>
> > > >> Great.
> > > >>
> > > >> > > > MASTER_BLADE=`$SSH_COMMAND cblade-1 "bin/get_master.sh" | tail
> > -1`
> > > >> > > >
> > > >> > > > case $1 in
> > > >> > > > gethosts)
> > > >> > > >         for h in $hostlist ; do
> > > >> > > >                 echo $h
> > > >> > > >         done
> > > >> > > >         exit 0
> > > >> > > >         ;;
> > > >> > > > on)
> > > >> > > >         for h in $hostlist
> > > >> > > >         do
> > > >> > > >           if
> > > >> > > >             [ "$h" != "$2" ]
> > > >> > > >           then
> > > >> > > >             continue
> > > >> > > >           else
> > > >> > > >                 P_BLADE=`$SSH_COMMAND $MASTER_BLADE
> > > >> > > "bin/get_processor-blade.sh $h"`
> > > >> > > >                 $SSH_COMMAND $MASTER_BLADE "echo 'please' >
> > > >> > > /proc/egenera/ipmi/node/$P_BLADE/control/on"
> > > >> > > >           fi
> > > >> > > >           sleep 30
> > > >> > > >           if
> > > >> > > >             is_host_up $h
> > > >> > > >           then
> > > >> > > >             exit 1
> > > >> > > >           else
> > > >> > > >             exit 0
> > > >> > > >           fi
> > > >> > > >         done
> > > >> > > >         exit 0
> > > >> > > >         ;;
> > > >> > > > off)
> > > >> > > >         for h in $hostlist
> > > >> > > >         do
> > > >> > > >           if
> > > >> > > >             [ "$h" != "$2" ]
> > > >> > > >           then
> > > >> > > >             continue
> > > >> > > >           else
> > > >> > > >                 P_BLADE=`$SSH_COMMAND $MASTER_BLADE
> > > >> > > "bin/get_processor-blade.sh $h"`
> > > >> > > >                 $SSH_COMMAND $MASTER_BLADE "echo 'please' >
> > > >> > > /proc/egenera/ipmi/node/$P_BLADE/control/off"
> > > >> > > >           fi
> > > >> > > >         done
> > > >> > > >         exit 0
> > > >> > > >         ;;
> > > >> > > > reset)
> > > >> > > >         for h in $hostlist
> > > >> > > >         do
> > > >> > > >           if
> > > >> > > >             [ "$h" != "$2" ]
> > > >> > > >           then
> > > >> > > >             continue
> > > >> > > >           else
> > > >> > > >                 P_BLADE=`$SSH_COMMAND $MASTER_BLADE
> > > >> > > "bin/get_processor-blade.sh $h"`
> > > >> > > >                 $SSH_COMMAND $MASTER_BLADE "echo 'please' >
> > > >> > > /proc/egenera/ipmi/node/$P_BLADE/control/nmi"
> > > >> > > >           fi
> > > >> > > >           sleep 20
> > > >> > > >           if
> > > >> > > >             is_host_up $h
> > > >> > > >           then
> > > >> > > >             exit 1
> > > >> > > >           else
> > > >> > > >             exit 0
> > > >> > > >           fi
> > > >> > > >         done
> > > >> > > >         exit 1
> > > >> > > >         ;;
> > > >> > >
> > > >> > > on), off), and reset) cases are very similar, they should be made
> > > >> > > to share some code. Also, the sleep values look too ephemeral for
> > > >> > > my taste. There should be a relatively tight loop to check the
> > > >> > > host status.
> > > >> > >
> > > >> >
> > > >> > I'm not sure yet what to do about the "ephemeral" sleep values.  I
> > chose
> > > >> > arbitrarily long waits because egenera blades take a surprisingly
> > long
> > > >> time
> > > >> > to boot.  Your point is well taken, however, the code can be
> > improved.
> > > >>
> > > >> Looking forward to it :)
> > > >>
> > > >> > > > status)
> > > >> > > >         if
> > > >> > > >           [ -z "$hostlist" ]
> > > >> > > >         then
> > > >> > > >           exit 1
> > > >> > > >         fi
> > > >> > > >         for h in $hostlist
> > > >> > > >         do
> > > >> > > >           if
> > > >> > > >             ping -w1 -c1 "$h" 2>&1 | grep "unknown host"
> > > >> > >
> > > >> > > The status should return the status of the device, not the status
> > > >> > > of a node.
> > > >> >
> > > >> >
> > > >> > ??  I must have misunderstood the existing code.  Hmmmmm.  The
> > status of
> > > >> > this device is always "0" if there's a hostlist and if $MASTER_BLADE
> > is
> > > >> set,
> > > >> > I think.
> > > >>
> > > >> And if the c-blade is reachable. Something like
> > > >> "ssh $MASTER_BLADE true" should do.
> > > >>
> > > >> > Thank you for taking the itme to look this over.  I'll clean it up
> > some
> > > >> and
> > > >> > try again.
> > > >>
> > > >> Many thanks.
> > > >>
> > > >> Cheers,
> > > >>
> > > >> Dejan
> > > >>
> > > >> > Be well,
> > > >> >
> > > >> > Karl
> > > >> >
> > > >> > >
> > > >> > >
> > > >> > > Cheers,
> > > >> > >
> > > >> > > Dejan
> > > >> > >
> > > >>
> > > >
> > > >
> > > I've cleaned this up some, and reworked much of it.  It has been tested
> > in
> > > production for a couple of weeks now, and it works properly as near as I
> > can
> > > tell.  (It has properly restarted a misbehaving server.)
> > >
> > > I could not see a way to get the existing IPMI script to work with
> > Egenera,
> > > and  I have abandoned using anything other than native Egenera commands
> > to
> > > control the blades.  These scripts require that ssh keys are set up for
> > user
> > > root between the cluster servers and the c-blades.
> >
> > OK.
> >
> > > Code:
> >
> > Can you please send the scripts as attachments. The mail agents
> > kill the formatting.
> >
> > > #The two bash scripts here at the top go on each of the Egenera C-Blades.
> > > #the STONITH module goes in /usr/lib/stonith/plugins/external/egenera on
> > > #each of the servers in the cluster.
> >
> > These two scripts will go to the doc part of the package.
> >
> > Cheers,
> >
> > Dejan
> >
> > > ############################### cut here
> > > ######################################
> > > #!/bin/bash
> > > # get_status.sh -  returns the status of a pServer, given the LPAN and
> > > pServer
> > >
> > > #called as:
> > > # get_status.sh pServer LPAN_Name UP
> > > # or
> > > # get_status.sh pServer LPAN_Name DOWN
> > > #depending on what you want.  This only works of the pServer is running
> > the
> > > PAN Agent
> > > #because until the agent comes up, the server does not count as "Up"
> > >
> > > if [ ${3} = "UP" ]
> > > then
> > >         CONDITION=`/opt/panmgr/bin/esh pserver -l ${2}/${1} | grep ^${1}
> > |
> > > grep "Booted" | grep "Up"`
> > >         if [ -z "${CONDITION}" ]
> > >         then
> > >                 echo "Down" # No Joy
> > >         else
> > >                 echo "Up" # Joy!
> > >         fi
> > > else # it should be the case that ${3} = "DOWN"
> > >         CONDITION=`/opt/panmgr/bin/esh pserver -l ${2}/${1} | grep ^${1}
> > |
> > > grep "Shutdown"`
> > >         if [ -z "${CONDITION}" ]
> > >         then
> > >                 echo "Up" #  No Joy
> > >         else
> > >                 echo "Down" # Joy!
> > >         fi
> > > fi
> > >
> > > ############################### cut here
> > > ######################################
> > >
> > > #!/bin/bash
> > > # get_master.sh -  returns the name of the master control blade in the
> > PAN.
> > >
> > > MASTER=`/opt/panmgr/bin/esh pan | grep ^c | grep Master | cut -c 2`
> > > echo "cblade-${MASTER}"
> > >
> > > ############################### cut here
> > > ######################################
> > >
> > > #!/bin/bash
> > > #
> > > # External STONITH module for Egenera pServers.
> > > #
> > > # Copyright (c) 2004 SUSE LINUX AG - Lars Marowsky-Bree <[email protected]>
> > > # Copyright (c) 2009 Karl W. Lewis <karl.w.lewis - AT - gmail.com>
> > > #
> > > # This program is free software; you can redistribute it and/or modify
> > > # it under the terms of version 2 of the GNU General Public License as
> > > # published by the Free Software Foundation.
> > > #
> > > # This program is distributed in the hope that it would be useful, but
> > > # WITHOUT ANY WARRANTY; without even the implied warranty of
> > > # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
> > > #
> > > # Further, this software is distributed without any warranty that it is
> > > # free of the rightful claim of any third person regarding infringement
> > > # or the like.  Any license provided herein, whether implied or
> > > # otherwise, applies only to this software file.  Patent licenses, if
> > > # any, provided herein do not apply to combinations of this program with
> > > # other software, or any other product whatsoever.
> > > #
> > > # You should have received a copy of the GNU General Public License
> > > # along with this program; if not, write the Free Software Foundation,
> > > # Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
> > > #
> > >
> > > SSH_COMMAND="/usr/bin/ssh -q -x -n -l root"
> > > GET_MASTER="/root/bin/get_master.sh"
> > > GET_STATUS="/root/bin/get_status.sh"
> > > PSERVER_COMMAND="/opt/panmgr/bin/esh pserver"
> > >
> > > #These TIMEOUT values were obtained from the 'pserver -l pan/pserver'
> > > command
> > > # on a given Egenera frame under "Timeouts"  YMMV.
> > >
> > > BOOT_TIMEOUT=270
> > > REBOOT_TIMEOUT=450
> > > SHUTDOWN_TIMEOUT=180
> > >
> > > TIMEOUT=${REBOOT_TIMEOUT}
> > > STATUS="UNKNOWN"
> > >
> > > #LOG=/var/log/egenera-stonith.log
> > > #echo `date` >> ${LOG}
> > > #echo ${hostlist} >> ${LOG}
> > > #echo ${lpan_name} >> ${LOG}
> > > #echo $1 >> ${LOG}
> > > #echo $2 >> ${LOG}
> > > #echo "executing--------------" >> ${LOG}
> > >
> > > # Rewrite the hostlist to accept "," as a delimeter for hostnames too.
> > > hostlist=`echo ${hostlist} | tr ',' ' '`
> > >
> > > is_host_up() {
> > >     TIME=$((${TIMEOUT}/5))
> > >     for j in 1 2 3 4 5 6
> > >     do
> > >         STATUS=`${SSH_COMMAND} ${MASTER_BLADE} "${GET_STATUS} ${h}
> > > ${lpan_name} UP"`
> > >         if [ "${STATUS}" = "Down" ]
> > >         then
> > >             sleep ${TIME}
> > >         else
> > >             SYSTEM_STATUS="On Target"
> > >             return 1
> > >         fi
> > >     done
> > >     return 0
> > > }
> > >
> > > is_host_down() {
> > >     TIME=$((${TIMEOUT}/5))
> > >     for j in 1 2 3 4 5 6
> > >     do
> > >         STATUS=`${SSH_COMMAND} ${MASTER_BLADE} "${GET_STATUS} ${h}
> > > ${lpan_name} DOWN"`
> > >         if [ "${STATUS}" = "Up" ]
> > >         then
> > >             sleep ${TIME}
> > >         else
> > >             SYSTEM_STATUS="On Target"
> > >             return 1
> > >         fi
> > >     done
> > >     return 0
> > > }
> > >
> > > MASTER_BLADE=`${SSH_COMMAND} cblade-1 "${GET_MASTER}" | tail -1`
> > >
> > > if [ -z "${MASTER_BLADE}" ]
> > > then
> > >     MASTER_BLADE=`${SSH_COMMAND} cblade-2 "${GET_MASTER}" | tail -1`
> > > fi
> > >
> > > case ${1} in
> > > gethosts)
> > >     for h in ${hostlist}
> > >     do
> > >         echo ${h}
> > >     done
> > >     exit 0
> > >     ;;
> > > on|off|reboot)
> > >     for h in ${hostlist}
> > >     do
> > >         if [ "${h}" != "${2}" ]
> > >         then
> > >             continue
> > >         else
> > >             if [ "${1}" = "on" ]
> > >             then
> > >                 CMD="--boot"
> > >             elif [ "${1}" = "off" ]
> > >             then
> > >                 CMD="--shutdown --force"
> > >             else #must be "reboot"
> > >                 CMD="--reboot --force"
> > >             fi
> > >             ${SSH_COMMAND} ${MASTER_BLADE} "${PSERVER_COMMAND} ${CMD}
> > > ${lpan_name}/${h}"
> > >             if [ "${1}" = "on" ]
> > >             then
> > >                 TIMEOUT=${BOOT_TIMEOUT}
> > >             elif [ "${1}" = "reboot" ]
> > >             then
> > >                 TIMEOUT=${REBOOT_TIMEOUT}
> > >             else
> > >                 TIMEOUT=${SHUTDOWN_TIMEOUT}
> > >             fi
> > >             if [ "${1}" = "off" ]
> > >             then
> > >                 is_host_down ${h}
> > >             else
> > >                 is_host_up ${h}
> > >             fi
> > >         fi
> > >         if [ "${SYSTEM_STATUS}" = "On Target" ]
> > >         then
> > >             exit 0
> > >         else
> > >             exit 1
> > >         fi
> > >     done
> > >     exit 1 # We got here only if the host was not in the list....
> > >     ;;
> > > status)
> > >     if [ -z "${hostlist}" ] || [ -z "${lpan_name}" ] || [ -z
> > > "${MASTER_BLADE}" ]
> > >     then
> > >         exit 1
> > >     fi
> > >     exit 0
> > >     ;;
> > > getconfignames)
> > >     echo "hostlist lpan_name"
> > >     exit 0
> > >     ;;
> > > getinfo-devid)
> > >     echo "Egenera STONITH device"
> > >     exit 0
> > >     ;;
> > > getinfo-devname)
> > >     echo "Egenera STONITH external device"
> > >     exit 0
> > >     ;;
> > > getinfo-devdescr)
> > >     echo "Egenera-based Linux host reset"
> > >     exit 0
> > >     ;;
> > > getinfo-devurl)
> > >     echo "http://www.egenera.com";
> > >     exit 0
> > >     ;;
> > > getinfo-xml)
> > >     cat << EGENERAXML
> > > <parameters>
> > > <parameter name="hostlist" unique="1" required="1">
> > > <content type="string" />
> > > <shortdesc lang="en">
> > > Hostlist
> > > </shortdesc>
> > > <longdesc lang="en">
> > > The list of hosts that the STONITH device controls
> > > </longdesc>
> > > </parameter>
> > > <parameter name="lpan_name" unique="1" required="1">
> > > <content type="string" />
> > > <shortdesc lang="en">
> > > LPAN_Name
> > > </shortdesc>
> > > <longdesc lang="en">
> > > The name of the LPAN that the cluster blades, that this STONITH device
> > > controls, live in
> > > </longdesc>
> > > </parameter>
> > > </parameters>
> > > EGENERAXML
> > >     exit 0
> > >     ;;
> > > *)
> > >     exit 1
> > >     ;;
> > > esac
> > > _______________________________________________
> > > Linux-HA mailing list
> > > [email protected]
> > > http://lists.linux-ha.org/mailman/listinfo/linux-ha
> > > See also: http://linux-ha.org/ReportingProblems
> > _______________________________________________
> > Linux-HA mailing list
> > [email protected]
> > http://lists.linux-ha.org/mailman/listinfo/linux-ha
> > See also: http://linux-ha.org/ReportingProblems
> >




> _______________________________________________
> Linux-HA mailing list
> [email protected]
> http://lists.linux-ha.org/mailman/listinfo/linux-ha
> See also: http://linux-ha.org/ReportingProblems
#!/bin/bash
#
# External STONITH module for Egenera pServers.
#
# Copyright (c) 2004 SUSE LINUX AG - Lars Marowsky-Bree <[email protected]>
# Copyright (c) 2009 Karl W. Lewis <karl.w.lewis - AT - gmail.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of version 2 of the GNU General Public License as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it would be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
# Further, this software is distributed without any warranty that it is
# free of the rightful claim of any third person regarding infringement
# or the like.  Any license provided herein, whether implied or
# otherwise, applies only to this software file.  Patent licenses, if
# any, provided herein do not apply to combinations of this program with
# other software, or any other product whatsoever.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write the Free Software Foundation,
# Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
#

SSH_COMMAND="/usr/bin/ssh -q -x -n -l root"
GET_MASTER="/root/bin/get_master.sh"
GET_STATUS="/root/bin/get_status.sh"
PSERVER_COMMAND="/opt/panmgr/bin/esh pserver"

#These TIMEOUT values were obtained from the 'pserver -l pan/pserver' command
# on a given Egenera frame under "Timeouts"  YMMV.

BOOT_TIMEOUT=270
REBOOT_TIMEOUT=450
SHUTDOWN_TIMEOUT=180

#LOG=/var/log/egenera-stonith.log
#echo `date` >> ${LOG}
#echo ${hostlist} >> ${LOG}
#echo ${lpan_name} >> ${LOG}
#echo $1 >> ${LOG}
#echo $2 >> ${LOG}
#echo "executing--------------" >> ${LOG}

# Rewrite the hostlist to accept "," as a delimeter for hostnames too.
hostlist=`echo ${hostlist} | tr ',' ' '`

is_host_up() {
    TIME=$((${TIMEOUT}/5))
    for j in 1 2 3 4 5 6
    do
        STATUS=`${SSH_COMMAND} ${MASTER_BLADE} "${GET_STATUS} ${h} ${lpan_name} 
UP"`
        if [ "${STATUS}" = "Down" ]
        then
            sleep ${TIME}
        else
            SYSTEM_STATUS="On Target"
            return 1
        fi
    done
    return 0
}

is_host_down() {
    TIME=$((${TIMEOUT}/5))
    for j in 1 2 3 4 5 6
    do
        STATUS=`${SSH_COMMAND} ${MASTER_BLADE} "${GET_STATUS} ${h} ${lpan_name} 
DOWN"`
        if [ "${STATUS}" = "Up" ]
        then
            sleep ${TIME}
        else
            SYSTEM_STATUS="On Target"
            return 1
        fi
    done
    return 0
}

MASTER_BLADE=`${SSH_COMMAND} cblade-1 "${GET_MASTER}" | tail -1`

if [ -z "${MASTER_BLADE}" ]
then
    MASTER_BLADE=`${SSH_COMMAND} cblade-2 "${GET_MASTER}" | tail -1`
fi

if [ -z "${MASTER_BLADE}" ] 
then
        echo "the master blade was not found, please check your environment"
        exit 1
fi

if [ -z "${lpan_name}" ]
then
        echo "lpan_name is not set"
        exit 1
fi

if [ -z "${hostlist}" ]
then
        echo "hostlist is not set"
        exit 1
fi

case ${1} in
gethosts)
    for h in ${hostlist}
    do
        echo ${h}
    done
    ;;
on|off|reboot)
    for h in ${hostlist}
    do
        if [ "${h}" != "${2}" ]
        then
            continue
        else
            if [ "${1}" = "on" ]
            then
                CMD="--boot"
                TIMEOUT=${BOOT_TIMEOUT}
            elif [ "${1}" = "off" ]
            then
                CMD="--shutdown --force"
                TIMEOUT=${SHUTDOWN_TIMEOUT}
            else #must be "reboot"
                CMD="--reboot --force"
                TIMEOUT=${REBOOT_TIMEOUT}
            fi
            ${SSH_COMMAND} ${MASTER_BLADE} "${PSERVER_COMMAND} ${CMD} 
${lpan_name}/${h}"
            if [ "${1}" = "off" ]
            then
                is_host_down ${h}
            else
                is_host_up ${h}
            fi
        fi
        [ "${SYSTEM_STATUS}" = "On Target" ]
                exit
    done
    exit 1 # We got here only if the host was not in the list....
    ;;
status)
        ${SSH_COMMAND} ${MASTER_BLADE} true
    ;;
getconfignames)
    echo "hostlist lpan_name"
    ;;
getinfo-devid)
    echo "Egenera STONITH device"
    ;;
getinfo-devname)
    echo "Egenera STONITH external device"
    ;;
getinfo-devdescr)
    echo "Egenera-based Linux host reset"
    ;;
getinfo-devurl)
    echo "http://www.egenera.com";
    ;;
getinfo-xml)
    cat << EGENERAXML
<parameters>
<parameter name="hostlist" unique="1" required="1">
<content type="string" />
<shortdesc lang="en">
Hostlist
</shortdesc>
<longdesc lang="en">
The list of hosts that the STONITH device controls
</longdesc>
</parameter>
<parameter name="lpan_name" unique="1" required="1">
<content type="string" />
<shortdesc lang="en">
LPAN_Name
</shortdesc>
<longdesc lang="en">
The name of the LPAN that the cluster blades, that this STONITH device 
controls, live in
</longdesc>
</parameter>
</parameters>
EGENERAXML
    ;;
*)
    exit 1
    ;;
esac

_______________________________________________
Linux-HA mailing list
[email protected]
http://lists.linux-ha.org/mailman/listinfo/linux-ha
See also: http://linux-ha.org/ReportingProblems

Reply via email to