Grupo Linuxero del Bajío

Checkspam, un pequeño analizador para spamassasin

Pedro Sánchez

Hace días escribí una entrada sobre como instalar y configurar el Spamassassin, ya la gran mayoría sabemos que Spamassassin genera un log de actividad y este log es un chorizón…

Si instalamos y configuramos el Spamassassin como lo recomienda la gran mayoría y como yo mismo lo he publicado en mi blog, tendríamos un archivo llamado spamd.log. Este archivo no es mas que un log de las actividades del Spamassassin en cuanto a sus tareas de filtrar el correo electrónico en nuestro servidor o equipo. La verdad es que con el tiempo este archivo crece y crece y analizarlo manualmente se vuelve un poco complicado.

Buscando alguna solución ya elaboradas encontré muchos generadores de reportes gráficamente en PHP pero no es lo que yo buscaba.

Mis necesidades son básicamente saber la fecha y hora en que el Spamassassin identificó un correo SPAM e identificar rápidamente el dominio de donde salió, así como la dirección IP de ese dominio.

Necesidades muy especificas que no me las daba alguna herramienta ya existente.

Entonces decidí escribir un pequeño script a manera de analizador para “analizar” el log del Spamassassin (spamd.log) y extraer dicha información y poder consultarla en pantalla.

Aquí el pequeño script:

#!/bin/bash
#checkspam.sh parse the spamd.log to print a report whit spamers domain and IP Address

clear

to_file=$1

if [ "$to_file" == "-h" ]
 then
  echo "Checkspam.sh homemade parser to spamd.log"
  echo "========================================="
  echo " "
  echo "Usage: checkspam.sh <logfile path> to indicate a specific spamd.log path"
  echo "Usage: checkspam.sh to get the default spamd.log path (/var/log/spamassassin/spamd.log)"
  echo "Usage: checkspam.sh to show this screen"
  echo " "
  exit 0
fi

if test -z $to_file
 then
  to_file="/var/log/spamassassin/spamd.log"
 else
  if ! test -e $to_file
   then
    echo "checkspam (can not get access to $to_file or does not exist the log, try again...)"
    exit 0
  fi
fi

echo -e "checkspamd (logfile: $to_file)...n"

grep "result: Y" $to_file > idspam.txt
if grep -v -e "unknown" idspam.txt > toparse.txt
 then
  i=1
  while read line
  do
   to_date=$(head -$i /home/user/path/toparse.txt | cut -d "[" -f 1 | tail -1)
   to_extract=$(head -$i /home/user/path/toparse.txt | cut -d "<" -f 2 | cut -d "@" -f 2 | cut -d ">" -f 1 | tail -1)
   to_address=$(nslookup $to_extract | grep "Address: " | cut -d ":" -f 2 | tail -1)

   if test -z $to_address ; then to_address=" unknown ip" ; fi

   echo -e "e[1;34m$to_datee[0m e[1;33m$to_extracte[0m (e[1;31m$to_address e[0m)" >> gral_spam.txt
  let i=i+1
  done < toparse.txt
fi

if test -s gral_spam.txt
 then
  echo "Date                      Identified Domain and IP Address (Only if is available)"
  echo "================================================================================="
  echo " "
  cat gral_spam.txt | uniq
 else
  echo "No Spam has been identified yet..."
fi
echo " "
echo " "
echo "Parse has been done..."
rm *.txt
exit 0

Espero que a alguien le sea de utilidad.

Ciao!