\SymantecScanEngine_5.2.4_Win32_IN\Tools\Java\Win32\jre-1_5_0_15-windows-i586-p.exe
SymantecScanEngine_5.2.4_Win32_IN\Scan_Engine\Win32\ScanEngine.exe
あんまり参考にならない「Symantec Scan Engine ソフトウェア開発者ガイド」といい加減な Javadoc ( SymantecScanEngine_5.2.4_Win32_IN\Scan_Engine_SDK\Java\Docs\SymJavaAPIDocs ) を参考にざざっとプログラムを書くと以下のようになる
package com.snail.example;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import org.apache.commons.beanutils.BeanUtils;
import com.symantec.scanengine.api.Policy;
import com.symantec.scanengine.api.Result;
import com.symantec.scanengine.api.ScanEngine;
import com.symantec.scanengine.api.ScanException;
import com.symantec.scanengine.api.StreamScanRequest;
public class AVExam {
private static final String SCAN_SERVER = "172.16.121.64"; // Win2003 Server on VMWare Fusion
private static final int SCAN_PORT = 1344;
private static final String SCAN_FILE = "/Users/atsushi/Downloads/eicar.com";
public static void main(String[] args) {
// 1) Scan Engine Server の IP アドレスと Port 番号を定義
// 複数台の Scan Engine Server で負荷分散をすることが可能
Vector<ScanEngine.ScanEngineInfo> scEngInfo
= new Vector<ScanEngine.ScanEngineInfo>();
ScanEngine.ScanEngineInfo scInfo
= new ScanEngine.ScanEngineInfo(SCAN_SERVER,SCAN_PORT);
scEngInfo.add(scInfo);
try{
// 2) Scan Engine Client を作成する
// 接続待ち 1000ms でエラー / 応答待ち 3000ms でエラー
ScanEngine scEngine = ScanEngine.createScanEngine(scEngInfo);
// 3) Scan Engine に、ウイルス検査を要求する
//
// 検査後のファイルの扱いを設定する必要がある
// Policy.DEFAULT : Scan Engine サーバの設定を利用する
// Policy.SCAN : Scan のみをする
// Policy.SCANDELETE : ウイルスが検出されたらファイルを削除する
// Policy.SCANREPAIR : ウイルスが検出されたらウイルスを除去する
// Policy.SCANREPAIRDELETE : ウイルス除去を試み、できなかったらファイルを削除する
//
// ※ scEngine.createFileScanRequest() は、Scan Engine サーバと
// ※ クライアントが同じマシンの場合のみ使える・・・・何日無駄にしたことか・・・orz
OutputStream out = new FileOutputStream("/tmp/output");
StreamScanRequest req
= scEngine.createStreamScanRequest(SCAN_FILE, SCAN_FILE, out, Policy.SCAN);
Result res = req.scanFile();
out.close();
// 4) 結果を標準出力に出力
Map resMap = BeanUtils.describe(res);
List keys = new ArrayList(resMap.keySet());
for(Object key : keys){
System.out.println(key + "=" + resMap.get(key));
}
} catch( ScanException ex ) {
ex.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
とりあえず動く物を作るだけなら簡単にできる
threatInfo=com.symantec.scanengine.api.ThreatInfo@13e4a47e definitionDate=Sun Jun 14 00:00:00 JST 2009 status=INFECTED_REPLACED fileStatus=null definitionRevNumber=004 IPTries=com.symantec.scanengine.api.ConnectionAttempt@3fe2670b class=class com.symantec.scanengine.api.Result totalInfection=0
サンプルウイルスを Scan Engine に検査させると、無事に INFECTED_REPLACED(感染している) というステータスが帰ってきた
CLEAN | |
FILE_ACCESS_FAILED | |
INFECTED_REPLACED | 感染している_除去に成功 |
INFECTED_UNREPLACED | 感染している_除去に失敗 |
INTERNAL_SERVER_ERROR | |
NO_AV_LICENSE | Scan Engine のライセンス切れ |
StreamScanRequest req = scEngine.createStreamScanRequest(SCAN_FILE, SCAN_FILE, out, Policy.SCAN); Result res = req.scanFile();
の代わりに、
byte[] byteArray = readFile(); StreamScanRequest req = scEngine.createStreamScanRequest(SCAN_FILE, SCAN_FILE, out, Policy.SCAN); req.send(byteArray); Result res = req.finish();
を使う。
なんか、キモい API だなぁ・・・
scEngine.createStreamScanRequest(actualFileName, originalFileName, out, policy);
scEngine.createFileScanRequest()
は、クライアントとサーバが同一筐体な時しか使えない(Javadoc にも明記されている)。
普通の開発者は、scEngine を作るときに、サーバーの IP アドレスとポート番号を渡しているんだから、そうは思わないだろう・・・ちゃんとドキュメントを読まない私が悪いんですが・・・