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