Version 23 (modified by michkawa, 6 years ago) (diff) |
---|
電子ログシステム & 画像ログシステム
KEK cERL/PF 加速器の運転のため、電子ログシステム(botlog)と画像ログシステム(PrintAnyServer)を開発した。
2018年加速器学会でも報告している(Abstract ページ 「Webベース電子ログ及び画像ログシステムの開発」WEP102)
使用方法
パッケージインストール
パッケージは以下のURLからダウンロードできる。インストールや運用は、サーバーシステム管理者でroot権限を持っていることを前提としている。
botlog & PrintAnyServer ソースパッケージ(2018/08/27版)
botlog & PrintAnyServer 設定パッケージ(2018/08/27版)
ソースパッケージはプログラムソースのみをまとめてあり、設定パッケージは、プログラムを実行するために必要な環境設定をまとめてある。
インストール環境
今回のインストールに使用したシステムは、
- Intel_x86_64
- CentOS 6.9(最新は6.10)
- インストールディスク: netinstall
- インストールパッケージ: desktop
- apache 2.2.x(CentOS 6.x標準)
のみで動作検証している。
これはパッケージ中に、コンパイル済の python2.7、epics_base とapache用 mod_wsgi.so が入っているためなので、
もし別のOSにインストールする場合には、これらを別途コンパイルするか、OSのpackageとpythonのpackageを自力でインストールする必要がある。
また、apache関連の設定も上書きするので、既存のサーバーにインストールする際には、一旦別ディレクトリに展開するなどの注意が必要。
なるべくなら新規のサーバーか仮想マシン上に展開するほうがいい。
このシステムは、Web画面表示用javascriptのほとんどをCDN(Content Delivery Network)経由で取得しているので、外部ネットワークから完全に隔離されたネットワークでは動作しない。
必ず、グローバルネットワークへ接続可能なネットワークで使用すること。
(この問題はいつかは解決する予定だが、現時点では優先順位は高くない。要望があれば連絡して欲しい。)
Webクライアント
現在開発に使用しているのは、主にWindows版chromeなので、これを推奨する。
firefox,edge,safariでもWeb画面の印刷機能以外は、動作を確認している。
IEは動作しないので、使用しないこと。
多分、ここ2~3年以内に更新されているHTML5対応のWebクライアントならば、ほとんどのものは使用可能だと思われるが、保証の限りではない。
パッケージ展開
電子ログシステム関連のプログラムのほとんどは、/opt/OperationLogに置くようにしてある。
追加/上書きされるディレクトリ一覧は、次のようになっている。
ソースパッケージの内容は、以下の様になっている。
/opt/OperationLog/botlog botlog本体 /PrintAnyServer PrintAnyServer本体 /data データ保存ディレクトリ /botlog botlog用DB /pas 画像保存用 /epics EPICS base R.14.12.7 /etc 環境設定用 /local 環境用プログラム(python2.7等) /log ログ保存ディレクトリ
設定パッケージの内容は、以下の様になっている。
/var/www/html 初期サイトディレクトリ /printView PrintAnyServer用ディレクトリ(/opt/OperationLog/PrintAnyServer/Printviewへのシンボリック) /etc/httpd/conf/httpd.conf apache 2.2用設定ファイル /conf.d/botlog.conf botlog用設定ファイル /conf.d/pas.conf PrintAnyServer用設定ファイル /etc/ld.so.conf.d/OperationLog.conf /opt/OperationLog/local/libを登録 /usr/lib64/httpd/modules/mod_wsgi.so /opt/OperationLog/local以下のpython2.7を使用するようにコンパイル済 /etc/selinux/targeted/contexts/files/file_contexts.local selinuxコンテキスト設定ファイル
環境も含めて一括で設定したい場合には、両方のパッケージを展開すれば、実行可能な状態になる。
設定環境を自分で構築する場合には、ソースパッケージのみを展開後、自分で設定を行う必要がある。
これらのパッケージをそのまま展開する場合には、rootで実行する必要がある。
[root@localhost ~]# tar zxvf botlog_pas_xxxxxx.tar.gz -C / [root@localhost ~]# tar zxvf botlog_pas_etc_xxxxxx.tar.gz -C /
展開後、ライブラリパスを設定し、/opt/OperationLog/local/libを使用可能にする。
[root@localhost ~]# ldconfig
selinuxの設定を行う。
[root@localhost ~]# restorecon -r /opt/OperationLog/
また、httpd(apache)のサービスを起動していない場合には、設定ファイルのチェック後にサービスを起動する。
[root@localhost ~]# apachtctl -t Syntax OK [root@localhost ~]# service httpd status httpd is stopped [root@localhost ~]# service httpd start Starting httpd: [ OK ] [root@localhost ~]# chkconfig --list httpd httpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off [root@localhost ~]# chkconfig httpd on [root@localhost ~]# chkconfig --list httpd httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
PrintAnyServerの起動
PrintAnyServerの本体は、httpdとは別のプロセスとして動作しているので、事前に起動させておく必要がある。
起動用のスクリプトを作成してあるが、まずはコマンドラインから起動して動作確認をする。
PrintAnyServerの起動は、通常はapacheユーザーで行う。apacheは通常はログインできないユーザーなので、rootになってからログイン。
[root@localhost ~]# su -s /bin/bash apache bash-4.1$ cd /opt/OperationLog/PrintAnyServer bash-4.1$ source /opt/OperationLog/etc/env.sh bash-4.1$ python2.7 printAnyServer.py conf/test.cfg Bottle v0.12.13 server starting up (using PasteServer())... Listening on http://0.0.0.0:9000/ Hit Ctrl-C to quit. serving on 0.0.0.0:9000 view at http://127.0.0.1:9000
正常に起動できれば、以上のようなメッセージが表示される。
動作確認
同一ネットワーク上のPCでWebブラウザを立ち上げて、それぞれhttp://(HOSTNAMEorIPADDR)/botlog/editとhttp://(HOSTNAMEorIPADDR)/printViewにアクセスすると画面が表示されるはずである。
下記の画面は、電子ログシステム起動後に入力した画面の例。
時々、ログを登録しても表示されない場合があるが、表示タイミングの問題なので、F5キーでWeb画面を更新すれば表示される。
画面を確認したら、PrintAnyServerは一旦CTRL+Cで終了しておく。
設定
この状態でも一般的な使用は可能なので、そのまま使っても問題はない。
botlog,PrintAnyServer共に設定を変更した際には、必ずhttpdを再起動する必要がある。
[root@localhost ~]# service httpd restart Stopping httpd: [ OK ] Starting httpd: [ OK ]
botlog
DB
デフォルトでは、sqlite3が動作確認用DBとして設定されている。
sqlite3のDBは単一ファイルなので、ファイルの保存ディレクトリを変更すればいい。
# sqlite3用DB設定 def getSqlite3Cfg(self): # file: db file # dbファイルのフルパスを設定 # * 作成したファイルとファイルのあるディレクトリのパーミッションは"777"にしておくか # Webサーバーのユーザー(通常はapache/apache)が読み書きできるようにしておくこと return {'file':'/opt/OperationLog/data/botlog/db/sqlite3/botlog.sqlite3'}
コメントにも書いてあるように、DBファイルとディレクトリのパーミッションは"777"にしないと動作しなくなるので注意。
DBをPostgreSQLに変更する場合には、
# DB種別設定 def getDbCfg(self): # type: [ sqlite3 | postgresql ] #return {'type':'sqlite3'} return {'type':'postgresql'} # postgresql用設定 # userは設定しないとhttpd user(apache)で書き込むので、 # DB管理用ユーザー(作成ユーザー)を設定すること def getPostgresqlCfg(self): return {'host':'localhost', <-- DBホスト 'port':5432, <-- 接続ポート番号 'db':'botlog', <-- DB名(これは変えなくてもいい) 'user':'logoper', <-- DB接続ユーザー名 'passwd':''} <-- DB接続パスワード
の設定を変更する。
PostgreSQL自体の設定はここでは説明しない。
セクション(グルーブ)設定
セクション名の設定は、SQLを直接実行するか、/opt/OperationLog/botlog/sql/[sqlite3|PostgreSQL]/section.sqlを編集したデータを各DB用のコンソールから設定する。
但し、idが0,1は特別な意味を持っているので、設定は変更しないこと。
データがない初期状態ならば、テーブルを一括で作成するスクリプトを作成しているので、それを利用すると一括でテーブルを再構築する。
このスクリプトは一度全てのテーブルを削除するので、消してもいいデータしかない場合以外は実行しないこと。
- sqlite3 の場合
[user@localhost ~]$ /opt/OperationLog/botlog/sql/sqlite3/createTable.sh /opt/OperationLog/data/botlog/db/sqlite3/botlog.sqlite3
- PostgreSQLの場合
PostgreSQLの場合には、DBへ接続するための設定をシェルスクリプト内に記述してから実行すること。
[user@localhost ~]$ /opt/OperationLog/botlog/sql/PostgreSQL/createTable.sh
テーブルがない状態でこれらのスクリプトを起動すると、いくつかエラーが表示されるが、無視してもいい。
PrintAnyServer
動作確認
PrintAnyServerは、サーバー起動後にWeb画面から画像を登録して動作を確認する。
まずは、rootになってから、apacheユーザーでPrintAnyServerを再起動する。
[root@localhost ~]# su -s /bin/bash apache bash-4.1$ cd /opt/OperationLog/PrintAnyServer bash-4.1$ source /opt/OperationLog/etc/env.sh bash-4.1$ python2.7 printAnyServer.py conf/test.cfg Bottle v0.12.13 server starting up (using PasteServer())... Listening on http://0.0.0.0:9000/ Hit Ctrl-C to quit. serving on 0.0.0.0:9000 view at http://127.0.0.1:9000
Web画面を起動し、クリップボードに画像を読み込んでから、"Paste clipboard image or Drop image file"上で右クリックして、"Paste"を選択する。
画像のサムネイルとキャプションが入力できるダイアログボックスが表示されるので、"登録"ボタンを押下する。
正常に動作すれば画像が表示され、/opt/OperationLog/data/pasに日付ディレクトリとindex_list.txtというファイルが作成される。
起動スクリプト
PrintAnyServerをprocServで起動するためのスクリプト"/opt/OperationLog/PrintAnyServer/bootPas.sh"を作成してあるので、通常運用時に使用して欲しい。
このスクリプトも必ずapacheユーザーで起動すること。
ファイルの内容は以下の通り。
#!/bin/sh USR=`whoami` if [ $USR != 'apache' ]; then echo 'execute apache only!' exit 1 fi TOP=/opt/OperationLog PROCSERV=$TOP/local/bin/procServ PYTHON=$TOP/local/bin/python PAS_TOP=$TOP/PrintAnyServer PAS=$PAS_TOP/printAnyServer.py PAS_CONFIG=$PAS_TOP/conf/test.cfg PROC_LOG=$TOP/log/pas/procServ.log PROC_PORT=20200 cd $PAS_TOP $PROCSERV -P $PROC_PORT -L $PROC_LOG $PYTHON $PAS $PAS_CONFIG
通常は、PAS_CONFIGで設定ファイルの名前を変更する程度だが、実際に使用する際には、環境に合わせてスクリプトの内容は変更してから使用すること。
PrintAnyServerを通常運用する場合には、以下のコマンドをcrontab の@rebootに設定するか /etc/rc.localに記述すると、サーバー起動時に自動的に実行されるようになる。
sudo -u apache /opt/OperationLog/PrintAnyServer/bootPas.sh
その他の設定
基本的な設定以外にも、クライアント用プログラムのダウンロード機能と同時印刷機能?があるが、これらは別ページで解説する。
EPICS record monitor
EPICS record monitor は、botlog用Web APIを使用した外部プログラムで、登録されているEPICSレコードに変化があった場合、botlogに自動的にメッセージを登録する。
監視するレコードとメッセージの関連付けは、pythonで記述し、1メッセージにつき、1ファイルを作成する必要がある。
プログラム本体は、/opt/OperationLog/botlog/tools/epicsRecordMonitorのepicsRecordMonitor.pyで、各設定は/opt/OperationLog/botlog/tools/epicsRecordMonitor/Modulesに設定する。
設定ファイル
設定ファイルは、/opt/OperationLog/botlog/tools/epicsRecordMonitor/test_ermi.pyをひな型にして作成し、/opt/OperationLog/botlog/tools/epicsRecordMonitor/Modulesに保存すれば、epicsRecordMonitor.pyを起動した際に読み込まれ、実行される。
# -*- coding: utf-8 -*- # """ このプログラムを EPICS Record Monitor 定義のひな型として使用すること 各設定に使用する場合に変更する箇所は、pvs変数とexecFunc関数 クラス名は変更しないこと """ from epicsRecordMonitorItem import * # # # class ermi(epicsRecordMonitorItemIF): # # クラスコンストラクタ # ここで使用するレコード名を設定 # def __init__(self): pvs = ['jane', 'fred'] # ここに使用するレコード名をリスト形式で設定 self.setPvs(pvs) # # メッセージ出力条件を記述 # 関数の引き数 pvs に関数実行時のデータが渡される # データの形式は辞書型を含んだリストで、構造は以下のようになっている # # [ # { # 'name' : record name, # 'prevVal': previos value, # 'val' : current value, # 'time' : record process time # }, # : # ] # # リストの順番はコンストラクタで設定した順番 # # 戻り値はメッセージのみを返すようにして、メッセージがない場合には None を返すこと # def execFunc(self, pvs): janePv = pvs[0] fredPv = pvs[1] rtn = None if janePv['val'] < fredPv['val'] and fredPv['prevVal'] != fredPv['val']: rtn = "fred is over jane!!!" return rtn
設定ファイルのチェック機能はまだ作成していないので、動作チェックは実際に動かしてみるしか方法が無い。
動作確認
動作テストは、/opt/OperationLog/botlog/tools/epicsRecordMonitor/test_ermi.pyをModulesにコピーして、プログラムを実行することで行う。
[user@localhost ~]$ source /opt/OperationLog/etc/env.sh [user@localhost ~]$ cd /opt/OperationLog/botlog/tools/epicsRecordMonitor [user@localhost epicsRecordMonitor]$ cp test_ermi.py Modules [user@localhost epicsRecordMonitor]$ python2.7 epicsRecordMonitor.py
プログラムを実行すると、botlogにInitial Disconnect Pvs:jane, fredというメッセージが表示される。
一旦プログラムを終了し、excasを別画面で起動する。
再度プログラムを起動し、test_ermi.pyに設定してある条件が満たされると、fred is over jane!!!というメッセージが追加される。
後は、Modules/test_ermi.pyを削除してから、設定ファイルを作成後にプログラムを実行すれば、メッセージが自動的にbotlogに追加される。
このプログラム用の起動スクリプトは作成していないので、ユーザーが作成すること。
Attachments (3)
- 2018_08_24_13_56_17.png (98.8 KB) - added by michkawa 6 years ago.
- 2018_08_24_13_55_40.png (78.2 KB) - added by michkawa 6 years ago.
- WEP102.pdf (1.1 MB) - added by michkawa 6 years ago.
Download all attachments as: .zip