ハイパー日記システムのインストール

手順

$ sudo a2enmod cgi
Enabling module cgi.
To activate the new configuration, you need to run:
  systemctl restart apache2

$ sudo a2enmod cgid
Enabling module cgid.
To activate the new configuration, you need to run:
  systemctl restart apache2

$ sudo apachectl graceful
  • nkfをインストール(依存関係)
$ sudo apt install nkf
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下のパッケージが新たにインストールされます:
  nkf
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 0 個。
126 kB のアーカイブを取得する必要があります。
この操作後に追加で 283 kB のディスク容量が消費されます。
取得:1 http://ports.ubuntu.com bionic/universe armhf nkf armhf 1:2.1.4-1ubuntu2 [126 kB]
126 kB を 2秒 で取得しました (69.6 kB/s)
以前に未選択のパッケージ nkf を選択しています。
(データベースを読み込んでいます ... 現在 141534 個のファイルとディレクトリがインストールされています。)
.../nkf_1%3a2.1.4-1ubuntu2_armhf.deb を展開する準備をしています ...
nkf (1:2.1.4-1ubuntu2) を展開しています...
nkf (1:2.1.4-1ubuntu2) を設定しています ...
man-db (2.8.3-2ubuntu0.1) のトリガを処理しています ...
  • makeをインストール(依存関係)
$ sudo apt install make
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
提案パッケージ:
  make-doc
以下のパッケージが新たにインストールされます:
  make
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 0 個。
142 kB のアーカイブを取得する必要があります。
この操作後に追加で 303 kB のディスク容量が消費されます。
取得:1 http://ports.ubuntu.com bionic/main armhf make armhf 4.1-9.1ubuntu1 [142 kB]
142 kB を 2秒 で取得しました (58.4 kB/s)
以前に未選択のパッケージ make を選択しています。
(データベースを読み込んでいます ... 現在 141542 個のファイルとディレクトリがインストールされています。)
.../make_4.1-9.1ubuntu1_armhf.deb を展開する準備をしています ...
make (4.1-9.1ubuntu1) を展開しています...
make (4.1-9.1ubuntu1) を設定しています ...
man-db (2.8.3-2ubuntu0.1) のトリガを処理しています ...
$ mkdir ~/diary   #日記を収納するフォルダ
$ mkdir ~/public_html/diary   #cgiスクリプトをインストールするフォルダ
  • hns-2.19.9.tar.gzをダウンロードして展開する
$ cd hns-2.19.9/
$ sh hns-setup.ja

# 以後、対話型シェルに従ってインストールを進める
  • インストール完了。しかし、ダメだった。orz

f:id:cutxout:20190615184641j:plain

原因の切り分け

$ tail -f /var/log/apache2/error.log

