以前、ある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.cgi
http://localhost:8080/cgi/upsstats.cgi
などにアクセスして、ブラウザに表示されればOKです。
ソースコード
GitHubに上げました。execute_apcupsd_cgi.py
が今回のスクリプトファイルです。
thinkAmi-sandbox/apcupsd_python-sample