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