[Sat Jun 15 18:40:13.087682 2019] [cgi:error] [pid 4666] [client 192.168.100.2:63976] AH01215: Can't use 'defined(@array)' (Maybe you should just omit the defined()?) at lib/ObjectTemplate.pm line 68.: /home/cutxout/public_html/diary/index.cgi, referer: http://192.168.100.4/index2.html
[Sat Jun 15 18:40:13.087997 2019] [cgi:error] [pid 4666] [client 192.168.100.2:63976] AH01215: Compilation failed in require at lib/DateTime/Date.pm line 14.: /home/cutxout/public_html/diary/index.cgi, referer: http://192.168.100.4/index2.html
[Sat Jun 15 18:40:13.088134 2019] [cgi:error] [pid 4666] [client 192.168.100.2:63976] AH01215: BEGIN failed--compilation aborted at lib/DateTime/Date.pm line 14.: /home/cutxout/public_html/diary/index.cgi, referer: http://192.168.100.4/index2.html
[Sat Jun 15 18:40:13.088323 2019] [cgi:error] [pid 4666] [client 192.168.100.2:63976] AH01215: Compilation failed in require at lib/DateTime/Time.pm line 13.: /home/cutxout/public_html/diary/index.cgi, referer: http://192.168.100.4/index2.html
[Sat Jun 15 18:40:13.088647 2019] [cgi:error] [pid 4666] [client 192.168.100.2:63976] AH01215: BEGIN failed--compilation aborted at lib/DateTime/Time.pm line 13.: /home/cutxout/public_html/diary/index.cgi, referer: http://192.168.100.4/index2.html
[Sat Jun 15 18:40:13.088760 2019] [cgi:error] [pid 4666] [client 192.168.100.2:63976] AH01215: Compilation failed in require at lib/DateTime/Format.pm line 6.: /home/cutxout/public_html/diary/index.cgi, referer: http://192.168.100.4/index2.html
[Sat Jun 15 18:40:13.088890 2019] [cgi:error] [pid 4666] [client 192.168.100.2:63976] AH01215: BEGIN failed--compilation aborted at lib/DateTime/Format.pm line 6.: /home/cutxout/public_html/diary/index.cgi, referer: http://192.168.100.4/index2.html
[Sat Jun 15 18:40:13.089096 2019] [cgi:error] [pid 4666] [client 192.168.100.2:63976] AH01215: Compilation failed in require at /home/cutxout/public_html/diary/index.cgi line 32.: /home/cutxout/public_html/diary/index.cgi, referer: http://192.168.100.4/index2.html
[Sat Jun 15 18:40:13.089281 2019] [cgi:error] [pid 4666] [client 192.168.100.2:63976] AH01215: BEGIN failed--compilation aborted at /home/cutxout/public_html/diary/index.cgi line 32.: /home/cutxout/public_html/diary/index.cgi, referer: http://192.168.100.4/index2.html
[Sat Jun 15 18:40:13.089420 2019] [cgi:error] [pid 4666] [client 192.168.100.2:63976] End of script output before headers: index.cgi, referer: http://192.168.100.4/index2.html
  • error.logを見ると、2種類のエラーが混ざっているように見える。
    • Can't use 'defined(@array)' (Maybe you should just omit the defined()?)
    • Compilation failed in require at lib/DateTime/Date.pm line 14
  • 前者は、perl 5.20でdefined()の仕様変更があったことに起因する。
defined(@array) と defined(%hash) は致命的エラーになりました
これは v5.6.1 から廃止予定で、v5.16 から廃止予定警告が出力されていました。
Can't use 'defined(@array)' (Maybe you should just omit the defined()?)

