APC製UPSに接続されているWindows端末があり、他のWindows端末からそのUPSの状態を確認したいことがありました。
そこで、apcupsdを使ってブラウザから確認することを試してみました。
apcupsd | A daemon for controlling APC UPSes
環境
APC製UPSが接続されている端末
- Windows7 x64
- APC製 smart-UPS 500 (SUA500JB)
- 付属シリアルケーブルにてWindows端末と接続
- apcupsd 3.14.12
- Ruby Installer 2.0.0p481
上記の端末に接続する端末の環境
apcupsdのセットアップ
インストール
公式サイトより、apcupsd-3.14.12のWindows版のダウンロードリンクから、Windowsバイナリをダウンロードします。
apcupsd | A daemon for controlling APC UPSes
ダウンロードしたファイルを実行すると、UACが表示されます。3.14.12のインストーラーにはOpen Source Developer, Adam Kropelin
という署名が入っていました。
Choose Components画面では、今回のシリアル接続では使わないUSB Driver
のチェックを外して進めます。
あとは、デフォルトのままインストールすれば、サービスの登録まで終わります。
apcupsd.confファイルの修正
apcupsd.confファイルのデフォルト設定ではUSB接続向けとなっています。
そのため、以下のファイルを修正します(デフォルトインストールの場合)。
C:\apcupsd\etc\apcupsd\apcupsd.conf
28,80,81行目あたりにある内容をシリアルポート向けに修正します。
UPSCABLE smart UPSTYPE apcsmart DEVICE COM1 # 端末によりCOMポート番号は異なる
修正が終わったら、apcupsdのサービス(Apcupsd UPS Monitor)を再起動しておきます。
WEBrickでapcupsdのCGIを動かす
公式サイトを見ると、3.14.7よりCGIプログラムが同梱されたとの記載がありました。
Using the CGI Programs on Windows - APCUPSD User Manual
そこには
との記載があったため、RubyのWEBrickでCGIを動かしてみることにしました。
Rubyスクリプトの作成
C:\apcupsd\cgi\server.rb
などと、適当なところにRubyスクリプトを作成します。
require 'webrick' DOCUMENT_ROOT = 'C:/apcupsd/cgi' server = WEBrick::HTTPServer.new({ DocumentRoot: DOCUMENT_ROOT, BindAddress: '0.0.0.0', Port: 10080 }) # DocumentRootに含まれる`.cgi`ファイルが、CGIで使うファイル cgi_files = Dir.entries(DOCUMENT_ROOT).select{ |f| File.extname(f) == '.cgi' } cgi_files.each {|cgi_file| server.mount(cgi_file, WEBrick::HTTPServlet::CGIHandler, File.join(DOCUMENT_ROOT, cgi_file)) } # とりあえずは、SIGINTとSIGTERMにのみ反応 %i[INT TERM].each {|signal| Signal.trap(signal){ server.shutdown } } server.start
なお、p Signal.list
による、シグナル名とシグナル番号は以下の通りでした。
{"EXIT"=>0, "INT"=>2, "ILL"=>4, "ABRT"=>22, "FPE"=>8, "KILL"=>9, "SEGV"=>11, "TERM"=>15}
WEBrickの起動
こんな感じでWEBrickを起動します。
C:\apcupsd\cgi>ruby server.rb
結果
http://localhost:10080/multimon.cgi にアクセスすると、以下のようにUPSの状態が表示されます。
一部文字化けがありますが、今回の用途ではあまり問題にならない部分なので、気にしないことにしました。
ソースコード
Gistにあげておきました。
Windows7 + WEBrick + apcupsdで、UPSの状態をブラウザから確認する