wiki:misc/botlog_pas

Version 21 (modified by michkawa, 15 months ago) (diff)

--

電子ログシステム & 画像ログシステム

KEK cERL/PF 加速器の運転のため、電子ログシステム(botlog)と画像ログシステム(PrintAnyServer)を開発した。
2018年加速器学会でも報告している(Abstract ページ 「Webベース電子ログ及び画像ログシステムの開発」WEP102)

使い方

使い方は記述中。

パッケージインストール

パッケージは以下のURLからダウンロードできる。インストールや運用は、サーバーシステム管理者でroot権限を持っていることを前提としている。

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 /

展開後、ライブラリパスを設定し、/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/edithttp://(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/epicsRecordMonitorepicsRecordMonitor.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.pyModulesにコピーして、プログラムを実行することで行う。

[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)

Download all attachments as: .zip