手順
$ 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
原因の切り分け
$ 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: