What breed of UPS are you using?

If it's an APC there is apcupsd which is a good tool... I use it at home to monitor one ups and shutdown two boxes, and also on my workstation. We also use it at work on all our gear, both windows and Linux with a Linux master. It's also got a cutesy web admin screen thingy to monitor activity.

Even if you don't have an APC ups you can monitor 'dumb' signaling UPS's with it on a tty port.

Cheers, Me.

Rex Johnston wrote:
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