Handle 标识解析系统从入门到能用

前言

本文首先介绍了 Handle 的安装方式,并以默认方式启动了 Handle 服务,实现了本地标识解析的增删改查;然后针对默认 Handle 服务使用小众数据库 Berkeley DB 不利于调试和数据管理等问题,参考官方技术手册实现了将其迁移到更流行的 MySQL 数据库上,并对相关数据表进行分析介绍;最后针对未购买权威前缀无法本地授权调试的问题,通过分别配置本地客户端和服务端的运行方式,实现绕过 Handle 官方根节点进行本地授权登录,最终搭建起自己的全局根节点服务。

Handle 运行方式跟 DNS 系统一样,当你在客户端输入 Handle 标识并点击解析后,客户端会把带解析标识发送到预设 IP 地址进行解析,返回该 Handle 标识对应的次级服务节点或者最终服务节点,通过这种方式即可实现资源的解析查找。但由于 Handle 服务还没有流行起来,故很多场景下还需要依赖 DNS 服务实现,比如官方文档地址为 https://hdl.handle.net/20.1000/113 ,就是通过 DNS 系统定位 hdl.handle.net 来实现定位 Handle 服务。由于 Handle 新概念较多,本文一些名词进行简化,针对 27.700.200/ifantasy.net :前缀即 27.700.200 ,代表权威前缀、授权前缀、一级节点、二级节点;后缀即 ifantasy.net ,代表 Handle 解析记录、Handle 值。

部署及使用

实验环境

软件 版本
OS Windows 11
Java 8
Handle 9.3.0

Handle 启动

  1. 下载 Handle压缩包 到本地并解压至合适的文件夹。
    https://cdn.jsdelivr.net/gh/wefantasy/FileCloud/img/handle_setup-2022-06-01-19-47-07.png
    Handle 目录结构
    其中主要文件及作用如下:
    • bin : Handle 官方的常用脚本文件。
    • lib : 被 bin 中脚本调用的软件库。
    • doc : 接口文档。
    • handle-9.3.0-src.zip : 源码压缩包。
    • admin.war : 自带的 web 后台界面。
  2. 将解压文件夹的 bin 目录加入环境变量。
    这里也可以不加入环境变量,只是每次需要输入 bin 下对应脚本的路径比较麻烦,加入环境变量比较方便。
  3. 在任意目录(以 C:\CommonProject 目录为例)下打开命令行,执行 hdl-setup-server.bat serv
    https://cdn.jsdelivr.net/gh/wefantasy/FileCloud/img/handle_setup-2022-06-01-19-57-21.png
    安装服务
    过程中配置基本上都可以使用默认的,要注意两个 IP 地址要填客户端机器可以访问的地址,一般是本机局域网地址(最好不要填 0.0.0.0localhost127.0.0.1 ,会有证书、访问等问题),本例中为 192.168.1.102 ,过程中每个参数的说明参考 Handle本地调试及基础开发,结束后会发现本目录下多了一个 serv 工作目录。
  4. 运行命令 hdl-server.bat serv 以启动 Handle 服务。
    https://cdn.jsdelivr.net/gh/wefantasy/FileCloud/img/handle_setup-2022-06-01-20-03-22.png
    启动 Handle 服务
    至此,即可在浏览器中访问自建的 Handle 解析页面 http://192.168.1.102:8000/ 、访问自带的管理页面 http://192.168.1.102:8000/admin ,也可以解析官方注册的 Handle 标识。
    https://cdn.jsdelivr.net/gh/wefantasy/FileCloud/img/handle_setup-2022-06-01-20-17-12.png
    解析官方 Handle 标识

添加 Handle 解析

上面的实验已经可以解析官方 Handle ,但是还没有我们自己的数据,在购买官方 Handle 前缀前我们是不可以通过以上管理页面直接添加自己的 Handle ,但是通过官方数据库工具 hdl-dbtool.bat 直接将 Handle 解析插入本地数据库实现。使用该工具前务必先退出上节运行的 Handle 服务

  1. 启动数据库管理工具: hdl-dbtool.bat serv
    https://cdn.jsdelivr.net/gh/wefantasy/FileCloud/img/handle_setup-2022-06-01-20-24-14.png
    数据库管理工具
  2. 通过 Add Homed Prefix 添加前缀 27
    https://cdn.jsdelivr.net/gh/wefantasy/FileCloud/img/handle_setup-2022-06-01-20-25-50.png
    添加前缀
  3. 通过 Create Handle 添加后缀 27/123 , 按照下图填写内容,然后依次确定即可。
    https://cdn.jsdelivr.net/gh/wefantasy/FileCloud/img/handle_setup-2022-06-01-20-51-06.png
    添加后缀
    此时点击 List HandlesList Homed Prefixes 可查到刚才添加的前缀和 Handle 值。
  4. 退出数据库工具的图形界面后,再次运行 Handle 服务: hdl-server.bat serv
    https://cdn.jsdelivr.net/gh/wefantasy/FileCloud/img/handle_setup-2022-06-01-20-55-30.png
    运行 Handle 服务
    此时在前端页面输入 27/213 已可以正常解析,默认会直接跳转到该 Handle 的 URL 值,解析时选中 Don't Redirect to URLs 即可避免直接跳转。但管理页面输入刚才创建的 Handle 地址,发现无法解析,是因为管理页面模式使用官方服务器进行全局解析,按照下面步骤将其改成本地服务器解析即可。
  5. Change this 下将 Global 变为 Source Server
    https://cdn.jsdelivr.net/gh/wefantasy/FileCloud/img/handle_setup-2022-06-01-20-56-58.png
    修改本地服务器解析
    此时管理员页面可以解析本地 Handle :
    https://cdn.jsdelivr.net/gh/wefantasy/FileCloud/img/handle_setup-2022-06-01-21-00-13.png
    解析本地 Handle

