#!/bin/sh # Copyright 1999-2007 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # # Remove old signatures and unimportant tokens from the DSPAM database # # # Function to run dspam_clean # run_dspam_clean() { if [ ! -f "/usr/bin/dspam_clean" ] then echo "/usr/bin/dspam_clean not found!" return 1 else /usr/bin/dspam_clean -s -p -u >/dev/null 2>&1 return 0 fi } # # Function to check if we have all needed tools # check_for_tools() { local myrc=0 for foo in awk head tail cut sed do if ! which ${foo} >/dev/null 2>&1 then echo "Command ${foo} not found!" myrc=1 fi done return ${myrc} } # # Acquire lock file and start processing # DSPAM_CRON_LOCKFILE="/var/run/$(basename $0 .sh).pid" if ( set -o noclobber; echo "$$" > "${DSPAM_CRON_LOCKFILE}") 2> /dev/null; then trap 'rm -f "${DSPAM_CRON_LOCKFILE}"; exit $?' INT TERM EXIT # # Check for needed tools # check_for_tools if [ "$?" -ne "0" ] then # We have not all needed tools installed. Run just the dspam_clean part. run_dspam_clean exit $? fi # # Try to get DSPAM home directory # DSPAM_HOMEDIR="$(grep ^dspam /etc/passwd|awk -F : '{print $6}')" if [ ! -f ${DSPAM_HOMEDIR}/dspam.conf ] then # Something is wrong in passwd! Check if /etc/mail/dspam exists instead. if [ -f /etc/mail/dspam/dspam.conf ] then DSPAM_HOMEDIR="/etc/mail/dspam" fi fi [ ! -d ${DSPAM_HOMEDIR} ] && exit 2 # # Try to get DSPAM data home directory # DSPAM_DATAHOMEDIR="$(grep ^Home ${DSPAM_HOMEDIR}/dspam.conf|awk '{print $2}')" if [ ! -d ${DSPAM_DATAHOMEDIR} ] then # Something is wrong in dspam.conf! Check if /var/spool/dspam exists instead. if [ -d /var/spool/dspam ] then DSPAM_DATAHOMEDIR="/var/spool/dspam" fi fi [ ! -d ${DSPAM_DATAHOMEDIR} ] && exit 2 # # MySQL # if [ -f "${DSPAM_HOMEDIR}/mysql.data" ] then if [ ! -f "/usr/bin/mysql_config" ] then echo "Can not run MySQL purge script:" echo " /usr/bin/mysql_config does not exist" run_dspam_clean exit 1 fi DSPAM_MySQL_PURGE_SQL="" DSPAM_MySQL_VER="$(/usr/bin/mysql_config --version | sed "s:\([^0-9\.]*\)::g")" DSPAM_MySQL_MAJOR="$(echo "${DSPAM_MySQL_VER}" | cut -d. -f1)" DSPAM_MySQL_MINOR="$(echo "${DSPAM_MySQL_VER}" | cut -d. -f2)" DSPAM_MySQL_MICRO="$(echo "${DSPAM_MySQL_VER}" | cut -d. -f3)" DSPAM_MySQL_INT="$((DSPAM_MySQL_MAJOR * 65536 + DSPAM_MySQL_MINOR * 256 + DSPAM_MySQL_MICRO))" # For MySQL >= 4.1 use the new purge script if [ "${DSPAM_MySQL_INT}" -ge "262400" ] then if [ -f "${DSPAM_HOMEDIR}/config/mysql_purge-4.1-optimized.sql" -o -f "${DSPAM_HOMEDIR}/mysql_purge-4.1-optimized.sql" ] then # See: http://securitydot.net/txt/id/32/type/articles/ [ -f "${DSPAM_HOMEDIR}/config/mysql_purge-4.1-optimized.sql" ] && DSPAM_MySQL_PURGE_SQL="${DSPAM_HOMEDIR}/config/mysql_purge-4.1-optimized.sql" [ -f "${DSPAM_HOMEDIR}/mysql_purge-4.1-optimized.sql" ] && DSPAM_MySQL_PURGE_SQL="${DSPAM_HOMEDIR}/mysql_purge-4.1-optimized.sql" else [ -f "${DSPAM_HOMEDIR}/config/mysql_purge-4.1.sql" ] && DSPAM_MySQL_PURGE_SQL="${DSPAM_HOMEDIR}/config/mysql_purge-4.1.sql" [ -f "${DSPAM_HOMEDIR}/mysql_purge-4.1.sql" ] && DSPAM_MySQL_PURGE_SQL="${DSPAM_HOMEDIR}/mysql_purge-4.1.sql" fi else [ -f "${DSPAM_HOMEDIR}/config/mysql_purge.sql" ] && DSPAM_MySQL_PURGE_SQL="${DSPAM_HOMEDIR}/config/mysql_purge.sql" [ -f "${DSPAM_HOMEDIR}/mysql_purge.sql" ] && DSPAM_MySQL_PURGE_SQL="${DSPAM_HOMEDIR}/mysql_purge.sql" fi if [ "${DSPAM_MySQL_PURGE_SQL}" == "" ] then echo "Can not run MySQL purge script:" echo " No mysql_purge SQL script found" run_dspam_clean exit 1 fi if [ ! -f "/usr/bin/mysql" ] then echo "Can not run MySQL purge script:" echo " /usr/bin/mysql does not exist" run_dspam_clean exit 1 fi # Get DSPAM MySQL username and password DSPAM_MySQL_HOST="$(cat ${DSPAM_HOMEDIR}/mysql.data|head -n 1|tail -n 1)" DSPAM_MySQL_PORT="$(cat ${DSPAM_HOMEDIR}/mysql.data|head -n 2|tail -n 1)" DSPAM_MySQL_USER="$(cat ${DSPAM_HOMEDIR}/mysql.data|head -n 3|tail -n 1)" DSPAM_MySQL_PWD="$(cat ${DSPAM_HOMEDIR}/mysql.data|head -n 4|tail -n 1)" DSPAM_MySQL_DB="$(cat ${DSPAM_HOMEDIR}/mysql.data|head -n 5|tail -n 1)" # Check if MySQL is remote or using a socket if [ -S "${DSPAM_MySQL_HOST}" ] then DSPAM_MySQL_HOSTCMD="--socket" else DSPAM_MySQL_HOSTCMD="--host" fi # Run the MySQL purge script /usr/bin/mysql --user="${DSPAM_MySQL_USER}" --password="${DSPAM_MySQL_PWD}" ${DSPAM_MySQL_HOSTCMD}="${DSPAM_MySQL_HOST}" ${DSPAM_MySQL_DB} < ${DSPAM_MySQL_PURGE_SQL} 1>/dev/null 2>&1 # Run the dspam_clean command run_dspam_clean # Optimize the MySQL tables for DSPAM for foo in $(/usr/bin/mysql --user="${DSPAM_MySQL_USER}" --password="${DSPAM_MySQL_PWD}" --silent --skip-column-names --batch ${DSPAM_MySQL_DB} -e 'SHOW TABLES;' 2>&1) do /usr/bin/mysql --user="${DSPAM_MySQL_USER}" --password="${DSPAM_MySQL_PWD}" ${DSPAM_MySQL_DB} -e "OPTIMIZE TABLE ${foo};" 1>/dev/null 2>&1 done exit 0 # # PostgreSQL # elif [ -f "${DSPAM_HOMEDIR}/pgsql.data" ] then DSPAM_PgSQL_PURGE_SQL="" [ -f "${DSPAM_HOMEDIR}/config/pgsql_purge.sql" ] && DSPAM_PgSQL_PURGE_SQL="${DSPAM_HOMEDIR}/config/pgsql_purge.sql" [ -f "${DSPAM_HOMEDIR}/pgsql_purge.sql" ] && DSPAM_PgSQL_PURGE_SQL="${DSPAM_HOMEDIR}/pgsql_purge.sql" if [ "${DSPAM_PgSQL_PURGE_SQL}" == "" ] then echo "Can not run PostgreSQL purge script:" echo " No pgsql_purge SQL script found" run_dspam_clean exit 1 fi if [ ! -f "/usr/bin/psql" ] then echo "Can not run PostgreSQL purge script:" echo " /usr/bin/psql does not exist" run_dspam_clean exit 1 fi # Get DSPAM PostgreSQL username and password DSPAM_PgSQL_HOST="$(cat ${DSPAM_HOMEDIR}/pgsql.data|head -n 1|tail -n 1)" DSPAM_PgSQL_PORT="$(cat ${DSPAM_HOMEDIR}/pgsql.data|head -n 2|tail -n 1)" DSPAM_PgSQL_USER="$(cat ${DSPAM_HOMEDIR}/pgsql.data|head -n 3|tail -n 1)" DSPAM_PgSQL_PWD="$(cat ${DSPAM_HOMEDIR}/pgsql.data|head -n 4|tail -n 1)" DSPAM_PgSQL_DB="$(cat ${DSPAM_HOMEDIR}/pgsql.data|head -n 5|tail -n 1)" # Run the PostgreSQL purge script PGUSER=${DSPAM_PgSQL_USER} PGPASSWORD=${DSPAM_PgSQL_PWD} /usr/bin/psql -U ${DSPAM_PgSQL_USER} -d ${DSPAM_PgSQL_DB} -p ${DSPAM_PgSQL_PORT} -h ${DSPAM_PgSQL_HOST} -f ${DSPAM_PgSQL_PURGE_SQL} 1>/dev/null 2>&1 # Run the dspam_clean command run_dspam_clean exit 0 # # SQLite3 # elif ( grep -q "^[\t ]*StorageDriver[\t ]*.*libsqlite3_drv" ${DSPAM_HOMEDIR}/dspam.conf ) then DSPAM_SQLite3_PURGE_SQL="" [ -f "${DSPAM_HOMEDIR}/config/sqlite_purge.sql" ] && DSPAM_SQLite3_PURGE_SQL="${DSPAM_HOMEDIR}/config/sqlite_purge.sql" [ -f "${DSPAM_HOMEDIR}/sqlite_purge.sql" ] && DSPAM_SQLite3_PURGE_SQL="${DSPAM_HOMEDIR}/sqlite_purge.sql" if [ "${DSPAM_SQLite3_PURGE_SQL}" == "" ] then echo "Can not run SQLite3 purge script:" echo " No sqlite_purge SQL script found" run_dspam_clean exit 1 fi if [ ! -f "/usr/bin/sqlite3" ] then echo "Can not run SQLite3 purge script:" echo " /usr/bin/sqlite3 does not exist" run_dspam_clean exit 1 fi # Run the SQLite3 purge script find ${DSPAM_DATAHOMEDIR} -name "*.sdb" -exec /usr/bin/sqlite3 "{}" < ${DSPAM_SQLite3_PURGE_SQL} \; 1>/dev/null 2>&1 # Run the dspam_clean command run_dspam_clean # Optimize the SQLite tables for DSPAM find ${DSPAM_DATAHOMEDIR} -name "*.sdb" -exec echo 'vacuum;' \| /usr/bin/sqlite3 "{}" \; exit 0 # # SQLite # elif ( grep -q "^[\t ]*StorageDriver[\t ]*.*libsqlite_drv" ${DSPAM_HOMEDIR}/dspam.conf ) then DSPAM_SQLite_PURGE_SQL="" [ -f "${DSPAM_HOMEDIR}/config/sqlite_purge.sql" ] && DSPAM_SQLite_PURGE_SQL="${DSPAM_HOMEDIR}/config/sqlite_purge.sql" [ -f "${DSPAM_HOMEDIR}/sqlite_purge.sql" ] && DSPAM_SQLite_PURGE_SQL="${DSPAM_HOMEDIR}/sqlite_purge.sql" if [ "${DSPAM_SQLite_PURGE_SQL}" == "" ] then echo "Can not run SQLite purge script:" echo " No sqlite_purge SQL script found" run_dspam_clean exit 1 fi if [ ! -f "/usr/bin/sqlite" ] then echo "Can not run SQLite purge script:" echo " /usr/bin/sqlite does not exist" run_dspam_clean exit 1 fi # Run the SQLite purge script find ${DSPAM_DATAHOMEDIR} -name "*.sdb" -exec /usr/bin/sqlite "{}" < ${DSPAM_SQLite_PURGE_SQL} \; 1>/dev/null 2>&1 # Run the dspam_clean command run_dspam_clean # Optimize the SQLite tables for DSPAM find ${DSPAM_DATAHOMEDIR} -name "*.sdb" -exec echo 'vacuum;' \| /usr/bin/sqlite "{}" \; exit 0 # # Generic # else run_dspam_clean exit $? fi # # Release lock # rm -f "${DSPAM_CRON_LOCKFILE}" trap - INT TERM EXIT fi