#!/bin/bash
# Kategorie: server
# Script zur zyklischen Virenprüfung der Fileserver-Freigaben
# (C) 2009 invis-server.org
# Author: Stefan Schäfer <stefan@invis-server.org>
# Questions: stefan@invis-server.org

# License: GPLv3
# Dieses Programm ist freie Software. Sie können es unter den Bedingungen der 
# GNU General Public License, wie von der Free Software Foundation veröffentlicht,
# weitergeben und/oder modifizieren, entweder gemäß Version 3 der Lizenz oder
# (nach Ihrer Option) jeder späteren Version.

# Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, daß es Ihnen
# von Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE, sogar ohne die implizite 
# Garantie der MARKTREIFE oder der VERWENDBARKEIT FÜR EINEN BESTIMMTEN ZWECK. 
# Details finden Sie in der GNU General Public License.

# Sie sollten ein Exemplar der GNU General Public License zusammen mit diesem 
# Programm erhalten haben. Falls nicht, siehe <http://www.gnu.org/licenses/>. 

#Konfigurationsdaten
conffile="/etc/invis/invis.conf"

# Funktionen
# Werte aus Konfigurationsdatendatei extrahieren
# $1 = Konfigurationsdatei, $2 = Parameter, $3 Wert (Feld)
getconfdata() {
    cat $1 |grep "$2" | cut -d ":" -f $3
}

# Konfigurationsparameter tauschen
changevalues() {
    # Arg1 = Pfad, Arg2 = Datei, Arg3 = sed String
    cat $1/$2|sed "s%$3%g" > $1/$2.new
    mv $1/$2.new $1/$2
}

# Scan mit ESET durchführen, Log beim ersten Durchgang immer neu beginnen
CLEAR_LOG="1"
doesetscan() {
    SCANPATH=$1
    if [[ $CLEAR_LOG == "1" ]]; then
        CLEAR_LOG="0"
        "$ESET_BIN" $ESET_PARA --log-rewrite "$SCANPATH" >> /dev/null 2>&1
    else
        "$ESET_BIN" $ESET_PARA "$SCANPATH" >> /dev/null 2>&1
    fi
    SCAN_STATE=$?
    case $SCAN_STATE in
	0)
	  # Still sein wenn alles Ok ist
	  ;;
	  
	1)
	  echo "Virus in $SCANPATH gefunden und bereinigt! Mehr siehe $AVLOG"
	  ;;
	
	10)
	  echo "Nicht alle Dateien in $SCANPATH gescannt! Mehr siehe $AVLOG"
	  ;;
	
	50)
	  echo "Virus in $SCANPATH gefunden! Mehr siehe $AVLOG"
	  ;;
	
	100)
	  echo "Fehler beim Scannen von $SCANPATH aufgetreten! Mehr siehe $AVLOG"
	  ;;
	
	*)
	  echo "Status $SCAN_STATE beim Scannen von $SCANPATH aufgetreten! Mehr siehe $AVLOG"
	  ;;
    esac
}

# Basis-Variablen
doavrun=`getconfdata $conffile "avCheck" "2"`
doclean=`getconfdata $conffile "avClean" "2"`
scanner=`getconfdata $conffile "AV" "2"`
quardir=`getconfdata $conffile "quarDir" "2"`
AVLOG="/var/log/avrun.log"
AVFUNDE="/var/log/avfunde.log"
ESET_BIN="/opt/eset/esets/sbin/esets_scan"
ESET_PARA="-f $AVLOG --unsafe --unwanted --adv-heur --ext-exclude iso --quarantine --quar-dir $quardir"

if [[ $doavrun == "j" ]]; then
    if [[ $scanner == "antivir" ]]; then
	avscan --allfiles --scan-in-archive -q -r1 -lang=DE -s --moveto=$quardir /var/lib/samba/profiles/
	avscan --allfiles --scan-in-archive -q -r1 -lang=DE -s --moveto=$quardir /srv/shares
	avscan --allfiles --scan-in-archive -q -r1 -lang=DE -s --moveto=$quardir /home
    else
	if [[ $scanner == "eset" ]]; then
	    if [[ $doclean == "j" ]]; then
		ESET_PARA="$ESET_PARA --clean-mode=standard"
	    else
		ESET_PARA="$ESET_PARA --clean-mode=none"
	    fi
	    
	    # Die verschiedenen Verzeichnisse scannen
	    doesetscan "/var/lib/samba/profiles"
	    doesetscan "/srv/shares"
	    doesetscan "/home"
	    
	    # Ausgabe der Zeilen mit Funden
	    grep -v 'threat="is OK"' "$AVLOG" | grep -E 'threat="[^"]+"' > "$AVFUNDE"
	    if [[ $? == "0" ]]; then
		echo "Funde:"
		cat "$AVFUNDE"
	    fi
	else
	    clamscan -r -i --log=/var/log/clamscan --move=$quardir /var/lib/samba/profiles/
	    clamscan -r -i --log=/var/log/clamscan --move=$quardir /srv/shares
	    clamscan -r -i --log=/var/log/clamscan --move=$quardir /home
	fi
    fi
fi
