HULFT8のインストール～配信実行までのまとめ

## はじめに
記事の第2弾ということで、MQに引き続きHULFTをまとめました。
MQもHULFTも他システムとの接続を行うIFのMWで色々と苦労した覚えがあります…。

## ダウンロード
HULFTは以下のサイトからダウンロード可能です。
ダウンロードの際に、my HULFTへの登録が必要となります。

https://his.hulft.com/mypage/trial/trialCountrySelect/

本記事記載時は、8.5.2がダウンロード可能でした。
評価版は60日間という制約がついています。

ダウンロードの際に、「シリアル番号」と「プロダクトキー」が発行されますので、
忘れないよう控えておいてください。

## インストール
### OS情報
MQを構築した環境をそのまま使用していますので、
引き続きCentOSの8を使用しています。
```ruby:コマンド
cat /etc/os-release

NAME="CentOS Stream"
VERSION="8"
ID="centos"
~省略~
```
### ファイル確認&解凍
ダウンロードしたファイルの解凍を行うと、マニュアルなども入っています。
解凍した中に「hulft.tar」というファイルが格納されており、
この中にインストーラが入っております。

```ruby:コマンド
# ls -l hulft-unix-linux-v852.zip
-rw-r--r-- 1 root root 501860369  3月 28 11:34 hulft-unix-linux-v852.zip

# unzip hulft-unix-linux-v852.zip
Archive:  hulft-unix-linux-v852.zip
   creating: 32bit/
   creating: 32bit/aix_power/
  inflating: 32bit/aix_power/hulft.tar
   creating: 32bit/solaris_sparc/
  inflating: 32bit/solaris_sparc/hulft.tar
   creating: 32bit/linux_x86/
  inflating: 32bit/linux_x86/hulft.tar
   creating: 32bit/solaris_x86/
  inflating: 32bit/solaris_x86/hulft.tar
   creating: 32bit/hpux_ia/
  inflating: 32bit/hpux_ia/hulft.tar
～省略～

cd 64bit/linux_x86/

# ls -l hulft.tar
-rw-r--r-- 1 root root 30218240  5月 13  2022 hulft.tar

# tar -xvf hulft.tar
_hul_main
_etce
_etcs
_etc8
_etceng
_libhulcipher
installer
```

### サイレントインストール用情報ファイル作成
インストーラである、「installer」を実行するとGUIチックに対話式でインストール可能ですが、
今回はサイレントインストールを行いたいため、専用のファイルを作成します。
1から作成することも可能ですが、対話式でインストールする際に、
「./installer -r」というように「-r」オプションを使用すると、
情報ファイルを自動生成し、次回以降使いまわしてインストールすることが可能です。

今回は以下のように作成しました。
(「シリアル番号」と「プロダクトキー」は適当な値にしています。)

環境によって変える項目としては、以下などでしょうか。
詳細はHULFTのマニュアルに詳しく記載がありますので、
そちらをご確認お願いします。

https://www.hulft.com/help/ja-jp/HULFT-V8/UX-INS/Content/HULFT_INS_UNIX/preface.htm?tocpath=_____1

・SERIAL
・PRODUCTKEY
・HULPATH
・HULEXEP
・MYHOSTNAME
```
# cat installinfo.txt

SERIAL=1234567891234
PRODUCTKEY=ABCD1234EFGH5678IJKL91234
INSTALLATIONROUTE=CUSTOM
HULPATH=/usr/local/HULFT/etc
HULEXEP=/usr/local/HULFT/bin
INSTALLATIONTYPE=NEW
MYHOSTNAME=VM-TEST01
TMPDIR=/usr/local/HULFT/tmp
DATEFMT=1
HULLANG=JPN
CS4TRNSFR=UTF-8
```

### インストール
情報ファイルができたらコマンドを叩くだけです。
一瞬でインストールが完了します。

オプションの「-f」には先ほど作成した、インストール情報ファイルを指定してください。

https://www.hulft.com/help/ja-jp/HULFT-V8/UX-INS/Content/HULFT_INS_UNIX/MthdInstl/Ssetup_Execute.htm?tocpath=3.%20%E3%82%B5%E3%82%A4%E3%83%AC%E3%83%B3%E3%83%88%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%7C3.1%20%E3%82%B5%E3%82%A4%E3%83%AC%E3%83%B3%E3%83%88%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%AE%E6%89%8B%E9%A0%86%7C_____3

```ruby:コマンド
# ./installer -si -f ./installinfo.txt;echo $?
0
```

インストール完了後、マニュアルに記載のある通りHULFT関連の環境設定を行います。
今回はrootユーザのプロファイルに以下の情報を追記します。

