RockyLinux8.5 で Delegate を動かす

## Delegate の入手
***

・  以下からソースコードをダウンロードします。

http://www.delegate.org/anonftp/DeleGate/


## Delegate のコンパイル
***

### makeの実施
ファイルを展開し、makeします。
```
# cd /var/tmp
# tar xvf delegate9.9.13.tar.gz
# cd delegate9.9.13
# make
```
makeを実施すると、以下のエラーが発生して、コンパイルが失敗します。
```
In file included from readycc.c:2:
readycc.c: 関数 ‘int ready_cc(FILE*)’ 内:
../include/fpoll.h:15:30: エラー: ‘FILE’ {aka ‘struct _IO_FILE’} has no member named ‘_egptr’
 #define READYCC(fp)     (fp->_egptr - fp->_gptr)
                              ^~~~~~
readycc.c:8:14: 備考: in expansion of macro ‘READYCC’
  else return READYCC(fp);
              ^~~~~~~
../include/fpoll.h:15:43: エラー: ‘FILE’ {aka ‘struct _IO_FILE’} has no member named ‘_gptr’
 #define READYCC(fp)     (fp->_egptr - fp->_gptr)
                                           ^~~~~
readycc.c:8:14: 備考: in expansion of macro ‘READYCC’
  else return READYCC(fp);
              ^~~~~~~
readycc.c: 関数 ‘int ready_CC(FILE*)’ 内:
../include/fpoll.h:15:30: エラー: ‘FILE’ {aka ‘struct _IO_FILE’} has no member named ‘_egptr’
 #define READYCC(fp)     (fp->_egptr - fp->_gptr)
                              ^~~~~~
readycc.c:13:8: 備考: in expansion of macro ‘READYCC’
  rcc = READYCC(fp);
        ^~~~~~~
../include/fpoll.h:15:43: エラー: ‘FILE’ {aka ‘struct _IO_FILE’} has no member named ‘_gptr’
 #define READYCC(fp)     (fp->_egptr - fp->_gptr)
                                           ^~~~~
readycc.c:13:8: 備考: in expansion of macro ‘READYCC’
  rcc = READYCC(fp);
        ^~~~~~~
make[4]: *** [Makefile.go:41: readycc.o] エラー 1
make[4]: ディレクトリ '/var/tmp/delegate9.9.13/rary' から出ます
make[3]: *** [Makefile:7: libx] エラー 2
make[3]: ディレクトリ '/var/tmp/delegate9.9.13/rary' から出ます
mkmake: ERROR LOG is left at /var/tmp/delegate9.9.13/rary/mkmake.err
mkmake: ERROR LOG is left at /var/tmp/delegate9.9.13/rary/mkmake.err
make[2]: *** [Makefile.go:1111: ../lib/library.a] エラー 2
make[2]: ディレクトリ '/var/tmp/delegate9.9.13/src' から出ます
make[1]: *** [Makefile:376: start0] エラー 2
make[1]: ディレクトリ '/var/tmp/delegate9.9.13/src' から出ます
mkmake: ERROR LOG is left at /var/tmp/delegate9.9.13/src/mkmake.err
mkmake: ERROR LOG is left at /var/tmp/delegate9.9.13/src/mkmake.err
make: *** [Makefile:77: all] エラー 2
```

そのため、以下の2つのファイルを修正し、再度、makeを実施します。
* delegate9.9.13/include/fpoll.h
* delegate9.9.13/include/ystring.h


### 修正1
delegate9.9.13/include/fpoll.h の 7行目の次に以下を追加
```C
#define _LIBIO_H
```
### 修正2 
delegate9.9.13/include/ystring.h の 1502行目の次に以下を追加

```C
#pragma GCC diagnostic ignored "-Wparentheses"
#pragma GCC diagnostic ignored "-Wcomment"
#pragma GCC diagnostic ignored "-Wunused-result"
#pragma GCC diagnostic ignored "-Wunused-value"
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
#pragma GCC diagnostic ignored "-Wformat-extra-args"
#pragma GCC diagnostic ignored "-Wnarrowing"
#pragma GCC diagnostic ignored "-Wstringop-overflow=" // for Pi
```

