#!/bin/sh
# sprawdza i/lub pobiera nowa wersje baz wirusow
# napisane przez Grzegorz Malicki
# rozszerzenia Dariusz Grzegorski


# --------------------------------
# ponizsze wartosci mozna zmieniac
# --------------------------------

# miejsce przetrzymywania daty ostatniej aktualizacji
# jesli skrypt nie jest uruchamiany przez roota, to nie ma prawa
# pisac do katalogu /var/log
#MKS_UPDATE_FILE=/var/amavis/mks_vir_update
MKS_UPDATE_FILE=/var/log/mks_vir_update

# czy tworzyc log z datami aktualizacji?
MKS_UPDATE_LOG=N

# plik tymczasowy
MKS_TMP_FILE=/tmp/mkshttpdata

# URL - skad sa pobierane bazy
MKS_URL=http://download.mks.com.pl/download/linux/bazy4.tgz

# docelowy katalog z bazami
MKS_BASES=/usr/local/share/mks_vir

# katalog, gdzie beda sciagane i obrabiane
MKS_DOWNLOAD=/tmp

# sciezka do pliku mks32 lub tylko nazwa, jesli plik znajduje sie w $PATH
MKS_XXXII=mks32

# opcja (facility) logowania
MKS_LOG_FACILITY=cron

# czy wysylac sygnal do demona po wgraniu nowych baz?
MKSD_KICK=Y


# dalej lepiej juz nie grzebac
VERBOSE=N
USELOG=N


lecho ()
{
    if [ ${USELOG} = "Y" ]
    then
        logger -p ${MKS_LOG_FACILITY}.$1 -t mksupdate -- "$2"
    else
        echo "$2"
    fi
}

mkscheck ()
{
    if [ ${VERBOSE} = "Y" ]
    then
        echo Sprawdzam czy sa nowe bazy.
    fi

    rm -f ${MKS_TMP_FILE}
    
    if ! wget ${MKS_URL} --tries=6 --server-response --spider -o ${MKS_TMP_FILE}
    then
	lecho err "Nie mozna nawiazac polaczenia z serwerem."
        return 5
    fi

    if [ ${VERBOSE} = "Y" ]
    then
        echo Polaczenie nawiazane.
    fi
    
    if ! cat ${MKS_TMP_FILE} | grep "Last-Modified" > ${MKS_TMP_FILE}2
    then
        lecho err "Zmieniony system aktualizacji lub nieprawidlowa nazwa pliku baz."
	return 6
    fi

    diff ${MKS_TMP_FILE}2 ${MKS_UPDATE_FILE} > /dev/null 2> /dev/null
    DIFFVAL=$?
    if [ ${DIFFVAL} -eq 0 ]
    then
        lecho info "Masz aktualne bazy."
	return 0
    fi
    
    lecho info "Sa dostepne nowe bazy wirusow."
    
    if [ ${DIFFVAL} -ne 1 ]
    then
        if [ ${VERBOSE} = "Y" ]
	then
	    echo Usunieta data ostatniego pobrania lub pierwsze pobieranie baz.
	fi
    fi
    return 1
}

mksinstall ()
{
    if [ -f ${MKS_DOWNLOAD}/bazy4.tgz ]
    then
        if [ ${VERBOSE} = "Y" ]
	then
            echo Rozpakowuje
        fi

        if ! gzip -d -f ${MKS_DOWNLOAD}/bazy4.tgz
	then
	    lecho err "Plik uszkodzony, ponow pobieranie."
    	    return 7
        fi
    fi

    tar xf ${MKS_DOWNLOAD}/bazy4.tar -C ${MKS_DOWNLOAD}
    
    if ! ${MKS_XXXII} -f /dev/null --mks-vir-dat-path=${MKS_DOWNLOAD}/bazy4/ -s ${MKS_DOWNLOAD}/bazy4/mksbase0.dat >/dev/null 2>&1
    then
	lecho err "Blad formatu baz, sprawdz wersje mks-a."
	return 8
    fi
    
    if [ ${VERBOSE} = "Y" ]
    then
        echo Instaluje
    fi

    if ! cp -f ${MKS_DOWNLOAD}/bazy4/* ${MKS_BASES}
    then
	lecho err "Blad podczas instalacji baz."
	return 9
    fi
    
    if [ ${MKSD_KICK} = "Y" -a -r /var/run/mksd/mksd.pid ]
    then
        if [ ${VERBOSE} = "Y" ]
        then
            echo Wysylam SIGHUP procesowi mksd
        fi

        kill -HUP `cat /var/run/mksd/mksd.pid`
    fi
    
    rm -rf ${MKS_DOWNLOAD}/bazy4 > /dev/null
    rm -f ${MKS_DOWNLOAD}/bazy4* > /dev/null
    cp -f ${MKS_TMP_FILE}2 ${MKS_UPDATE_FILE}
    if [ ${MKS_UPDATE_LOG} = "Y" ]
    then
        cat ${MKS_TMP_FILE}2 >> ${MKS_UPDATE_FILE}.log
    fi
    
    lecho info "Nowe bazy zainstalowane."
    return 0
}

mksgetforce ()
{
    if [ ${VERBOSE} = "Y" ]
    then
        echo Pobieram bazy
    fi

    rm -f ${MKS_TMP_FILE}
    
    if ! wget ${MKS_URL} --tries=6 --server-response -O ${MKS_DOWNLOAD}/bazy4.tgz -o ${MKS_TMP_FILE}
    then
	lecho err "Nie mozna nawiazac polaczenia z serwerem lub przerwana transmisja."
        return 5
    fi

    cat ${MKS_TMP_FILE} | grep "Last-Modified" > ${MKS_TMP_FILE}2
    if [ $? -ne 0 ]
    then
        lecho err "Zmieniony system aktualizacji lub nieprawidlowa nazwa pliku baz."
	return 6
    fi
    
    mksinstall
}

mksget ()
{
    mkscheck
    CHECKVAL=$?
    if [ ${CHECKVAL} -eq 1 ]
    then
	mksgetforce
	CHECKVAL=$?
    fi
    return ${CHECKVAL}
}

mkshelp ()
{
    lecho info "mksupdate wersja 0.2 napisane przez Grzegorz Malicki + DG"
    lecho info ""
    lecho info "skladnia: mksupdate opcja [verbose|uselog]"
    lecho info ""
    lecho info "opcje:"
    lecho info "   check    :sprawdza czy sa nowe bazy"
    lecho info "   get      :pobiera nowe bazy jesli trzeba i instaluje"
    lecho info "   getforce :pobiera bazy bez sprawdzania czy to potrzebne i instaluje"
    lecho info "   install  :sama instalacja jesli pobrane recznie lub wystapil blad"
    lecho info "   help     :ten opis"
    lecho info ""
    lecho info "na koncu mozna dodac verbose to wtedy bedzie widac co sie dzieje"
    lecho info "opcja uselog przekierowuje stdout do logow systemowych"
}


if [ "$2" = "verbose" ]
then
    VERBOSE=Y
fi

if [ "$2" = "uselog" ]
then
    USELOG=Y
fi

case "$1" in
help)
    mkshelp
	;;
check)
    mkscheck
	;;
get)
    mksget
	;;
getforce)
    mksgetforce
	;;
install)
    mksinstall
	;;
*)
    mkshelp
	;;
esac