(F) defined() は配列に使っても有用ではありません; 未定義の スカラ 値を チェックするからです。 配列が空かどうかを知りたい場合は、例えば単に if (@array) { # not empty } を 使ってください。
  • それを踏まえて、lib/ObjectTemplate.pmの68行目を確認してみる。
sub get_attribute_names {
    my $pkg = shift;
    $pkg = ref($pkg) if ref($pkg);
    my @result = @{"${pkg}::_ATTRIBUTES_"};
    if (defined (@{"${pkg}::ISA"})) {
        foreach my $base_pkg (@{"${pkg}::ISA"}) {
           push (@result, get_attribute_names($base_pkg));
        }
    }
    @result;
}
  • 原因はこれか!
#    if (defined (@{"${pkg}::ISA"})) {
#    if (defined (@{"${pkg}::ISA"})) {
#    if (defined (@{"${pkg}::ISA"})) {
  • 手作業で修正を試みる。
#    if (defined (@{"${pkg}::ISA"})) {
      if (@{"${pkg}::ISA"}) {
  • ビンゴ!しかし、その修正は次のエラーを呼ぶことに。orz
[Sat Jun 15 19:33:37.068314 2019] [cgi:error] [pid 5148] [client 192.168.100.2:64257] AH01215: Can't use 'defined(%hash)' (Maybe you should just omit the defined()?) at lib/jcode.pl line 684.: /home/cutxout/public_html/diary/index.cgi
[Sat Jun 15 19:33:37.068672 2019] [cgi:error] [pid 5148] [client 192.168.100.2:64257] AH01215: Compilation failed in require at lib/CodeConv.pm line 61.: /home/cutxout/public_html/diary/index.cgi
[Sat Jun 15 19:33:37.068787 2019] [cgi:error] [pid 5148] [client 192.168.100.2:64257] AH01215: BEGIN failed--compilation aborted at lib/CodeConv.pm line 64.: /home/cutxout/public_html/diary/index.cgi
[Sat Jun 15 19:33:37.068937 2019] [cgi:error] [pid 5148] [client 192.168.100.2:64257] AH01215: Compilation failed in require at lib/HNS/Diary.pm line 30.: /home/cutxout/public_html/diary/index.cgi
[Sat Jun 15 19:33:37.069103 2019] [cgi:error] [pid 5148] [client 192.168.100.2:64257] AH01215: BEGIN failed--compilation aborted at lib/HNS/Diary.pm line 30.: /home/cutxout/public_html/diary/index.cgi
[Sat Jun 15 19:33:37.069247 2019] [cgi:error] [pid 5148] [client 192.168.100.2:64257] AH01215: Compilation failed in require at lib/HNS/Collection.pm line 26.: /home/cutxout/public_html/diary/index.cgi
[Sat Jun 15 19:33:37.069448 2019] [cgi:error] [pid 5148] [client 192.168.100.2:64257] AH01215: BEGIN failed--compilation aborted at lib/HNS/Collection.pm line 26.: /home/cutxout/public_html/diary/index.cgi
[Sat Jun 15 19:33:37.069747 2019] [cgi:error] [pid 5148] [client 192.168.100.2:64257] AH01215: Compilation failed in require at lib/HNS/Calendar/Table.pm line 32.: /home/cutxout/public_html/diary/index.cgi
[Sat Jun 15 19:33:37.069894 2019] [cgi:error] [pid 5148] [client 192.168.100.2:64257] AH01215: BEGIN failed--compilation aborted at lib/HNS/Calendar/Table.pm line 32.: /home/cutxout/public_html/diary/index.cgi
[Sat Jun 15 19:33:37.070112 2019] [cgi:error] [pid 5148] [client 192.168.100.2:64257] AH01215: Compilation failed in require at lib/HNS.pm line 32.: /home/cutxout/public_html/diary/index.cgi
[Sat Jun 15 19:33:37.070273 2019] [cgi:error] [pid 5148] [client 192.168.100.2:64257] AH01215: BEGIN failed--compilation aborted at lib/HNS.pm line 32.: /home/cutxout/public_html/diary/index.cgi
[Sat Jun 15 19:33:37.070478 2019] [cgi:error] [pid 5148] [client 192.168.100.2:64257] AH01215: Compilation failed in require at /home/cutxout/public_html/diary/index.cgi line 35.: /home/cutxout/public_html/diary/index.cgi
[Sat Jun 15 19:33:37.070632 2019] [cgi:error] [pid 5148] [client 192.168.100.2:64257] AH01215: BEGIN failed--compilation aborted at /home/cutxout/public_html/diary/index.cgi line 35.: /home/cutxout/public_html/diary/index.cgi
  • defined()の誤った使い方をしているらしき箇所を調べると23件ヒットする。正確には、配列@とハッシュ%に限定してよいはずだから、もうちょっと減るだろう。あれ、jcodeも対象なのか。しかも、jcode.pmではなくてjcode.plかよ!これだったら、誰かがパッチあてたバージョンを公開している気がする。
$ grep -r "defined *(" ./diary/ 
./diary/i/index.cgi:    if (!defined(&main::nkf)) {
./diary/lib/HNS/Hnf/Command.pm:    } elsif ($$attr =~ /^([\d\w-]+):/ && defined($Template{$1})) {
./diary/lib/HNS/Tools/Title.pm: if (defined($value)) {
./diary/lib/HNS/Tools/Title.pm:    if (defined(@Selected)) { # ?2001, ?200105, ?2001050, ?200105a
./diary/lib/HNS/Tools/Title.pm:    if (defined($Selected{YEAR})) { # YEAR=2001&MONTH=5
./diary/lib/HNS/Tools/Title.pm:     if (defined($Selected{MONTH}) && $Selected{MONTH}->[0] ne "ALL") {
./diary/lib/HNS/Tools/Title.pm:             if (defined($Selected{DAY}) &&
./diary/lib/HNS/Tools/Title.pm:    if (defined(%selected_cat)) {
./diary/lib/HNS/Diary.pm:       if (defined($value)) {
./diary/lib/HNS/Diary.pm:           if (defined($cat_selected{"ALL"})) {
./diary/lib/HNS/Diary.pm:                   if (defined($cat_selected{$cat})) {
./diary/lib/HNS/Diary.pm:       if ($flg_display || defined($cat_selected{"ALL"})) {
./diary/lib/Board/System.pm:    $refid_hash->{$article->refid} = [] unless (defined($refid_hash->{$article->refid}));
./diary/lib/Board/Article.pm:    if (defined($msgid_hash) && defined($refid_hash)) {
./diary/lib/ObjectTemplate.pm:    if (defined (@{"${pkg}::ISA"})) {
./diary/lib/ObjectTemplate.pm:            if (defined(\$_free[\$_free])) {
./diary/lib/jcode.pl:;# while (defined($s = <>)) {
./diary/lib/jcode.pl:;# while (defined($s = <>)) {
./diary/lib/jcode.pl:;#     defined(&f) || next;
./diary/lib/jcode.pl:;# while (defined($s = <>)) {
./diary/lib/jcode.pl:;#     while (defined($s = shift(@buf))) {
./diary/lib/jcode.pl:;#     while (defined($s = <>)) {
./diary/lib/jcode.pl:    if (!defined($prev_from) || $from ne $prev_from || $to ne $prev_to) {
./diary/lib/jcode.pl:   defined($table{$1}) && ++$n ? $table{$1} : $1
  • 後者のエラーは、use文を辿ってみるとDateTime系のモジュールからObjectTemplate.pmを呼び出すところに帰着するので、一つ目のエラーと根は同じだと思われる。

対応方針を検討

  • 覚悟を決めて、自力でパッチをあてていく。
  • 最新のCPANモジュールをシステムレベルでインストールして、そちらを読み込む
    • ローカル側の*.cgiをuse lib qw(lib);を削除して、代わりにuse ###を追加していくことになるのか?
  • 最新のCPANモジュールをダウンロードして、lib配下の古いモジュールと置き換える
    • 単純に数えて92ファイル。古いものばかりで、おまけに独自実装らしきものもある。
    • 置き換えただけで本当に動作するかは甚だあやしい。
$ ls -lR
.:
total 92
drwxr-xr-x 2 cutxout cutxout  4096 11月  5  2006 Board
-rw-r--r-- 1 cutxout cutxout  4835  4月  6  2002 Board.pm
drwxr-xr-x 2 cutxout cutxout  4096 11月  5  2006 CGI
-rw-r--r-- 1 cutxout cutxout  4160  5月 30  2003 CodeConv.pm
drwxr-xr-x 2 cutxout cutxout  4096 11月  5  2006 DateTime
drwxr-xr-x 7 cutxout cutxout  4096 11月  5  2006 HNS
-rw-r--r-- 1 cutxout cutxout  8481 11月  5  2006 HNS.pm
-rw-r--r-- 1 cutxout cutxout  2389 12月  7  2000 HTTP.pm
drwxr-xr-x 2 cutxout cutxout  4096 11月  5  2006 Image
-rw-r--r-- 1 cutxout cutxout  2233 12月  7  2000 LIRS.pm
-rwxr--r-- 1 cutxout cutxout  4216  6月 15 19:34 ObjectTemplate.pm
drwxr-xr-x 2 cutxout cutxout  4096 11月  5  2006 SimpleDB
-rw-r--r-- 1 cutxout cutxout 21093 10月 14  2000 jcode.pl

./Board:
total 16
-rw-r--r-- 1 cutxout cutxout 5987  4月  6  2002 Article.pm
-rw-r--r-- 1 cutxout cutxout 6887  5月 28  2003 System.pm

./CGI:
total 12
-rw-r--r-- 1 cutxout cutxout 2399 11月 24  1999 Cookie.pm
-rw-r--r-- 1 cutxout cutxout 1328 11月 24  1999 QueryString.pm
-rw-r--r-- 1 cutxout cutxout  825  2月  2  2002 Tools.pm

./DateTime:
total 20
-rw-r--r-- 1 cutxout cutxout 5347  7月 21  2000 Date.pm
-rw-r--r-- 1 cutxout cutxout 1006  5月  1  1999 Format.pm
-rw-r--r-- 1 cutxout cutxout  606 11月  3  2002 Qreki.pm
-rw-r--r-- 1 cutxout cutxout 1383 11月 24  1999 Time.pm

./HNS:
total 112
-rw-r--r-- 1 cutxout cutxout  4701  1月  7  2001 AccessControl.pm
-rw-r--r-- 1 cutxout cutxout  3134  9月 30  2001 Admini.pm
-rw-r--r-- 1 cutxout cutxout  4161  2月  3  2002 Cache.pm
drwxr-xr-x 2 cutxout cutxout  4096 11月  5  2006 Calendar
-rw-r--r-- 1 cutxout cutxout  2204  4月 15  2001 CategoryList.pm
-rw-r--r-- 1 cutxout cutxout 10574 11月 22  2003 Collection.pm
-rw-r--r-- 1 cutxout cutxout  2718 11月 24  1999 DateSelect.pm
drwxr-xr-x 2 cutxout cutxout  4096 11月  5  2006 Diary
-rw-r--r-- 1 cutxout cutxout 13253  1月  6  2005 Diary.pm
-rw-r--r-- 1 cutxout cutxout  1057  4月 15  2001 ExtHTML.pm
drwxr-xr-x 2 cutxout cutxout  4096 11月  5  2006 Hnf
-rw-r--r-- 1 cutxout cutxout  5939  8月 21  2005 IntelliSearch.pm
drwxr-xr-x 2 cutxout cutxout  4096 11月  5  2006 PIM
-rw-r--r-- 1 cutxout cutxout  6020  9月 15  2001 Status.pm
-rw-r--r-- 1 cutxout cutxout  6494 11月  3  2002 Style.pm
-rw-r--r-- 1 cutxout cutxout  1761  3月 29  2002 System.pm
-rw-r--r-- 1 cutxout cutxout  1500 11月 24  1999 Template.pm
drwxr-xr-x 2 cutxout cutxout  4096 11月  5  2006 Tools

./HNS/Calendar:
total 20
-rw-r--r-- 1 cutxout cutxout  886 10月  5  2002 Direct.pm
-rw-r--r-- 1 cutxout cutxout 4404 11月  3  2002 NoTable.pm
-rw-r--r-- 1 cutxout cutxout 5383 11月  3  2002 Table.pm

./HNS/Diary:
total 4
-rw-r--r-- 1 cutxout cutxout 2377 11月 15  2001 Template.pm

./HNS/Hnf:
total 56
-rw-r--r-- 1 cutxout cutxout 35070 10月  4  2005 Command.pm
-rw-r--r-- 1 cutxout cutxout 11394  6月 19  2002 TreeBuilder.pm
-rw-r--r-- 1 cutxout cutxout  2037 10月 21  2000 UserVar.pm
-rw-r--r-- 1 cutxout cutxout  1557  7月 24  2000 Warning.pm

./HNS/PIM:
total 28
-rw-r--r-- 1 cutxout cutxout  2437  5月 28  2003 Link.pm
-rw-r--r-- 1 cutxout cutxout 20354 10月 28  2003 Schedule.pm
-rw-r--r-- 1 cutxout cutxout  1822  5月 28  2003 Todo.pm

./HNS/Tools:
total 32
-rw-r--r-- 1 cutxout cutxout  5231 11月 15  2001 HeadLine.pm
-rw-r--r-- 1 cutxout cutxout  6484  4月 25  2005 RSS.pm
-rw-r--r-- 1 cutxout cutxout 15266  5月 28  2003 Title.pm

./Image:
total 4
-rw-r--r-- 1 cutxout cutxout 3124  3月 18  2000 Size.pm

./SimpleDB:
  • perl 5.20より前のバージョンのperlをインストールして、共存させる or 置き換える。
    • hns的にはperl 5.004が要求仕様で、defined()の仕様変更があったのがperl 5.20なので、perl 5.19系列の採取バージョンが狙い目。
    • 実現できるならこれが手っ取り早そうだけど、そんなことできるのだろうか?