#### 参照情報
[https://stackoverflow.com/questions/62140615/failed-compile-delegate-raspbian](https://stackoverflow.com/questions/62140615/failed-compile-delegate-raspbian)


### 再度、makeの実施
```
# make
```

### Delegateの起動確認
Delegateが使用するポート(TCPの8080)を開放します。
```
# firewall-cmd --zone=public --add-port=8080/tcp --permanent
# firewall-cmd --reload
```

Delegateを起動します。
```
#　cd src
# ./delegated -P8080
```
以下のメッセージが表示され、起動することが出来ないです。
```  
-- ERROR: can't link the SSL/Crypto library.
-- Hint: use -vl option to trace the required library,
--- find it (ex. libssl.so.X.Y.Z) under /usr/lib or /lib,
--- then set the library version as DYLIB='+,lib*.so.X.Y.Z'
<DeleGate/9.9.13> [3941] -P8080 READY
```

Delegateは、OpenSSL 1.1.x 以前の関数で実装されているため、1.0.xで廃止された関数でエラーとなるみたいです。そのため、OpenSSLの1.0.2uを別途準備して、Delegateを起動できるようにします。

##  OpenSSL 1.0.2uのソースコードの取得
***
以下からOpenSSL 1.0.2uのソースコードを取得します。

https://www.openssl.org/source/old/1.0.2/

OpenSSL 1.0.2uをコンパイルします。

以下のコマンドを実施します。
```
# cd /var/tmp
# tar xvf openssl-1.0.2u.tar.gz
# cd openssl-1.0.2u
# ./config shared
# make
# make install
```

OpenSSＬ 1.0.2uは以下に格納されます。

/usr/local/ssl/bin/openssl

OpenSSLのライブラリは以下に格納されます。

/usr/local/ssl/lib

## Delegateの配置
***
### install.shファイルの修正
delegate9.9.13/install.shファイルを修正して、インストール先を変更します。

``` 
変更前 INST=inst　
変更後 INST=/opt
```
### installの実施
install を実施します。

```
# make install
# ./install
```

### OpenSSL 1.0.2uライブラリのシンボリックリンクの作成
/opt/dg9_9_13/DGROOT/lib フォルダに openssl のライブラリのシンボリックリンクを作成します。

```
# ln -s /usr/local/ssl/lib/libcrypto.so.1.0.0 /opt/dg9_9_13/DGROOT/lib/libcrypto.so
# ln -s /usr/local/ssl/lib/libssl.so.1.0.0 /opt/dg9_9_13/DGROOT/lib/libssl.so
```

### Delegateの起動確認

以下のコマンドを実施します。
```
# /opt/dg9_9_13/DGROOT/bin/dg9_9_13 -P8080
```

コマンドを実施すると以下のメッセージが表示されます。

```
#### loading default conf: /opt/dg9_9_13/DGROOT/bin/dg9_9_13.conf
<DeleGate/9.9.13> [48533] -P8080 READY
_execPath=/opt/dg9_9_13/DGROOT/bin/dg9_9_13
Config: Linux/4.18.0-348.23.1.el8_5.x86_64; FileSize-Bits=64/64,64/32,64,64; socket=87380/16384,++NAT; sockpair=212992/212992,1002++U; char=signed; fcF=B; thread=PThread/pthread,64/128; zlib=112,308024; pam=2; stty=tcsetattr/NA; regex=regex; addr=A/440780/7FFDA9ED8E58; fmem=2677/-1418/5751M
DGROOT=/opt/dg9_9_13/DGROOT
ADMIN=root@localhost.localdomain
AIST-Product-ID: 2000-ETL-198715-01, H14PRO-049, H15PRO-165, H18PRO-443
Copyright (c) 1994-2000 Yutaka Sato and ETL,AIST,MITI
Copyright (c) 2001-2014 National Institute of Advanced Industrial Science and Technology (AIST)
BLDSIGN=9.9.13:20220428202141--500:3f6d3795eba9135d:root@localhost.localdomain:-
HostID: No-HostId-Available
Loaded: OpenSSL 1.0.2u  20 Dec 2019
Loaded: Zlib 1.2.11
```

以下のコマンドでDelegateを停止させます。
```
# /opt/dg9_9_13/DGROOT/bin/dg9_9_13 -P8080 -Fkill
```

## systemd のサービスとして起動させる
***

### systemdのUnitファイルの作成
delegate.service という名前で作成します。
内容は以下の通りです。

```
[Unit]
Description=Delegate server daemon

[Service]
Type=forking
ExecStart=/opt/dg9_9_13/DGROOT/bin/dg9_9_13 -P8080
ExecStop=/opt/dg9_9_13/DGROOT/bin/dg9_9_13 -P8080 -Fkill
ExecReload=/opt/dg9_9_13/DGROOT/bin/dg9_9_13 -P8080 -Fkill -HUP
Restart=no

[Install]
WantedBy=multi-user.target
```
delegate.service ファイルを /etc/systemd/system にコピーします。

```
# cp delegate.service /etc/systemd/system
# chomod 755 /etc/systemd/system/delgate.service
```

### Delegate サービスの起動

以下のコマンドでサービスを起動します。

```
# systemctl start delegate.service
```
サービスが正常に起動したかを確認します。

```
# systemctl status delgate.service
```

正常に起動した場合、以下のメッセージが表示されます。
```
● delegate.service - Delegate server daemon
   Loaded: loaded (/etc/systemd/system/delegate.service; disabled; vendor preset: disabled)
   Active: active (running) since Thu 2022-04-28 21:57:28 EDT; 2s ago
  Process: 49014 ExecStart=/opt/dg9_9_13/DGROOT/bin/dg9_9_13 -P8080 (code=exited, status=0/SUCCESS)
 Main PID: 49015 (dg9_9_13)
    Tasks: 1 (limit: 36455)
   Memory: 1.5M
   CGroup: /system.slice/delegate.service
           └─49015 /opt/dg9_9_13/DGROOT/bin/dg9_9_13 -{000}[RPM=0.00(0.0 0.0 0.0)]-P8080 -- ------
```

サービスを停止させます。
```
# systemctl stop delegate.service
```

### 参照情報
[https://genzouw.com/entry/2021/07/05/154156/2701/](https://genzouw.com/entry/2021/07/05/154156/2701/)