HULFTインストール後に「HULPATH」配下に「hulft.bsh.profile」というような
変数が設定されたプロファイルが自動で作成されるため、こちらを読み込んでもよいと思います。
```ruby:.bash_profile
HULEXEP=/usr/local/HULFT/bin
export HULEXEP
PATH=/usr/local/HULFT/bin:$PATH
export PATH
HULPATH=/usr/local/HULFT/etc
export HULPATH
```

## HULFT起動
### 配信デーモンの起動
```ruby:コマンド
# hulsndd
```
### 集信デーモンの起動
```ruby:コマンド
# hulrcvd
```
### 要求受付デーモンの起動
```ruby:コマンド
# hulobsd
```

エラーなどが発生していなければ、無事デーモンが起動しているかと思います。
```ruby:コマンド
# ps -ef | grep hul
root       70693       1  0 12:26 pts/0    00:00:00 hulsndd
root       70714       1  0 12:28 pts/0    00:00:00 hulrcvd
root       70716       1  0 12:28 pts/0    00:00:00 hulobsd
```

## HULFT停止
### 配信デーモンの終了
```ruby:コマンド
# utlkillsnd
```
### 集信デーモンの終了
```ruby:コマンド
# utlkillrcv
```
### 要求受付デーモンの終了
```ruby:コマンド
# utlkillobs
```

## 各種定義作成
「utladmin」コマンドから管理コンソールを立ち上げGUIで編集することも可能なのですが、
そのあたりは既に他の方がやっているため、あえてファイルでの定義作成のみ記載します。

### 配信定義
今回はお試しでデフォルトから少し変更しています。
パラメータの詳細をいくつか代表で紹介します。

FILENAME：配信元のファイル名を記載
JOBID：正常終了後のジョブIDを記載
EJOBID：異常終了後のジョブIDを記載(今回はJOBIDと同じに設定)
PASSWORD：暗号通信用のパスワードを記載。集信側と同じにする必要があります。

```ruby:コマンド
#
# ID=TEST02
#

SNDFILE=TEST02
★FILENAME=/tmp/test.txt
DBID=
TRANSTYPE=B
TRANSPRTY=50
INTERVAL=0
BLOCKLEN=0
BLOCKCNT=0
COMP=N
★JOBID=JOB01
COMMENT=
GRPID=VM-TEST02
FMTID=
★EJOBID=JOB01
KJCHNGE=N
CLEAR=K
★PASSWORD=TESTPASS
CODESET=0
COMPSIZE=0
SHIFTTRANSACT=Y
PREJOBID=
DEFLATELEVEL=
END
```

### 集信定義
先ほどの配信定義と同様にパラメータを少し紹介します。

FILENAME：集信する際にファイル名を記載
PASSWORD：暗号通信用のパスワードを記載。先ほどの配信側と同じにしています。

```ruby:コマンド
#
# ID=TEST02
#

RCVFILE=TEST02
★FILENAME=/tmp/test.txt
OWNER=test
GROUP=test
PERM=666
TRANSMODE=R
ABNORMAL=D
RCVTYPE=S
JOBID=
COMMENT=
GRPID=
EJOBID=
GENCTL=N
★PASSWORD=TESTPASS
CODESET=0
JOBWAIT=T
GENMNGNO=0000
DATAVERIFY=0
END
```

### 転送グループ定義
配信定義と詳細ホストを紐づける転送グループの設定です。
私は経験上1転送グループで1ホスト名でしたが、
複数のホスト名を紐づけることで同時に配信できるらしいです。

```ruby:コマンド
#
# ID=VM-TEST02
#

GRP=VM-TEST02
SERVER DEF
 VM-TEST02
DEFEND
COMMENT=
END
```

### 詳細ホスト定義
今回は設定したホスト名以外デフォルトにしています。

```ruby:コマンド
#
# ID=VM-TEST02
#

HOST=VM-TEST02
HOSTTYPE=U
KCODETYPE=8
RCVPORT=30000
REQPORT=31000
COMMENT=
JISYEAR=1
CONNECTTYPE=L
MYPROXYNAME=
MYPROXYPORT=
HOSTSPSNUM=0
SENDPERMIT=Y
HULJOBPERMIT=Y
HULSNDRCPERMIT=Y
HULRJOBPERMIT=Y
ALLOWINSTTRANS=N
USRNOTIFY=N
HUL7MODE=N
END
```

### ジョブ定義
今回はHULFTで使用できる変数も紹介したいため、コマンドを直接記載しています。

FILENM：配信ファイル名(または集信ファイル名)をフルパスで取得
EDATE2：配信終了日(または集信終了日)をYYYYMMDD形式で取得
ETIME：配信終了時刻(または集信終了時刻)をHHMMSS形式で取得

使用できる変数の説明などは以下のマニュアルに記載があります。
https://www.hulft.com/help/ja-jp/HULFT-V8/UX-ADM/Content/HULFT_ADM/System/job_execution.htm

