#! /bin/bash

set -e

export LANG=C
export LC_CTYPE=C

# Script to automatically check whether the installed clamav databases
# can be used to correctly find clamav-testfiles and eicar.com

# Written by Marc Haber <mh+debian-packages@zugschlus.de>

[ "$CLAMSCAN" ] || CLAMSCAN="$(which clamscan)"
[ "$CONFFILE" ] || CONFFILE="/etc/clamav/clamav-check.conf"

umask 002
CLAMSCAN_OPTS="${CLAMSCAN_OPTS:-}"

OUTPUTFILE=$(mktemp -t clamscanoutput.XXXXXX) || { echo "$0: Cannot create temporary file" >&2; exit 1;  }
trap " [ -f \"$OUTPUTFILE\" ] && /bin/rm -f -- \"$OUTPUTFILE\"" 0 1 2 3 13 15

if ! [ -x "$CLAMSCAN" ]; then
	echo >&2 "ERR: no clamscan in path. Aborting."
	exit 1
fi

if ! dpkg --list clamav-testfiles >/dev/null 2>/dev/null; then
	echo >&2 "ERR: no clamav-testfiles installed. Aborting."
	exit 1
fi

PKGNAME="$(< $CONFFILE awk '{if( "packagename" == $1 ) { print $2 }}')"
if [ -z "$PKGNAME" ]; then
    PKGNAME="clamav-testfiles"
fi

PKGVERS="$(dpkg --list $PKGNAME | sed -n '/^ii/{s/^ii[[:space:]]\+[^[:space:]]\+[[:space:]]\+\([^[:space:]]\+\).*/\1/;p;q;}')"

CONFLINE="$(< $CONFFILE grep "^$PKGVERS[[:space:]]" || true)"
if [ -z "$CONFLINE" ]; then
    CONFLINE="$(< $CONFFILE grep "^default[[:space:]]")"
fi

if [ -z "$CONFLINE" ]; then
    echo >&2 "ERR: error parsing $CONFFILE for $CLAMAVVER"
    exit 1
fi

NUM=1
[ "$CLAMAVTESTFILES" ] || CLAMAVTESTFILES="/usr/share/clamav-testfiles"
TESTDIR[$NUM]="$CLAMAVTESTFILES"
TESTGREPSTR[$NUM]="ClamAV-Test-File FOUND"
TESTEXPLSTR[$NUM]="ClamAV Test Files"

[ "$EICAR" ] || EICAR="/var/lib/clamav-getfiles/eicar.com"
if [ -f "$EICAR" ]; then
    NUM=$(( $NUM + 1 ))
    TESTDIR[$NUM]="/var/lib/clamav-getfiles"
    TESTGREPSTR[$NUM]="Eicar-Test-Signature FOUND"
    TESTEXPLSTR[$NUM]="EICAR Anti-Virus Test-File"
fi

TESTDIRS=""
I=1
while [ "$I" -le "$NUM" ]; do
    TESTDIRS="$TESTDIRS ${TESTDIR[$I]}"
    TESTNUMBADFILES[$I]="$(echo $CONFLINE | awk -v FN=$(( $I + 1 )) '{print $FN}')"
    I=$(( $I + 1 ))
done

echo "$CLAMSCAN $CLAMSCAN_OPTS --recursive $TESTDIRS"
RET=0
$CLAMSCAN $CLAMSCAN_OPTS --recursive $TESTDIRS > $OUTPUTFILE 2>&1 || RET=$?
cat $OUTPUTFILE
if [ $RET -ne 1 ] ; then
    echo >&2 "An error ($RET) occured while scanning $EXPLSTRING."
    exit 2
fi

I=1
while [ "$I" -le "$NUM" ]; do
    NUMBADFILES=$(< $OUTPUTFILE grep "${TESTGREPSTR[$I]}" | wc -l)
    if [ $NUMBADFILES -ne ${TESTNUMBADFILES[$I]} ]; then
        echo >&2 "Wrong number ($NUMBADFILES/${TESTNUMBADFILES[$I]}) of 'infected' files detected while scanning ${TESTEXPLSTR[$I]}"
        exit 2
    fi
    I=$(( $I + 1 ))
done

if ! [ -f "$EICAR" ]; then
    echo "No test scan against eicar.com done, file not present on system."
    echo "You might want to point the EICAR environment variable to the file."
fi

rm -f $OUTPUTFILE
