HEX
Server: Apache/2.4.63 (Unix)
System: Linux Synopilou92 4.4.302+ #72806 SMP Mon Jul 21 23:16:00 CST 2025 x86_64
User: pilou92 (1026)
PHP: 8.0.30
Disabled: NONE
Upload Files
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