ClamAV(epelリポジトリ el7 rpm版)のアップデートでハマった

epelリポジトリにあるclamav関連パッケージを、yumコマンドで 0.100.1-3.el7 から 0.100.2-2.el7 にアップデートしたら久々にハマりました。

バージョン 0.100.2-2.el7 から /etc/clamd.d/scan.conf が必須となった模様です。よくある仕様変更の罠というやつでしょう。バージョン 0.100.1-3.el7 までは、/etc/clamd.conf があれば、そちらを読むようになっていましたが(後方互換性)、バージョン 0.100.2-2.el7 からは /etc/clamd.d/scan.conf が無いと以下のエラーログを吐いてclamdは起動しません。

ERROR: Can’t open/parse the config file /etc/clamd.d/scan.conf

この対策として /etc/clamd.conf を /etc/clamd.d/scan.conf に移動しました。/etc/clamd.conf は無くとも正常に起動します。後方互換性にいつまでも甘えていると、突然バッサリ切られるという典型的パターン…。

トラブルは重なるものでして、上の問題が片付いたら別の問題が発覚しました。データベースファイルが破損していると、以下のようなエラーログを吐いてclamdは起動しません(汗)。

LibClamAV Error: hm_addhash_str: invalid hash f7a3ecb6beaf87d3b1836e79bfd190b
LibClamAV Error: cli_loadhash: Malformed hash string at line 660750
LibClamAV Error: cli_loadhash: Problem parsing database at line 660750
LibClamAV Error: Can’t load daily.hsb: Invalid argument passed to function
LibClamAV Error: cli_tgzload: Can’t load daily.hsb
LibClamAV Error: Can’t load /var/lib/clamav/daily.cld: Malformed database
ERROR: Malformed database

バックアップから /var/lib/clamav/daily.cld を持ってきて、上書きコピーしたら回復しました。当該ファイルを削除すれば、自動生成(インターネットからダウンロード)される可能性もありますが、確認していません。ファイルを削除しない状態でfreshclam を再起動しても、以下のエラーログを吐いてしまい、回復しませんでした。

WARNING: [LibClamAV] hm_addhash_str: invalid hash f7a3ecb6beaf87d3b1836e79bfd190b
WARNING: [LibClamAV] cli_loadhash: Malformed hash string at line 660750
WARNING: [LibClamAV] cli_loadhash: Problem parsing database at line 660750
WARNING: [LibClamAV] Can’t load daily.hsb: Invalid argument passed to function
WARNING: [LibClamAV] cli_tgzload: Can’t load daily.hsb
WARNING: [LibClamAV] Can’t load /var/lib/clamav/clamav-e6f946713131cafb4de084c27608b718.tmp/clamav-a25492f514c1d64cecde0d807bfdb5e5.cld: Malformed database
ERROR: Failed to load new database: Malformed database
WARNING: Database load exited with status 55
ERROR: Failed to load new database
Update process terminated

※/etc/clamd.conf を移動した関係で、以下のエラーログを吐くようになったので /etc/freshclam.conf の NotifyClamd を変更しています。

ERROR: NotifyClamd: Can’t find or parse configuration file /etc/clamd.conf

サーバのバージョンアップは、yumコマンドで簡単に出来るようになったけれども、それでトラブルが発生した際に対処出来るか否か?で技術者としての力量が試されます。オープンソースソフトウェア(OSS)の場合、最悪はソースコードを取得して読めばいいのですが、開発言語はC言語が選択されていることが多いので、C言語が読めないとその時点で詰みですね。