File: /volume1/@appstore/AntiVirus/scripts/clamav.sh
#!/bin/bash
PKG_DIR="/var/packages/AntiVirus"
CLAMAV_URL="current.cvd.clamav.net"
CLAMAV_DB_DIR="${PKG_DIR}/target/engine/clamav/var/lib"
CLAMAV_SIGTOOL="${PKG_DIR}/target/engine/clamav/bin/sigtool"
STATUS_UPDATED="updated"
STATUS_OUTDATED="outdated"
STATUS_CHECKFAIL="updatecheckfail"
find_db_file_path()
{
# return: 0 if file exists else 1
# output: file path
local db_dir=$1
local basename=$2
local path
for ext in cld cvd; do
path=$db_dir/$basename.$ext
if [[ -f $path ]]; then
echo $path
return 0
fi
done
return 1
}
get_latest_daily_version()
{
# output: extracted version
nslookup -query=txt $CLAMAV_URL | grep text | awk 'BEGIN {FS=":"} {print $3}'
}
get_local_db_version()
{
# return: 0 if verified OK else 1
# output: extracted version
local db_dir=$1
local basename=$2
local db_file_path
db_file_path=`find_db_file_path $db_dir $basename` || return 1
local sigtool_out_temp
sigtool_out_temp=`mktemp` || return 1
$CLAMAV_SIGTOOL -i "$db_file_path" 2>/dev/null > $sigtool_out_temp
local version=`grep Version $sigtool_out_temp | awk 'BEGIN {FS=": "} {print $2}'`
local ok_string=`grep 'Verification OK.' $sigtool_out_temp`
rm -f $sigtool_out_temp
echo $version
[[ $ok_string ]]
}
is_num() {
case $1 in
''|*[!0-9]*) return 1 ;;
*) return 0 ;;
esac
}
check_update()
{
# output: current version status string
local current_ver=`get_local_db_version $CLAMAV_DB_DIR daily`
local latest_ver=`get_latest_daily_version`
if ! is_num "$current_ver" || ! is_num "$latest_ver"; then
echo ${STATUS_CHECKFAIL}
return
elif [[ $latest_ver -gt $current_ver ]]; then
echo ${STATUS_OUTDATED}
return
fi
echo ${STATUS_UPDATED}
}
check_local_update_source()
{
# Check if the provided (uploaded) DBs are valid replacements for current DBs.
# return:
# 0 - if all the provided DB versions >= current versions
# 1 - else or any failure
local provided_db_dir=$1
local current_ver
local provided_ver
for basename in bytecode daily main; do
current_ver=`get_local_db_version $CLAMAV_DB_DIR $basename` || return 1
provided_ver=`get_local_db_version $provided_db_dir $basename` || return 1
is_num "$current_ver" || return 1
is_num "$provided_ver" || return 1
[[ $current_ver -le $provided_ver ]] || return 1
done
return 0
}
case "$1" in
check_update)
check_update
;;
check_local_update_source)
check_local_update_source "$2"
;;
*)
program=$(basename $0)
{
echo "Usage:"
echo " $program check_update"
echo " $program check_local_update_source <SOURCE_DB_DIR>"
} >&2
exit 1
;;
esac