ウイングアークのSVF for PDF Ver9.2をDockerコンテナにする

# 概要

SVF製品においては、「[SVFクラウド](http://www.wingarc.com/cloud/svfc/)」がありますが、昔からあるシステムのお守りなどで、社内において、SVFサーバを動かす必要がある、といったところはあるように思います。

今回は、誰かに引継ぎも兼ねて、SVF for PDFをDockerコンテナにして動かす方法を書いておきます。
当然、[システム要件](http://www.wingarc.com/product/svf/lineup/system_v9.html#jump09)を満たすものではないので、開発用途・検証用途などで利用するものとしていることをご了承ください。

自分のお守りするシステムのあるバージョンは、SVF9.2で、
また違うバージョンは、SVF9.2sp3で、
最新の開発中のものは、SVF9.2sp6で・・・　という人に向いています。

# 用意するもの

SVF for PDF Ver9.2では、利用するにあたって、オンラインかオフラインでアクティべーションを行う必要があります。
このため、ライセンスキーなどは事前に入手しているものとします。

|キー|値の例|
|-----|----|
|LICENSE_KEY| SVF92-12345-67890-ABCDE-FGHIJ |
|EDITION_ID| OEM-SVF-XXX-XXXXX |


インストールに必要な資材については、媒体等で入手しているものとして進めます。
install_resources以下にこんな感じで用意しておきます。

```
install_resources
  ├── bin
  ├── conf
  ├── data
  ├── install.exe
  ├── install_other.sh
  ├── install_x64.sh
  ├── install_x86.sh
  ├── lib
  ├── license
  ├── logging.properties
  ├── ProductLicense
  ├── runtime
  ├── sample
  └── tools

```

# Dockerfile

用意するもので示した変数を--build-argで渡します。

```sh

docker build -t svf:9.2 --build-arg LISENCE_KEY=ライセンスキー --build-arg EDITION_ID=エディションID .
```


Dockerファイルはこのようになっています。

```Dockerfile

FROM centos:7

ARG LICENSE_KEY
ARG EDITION_ID

ENV FIT_PRODUCTS_BASE=/opt/SVFJP \
    OS_NAME=rhel \
    JAVA_HOME=/usr/lib/jvm/jre-1.7.0-openjdk \
    LICENSE_KEY=$LICENSE_KEY \
    EDITION_ID=$EDITION_ID \
    PRINTER_NAME=PDF \
    USE_SVF_JAVA_CONNECT_SERVER=1 \
    USE_PLUGABLE_DATABASE=1

COPY install_resources /tmp/SVF
COPY runSVF.sh /runSVF.sh

RUN \
   yum install -y java-1.7.0-openjdk && \
   useradd svf -m -d /home/svf && \
   echo 'svf:svf' |chpasswd && \
   mkdir $FIT_PRODUCTS_BASE && \
   chown -R svf:svf $FIT_PRODUCTS_BASE && \
   chown -R svf:svf /tmp/SVF && \
   chown svf:svf /runSVF.sh && \
   chmod +x /runSVF.sh && \
   yum clean all

USER svf

RUN \
   echo 'yes' > /tmp/response_file && echo 'yes' >> /tmp/response_file && \
   chmod +x /tmp/SVF/install_x64.sh && \
   /tmp/SVF/install_x64.sh < /tmp/response_file && \
   find $FIT_PRODUCTS_BASE/bin -name "*.sh" | xargs sed -i \ 
      -re 's|^(su -)|\# \1|g' && \
   rm -rf /tmp/SVF && \
   mkdir $FIT_PRODUCTS_BASE/tmp && \
   mkdir $FIT_PRODUCTS_BASE/log && \
   mkdir -p $FIT_PRODUCTS_BASE/svfjpd/form && \
   sed -i -e s#Default.TempDir=#Default.TempDir=${FIT_PRODUCTS_BASE}/tmp#g \
           $FIT_PRODUCTS_BASE/svfjpd/lib/vfreport.properties.ja && \
   sed -i -e s#SearchPath.Path=#SearchPath.Path=${FIT_PRODUCTS_BASE}/svfjpd#g \ 
           $FIT_PRODUCTS_BASE/svfjpd/lib/vfreport.properties.ja && \
   sed -i -e s#Debug.Debug=OFF#Debug.Debug=ON#g \ 
           $FIT_PRODUCTS_BASE/svfjpd/lib/vfreport.properties.ja && \
   sed -i -e s#Debug.LogDir=#Debug.LogDir=${FIT_PRODUCTS_BASE}/log#g  \
           $FIT_PRODUCTS_BASE/svfjpd/lib/vfreport.properties.ja && \
   sed -i -e s#defaultprinter=#defaultprinter=${PRINTER_NAME}#g \
           $FIT_PRODUCTS_BASE/svfjpd/lib/vfreport.printers.properties && \
   echo "${PRINTER_NAME}=vfreport.hoge.${PRINTER_NAME}.properties.ja" >> \
           $FIT_PRODUCTS_BASE/svfjpd/lib/vfreport.printers.properties && \
   cp $FIT_PRODUCTS_BASE/svfjpd/lib/vfreport.PDF.properties.ja \
      $FIT_PRODUCTS_BASE/svfjpd/lib/vfreport.hoge.${PRINTER_NAME}.properties.ja


WORKDIR $FIT_PRODUCTS_BASE

VOLUME $FIT_PRODUCTS_BASE/svfjpd/form

CMD exec /runSVF.sh

EXPOSE 515 4141 44081 44090

```

## Javaのバージョンについて

9.2（無印）は、Java8に対応していないため、Java7を入れておきます。

```
yum install -y java-1.7.0-openjdk && \
```

## svfユーザについて

SVF for PDFは、rootユーザではなく、専用のユーザを作成し、そのユーザで動かすこと、と言われておりますので、
svfユーザを作成し、svfユーザでインストール処理を行います。

```
useradd svf -m -d /home/svf && \
echo 'svf:svf' |chpasswd && \
```

## PDFプリンタの作成

SVF for PDFの8系のときは、インストール直後にPDFプリンタが１つ作成されていましたが、9.2ではインストール直後にプリンタは何も作成されていません。
そのため、PDFプリンタをファイルベースで作成しておきます。

```
echo "${PRINTER_NAME}=vfreport.hoge.${PRINTER_NAME}.properties.ja" >> \
      $FIT_PRODUCTS_BASE/svfjpd/lib/vfreport.printers.properties && \
cp $FIT_PRODUCTS_BASE/svfjpd/lib/vfreport.PDF.properties.ja \
   $FIT_PRODUCTS_BASE/svfjpd/lib/vfreport.hoge.${PRINTER_NAME}.properties.ja

```
## エラー対応

SVFのインストーラで、OS_NAMEが判定で使われていることから、centos:7ですがOS_NAMEを**rhel**としています。




# 起動用スクリプト

docker run/stop用のスクリプトとして runSVF.shを用意しました。
主にやっていることは3つです。

1. SVFのサーバプロセスを開始する前に、指定されたライセンスキーでオンラインアクティベーションを行う。
2. SVFサーバプロセスの開始する。
3. 終了コマンドを受信したら、指定されたエディションIDを指定して、ディアクティベーション処理とSVFサーバプロセスを終了する。

コンテナですので、動作するハードウェア環境は、その時々で変わるでしょうから、毎回アクティベーションするようにしています。
当然、許容されたライセンス数で動かしているものとしますが、使い終わったら消すのが良いですので、ディアクティベーション処理を終了時に走らせます。

## アクティベーション

```
echo "Activation"
${FIT_PRODUCTS_BASE}/ac/bin/lm_svf.sh activation ${LICENSE_KEY}
```

このようにしてライセンスキーを使い、アクティベーション処理を行います。

成功すると、以下のようなメッセージが出力されます。

```
Online Activation is successful.
```

キーが間違っていると、このようなメッセージになります。

```
Valid Activation Code is not registered.
```


## ディアクティベーション

`lm_svf.sh activation ライセンスキー` でアクティベーションなら、`lm_svf.sh deactivation ライセンスキー` で、ディアクティベーションできるかと思いきや、deactivationで使用するのは、エディションIDの方です。

edition_idはlm_svf.sh listとすることで、求めることができます。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/111676/34965e9d-6857-1e48-30e8-2b9e45fe1504.png)

Activatedな製品があれば（アクティべーションされていれば）、解除処理をします。

```sh

   ${FIT_PRODUCTS_BASE}/ac/bin/lm_svf.sh list | grep "(Activated)"

   if [ $? -eq 0 ]; then
       echo "SVF Licence Deactivation"
       ${FIT_PRODUCTS_BASE}/ac/bin/lm_svf.sh deactivation ${EDITION_ID}
   fi
```
## [TIPS] Oracle12c PDB対応

プラガブルなDBを使うとき、使わないときで接続文字列が変わるので、文字列の置換処理を行っています。

```sh

if [ "${USE_PLUGABLE_DATABASE}" = "1" ]; then
  sed -i -e "s#jdbc:oracle:thin:@{0}:{1}:{2}#jdbc:oracle:thin:@//{0}:{1}/{2}#g" \
    ${FIT_PRODUCTS_BASE}/svfjpd/lib/vfreport.properties.ja
else
   sed -i -e "s#jdbc:oracle:thin:@//{0}:{1}/{2}#jdbc:oracle:thin:@{0}:{1}:{2}#g" \
    ${FIT_PRODUCTS_BASE}/svfjpd/lib/vfreport.properties.ja
fi
```

## runSVF.sh

中身はこのようになっています。

```sh

#!/bin/bash

LOG_FILE=${FIT_PRODUCTS_BASE}/log/*

if [ ! -e ${FIT_PRODUCTS_BASE}/log/server.log ]; then
   touch ${FIT_PRODUCTS_BASE}/log/server.log
fi

########### SIGINT handler ############
function _closer() {
   echo "Stopping container."
   echo "SIGINT received, shutting down svf"

   ${FIT_PRODUCTS_BASE}/ac/bin/lm_svf.sh list | grep "(Activated)"

   if [ $? -eq 0 ]; then
       echo "SVF Licence Deactivation"
       ${FIT_PRODUCTS_BASE}/ac/bin/lm_svf.sh deactivation ${EDITION_ID}
   fi

   ${FIT_PRODUCTS_BASE}/bin/svf_shutdown.sh
}


###################################
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! #
############# MAIN ################
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! #
###################################

# Set handler
trap _closer SIGINT SIGTERM SIGKILL


echo "Activation"
${FIT_PRODUCTS_BASE}/ac/bin/lm_svf.sh activation ${LICENSE_KEY}


echo "replace startup environment"
sed -i -re s/USE_SVF_JAVA_CONNECT_SERVER=[01]/USE_SVF_JAVA_CONNECT_SERVER=${USE_SVF_JAVA_CONNECT_SERVER}/g \
   ${FIT_PRODUCTS_BASE}/bin/.startup_products

if [ "${USE_PLUGABLE_DATABASE}" = "1" ]; then
  sed -i -e "s#jdbc:oracle:thin:@{0}:{1}:{2}#jdbc:oracle:thin:@//{0}:{1}/{2}#g" \
    ${FIT_PRODUCTS_BASE}/svfjpd/lib/vfreport.properties.ja
else
   sed -i -e "s#jdbc:oracle:thin:@//{0}:{1}/{2}#jdbc:oracle:thin:@{0}:{1}:{2}#g" \
    ${FIT_PRODUCTS_BASE}/svfjpd/lib/vfreport.properties.ja
fi


echo "StartUp SVF"
${FIT_PRODUCTS_BASE}/bin/svf_startup.sh

tail -f ${LOG_FILE} &
childPID=$!
wait $childPID

```

# 制約

フォントの設定も本来は必要ですが、今回はスキップしています。
有償フォントを買って別途入れなければ帳票が出ない！というような人は厳しいです。


# 次回

今回作成したイメージをベースにして、サービスパックをあてたイメージの作成方法について書きたいと思います。