```ruby:コマンド
#
# ID=JOB01
#

# 例)「/tmp/test.txt」を正常/異常終了後に「/tmp/test.txt_YYYYMMDDHHMMSS」にファイル名を変更


JOB=JOB01
JOB DEF
 mv "${FILENM}" "${FILENM}_${EDATE2}${ETIME}"
DEFEND
COMMENT=
END
```

### 定義インポート
上記定義毎にファイル保存を行います。
例えば配信定義を「20240420_VM-TEST01_snd.txt」として保存した場合、
インポートコマンドは以下のようになります。

```ruby:コマンド
# -f:インポートする定義のファイル名を指定
# -r:各定義を新規IDとして登録するかのオプション。本オプションを使用しないと常に新規となる。
utliupdt -f ./20240420_VM-TEST01_snd.txt -r
```

### 定義エクスポート
先に定義ファイルの記載内容、インポートを紹介しましたが、
本来は定義からファイルをエクスポートしそのファイルを修正するほうが一般的かと思います。
今回はインストールから実施し、utladminでの登録を省略しているので
順番が逆になってしましました。

以下は配信定義を全てエクスポートするコマンドになります。
他の定義を抜きたい時は、「-i」に渡す値を変更してください。
```ruby:コマンド
# Usage:utligen -f filename -i {snd|rcv|job|hst|tgrp|fmt|mfmt|trg} -id ID
# -f:エクスポートする定義のファイル名を指定
# -i:どの定義(配信や集信など)をエクスポートするか指定
# -id:各定義のどのIDを対象とするか指定(*での一括エクスポートも可能)

utligen -f ./$(date '+%Y%m%d')_$(uname -n)_snd.txt -i snd -id '*'
```

## 配信実行
配信側を「VM-TEST01」、集信側を「VM-TEST02」としてファイルの送信を行います。

### 配信側定義確認
```ruby:コマンド
[root@VM-TEST01 ~]# utlidlist -i snd -id '*' -v8
<Sending Management Information Summary>
TEST02
           [TgrpID]    VM-TEST02
           [JobID]
           [ErrJobID]
           [PreJobID]
           [FMTID]
           [MFMTID]

[root@VM-TEST01 ~]# utlidlist -i hst -id '*' -v8
<Host Information Summary>
VM-TEST01
           [TgrpID]    VM-TEST01
VM-TEST02
           [TgrpID]    VM-TEST02

[root@VM-TEST01 ~]# utlidlist -i tgrp -id '*' -v8
<Transfer Group Information Summary>
VM-TEST01
           [HostName]  VM-TEST01
VM-TEST02
           [SendID]    TEST02
           [HostName]  VM-TEST02
```

### 集信側定義確認
```ruby:コマンド
[root@VM-TEST02 ~]# utlidlist -i rcv -id '*' -v8
<Receiving Management Information Summary>
TEST02
           [TgrpID]
           [JobID]
           [ErrJobID]
```

### 配信実行
HULFTのファイルの配信は「utlsend」コマンドで実行します。
その際オプションとして以下を付けています。

-sync：同期転送モードで配信します。(確か)本オプションを使用しないと、相手へのファイルの到達の有無に関わらず基本正常終了扱いになります。

-w：同期転送待ち時間となります。この値を省略すると、システム動作環境設定ファイルのソケットリードタイムアウトの値が使用されます。

```ruby:コマンド
utlsend -f TEST02 -sync -w 30
```

### 配信結果確認
配信結果は「utllist」コマンドで確認できます。
「STATUS」が「0000-0000」であれば正常に相手へもファイルの配信ができています。
```ruby:コマンド
[root@VM-TEST01 ~]# utllist -s -f TEST02
FILEID    HOST NAME START DAY   START TIME END TIME   RECORDS  STATUS   CONNECT
TEST02    VM-TEST0  2024/04/20  12:58:44   12:58:44          0 0000-0000   LAN
```

## 最後に
取り急ぎ分に起こしたのですが、また後日読み返してきれいに整えたいなと思います…。

## 参考サイト
・UNIX/Linux 導入 マニュアル
https://www.hulft.com/help/ja-jp/HULFT-V8/UX-INS/Content/HULFT_INS_UNIX/preface.htm

・UNIX/Linux オペレーション マニュアル
https://www.hulft.com/help/ja-jp/HULFT-V8/UX-OPE/Content/HULFT_OPE_UNIX/preface.htm

・ジョブ実行
https://www.hulft.com/help/ja-jp/HULFT-V8/UX-ADM/Content/HULFT_ADM/System/job_execution.htm

・【第2回】HULFT8 配信設定・集信設定・配信テスト(Linux)
https://qiita.com/asds0025/items/5373ae5248964c4cb4cc