RDAPサーバを構築する

# RDAPとは？
WHOIS（ドメインやIPアドレスの所有者を検索するサービス）をドメインやIPアドレス事業者が提供しているが、EUのGDPR（欧州データ一般保護規則に対応できない（検索して表示される項目に住所や担当者名・連絡先などが表示される）ため、それに代わる検索システムとしてRDAPというプロトコルをICANNで策定された。
また、WHOISでは、すべてテキストベースで結果が表示されていたため、人間が見るにはよいが、プログラムで処理するには適していなかった。そのため、RDAPではREST APIで問い合わせを行い、結果をJSON形式で返すように定められている。
通常、自社のサーバ等でRDAPをサービスする機会はほぼない（レジストリ以外では不要）と思われる。

# 前提ソフトウェアのインストール
RDAPサーバとして、現時点（2019年11月）で、openrdapとreddogのオープンソースソフトウェアが確認されている。
今回は[reddog](https://www.reddog.mx/ "reddog")を使用してRADAPサーバの構築を行った。

RDAPサーバはTomcatで動作するため、前提ソフトウェアとして、Apache Tomcat、MySQL（Mariadb）、Apache、openjdk、mysql-connector-javaが必要となる。今回はすべてyumレポジトリよりインストールしている。

```
$ sudo yum install java-latest-openjdk httpd mariadb mariadb-server mysql-connector-java tomcat
```

# RDAPサーバのインストール
reddogはwar形式で配布されているので、[公式サイト](https://www.reddog.mx/ "reddog")より最新版をダウンロードする。

```
$ cd $CATALINA_HOME/webapps/rdap/
$ wget https://github.com/NICMx/rdap-server/releases/download/v1.4.3/rdap-server-1.4.3.war
$ jar -xvf rdap-server-1.4.3.war
$ rm rdap-server-1.4.3.war
```

次にサンプルのDAOファイルをダウンロードします。
reddogでは、ビルトインDBやMySQLなどの外部DBなど様々なDAOが利用できます。

```
$ cd $CATALINA_HOME/webapps/rdap/WEB-INF/lib
$ wget https://github.com/NICMx/releases/raw/master/RedDog/rdap-sample-daa-impl-0.0.2.jar
```

本来であれば、”$CATALINA_HOME/webapps/rdap/WEB-INF/data-access.properties”にどのDAOを使用するか記載する必要があるのですが、1つしかない場合は、自動的に設定してくれますので、以上で終了です。

```
$ sudo systemctl start tomcat
```
Tomcatを起動します。エラーなく起動できていることを確認してください。ブラウザから”http://サーバ名:8080/rdap/”にアクセスすると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133769/6825b476-f9dc-6c72-7318-512bff834a36.png)
が表示されます。

# MySQLをデータソースとして使用する
これまではビルトインのデータベースを使用していた。しかし、このままでは使い勝手が悪く他のアプリケーション（例えばドメイン管理用のアプリなど）との連携がしにくくデータの登録・削除・更新もしずらい。そこで、データベースをMySQL（Mariadb）に変更する。
MariaDBのインストールと初期設定（rootユーザのパスワード設定等）は完了しているものとする。

まずは、データベースの初期化（テーブルの作成など）を行う

```
$ wget https://raw.githubusercontent.com/NICMx/rdap-sql-provider/v1.4.2/src/test/resources/META-INF/sql/Database.sql
$ mysql -u root -p < Database.sql
```

これで、データベースの作成と初期データ（カントリーコードだけ）の登録がされる。
つぎにJavaから接続するユーザを作成する。

```
$ mysql -u root -p
mysql > create user 'rdap'@'localhost' identified by 'password';
mysql > grant all on rdap.* to 'rdap'@'localhost' identified by 'password';
```

つぎにSQL用のDAOをインストールする。

```
$ cd $CATALINA_HOME/webapps/rdap/WEB-INF/lib/
$ wget https://github.com/NICMx/rdap-sql-provider/releases/download/v1.4.2/rdap-sql-provider-1.4.2.jar
$ rm rdap-sample-daa-impl-0.0.2.jar
```
なお、先ほど使ったdemo用のDAOは消しておきます。
次にResourceの設定を$CATALINA_HOME/webapps/rdap/META-INF/context.xmlに記述します。

```META-INF/context.xml
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/rdap">
        <Resource name="jdbc/rdap"
                type="javax.sql.DataSource"
                auth="Container"
                driverClassName="com.mysql.jdbc.Driver"
                url="jdbc:mysql://localhost/rdap"
                username="rdap"
                password="パスワード"
                validationQuery="select 1" />
</Context>
```
yumで入ったtomcatはバグがあるらしく

```
Failed to register in JMX: javax.naming.NamingException: Could not create resource factory instance [Root exception is java.lang.ClassNotFoundException: org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory]
```
と起動時にエラーが発生し、起動しません。いろいろ調べた結果、エラーで見つからないと言われたfactoryを明示的に指定することに。

```META-INF/context.xml
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/rdap">
        <Resource name="jdbc/rdap"
                type="javax.sql.DataSource"
                auth="Container"
                factory="org.apache.commons.dbcp.BasicDataSourceFactory"
                driverClassName="com.mysql.jdbc.Driver"
                url="jdbc:mysql://localhost/rdap"
                username="rdap"
                password="パスワード"
                validationQuery="select 1" />
</Context>
```
これで起動してもやはりエラーになる。

```
java.lang.IllegalArgumentException: mx.nic.rdap.db.exception.InitializationException: Trouble loading country codes from the DB.
....
   Caused by: org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class 'com.mysql.jdbc.Driver'
```
よくログをみるとSQLのドライバが読めていないよう。そこで、SQLのドライバをWEB-INF/libにコピー。

```
$ cp /usr/share/java/mysql-connector-java.jar $CATALINA_HOME/webapps/rdap/WEB-INF/lib/.
```

これで完了。
なお、DBの中身はカントリーコード以外空白なので、何も値を返しません。