Compare commits

...

15 Commits

Author SHA1 Message Date
Daniel Berteaud 6d99639d6d Spec file update 2014-06-26 06:53:38 +02:00
Daniel Berteaud 3c7d17a2e5 Define HOME so cron task works on EL6 2014-06-26 06:51:52 +02:00
Daniel Berteaud 432eaa8de8 update spec file 2013-05-15 09:38:00 +02:00
Daniel Berteaud e6b501d606 Only convert to InnoDB if not already done 2013-05-15 09:37:17 +02:00
Daniel Berteaud 52e7d7997c update spec file 2013-04-22 12:16:52 +02:00
Daniel Berteaud 8669325555 Fix a typo in SQL template 2013-04-22 12:16:21 +02:00
Daniel Berteaud c9f983db0d update spec file 2013-04-19 16:41:44 +02:00
Daniel Berteaud 3b05c5c5f6 Alter table to migrate existing databases to InnoDB 2013-04-19 16:40:58 +02:00
Daniel Berteaud f9260644a5 Use InnoDB engine 2013-04-19 14:54:42 +02:00
Daniel Berteaud 1a090306f9 Mise à jour du fichier spec 2012-10-16 17:23:50 +02:00
Daniel Berteaud 825e337c60 Log headers in a separate table 2012-10-16 15:59:47 +02:00
Daniel Berteaud 260359acbb Add a script to remove old entries from the database, default keeps 2 years of logs 2012-10-16 14:52:05 +02:00
Daniel Berteaud 70be65c741 Mise à jour du fichier spec 2012-10-14 22:18:50 +02:00
Daniel Berteaud ebf4c1e73d Log de l'utilisateur authentifié 2012-10-14 22:10:54 +02:00
Daniel Berteaud b56e73795a UTF-8 pour les connexions MySQL 2012-10-14 20:43:17 +02:00
7 changed files with 95 additions and 13 deletions

View File

@ -0,0 +1,18 @@
#!/bin/bash
HOME=/root
LOG=$(/sbin/e-smith/db configuration getprop qpsmtpd Log2Sql || echo 'disabled')
if [ "$LOG" != "enabled" ]; then
exit 0
fi
RETENTION=$(/sbin/e-smith/db configuration getprop qpsmtpd Log2SqlRetention || echo 730)
DB=$(/sbin/e-smith/db configuration getprop qpsmtpd DbName || echo smtp_log)
echo "delete from rcpts where mail_id IN (select mail_id from messages where date_day<DATE_SUB(NOW(), INTERVAL $RETENTION DAY));" | mysql $DB
echo "delete from message_body where mail_id IN (select mail_id from messages where date_day<DATE_SUB(NOW(), INTERVAL $RETENTION DAY));" | mysql $DB
echo "delete from message_headers where mail_id IN (select mail_id from messages where date_day<DATE_SUB(NOW(), INTERVAL $RETENTION DAY));" | mysql $DB
echo "delete from messages where date_day<DATE_SUB(NOW(), INTERVAL $RETENTION DAY);" | mysql $DB

View File

@ -5,6 +5,12 @@ my $pass = ${'qpsmtpd'}{'DbPassword'} || 'secret';
my $dbstruct = `rpm -qd smeserver-qpsmtpd-log2sql | grep smtp_log.sql`;
my $convertInnoDB = '';
foreach my $table qw(messages message_headers message_body rcpts){
$convertInnoDB .= "ALTER TABLE $table ENGINE=InnoDB;\n"
if (-e "/var/lib/mysql/$db/$table.MYD");
}
$OUT .= <<"END";
#! /bin/sh
if [ ! -d /var/lib/mysql/$db ]; then
@ -41,6 +47,10 @@ REPLACE INTO db (
'N', 'Y', 'Y');
FLUSH PRIVILEGES;
USE smtp_log;
$convertInnoDB
EOF
END
}

View File

