最近、clamXav Sentryを考えているのだが、どうも、LaunchAgentかLaunchDaemonを使えば、代用できそうな気がしている。Lingonでそれを作れそうだ。
Firefoxなどからダウンロードしたファイルは~/Downloadsにおかれる。これを検出して動く仕組みが、Launchdにあるみたいなのだ。それで、shell scriptでclamscanを呼び出そう。そしてscan終了の通知には、growlだ。growl付属のgrowlnotifyでいけそうだ。
ただLaunchdにある仕組みを使うと処理が終った後、そのフォルダが空にならないとだめらしい。うーん。scan後にファイルをどこにおくのが良いのだろうか?
Desktopで良いのだろうか?
つくってみた
前提
- /opt/local/bin/clamdscanが使える(clamdは落ちないよね!ずっと動くよね!)
- /usr/local/bin/growlnotifyが使える(growlのExtraにあるやつ)
- mv で乱暴にダウンロードからデスクトップにファイルを移す
scan-notify.shを作成
こんなscriptをscan-notify.shって名前で作成
#!/bin/bash # # scan-notify # # # (1) scan $ScanTarget(Dir) by clamdscan (installed by macport) # (2) notify Scan Summary by growl(growlnotify) # (3) move files/Dir to $ToDir(Dir) # # Usage # scan-notify [scan-target-dir] [to-dir] # # This script use for LaunchAgent # # author : fu7mu4@gmail.com # licence : MIT Licence # version : 04-07-2010 # # note: clamav and growl is independent from this licence #---variables---# # # Scan Target directory : where your browser put downloads files in ScanTarget=${1:-"$HOME/Downloads/"} # Moving-to dir : where this script put scanned files in ToDir=${2:-"$HOME/Desktop/"} # Temporary directory : you have to have write permission ScanNotifyTmpDir=${TMP:-"$HOME/TMP/"} # Temporary file : ScanNotifyTmp="$ScanNotifyTmpDir/scan-notify.$$.tmp" # Log directory : you have to have write permission ScanNotifyLogDir=${TMP:-"$HOME/TMP/"} # Log file : clamdscan log ScanNotifyLog="$ScanNotifyLogDir/scan-notify.log" # --- code --- # --- dir check --- mkdir -p "$ScanNotifyTmpDir" mkdir -p "$ScanNotifyLogDir" if [ -d "$ScanTarget" ] ; then # --- Targets are file names belong in the ScanTarget dir Targets=$(ls "${ScanTarget}/"[!.]*) # --- Exit 1 if Targets are empty if [ ${#Targets[@]} -eq 0 ] || [ -z ${Targets[0]} ] ; then exit 1 fi # --- scanning and making log /opt/local/bin/clamdscan ${Targets[@]} > "${ScanNotifyTmp}" # --- notify tail -3 "${ScanNotifyTmp}" | /usr/local/bin/growlnotify -t scan-notify # --- saving log echo "scanned by $0 at" $(date +"%Y %m %d %T") >> "${ScanNotifyLog}" cat "${ScanNotifyTmp}" >> "${ScanNotifyLog}" # --- moving scanned files (independet from result) mv "${Targets[@]}" "${ToDir}" # --- removing temporaries rm "${ScanNotifyTmp}" exit 0 fi
デスクトップ監視のAgent化してみた。
Lingonつかって、さっきのscan-notify.shをAgent化。
前提
- scan-notify.shは/where/you/save/scan-notify.sh
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>org.fu7mu4.scan-notify.watchd</string> <key>ProgramArguments</key> <array> <string>/where/you/save/scan-notify.sh</string> </array> <key>QueueDirectories</key> <array> <string>/Users/fu7mu4/Downloads</string> </array> </dict> </plist>
問題
同じ名前のファイルがあったら、どうなるかな?
あと、なにかの条件で移動できなかったら?延々scanしますが、なにか?