定制数据库

Handle 服务默认运行的数据库是历史悠久的 Berkeley DB 数据库,感觉该数据库有点类似于 SQLite ,是个轻量级的文件形式数据库,因此不需要额外安装任何软件即可直接使用,在 Handle 服务器中数据库文件在项目的 bdbje 目录下。在实际项目中当然不能使用这个数据库,毕竟陌生数据库不利于 Debug 和数据迁移,本节将实现把 Handle 服务中默认数据库 Berkeley DB 改为 MySQL ,相关内容参考官方手册 Technical Manual 中 [#8 Using Custom Handle Storage] 。

  1. 下载 Java 的 MySQL 驱动包 mysql-connector-java ,并将其放在上节解压的 Handle 目录下的 lib 目录下:
    https://cdn.jsdelivr.net/gh/wefantasy/FileCloud/img/handle_setup-2022-06-01-21-15-10.png
    下载 Java 的 MySQL 驱动包
    如果忽略这步仅仅按照官方文档配置的话后面会报 java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 错误,这个问题我找了好久,毕竟谁能想到 Handle 将代码封装了一层又一层却没有准备 MySQL 驱动包呢,最终还是看源码找到了这个错误原因。
  2. 在 MySQL 中创建数据库 handle_test ,并在其下创建以下两个数据表:
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    create table nas ( 
       na varchar(255) not null, 
       PRIMARY KEY(na) 
    );  
    create table handles ( 
       handle varchar(255) not null, 
       idx int4 not null, 
       type blob, 
       data blob, 
       ttl_type int2, 
       ttl int4, 
       timestamp int4,
       refs blob, 
       admin_read bool, 
       admin_write bool, 
       pub_read bool, 
       pub_write bool, 
       PRIMARY KEY(handle, idx) 
    );
    
    没错,handle背后的支撑就是这两个简单的数据表。
  3. 修改 serv 目录下的 config.dct 文件,在其 server_config 项下添加以下内容:
    1
    2
    3
    4
    5
    6
    7
    8
    
    "storage_type" = "sql"
    "sql_settings" = { 
       "sql_url" = "jdbc:mysql://localhost:3306/handle_test" 
       "sql_driver" = "com.mysql.jdbc.Driver" 
       "sql_login" = "root" 
       "sql_passwd" = "root" 
       "sql_read_only" = "no" 
    }
    
    https://cdn.jsdelivr.net/gh/wefantasy/FileCloud/img/handle_setup-2022-06-01-21-11-13.png
    配置 config.dct
  4. 启动 Handle 服务: hdl-server.bat serv
    现在我们已经成功的更换了数据,此时再查询上节注册的 Handle 标识发现会为空,因为我们并没有向新数据库中插入数据。
  5. 创建新的 Handle 值:
    上节中我们创建新数据是通过自带的数据库脚本 hdl-dbtool.bat 实现,分析源码发现该工具只是通过调用 jar 包接口向数据库插入数据,在此我们选择另一种插入数据的方法——直接修改 MySQ L数据库:
    • 打开刚才创建的数据库 handle_test ,并直接向其中 na 表插入数据 72
      https://cdn.jsdelivr.net/gh/wefantasy/FileCloud/img/handle_setup-2022-06-01-21-29-04.png
      插入前缀
    • 打开表 handles ,直接向其中插入 Handle 值 72/456
      https://cdn.jsdelivr.net/gh/wefantasy/FileCloud/img/handle_setup-2022-06-01-21-30-38.png
      插入后缀

以上步骤完成后,即可在前台/后台页面查询到新插入的 Handle 记录 72/456

https://cdn.jsdelivr.net/gh/wefantasy/FileCloud/img/handle_setup-2022-06-01-21-31-48.png
查询 72/456
上面的实验完成后,我们成功的让 Handle 服务在 MySQL 数据库上启动,但这还远远不够,此时我们还无法通过正常渠道(客户端)添加解析后缀,因为我们缺少权威前缀授权。

自建全局根节点

如果你看过两个官方手册 Technical ManualHandle Tool User Manual 的话会发现,很多功能开始之前都会加上一句类似的话: Before using this tool it is important that you read “How Your Prefix Was Set Up” in the Handle Technical Manual (http://hdl.handle.net/20.1000/105). 这是因为你没有通过 Handle 官网购买权威前缀,而在验证和开发阶段就购买权威前缀终是不太妥当(尽管官方提供申请免费前缀方法,但其手续繁琐令人止步),因此本节实现了另一种方法——即自建全局根节点,相关文档参考官方手册 Technical Manual 中 [#10 Configuring an Independent Handle Service] 。

修改客户端

首先说明一下 Handle 中客户端和服务端的区别,就像常规 C/S 架构,服务端主要提供数据管理服务、客户端提供用户操作数据的接口,Handle 中的网页端和 hdl-admintool 图形界面等都属于客户端,但本节客户端配置只对于 hdl-admintool 图形界面生效,也就是说生产使用时(只通过网页访问)应该可以不配置客户端。

  1. 复制 serv 目录下的 siteinfo.json 到用户家目录下,并重命名为 resolver_site
  2. 家目录下创建 local_nas 文件 ,其内容为 *
    https://cdn.jsdelivr.net/gh/wefantasy/FileCloud/img/handle_setup-2022-06-02-15-10-41.png
    创建 local_nas

修改服务端

  1. 使用 hdl-dbtool.batAdd Homed Prefix 添加本地管理前缀 27
    https://cdn.jsdelivr.net/gh/wefantasy/FileCloud/img/handle_setup-2022-06-01-16-59-00.png
    添加本地管理前缀
  2. 使用 hdl-dbtool.batCreate Handle 添加管理员 handle 记录 24/ADMIN
    https://cdn.jsdelivr.net/gh/wefantasy/FileCloud/img/handle_setup-2022-06-01-17-02-21.png
    添加管理员 handle

    注意:这里的后缀 24/ADMINADMIN 单词必须全大写(官方手册这样写,小写我还没试过),一般管理员默认 index 值为 300 ,此处认证方式选择最简单的 HS_SECKEY ,实际密码直接以 TEXT 形式存入 DATA 中即可。

  3. 修改 serv 目录下的 config.dct 文件,在 server_config 项的 server_adminsreplication_admins 下添加站点新注册的管理员:
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    
    "server_config" = {
       "server_admins" = (
          "300:27/ADMIN"
       )
    
       "replication_admins" = (
          "300:27/ADMIN"
       )
    
       "max_session_time" = "86400000"
       "this_server_id" = "1"
       "max_auth_time" = "60000"
       "server_admin_full_access" = "yes"
       "case_sensitive" = "no"
       "auto_homed_prefixes" = (
          "0.NA/YOUR_PREFIX"
       )
    
       "storage_type" = "sql"
       "sql_settings" = { 
          "sql_url" = "jdbc:mysql://localhost:3306/handle_test" 
          "sql_driver" = "com.mysql.jdbc.Driver" 
          "sql_login" = "root" 
          "sql_passwd" = "root" 
          "sql_read_only" = "no" 
       }
    }
    
    https://cdn.jsdelivr.net/gh/wefantasy/FileCloud/img/handle_setup-2022-06-02-15-24-46.png
    添加站点管理员
  4. 启动 Handle 服务: hdl-server.bat serv
  5. 打开网页后台界面,选择 Authorization 按钮并输入刚才注册的账号密码进行授权登录:
    https://cdn.jsdelivr.net/gh/wefantasy/FileCloud/img/handle_setup-2022-06-01-17-08-55.png
    授权登录
  6. 此时已可通过王爷后台添加新解析:
    https://cdn.jsdelivr.net/gh/wefantasy/FileCloud/img/handle_setup-2022-06-01-17-10-43.png
    添加新解析

除了上述通过网页管理员后台进行站点管理外,也可通过官方图形界面工具 hdl-admintool.bat 进行 Handle 管理:

  1. 命令行输入 hdl-admintool.bat 打开图形界面。
  2. 在主页面输入已注册的 Handle 标识再点击 Lookup 即可查询。
    https://cdn.jsdelivr.net/gh/wefantasy/FileCloud/img/handle_setup-2022-06-02-15-48-31.png
    查询 ADMIN
  3. 点击主页面 Authenticate 并输入管理员账号信息即可登录管理员。
    https://cdn.jsdelivr.net/gh/wefantasy/FileCloud/img/handle_setup-2022-06-02-15-54-01.png
    登录管理员
  4. 认证成功后在主页面输入新 Handle 值即可进行标识添加。
    https://cdn.jsdelivr.net/gh/wefantasy/FileCloud/img/handle_setup-2022-06-02-15-55-31.png
    标识添加
    https://cdn.jsdelivr.net/gh/wefantasy/FileCloud/img/handle_setup-2022-06-02-15-56-17.png
    标识添加2

参考

[1]: Handle.Net. Technical Manual, Handle.Net Version 9. handle.net. [2016-08-25]
[2]: osulibraries. handle-docker. github.com. [2016-08-25]
[3]: EUDAT-B2HANDLE. pyhandle. github.com. [2022-05-20]