以前、あるWindows端末に接続されているAPC製UPSの状態を、別の端末のブラウザから確認できるよう、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というエラーが出て正しく動作しないため、バージョンを下げています。
- 現時点で最新版の
PythonでCGIを動かす
Rubyの時はWEBrickを使いましたが、Pythonで同じようなものがないかを探したところ、標準ライブラリhttp.server.CGIHTTPRequestHandlerを使えば良さそうでした。
CGIHTTPRequestHandlerでは、カレントディレクトリ + cgi_directoriesがCGIディレクトリとして認識されます。そのため、スクリプト実行時に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()関数のソースコードやドキュメントを参考にして、自作しても良さそうです。
- test() | GitHub | cpython/server.py at 3.5 · python/cpython
- みんなのPython Webアプリ編 - PythonのスクリプトをWebサーバの中で動かす | TRIVIAL TECHNOLOGIES 4 @ats のイクメン日記
あとは、python execute_apcupsd_cgi.pyで起動し、
http://localhost:8080/cgi/multimon.cgihttp://localhost:8080/cgi/upsstats.cgi
などにアクセスして、ブラウザに表示されればOKです。
ソースコード
GitHubに上げました。execute_apcupsd_cgi.pyが今回のスクリプトファイルです。
thinkAmi-sandbox/apcupsd_python-sample