apcupsd


今は個人用の安価なUPSもずいぶん出回っており、手軽にバックアップが行える時代になった。
ただしバックアップ装置を接続しただけでは停電を先送りにする効果しか無く、バッテリエンプティの前に商用電源が回復しなければPCはシャットダウンの手続きを踏むことなく無惨に電源が落ちることになる。
ではF&Fサーバの電源をブチッと切ってしまうと何が起こるかというと、ディスクの内容不整合が起きてファイルが壊れたりする。
それを防ぐにはUPSのバッテリがエンプティにならないうちにシステムをシャットダウンしなければいけない。
この制御を行うのがapcupsc(APCのUPS専用)だ。
APCのUPSには大きく分けて3種類ある。
一つはUSBインタフェースの付いたもの、もう一つはシリアルインタフェースの付いたもの、そしてsmartと名の付いていないI/Oのみのものだ。
シリアルインタフェースのものは2線(TxD/RxD/GND)だが、スタンダードなRS-232Cケーブルは使えないような端子配列なので自作するかウルトラ高い純正品を買う必要がある。
I/O方式はCTSやRTSをI/Oラインとして使う方法で、こちらも専用のケーブルが必要なので自作するのが良いだろう。
配線は4本、他に抵抗1本が必要だ。
apcupsdはこのいずれのインタフェースタイプにも対応している。
設定はapcupsd.confによって細かく行える。
このあたりは詳しいページがいくつもあるのでここでは触れないが、F&Fではメールで問い合わせるとapcaccessを実行してその内容をメールで返信してくれるようなスクリプトを作ったりしている。
インストールもportsなどを使えば簡単だが、FreeBSD7のF&Fの環境では/usr/local/etc/rc.d/apcusbdがうまく動作しなかった。
これが動いていないとapcaccessと当然動作しない訳なので、サーバの再起動時には必ず動くようにしておきたい。
簡単にやるなら/usr/local/etc/rc.d/の中にapcupsd.shでも作り、その中に/usr/local/bin/apcupsd --kill-on-powerfai
と書いておくだけでも良い。
--kill-on-powerfail オプションはシステムをシャットダウンした後でUPS自体の電源を切る指定だ。
こうすると商用電源復帰と共にサーバに電力が供給されるが、そうでない場合でUPSが生きているうちに商用電源が復帰した場合にはサーバは二度と起動できなくなる。
F&Fではapcaccessで得られる情報をMRTGに渡し、バッテリ電圧やライン電圧などをグラフ化している。
現状ではwwwサーバにUPSのインタフェースを接続しているのだが、一旦ノートPCで信号を受けてwindows用のapcupsdをマスターに使い、ネットワーク経由でunixサーバをシャットダウンさせることも出来る。
こうするとunixマシンにリセットをかける必要が生じた場合でも、WindowsマシンでUPSの電源を落としてそれに代えることが出来る。
この場合WindowsマシンがノートPCならばUPSが落ちてもPCは生きていられるのでUPSの状況を知ることが可能になる。
ルータやハブが落ちなければと言う条件付きではあるが、このWindowsPCにmobile2pcでもインストールしておけば出先から携帯電話経由でのコントロールが可能となる。
【追記】upsstats.cgiでグラフが表示されるが、この色合いが何とも上品ではないと思う。
これを修正するには src/cgi/upsimage.cをいじる。
色を追加する場合は、
static int green, black, white, grey, darkgrey, red
これを
static int green, black, white, grey, darkgrey, red, blue
こんな風にして、その下で色コードを指定する。
black = gdImageColorAllocate (im, 0, 0, 0);
blue = gdImageColorAllocate (im, 25, 50, 200); ←これを追加
green = gdImageColorAllocate (im, 0, 255, 0);
white = gdImageColorAllocate (im, 255, 255, 255);
grey = gdImageColorAllocate (im, 200, 200, 200);
darkgrey = gdImageColorAllocate (im, 50, 50, 50);
red = gdImageColorAllocate (im, 255, 0, 0);
後は実際のグラフ描画の所を変更する。
battpos = (int)(300 - (battcap * 3));
gdImageFilledRectangle(im, 75, battpos, 125, 300, blue); ←ここをblackからblueに変更
(void) snprintf(batttxt, sizeof(batttxt), "%.1f %%", battcap);
gdImageString(im, gdFontLarge, 70, 320, (unsigned char *)batttxt, black);
グラフはその種類分だけ定義部分があるので全てを修正する必要がある。
もちろん意図的に一部だけにしても良いし、全部違う色を指定しても咎められない。

cgiはapcupsd.confの格納されているディレクトリ(/usr/local/etc/apcupsd)のapcupsd.cssを参照している。
したがってこのCSSで指定されている/指定出来る項は変更が出来る。
apcupsd.cssを直接変更してしまえばいい。
背景の設定やフォント設定もここで行う。