Windows7 + WEBrick + apcupsdで、UPSの状態をブラウザから確認する

APCUPSに接続されているWindows端末があり、他のWindows端末からそのUPSの状態を確認したいことがありました。

そこで、apcupsdを使ってブラウザから確認することを試してみました。
apcupsd | A daemon for controlling APC UPSes

 

環境

APCUPSが接続されている端末
  • 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

そこには

  • Apacheでの動作を確認
  • IISでもたぶん動く

との記載があったため、RubyWEBrickCGIを動かしてみることにしました。

 

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の状態が表示されます。

f:id:thinkAmi:20140820053419p:plain

一部文字化けがありますが、今回の用途ではあまり問題にならない部分なので、気にしないことにしました。

 

ソースコード

Gistにあげておきました。
Windows7 + WEBrick + apcupsdで、UPSの状態をブラウザから確認する

 

参考