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

以前、あるWindows端末に接続されているAPCUPSの状態を、別の端末のブラウザから確認できるよう、Rubyを使って実装しました。
Windows7 + WEBrick + apcupsdで、UPSの状態をブラウザから確認する - メモ的な思考的な

 
今回は、Pythonを使って同じことを試してみました。

なお、apcupsdのセットアップ方法については上記のエントリと同じため、省略します。

 

環境

  • Windows10 x64
  • Python 3.5.1 32bit
  • apcupsd 3.14.12
    • 現時点で最新版の3.14.14では、multimon.cgiを実行した時にError: Cannot open hosts fileというエラーが出て正しく動作しないため、バージョンを下げています。

 

PythonCGIを動かす

Rubyの時はWEBrickを使いましたが、Pythonで同じようなものがないかを探したところ、標準ライブラリhttp.server.CGIHTTPRequestHandlerを使えば良さそうでした。

CGIHTTPRequestHandlerでは、カレントディレクトリ + cgi_directoriesCGIディレクトリとして認識されます。そのため、スクリプト実行時にos.chdir()でカレントディレクトリを変更しておく必要があります。
How to set the DocumentRoot while using python's HTTPServer? - Stack Overflow

 
実際のコードは以下の通りです。

execute_apcupsd_cgi.py

from http.server import CGIHTTPRequestHandler, test
import os

def main():
    os.chdir("C:/apcupsd")
    CGIHTTPRequestHandler.cgi_directories = ["/cgi"]
    test(HandlerClass=CGIHTTPRequestHandler, port=8080)

if __name__ == "__main__":
    main()

 
なお、今回はhttp.server.test()を使いましたが、test()関数のソースコードやドキュメントを参考にして、自作しても良さそうです。

 
あとは、python execute_apcupsd_cgi.pyで起動し、

  • http://localhost:8080/cgi/multimon.cgi
  • http://localhost:8080/cgi/upsstats.cgi

などにアクセスして、ブラウザに表示されればOKです。

 

ソースコード

GitHubに上げました。execute_apcupsd_cgi.pyが今回のスクリプトファイルです。
thinkAmi-sandbox/apcupsd_python-sample