virus update scripts.

Julian Field mailscanner at ecs.soton.ac.uk
Thu Sep 4 14:45:40 IST 2003


When I ran your new version, I get this:

 > uvscan --version --dat .
uvscan: error while loading shared libraries: liblnxfv.so.4: cannot open
shared object file: No such file or directory
Fetch or test failed -- removing bad McAfee data files

At 13:33 04/09/2003, you wrote:
>Bob Jones <bob.jones at USG.EDU> wrote:
> >Hey all, a couple things here.  First is with the mcafee-autoupdate
> >script in the latest release.  What is this extra.dat file it tries to
> >download and complains about when it's not there?
>
>Sorry that was a cockup on my part -- some experimental code for getting
>emergency dat files between a virus outbreak and a full dat file update
>escaped. My current version of the script is below.
>
>Tony.
>--
>f.a.n.finch  <dot at dotat.at>  http://dotat.at/
>BISCAY: EASTERLY BECOMING CYCLONIC THEN WESTERLY 3 OR 4. THUNDERY SHOWERS.
>MODERATE OR GOOD.
>
>
>
>#!/bin/sh -e
>#
># Update the McAfee data files.
>#
># $Cambridge: hermes/build/bin/uvscan-update,v 1.38 2003/09/04 12:27:27
>fanf2 Exp $
>
># $PREFIX is the directory where the uvscan binary is (NOT a symlink to
># the binary), which is where it looks for its dat files. You may run
># uvscan via a symlink to this place (e.g. from /usr/local/bin/uvscan)
># and it will still look for the dat files here. If uvscan's library
># dependencies can be found in a standard place (e.g. /usr/local/lib)
># then you don't need a wrapper script to set LD_LIBRARY_PATH before
># running it.
>#
># The dat files are installed in a subdirectory of $DATDIR named
># according to their version number, with symlinks from $PREFIX into
># the subdirectory via a current link. The current link is updated
># without locking on the assumption that this is sufficiently unlikely
># to cause a problem.
>
># defaults
>OPTS=""
>PREFIX=/opt/uvscan
>FTPDIR=http://download.nai.com/products/datfiles/4.x/nai/
>
># handle the command line
>usage () {
>         echo "usage: $0 [-dfrtv] [prefix]"
>         echo "  -d      delete old files"
>         echo "  -f      force update"
>         echo "  -r      show README"
>         echo "  -t      timestamp output"
>         echo "  -v      verbose"
>         echo "  prefix  uvscan installation directory"
>         exit 1
>}
>case $# in
>0|1|2)  : ok
>         ;;
>*)      usage
>         ;;
>esac
>for arg in "$@"
>do
>         case $arg in
>         -*)     OPTS=$arg
>                 ;;
>         /*)     PREFIX=$arg
>                 ;;
>         *)      usage
>                 ;;
>         esac
>done
>case $OPTS in
>*[!-dfrtv]*)
>         usage
>esac
>option () {
>         case $OPTS in
>         -*$1*)  eval $2=yes
>                 ;;
>         *)      eval $2=no
>                 ;;
>         esac
>}
>option d DELETE
>option f FORCE
>option r README
>option t TIME
>option v VERBOSE
>case $FORCE in
>yes)    VERBOSE=yes
>esac
>
># set up paths
>PATH=$PREFIX:/usr/local/bin:/usr/bin:/bin
>export PATH
>DATDIR=$PREFIX/datfiles
>SUBDIR=datfiles/current
>LINK=$PREFIX/$SUBDIR
>
># wrapper functions for echo etc.
>timestamp () {
>         case $TIME in
>         yes)    date "+%Y-%m-%d %H:%M:%S "
>         esac
>}
>say () {
>         case $VERBOSE in
>         yes)    echo "`timestamp`$*"
>         esac
>}
>run () {
>         say "> $*"
>         "$@"
>}
>say Starting $0
>say DELETE=$DELETE
>say FORCE=$FORCE
>say README=$README
>say TIME=$TIME
>say VERBOSE=$VERBOSE
>say PREFIX=$PREFIX
>
>if [ ! -h $LINK ]
>then
>         INIT=yes
>         VERBOSE=yes
>         say Initial setup of $0
>         run mkdir -p $DATDIR
>fi
>run cd $DATDIR
>
># version number pattern
>MATCH="[0-9][0-9][0-9][0-9]"
>
># work out latest dat version
>CMD="wget --passive-ftp $FTPDIR/update.ini 2>update.err"
>say "> $CMD"
>if eval "$CMD"
>then
>         VERSION=`cat update.ini | sed
> "/^DATVersion=\($MATCH\).$/!d;s//\1/;q"`
>else
>         cat update.err
>         VERSION=UNKNOWN
>fi
>run rm -f update.*
>
>badversion () {
>         VERBOSE=yes
>         say "Failed to get McAfee datfile update from $FTPDIR"
>         say "FTP version number \"$VERSION\" $*"
>         run exit 1
>}
>
># check the format of the version number
>case $VERSION in
>$MATCH) : ok
>         ;;
>*)      badversion does not match "$MATCH"
>         ;;
>esac
>
># already got it?
>if [ -d $VERSION ]
>then
>         case $FORCE in
>         yes)    say Forced removal of $VERSION
>                 run rm -rf $VERSION
>                 ;;
>         *)      say Already have $VERSION
>                 run exit 0
>                 ;;
>         esac
>fi
>
># work out installed dat version
>PREVIOUS=`(ls -d $MATCH 2>/dev/null || echo 0000) | tail -1`
>
># check new version is actually newer
>if [ $PREVIOUS -gt $VERSION ]
>then
>         badversion older than installed $PREVIOUS
>fi
>
>VERBOSE=yes
>
>say Installed dat file is $PREVIOUS
>say Latest dat file is $VERSION
>
># protect against failure
>fail () {
>         trap EXIT
>         echo "$OUT"
>         say Fetch or test failed -- removing bad McAfee data files
>         run cd $DATDIR
>         run rm -rf $VERSION
>         run exit 1
>}
>trap fail EXIT
>
># fetch and extract dat files
>TARFILE=dat-$VERSION.tar
>run mkdir $VERSION
>run cd $VERSION
>run wget --passive-ftp --progress=dot:mega $FTPDIR/$TARFILE
>run tar xvf $TARFILE
>
># verify the contents
>CMD="uvscan --version --dat ."
>say "> $CMD"
>OUT=`$CMD 2>&1`
>case "$OUT" in
>*"Missing or invalid DAT"* | \
>*"Data file not found"* | \
>*"Removal datafile clean.dat not found"* | \
>*"Unable to remove viruses"* )
>         fail
>esac
>
># protection not needed now
>trap '' EXIT
>
>echo "$OUT"
>say Update OK
>
># show information on this update?
>case $README in
>yes)    run sed 's/[[:cntrl:]]//g
>                 1,/^====================/d
>                 /^====================/,/^NEW VIRUSES DETECTED/d
>                 /^UNDERSTANDING VIRUS NAMES/,$d
>                 s/^/# /;/@MM/s/$/ <--/' readme.txt
>esac
># remove some crap
>run rm -f *.diz *.exe *.ini *.lst *.tar *.txt
>
># do remaining part of initial setup
>case $INIT in
>yes)    for file in *.dat
>         do
>                 run rm -f $PREFIX/$file
>                 run ln -s $SUBDIR/$file $PREFIX/$file
>         done
>esac
>
># update the current version link
>run rm -f $LINK
>run ln -s $VERSION $LINK
>
># maybe delete old dat files
>case $DELETE in
>yes)    run cd $DATDIR
>         run rm -rf $PREVIOUS
>esac
>
>say Completed OK
>run exit 0
>
># done

--
Julian Field
www.MailScanner.info
MailScanner thanks transtec Computers for their support



More information about the MailScanner mailing list