DSpace に Handle Server プラグインを組み込む


この文章は単なる作業メモであり、セキュリティ的に必ずしも適切でないところもあります。内容を鵜呑みにせず、ご自分の環境に合った設定をすることをお勧めします。

構築にあたって、マニュアルの一部を翻訳しました。こちらに置いてあります。

  1. 設置環境
    
    $ head -1 /etc/redhat-release
    CentOS release 5.3 (Final)
    $ rpm -q httpd apache-tomcat jdk
    httpd-2.2.3-22.el5.centos.2
    apache-tomcat-6.0.18-2.newbie
    jdk-1.6.0_12-fcs
    dspace-1.5.1
    

    以下、dspace-1.5.2 が設置されているディレクトリ(dspace.cfg:dspace.dir)を[dspace]と表記する。

  2. [dspace] 配下の調整

    handle servertomcat権限ではなく、[dspace]/bin/start-handle-serverスクリプトを動かすユーザの権限で動作する。 tomcatの動作とは関係しない。 たとえばserive tomcat stopすると DSpace のサービスは停止するが、(デフォルトでは TCP 8000 で動いている)handle serverは動き続ける。

    ここではdspaceユーザの権限でhandle serverを動かすことにする。 サービス停止するために(正確には停止するべき pid を探すために)root 権限が必要なので、dspace ユーザを /etc/sudoers に追加した。

    
    # visudo(下の1行を追加。実際にはさらに細かく設定することが望ましい)
    dspace  ALL=(ALL)   NOPASSWD: ALL
    

    [dspace]配下でdspaceユーザーからの書き込み権が必要なディレクトリがあるのでこれらを調整する。 特にlog配下はtomcatユーザからも書き込むと思われるので、パーミッションを共有するためにdspacetomcat グループに入れることにする。

    
    dspace@celica:~$ sudo /usr/sbin/usermod -G tomcat dspace
    dspace@celica:~$ id tomcat
    uid=621(tomcat) gid=621(tomcat) 所属グループ=621(tomcat)
    dspace@celica:~$ id dspace
    uid=622(dspace) gid=622(dspace) 所属グループ=622(dspace),621(tomcat)
    dspace@celica:~$ sudo chown -R dspace /usr/local/dspace
    dspace@celica:~$ sudo chgrp -R tomcat /usr/local/dspace
    
  3. handle server の設置

    handle server 用のディレクトリを用意する。今回は再設定だったので、バージョンは 2 とし、慣例に従ってディレクトリ名も svr_2 とした。

    
    dspace@celica:~$ mkdir -p /usr/local/dspace/hs/{bin,svr_2}
    dspace@celica:~$ ln -s /usr/local/dspace/ .
    

    バイナリを設置する。ダウンロード元はこちら

    
    dspace@celica:~$ tar xzf hdl6.2.5_02.tar.gz
    dspace@celica:~$ cd hdl6.2.5_02
    dspace@celica:~/hdl6.2.5_02$ cp *.jar ../dspace/hs/bin/
    
  4. dspace.cfg の調整

    関係しそうなパラメータは以下の通り。 これらが適当でも DSpace 単体では動くかもしれないが、handle server はまともに動かないので、正しいもの(外部から見えるリソース)で設定すること。

    
    dspace.dir = /usr/local/dspace
    # 外に見せる URL
    dspace.url = http://hs.example.com
    # 外に見せるホスト名(FQDN)
    dspace.hostname = hs.example.com
    dspace.name = Official Name
    mail.admin = admin@example.com
    log.dir = /usr/local/dspace/log
    # CNRIから割り当てられた番号
    handle.prefix = 99999
    # 作成したディレクトリ名に合わせる
    handle.dir = /usr/local/dspace/hs/svr_2
    

    ※ 各パラメータ値の後ろにスペースがあるだけで、以降のスクリプトがコケることもあったので注意。

  5. [dspace]/bin/make-handle-configスクリプトの調整と実行

    必要であれば調整する。今回は(必要ではなかったのかもしれないが)バージョン番号を上げるために

    
    echo "2" >>$tempfile  # Version/serial no. of site (default=1)
    

    の行を変更した。

    
    dspace@celica:~$ ./dspace/bin/make-handle-config
    

    これでうまくいけば、dspace/hs/svr_2配下に実行に必要なファイルが生成される。

    
    dspace@celica:~$ ls dspace/hs/svr_2/
    admpriv.bin  config.dct       error.log    privkey.bin   siteinfo.bin
    admpub.bin   contactdata.dct  handles.jdb  pubkey.bin    txns
    cache.jdb    dbtxns.log       nas.jdb      sitebndl.zip
    
    config.dct
    メインの設定ファイル
    sitebndl.zip
    CNRI に送付すべきファイル
  6. 起動

    以下のスクリプトを作成した:

    
    dspace@celica:~$ cat START_HANDLE_SERVER
    #!/bin/bash
    # 美乳、京眉(文字化け回避のおまじない)
    DSPACE=/usr/local/dspace
    $DSPACE/bin/start-handle-server
    sleep 3
    PID=`sudo netstat -tlnp|grep 8000|awk '{print $7}'|sed 's/\/java//'`
    if [ "$PID" != "" ]; then
        echo "Handle Server サービスを開始しました"
    else
        echo "Handle Server サービスを開始できませんでした"
        echo "$DSPACE/log/handle-server.log および"
        echo "$DSPACE/hs/svr_2/error.log を確認してください"
    fi
    
    
    dspace@celica:~$ ./START_HANDLE_SERVER
    Handle Server サービスを開始しました
    
  7. 動作確認

    以下のスクリプトを作成した:

    
    dspace@celica:~$ cat TRACE_HANDLE_SERVER
    #!/bin/bash
    ./dspace/bin/dsrun net.handle.apps.simple.HDLTrace 99999/242
    

    ただし本学の環境は、サーバ自体はプライベートアドレスが振られており、F/W の SNAT で外部公開している。 この場合、localhost からのトレーステストがうまくいかないので、グローバル IP とプライベート IP のマッピングテーブルを置いてやる必要がある(参照:4.18 I opened both ports (2641 and 8000) for my handle server, and handles resolve from outside of our firewall, but users inside the firewall cannot resolve them. What can I do? )。

    
    dspace@celica:~$ cat .handle/local_addresses
    123.456.789.1 10.12.1.1(IPアドレスの間はタブで区切ること)
    
    
    dspace@celica:~$ ./TRACE_HANDLE_SERVER
      sending HDL-UDP request (version=2.1; oc=1; rc=0; snId=0 caCrt noAuth 0.NA/99999 [HS_SITE, HS_SERV, ] [ ]) to 38.100.138.131:2641
      sending HDL-TCP request (version=2.1; oc=1; rc=0; snId=0 caCrt noAuth 99999/242 [ ] [ ]) to 10.12.1.1:2641
        received HDL-TCP response: version=2.1; oc=1; rc=1; snId=0 caCrt noAuth 99999/242
        index=100 type=URL r-r- "http://hs.example.com/handle/99999/242"
    
      Got Response:
      version=2.1; oc=1; rc=1; snId=0 caCrt noAuth 99999/242
        index=100 type=URL r-r- "http://hs.example.com/handle/99999/242"
    
  8. 停止

    以下のスクリプトを作成した:

    
    dspace@celica:~$ cat STOP_HANDLE_SERVER
    #!/bin/bash
    sudo kill `sudo netstat -tlnp|grep 8000|awk '{print $7}'|sed 's/\/java//'` >& /dev/null
    if [ $? -eq 0 ]; then
        echo "Handle Server を停止しました"
    else
        echo "Handle Server は停止中です"
    fi
    
    dspace@celica:~$ ./STOP_HANDLE_SERVER
    Handle Server を停止しました
    
up