ReLoad

Thierry Jaouen ~ WikiBlog
"Rien à foutre d'être lu, tant que je peux me relire."

Outils pour utilisateurs

Outils du site


blog:2013:09:05:spamassassin_awl_avec_mysql

Spamassassin AWL avec MySQL

Aprés avoir vu “Bayes”, attaquons “AWL”, c'est a dire: Auto-White-List

On va aussi effectuer une phase de migration d'une base “DBFILE” vers “MySQL”.

~~READMORE~~

MySQL

Dixit la doc: préférer le moteur “MyISAM”.

Les schemas de la base de données sont dans /usr/share/doc/spamassassin/sql/awl_mysql.sql

Pour info:

  • ip varchar(40) … ⇒ prêt pour gérer l'ipv6 (ce dont je n'ai cure)
  • signedby … ⇒ prêt pour auto_whitelist_distinguish_signed

En tant que “root” :

$ mysql -u root -p 

Créer la database “sa_awl” :

mysql> create database sa_awl;

Sous shell, créer la table:

$ sed -e 's/TYPE=MyISAM/ENGINE=MyISAM/' awl_mysql.sql | mysql -u root -p sa_awl

Je retourne dans MySQL pour autoriser mes 2 frontaux a interroger la base:

$ mysql -u root -p 

( Les utilisateurs ont déjà été créé pour installer Bayes )

mysql> GRANT SELECT, UPDATE, DELETE, INSERT ON sa_awl.awl TO 'sa_user'@'mx0.local.eez.fr';
mysql> GRANT SELECT, UPDATE, DELETE, INSERT ON sa_awl.awl TO 'sa_user'@'mx1.local.eez.fr';

Migration

On va migrer 1 seul base “awl” d'un frontal.
Chez moi, l'utilisateur qui gère le spam c'est “debian-spamd” .

La base de données se trouve là dedans:

/var/lib/spamassassin/.spamassassin/auto-whitelist

On récupère cette base (surement en arrêtant l'“autowhitelist” et en ayant les bons droits.)

Soit le fichier auto-whitelist dans le répertoire courant (hors du contexte de spamassassin).

D'abord, purger un peu la base:

$ sa-awl --clean ./auto-whitelist

(Il ne doit pas y avoir d'erreur)

On va utiliser un scripte Perl pour créer un fichier “.sql” contenant l'export et la conversion de la base existante.

Voici le script “awl_dump.pl” :

Ce scripte est inspiré de celui-ci : http://svn.apache.org/repos/asf/spamassassin/trunk/tools/convert_awl_dbm_to_sql

D'abord, vérifier qu'il n'y a pas (trop) d'erreur:

$ perl awl_dump.pl 1>/dev/null

S'il y a quelques “WARNING…” , on peut constater que ce sont des problèmes mineures (pas d'IP associé a un SPAM… on s'en fout!)

Maintenant, transformer la base en requête d'importation SQL :

$ perl awl_dump.pl 1>./awl_dump.sql

Voila, le fichier “awl_dump.sql” contient une série de requêtes SQL … Par exemple, extrait:

...
INSERT INTO awl (username,email,ip,count,totscore) VALUES ('debian-spamd','service-clients@newsletter.jajabou4999.com','81.92',26,83.537)
INSERT INTO awl (username,email,ip,count,totscore) VALUES ('debian-spamd','tradition-des-vosges-plandefou-341777@eml-ava.com','91.209',4,46.476)
...

Maintenant, il suffit d'importer cela dans la base:

$ mysql -u root -p sa_awl < ./awl_dump.sql

Spamassassin

La nouvelle configuration dans local.cf :

# awl
auto_whitelist_factory          Mail::SpamAssassin::SQLBasedAddrList
user_awl_dsn                    DBI:mysql:database=sa_awl;host=mail.local.eez.fr;
user_awl_sql_username           sa_user
user_awl_sql_password           <PASSWORD>
user_awl_sql_table              awl

Redemarrer:

# /etc/init.d/spamassassin restart

Tester: FIXME

Maintenance

On est content , ça marche.

Mais il manque une “column” bien utile : la date de la dernière modification.

On va la créer:

$ mysql -u root -p sa_awl
mysql> ALTER TABLE awl ADD ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;

Query OK, 85083 rows affected (0.19 sec)
Records: 85083  Duplicates: 0  Warnings: 0

Maintenant, on va fixer la valeur par defaut, c'est à dire l' “heure actuelle” (sinon, c'est “0000-00-00 00:00:00” ).

mysql> UPDATE awl SET ts=DEFAULT WHERE ts=0;

Query OK, 84734 rows affected (0.05 sec)
Records: 84734  Duplicates: 0  Warnings: 0

Maintenant, on peut executer, de temps en temps, une petit commande pour purger les enregistrements obsoletes:

mysql> DELETE FROM awl WHERE ts < (NOW() - INTERVAL 35 DAY);

Pour l'exemple, voici une mise en place dans CRON :

Dans /root/local créer un fichier mysql-root.cnf contenant:

[client]
user=root
password=<PASSWORD>
batch
# chmod 0600 mysql-root.cnf

Dans crontab on peut maintenant ajouter:

1 5 * * sun echo 'DELETE FROM awl WHERE ts < (NOW() - INTERVAL 35 DAY);' | mysql --defaults-file='/root/local/mysql-root.cnf' sa_awl >/dev/null

Voila.

Sources

blog/2013/09/05/spamassassin_awl_avec_mysql.txt · Dernière modification : 2013/09/08 19:26 de thierry