あまつぶ


9.7 【DATファイルを自動的に更新する】

 以前、VirexのDATファイルの更新の話を少し書いたが、これを自動的に行う方法を考えてみた。9.x用のVirex 6.1のアップデート確認を見ていたら、ftp.nai.comからファイルをダウンロードしていらしい。手に入れられる場所さえわかれば自動化もできるはず。思い立ったら早速やってみるべし。しばらくの試行錯誤の末、なんとか下のようなスクリプトを作成。

 update.sh
#!/bin/sh

local_pat="Virus data file v[0-9]+"
current_pat="dat-[0-9]+\.zip"
ftp_path="ftp.nai.com/pub/antivirus/datfiles/4.x/"

/usr/local/vscanx/vscanx --version | grep -E "$local_pat" > local.txt
curl -l $ftp_path | grep -E "$current_pat" > current.txt

perl_script="s/[^0-9]*([0-9]{4}).*/\1/"

local=`perl -pe "$perl_script" < local.txt`
current=`perl -pe "$perl_script" < current.txt`

#echo $local
#echo $current

if [ $local = $current ]; then
  echo "The latest version is installed."
else
  echo "The newer version $current is available."
  
  mkdir tmp
  curl "{$ftp_path}dat-$current.zip" -o "tmp/dat-$current.zip"
  unzip "tmp/dat-$current.zip" -d tmp
  sudo cp tmp/*.dat /usr/local/vscanx/
  rm -RP tmp
  
  /usr/local/vscanx/vscanx --version
fi

 手探りで作ったため、かなり出来の悪いスクリプトだが、一応ちゃんと動くからとりあえずよし(汗)。(※ 9.28註 perlスクリプトの部分を変更)
 まず、動作環境から。Virex 7.1の英語版を入れた環境でのみ動作確認。日本語版では、バージョン表示の部分が違うみたいなのでたぶん動かないと思う。また、OSはX 10.2にて動作確認。こちらはおそらく他のバージョンでも動くと思われる。

 さて、本題の、何をやっているか。
 まず、確認しなければいけないのは、インストールされているDATファイルのバージョンと、インターネット上にあるDATファイルのバージョンの比較。インストールされているDATファイルのバージョンはvscanxの--versionオプションで調べられる。何行か情報が表示されるが、「Virus data file v4221 created Sep 04 2002」と書かれたところがバージョン。バージョン表示からこの情報が書かれた部分をgrepで探し、とりあえずファイルに保存しておく(別にそんな必要はないのだが、デバッグを容易にするため)。
 次に、インターネット上にあるDATファイルのバージョンだが、ftp.nai.com/pub/antivirus/datfiles/4.x/にあるから、ここのファイル一覧をcurlで調べ(-lオプションを使う)、その中の「dat-4221.zip」のようなファイル名のものをgrepで探してこれもファイルに保存しておく。実際には、同フォルダにあるupdate.iniの内容を確認するべきなのかも知れないが、とりあえず、ということで。

 次に、バージョンの数字部分だけを取り出して比較するのだが、簡単な方法がわからなかったのでperlで無理矢理数字部分を抜き出している。非常に恥ずかしいやり方だが、これも動くからよし(汗)。
 バージョンが得られたら、それらを比較する。比較は、「if 条件; then」という感じで書く。上でそれぞれlocal、currentという変数にバージョンをおさめてあるから、それらを「$local = $current」と比較すればいい。注意するのは、周りの括弧([])との間にスペースが必要なことくらいかな。
 バージョンが同じなら、特になにもする必要はない。異なる場合は(実際にはインターネット上のファイルが「新しい場合」だが、通常、インストールされているファイルの方が新しいということはあり得ないだろうということで、同じかどうかだけの比較とした)DATファイルをダウンロードする。curlの-oオプションでダウンロード先のファイルを指定できる。
 ダウンロードが完了したら、unzipで解凍し、所定の場所にコピーすれば完了だ。コピーの際、rootのアクセス権が必要なのでsudoで一時的にrootになる必要がある。環境にもよるが、ダウンロードにしばらく時間がかかるので、その後にパスワードを要求するというインタフェースはあまり好ましくないが、これもとりあえず。

 こんな感じで一応ダウンロード、インストールの自動化は可能だ。あとは、これを定期的に実行できるようにすればいいのだが(7.28に書いたcronを使えばokかな)、問題が一つ。sudoのパスワード入力をどうするか、だ。簡単な解決方法は、/usr/local/virexのアクセス権を変更しておくことだが、それもどうかと思うのでなにか考えないといけないな。crontabの-uオプションかなと思いつつ、そのうち試してみようと思う。

 あ、書き忘れたけど、上記のスクリプトの使用は自己責任でどうぞ。というか、もっといい方法がありそうなので、どんどん改良して下さい(汗)。
August 25, 2002 ↑ 2002 index → September 22, 2002