#!/bin/bash # 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 DSPAM_Check_App="$(${foo} --version 2>&1)" if [[ "${DSPAM_Check_App/ *}" == "bash:" ]] 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}/*.data ] then # Something is wrong in passwd! Check if /etc/mail/dspam exists instead. if [ -f /etc/mail/dspam/*.data ] then DSPAM_HOMEDIR="/etc/mail/dspam" fi fi # # 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" || -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)" # Run the MySQL purge script /usr/bin/mysql --user="${DSPAM_MySQL_USER}" --password="${DSPAM_MySQL_PWD}" ${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 # # Generic # else run_dspam_clean exit $? fi # # Release lock # rm -f "${DSPAM_CRON_LOCKFILE}" trap - INT TERM EXIT fi