@ -7,7 +7,7 @@ if (($qpsmtpd{'Log2Sql'} || 'enabled') eq 'enabled'){
$OUT .=<<"EOF";
# Log to MySQL
logging/log2sql d $dbname h $dbhost u $dbuser p $dbpass D Yes
logging/log2sql d $dbname h $dbhost u $dbuser p $dbpass D Yes H Yes
EOF
}
else{

View File

@ -7,7 +7,7 @@ if (($qpsmtpd{'Log2Sql'} || 'enabled') eq 'enabled'){
$OUT .=<<"EOF";
# Log to MySQL
logging/log2sql d $dbname h $dbhost u $dbuser p $dbpass D Yes
logging/log2sql d $dbname h $dbhost u $dbuser p $dbpass D Yes H Yes
EOF
}
else{

View File

@ -16,7 +16,7 @@ use strict;
#plugin level variables are here since version 0.02
my ($dsn,$mail_table,$rcpt_table,$user,$passwd,$mail_id);
my ($log_header);
my ($log_all_body,$log_deny_body,$body_table);
my ($log_all_body,$log_deny_body,$body_table,$headers_table);
my ($dbh,$sth);
sub register {
@ -25,6 +25,8 @@ sub register {
my (%args) = @_;
$self->register_hook("connect", "connect_handler");
$self->register_hook("auth-plain", "auth_handler");
$self->register_hook("auth-login", "auth_handler");
$self->register_hook("mail", "mail_handler");
$self->register_hook("rcpt", "rcpt_handler");
$self->register_hook("data_post", "data_post_handler");
@ -50,6 +52,7 @@ sub register {
$log_all_body = $args{B} || undef;
$log_deny_body = $args{DB} || undef;
$body_table = $args{b} || 'message_body';
$headers_table = $args{I} || 'message_headers';
}
sub connect_handler {
@ -58,6 +61,9 @@ sub connect_handler {
$self->log(LOGDEBUG,"DSN:$dsn");
$dbh = DBI->connect($dsn,$user,$passwd) || $self->log(LOGERROR,DBI::errstr);
# Use UTF8
$dbh->do("SET NAMES 'utf8';") || $self->log(LOGERROR,$dbh->errstr());
# generate mail id
$mail_id = $$.'.'.time.'.'.int(rand(10000));
# set note for other plugins
@ -89,6 +95,20 @@ sub connect_handler {
return(DECLINED);
}
sub auth_handler {
my ($self, $transaction, $method, $user) = @_;
my ($statement) = "UPDATE ".$mail_table." SET auth_user=".
$dbh->quote($user).
" WHERE mail_id=".$mail_id;
$self->log(LOGDEBUG,"auth_handler statement:".$statement);
$dbh->do($statement)
|| $self->log(LOGERROR,$dbh->errstr());
return(DECLINED);
}
sub mail_handler {
my ($self, $transaction, $sender) = @_;
@ -151,9 +171,9 @@ sub data_post_handler{
#if $args{H} then log the message header in the main 'messages' table
if ($log_header){
$statement = "UPDATE ".$mail_table." SET ".
"header=".$dbh->quote($header->as_string()).
"WHERE mail_id=".$mail_id;
$statement = "INSERT INTO ".$headers_table." (mail_id,header)".
" VALUES(".$mail_id.",".$dbh->quote($header->as_string()).
")";
$self->log(LOGDEBUG,"data_post_handler log header statement:".$statement);
$dbh->do($statement)
@ -268,6 +288,7 @@ The plugin accepts the following parameters:
u - database user (default root)
p - database password (default '')
H - log the header of the message in the main table for mail messages (e.g. 'messages'). For example "H Yes".
I - sql table for the message headers. H parameter is requiered
=head1 CONFIGURATION OF THE ADDITIONAL FEATURES
@ -297,7 +318,6 @@ Here are the CREATE statements for the tables. Assuming the 'messages' table is
`header_size` int(11) default NULL,
`body_size` int(11) default NULL,
`spam_status` float default NULL,
`header` text,
`deny` set('YES','NO') default NULL,
`deny_plugin` varchar(100) default '',
`deny_code` int(11) default '0',
@ -319,6 +339,12 @@ Here are the CREATE statements for the tables. Assuming the 'messages' table is
PRIMARY KEY (`bdy_id`)
) TYPE=MyISAM;
CREATE TABLE `message_headers` (
`header_id` int(11) NOT NULL auto_increment,
`mail_id` varchar(255) NOT NULL default '',
`header` text,
PRIMARY KEY (`header_id`)
) TYPE=MyISAM;
=head1 AUTHOR

View File

@ -1,4 +1,4 @@
%define version 0.1.2
%define version 0.1.8
%define release 1
%define name smeserver-qpsmtpd-log2sql
@ -23,7 +23,27 @@ Requires: perl(DBI)
Log every smtp transaction in a database
%changelog
* Fri Oct 12 2012 Daniel Berteaud <daniel@firewall-services.com> 0.1.2-1
* Thu Jun 26 2014 Daniel Berteaud <daniel@firewall-services.com> 0.1.8-1
- Define HOME in cron task so it works on EL6
* Wed May 15 2013 Daniel Berteaud <daniel@firewall-services.com> 0.1.7-1
- Only convert to InnoDB if not already done
* Mon Apr 22 2013 Daniel Berteaud <daniel@firewall-services.com> 0.1.6-1
- Fix a typo in MySQL template
* Fri Apr 19 2013 Daniel Berteaud <daniel@firewall-services.com> 0.1.5-1
- Use InnoDB instead of MyISAM
* Tue Oct 16 2012 Daniel Berteaud <daniel@firewall-services.com> 0.1.4-1
- purge old entries from the database
- log headers in a separate table
* Sun Oct 14 2012 Daniel Berteaud <daniel@firewall-services.com> 0.1.3-1
- use UTF-8 for MySQL connexion
- log auth user name
* Fri Oct 12 2012 Daniel Berteaud <daniel@firewall-services.com> 0.1.2-1
- decode (MIME-Header) mail subject
* Thu Oct 11 2012 Daniel Berteaud <daniel@firewall-services.com> 0.1.1-1
@ -45,6 +65,7 @@ perl ./createlinks
(cd root ; /usr/bin/find . -depth -print | /bin/cpio -dump $RPM_BUILD_ROOT)
/bin/rm -f %{name}-%{version}-filelist
/sbin/e-smith/genfilelist $RPM_BUILD_ROOT \
--file /etc/cron.daily/qpsmtpd-db-cleanup 'attr(0755,root,root)' \
> %{name}-%{version}-filelist
echo "%doc CHANGELOG.git" >> %{name}-%{version}-filelist

View File

@ -5,29 +5,36 @@ CREATE TABLE `messages` (
`remote_ip` varchar(255) default NULL,
`remote_host` varchar(255) default NULL,
`remote_info` varchar(255) default NULL,
`auth_user` varchar(30) default NULL,
`sender` varchar(255) default NULL,
`subject` varchar(255) default NULL,
`header_size` int(11) default NULL,
`body_size` int(11) default NULL,
`spam_status` float default NULL,
`header` text,
`deny` set('YES','NO') default NULL,
`deny_plugin` varchar(100) default '',
`deny_code` int(11) default '0',
`deny_msg` text,
PRIMARY KEY (`mail_id`)
) TYPE=MyISAM;
) TYPE=InnoDB;
CREATE TABLE `rcpts` (
`rcpt_id` int(11) NOT NULL auto_increment,
`mail_id` varchar(255) NOT NULL default '',
`recipient` varchar(255),
PRIMARY KEY (`rcpt_id`)
) TYPE=MyISAM;
) TYPE=InnoDB;
CREATE TABLE `message_body` (
`bdy_id` int(11) NOT NULL auto_increment,
`mail_id` varchar(255) NOT NULL default '',
`body` text,
PRIMARY KEY (`bdy_id`)
) TYPE=MyISAM;
) TYPE=InnoDB;
CREATE TABLE `message_headers` (
`header_id` int(11) NOT NULL auto_increment,
`mail_id` varchar(255) NOT NULL default '',
`header` text,
PRIMARY KEY (`header_id`)
) TYPE=InnoDB;