Hi all,

Had a fun time yesterday afternoon trying to make one machine supervise the 
shutdown of another.

The situation is this...

UPS, serial connection to server A, has server A and server B connected to 
power outlets.

The UPS in question will only talk to OpenUPSmartd, which is a single machine 
daemon, and the
documentation suggests that it is compatible with pretty much everything, 
however, the site
suggested (www.ups-software-download.com) has a pretty woeful selection of 
software, and i
didn't like the look of the linux version.

Anyway, OpenUPSmartd is the software you want.  Missing is a startup script...

[EMAIL PROTECTED]:~$ cat /etc/init.d/openupsmartd
#!/bin/sh

PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin

set -e

case "$1" in
  start)
    test -x /usr/local/bin/openupsmartd || exit 0

    nohup /usr/local/bin/openupsmartd > /var/log/openupsmartd.out 2>&1 &
    ;;
  stop)
    killall openupsmartd
    ;;
esac


You'll know it's working fine when you see this in syslog

Sep  6 12:41:59 serverA openupsmartd: IN:234.40V, FAULT:233.90V, OUT:231.30V, 
LOAD:13.00% ^I^I^I INFREQ:50.00hz, BATT:27.70V, TEMP:25.
00C, FLAGS 00001001 ^I^I^I ( FLAG_BEEPER FLAG_STANDBY  )

Now, this has to control 2 machines, not just this one...

link the configuration file from where it installs it to where it expects it
lrwxrwxrwx    1 root     root           31 Aug 15 13:44 /etc/openupsmart.conf 
-> /usr/local/etc/openupsmart.conf

and edit thus...
use_syslog=y
shutdown_command="/root/scripts/start_shutdown"
restore_command="/root/scripts/stop_shutdown"

serverA:~/scripts# cat start_shutdown
#!/bin/bash

nohup /sbin/shutdown -h +4 < /dev/null > /dev/null 2>&1 &
ssh [EMAIL PROTECTED]  /root/scripts/start_shutdown &
serverA:~/scripts# cat stop_shutdown
#!/bin/bash

nohup /sbin/shutdown -c < /dev/null > /dev/null 2>&1 &
ssh [EMAIL PROTECTED]  /root/scripts/stop_shutdown &

Now you need to set up an rsa key on serverB so that serverA can connect via 
ssh without a password.
There are numerous places this is described, i set up 2 accounts, "shutdown" and 
"noshutdown",
the first to initiate the shutdown of serverB, the second to stop it when/if 
the power is restored.
It's easier to grep for events in the log file this way.

Once done, you need these on serverB
serverB:~/scripts# cat start_shutdown
#!/bin/bash

nohup /sbin/shutdown -h +3 &
serverB:~/scripts# cat stop_shutdown
#!/bin/bash

nohup /sbin/shutdown -c &


Now create a shutdown group, make sure that shutdown (&noshutdown) are by 
default that group,
[EMAIL PROTECTED]:~$ id
uid=1130(shutdown) gid=1044(shutdown) groups=1044(shutdown)

and alter the permissions on /sbin/shutdown so it looks like this...

[EMAIL PROTECTED]:~$ ls -l /sbin/shutdown
-rwsr-x---    1 root     shutdown    17388 Sep  5 15:00 /sbin/shutdown

(that's 4750, NOT 4755)

make sure that only shutdown (&noshutdown) are in this group.

Now comes the tricky bit.

When shutdown is called with a delay, it creates a file called /etc/nologin 
which contains
the text displayed before the ssh daemon kicks you off.  If you have a later 
version of sysvinit,
you can modify /etc/pam.d/ssh to stop this behaviour.  Earlier versions of sshd 
have this built in,
and non-defeatable.  The upshot of this nasty behaviour is that once shutdown 
is called on serverB,
serverA can't log back in to stop this shutdown when/if power is restored.
What to do?

I used apt-src to install sysvinit tools and edited

src/shutdown.c like this...

        /* Give warnings on regular intervals and finally shutdown. */
        if (wt < 15 && !needwarning(wt)) warn(wt);
        while(wt) {
                if (wt <= 5 && !didnolog) {
//                      donologin(wt);
                        didnolog++;
                }
                if (needwarning(wt)) warn(wt);
                hardsleep(60);
                wt--;
        }

before installing.


Cheers, Rex

Reply via email to