Blame src/bf_compact

Packit e8bc57
#! /bin/sh
Packit e8bc57
Packit e8bc57
#  bf_compact source_dir [wordlist_name...]
Packit e8bc57
#
Packit e8bc57
#    use to compact wordlist.db
Packit e8bc57
#    replaces original directory with new one
Packit e8bc57
#    renames original directory with '.old' extension
Packit e8bc57
Packit e8bc57
set -e # die on errors
Packit e8bc57
Packit e8bc57
: ${BOGOFILTER:=bogofilter}
Packit e8bc57
: ${BOGOUTIL:=bogoutil}
Packit e8bc57
Packit e8bc57
if [ -z "$1" ] ; then
Packit e8bc57
    echo 'usage: bf_compact source_dir [wordlist_name...]'
Packit e8bc57
    exit 1
Packit e8bc57
fi
Packit e8bc57
Packit e8bc57
# extract home directory
Packit e8bc57
BOGOHOME="$1"
Packit e8bc57
shift
Packit e8bc57
Packit e8bc57
if [ ! -d "$BOGOHOME" ] ; then
Packit e8bc57
    echo "$BOGOHOME must be a directory, not a file"
Packit e8bc57
    exit 1
Packit e8bc57
fi
Packit e8bc57
Packit e8bc57
# strip trailing slashes
Packit e8bc57
while true; do
Packit e8bc57
    case "$BOGOHOME" in
Packit e8bc57
	*/) BOGOHOME=${BOGOHOME%/} ;;
Packit e8bc57
	*)  break ;;
Packit e8bc57
    esac
Packit e8bc57
done
Packit e8bc57
Packit e8bc57
export BOGOHOME
Packit e8bc57
Packit e8bc57
# find wordlists
Packit e8bc57
if [ -n "$1" ] ; then
Packit e8bc57
    FILES="$@"
Packit e8bc57
else
Packit e8bc57
    DIR=$($BOGOFILTER -QQ | grep ^bogofilter_dir | gawk '{print $3}')
Packit e8bc57
    if [ "$BOGOHOME" != "$DIR" ] ; then
Packit e8bc57
	FILES=$(ls "$BOGOHOME"/*.db)
Packit e8bc57
    else
Packit e8bc57
	FILES=$($BOGOFILTER -QQ | grep ^wordlist | cut -f3 -d,)
Packit e8bc57
    fi
Packit e8bc57
fi
Packit e8bc57
Packit e8bc57
BOGOTEMP="bf_compact.$$"
Packit e8bc57
Packit e8bc57
mkdir "$BOGOTEMP" || {
Packit e8bc57
    echo "Cannot create directory $BOGOTEMP. Abort."
Packit e8bc57
    exit 1
Packit e8bc57
}
Packit e8bc57
Packit e8bc57
# copy Berkeley DB configuration if present
Packit e8bc57
if test -f "$BOGOHOME"/DB_CONFIG ; then
Packit e8bc57
    cp -p "$BOGOHOME"/DB_CONFIG "$BOGOTEMP"/
Packit e8bc57
fi
Packit e8bc57
Packit e8bc57
case "$($BOGOFILTER -V | grep Database:)" in
Packit e8bc57
    *"Berkeley DB"*)
Packit e8bc57
    # determine transactions
Packit e8bc57
	if test "$(find "$BOGOHOME/" -name "log.??????????" -print)" = "" ; then
Packit e8bc57
	    TXN=no
Packit e8bc57
	else
Packit e8bc57
	    TXN=yes
Packit e8bc57
	fi
Packit e8bc57
    ;;
Packit e8bc57
    *)
Packit e8bc57
	TXN=noarg
Packit e8bc57
    ;;
Packit e8bc57
esac
Packit e8bc57
Packit e8bc57
# reload files
Packit e8bc57
for FILE in $FILES ; do
Packit e8bc57
    NAME="$(basename $FILE)"
Packit e8bc57
    $BOGOUTIL --db-verify "$FILE" \
Packit e8bc57
	|| { echo "$FILE corrupted, aborting." ; rm -r "$BOGOTEMP" ; exit 1 ; }
Packit e8bc57
    $BOGOUTIL -d "$FILE" | case $TXN in 
Packit e8bc57
	no|yes) $BOGOUTIL --db-transaction=no -l "$BOGOTEMP/$NAME" ;;
Packit e8bc57
	noarg)  $BOGOUTIL                     -l "$BOGOTEMP/$NAME" ;;
Packit e8bc57
    esac
Packit e8bc57
done
Packit e8bc57
Packit e8bc57
if [ $TXN = "yes" ] ; then
Packit e8bc57
    #create database environment files
Packit e8bc57
    $BOGOFILTER -e -C -d "$BOGOTEMP" --db-transaction=yes < /dev/null
Packit e8bc57
fi
Packit e8bc57
Packit e8bc57
# remove $BOGOHOME.old so we don't move the new backup *into* it
Packit e8bc57
# rather than renaming the backup to it.
Packit e8bc57
rm -rf "$BOGOHOME.old"
Packit e8bc57
mv "$BOGOHOME" "$BOGOHOME.old"
Packit e8bc57
mv "$BOGOTEMP" "$BOGOHOME"