|
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"
|