fu7mu4’s diary

はてなダイアリーから移転しました。

alternative ClamXav Sentry

最近、clamXav Sentryを考えているのだが、どうも、LaunchAgentかLaunchDaemonを使えば、代用できそうな気がしている。Lingonでそれを作れそうだ。

Firefoxなどからダウンロードしたファイルは~/Downloadsにおかれる。これを検出して動く仕組みが、Launchdにあるみたいなのだ。それで、shell scriptでclamscanを呼び出そう。そしてscan終了の通知には、growlだ。growl付属のgrowlnotifyでいけそうだ。

ただLaunchdにある仕組みを使うと処理が終った後、そのフォルダが空にならないとだめらしい。うーん。scan後にファイルをどこにおくのが良いのだろうか?

Desktopで良いのだろうか?

つくってみた

前提

  1. /opt/local/bin/clamdscanが使える(clamdは落ちないよね!ずっと動くよね!)
  2. /usr/local/bin/growlnotifyが使える(growlのExtraにあるやつ)
  3. 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化。
前提

  1. 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しますが、なにか?