Поднял я как то почтовый сервер на FreeBSD под POSTFIX. По мотивам вот этой статьи:
http://sys-adm.org.ua/mail/mail-howto-p1.php
А потом потребовало руководство той организации что я обслуживал, что бы я им выдавал сведенья куда ходят письма, сколько, кто, ёмкость писем из внутри или с наружи, в общем очередная идея КГБ начальства)))
Ну хорошо, погуглил я немного и не нашел по этому поводу не чего адекватного…
Ну и да ладно, значит сделаем сами!
Надо из лог файла (а там все сведенья кто, куда, сколько, откуда, во сколько) перегонять в базу Муськи)
Ну хорошо, снова погуглил на опен нете нашёл стрёмненькую статью и скрипт под PERL причём так себе не год не определяет не id в базу не вбивает...
Пришлось поправить скрипт, естественно базу немного изменить, ну а затем самому ручками написать адекватную Web – Мордочку)))
Что надо нам для этого: апач, муська, пхап, ну в принципе если вы по давече упомянутой статье подымали почтовик то всё это хозяйство у вас имеется!
Начнём по шагово:
1. Нам нужно создать базу в муське:
Копируйте отсюда код:
Код: Выделить всё
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
--
-- Структура таблицы `calendar`
--
CREATE TABLE IF NOT EXISTS `calendar` (
`num` int(2) NOT NULL default '0',
`month` char(3) NOT NULL default '',
`mesyc` varchar(20) NOT NULL default ''
) ENGINE=MyISAM DEFAULT CHARSET=koi8r;
--
-- Дамп данных таблицы `calendar`
--
INSERT INTO `calendar` (`num`, `month`, `mesyc`) VALUES
(1, 'Jan', 'Январь'),
(2, 'Feb', 'Февраль'),
(3, 'Mar', 'Март'),
(4, 'Apr', 'Апрель'),
(5, 'May', 'Май'),
(6, 'Jun', 'Июнь'),
(7, 'Jul', 'Июль'),
(8, 'Aug', 'Август'),
(9, 'Sep', 'Сентябрь'),
(10, 'Oct', 'Октябрь'),
(11, 'Nov', 'Ноябрь'),
(12, 'Dec', 'Декабрь');
-- --------------------------------------------------------
--
-- Структура таблицы `mails`
--
CREATE TABLE IF NOT EXISTS `mails` (
`id` int(16) NOT NULL default '0',
`year` int(4) NOT NULL default '0',
`month` varchar(10) NOT NULL default '',
`day` char(2) NOT NULL default '',
`time` time NOT NULL default '00:00:00',
`ip` varchar(255) NOT NULL default '',
`mailfrom` varchar(255) NOT NULL default '',
`rcptto` varchar(255) NOT NULL default '',
`size` int(32) default NULL,
PRIMARY KEY (`month`,`day`,`time`)
) ENGINE=MyISAM DEFAULT CHARSET=koi8r;
-- --------------------------------------------------------
--
-- Структура таблицы `userlist`
--
CREATE TABLE IF NOT EXISTS `userlist` (
`id` int(11) NOT NULL auto_increment,
`user` varchar(255) NOT NULL default '',
`pass` varchar(255) NOT NULL default '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=koi8r AUTO_INCREMENT=1 ;
Код: Выделить всё
touch maillogs.sql
затем
ee maillogs.sql
Сохроняем Esc -> а -> а
Заходим в муську:
Код: Выделить всё
mysql -u root -p
Код: Выделить всё
Enter password:
Код: Выделить всё
CREATE DATABASE maillogs DEFAULT CHARACTER SET koi8r COLLATE koi8r_general_ci;
Код: Выделить всё
GRANT ALL PRIVILEGES ON maillogs.* TO mailuser@localhost IDENTIFIED BY 'mailuser';
Код: Выделить всё
mysql> use maillogs;
Database changed
mysql> show tables;
Empty set (0.00 sec)
mysql> SET NAMES koi8r;
Query OK, 0 rows affected (0.00 sec)
mysql> SET character_set_database=koi8r;
Query OK, 0 rows affected (0.00 sec)
mysql> SET character_set_server=koi8r;
Query OK, 0 rows affected (0.00 sec)
mysql> \. maillogs.sql
Код: Выделить всё
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.01 sec)
Query OK, 12 rows affected (0.00 sec)
Records: 12 Duplicates: 0 Warnings: 0
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Заходим в муську, только теперь вод так:
Код: Выделить всё
mysql -u mailuser -p
Код: Выделить всё
Enter password:
Код: Выделить всё
show databases;
Код: Выделить всё
+----------+
| Database |
+----------+
| maillogs |
+----------+
1 row in set (0.00 sec)
Код: Выделить всё
use maillogs;
Database changed
Код: Выделить всё
show tables;
Код: Выделить всё
+--------------------+
| Tables_in_maillogs |
+--------------------+
| calendar |
| mails |
| userlist |
+--------------------+
3 rows in set (0.00 sec)
Код: Выделить всё
INSERT INTO `userlist` (`id`, `user`, `pass`) VALUES (1, 'admin', '1234567');
Код: Выделить всё
select * from userlist;
Код: Выделить всё
+----+-------+----------+
| id | user | pass |
+----+-------+----------+
| 1 | admin | 1234567 |
+----+-------+----------+
1 row in set (0.00 sec)
И так мы справились с созданием базы!)))
2. Приступим к следующему этапу, в нём мы создадим скрипт который будет лопатить лог!
Например, ну где вы храните скрипты, или например прямо в руте создаём папочку для скрипта и кладём его туда:
Код: Выделить всё
mkdir /root/scripts
touch /root/scripts/maillog.pl
ee /root/scripts/maillog.pl
Код: Выделить всё
#!/usr/local/bin/perl
use DBI;
$dbh = DBI->connect("DBI:mysql:host=localhost;database=maillogs","mailuser","mailuser")
or die "Нет доступа к СУБД!";
$insert = "INSERT INTO mails (id,year,month,day,time,ip,mailfrom,rcptto,size) VALUES(?,?,?,?,?,?,?,?,?)";
$sth = $dbh->prepare("$insert");
my %rec;
open(MAIL, "/var/log/maillog");
while ($line = <MAIL>)
{
my ($month, $day, $time, $hostname, $servicename, $id, $message) = split /\s+/, $line, 7;
if ($id =~ /([a-z0-9]+)\:/i)
{
$id = $1;
$rec{$id} = {}
unless ($rec{$id});
if ($message =~ 'removed')
{
$rec{$id}->{'removed'}++;
}
else
{
while ($message =~ /(client|size|from|to)=(\S+?)(\s|,)/g)
{
if ($1 eq 'client') {
$rec{$id}->{'month'} = sprintf "%s", $month;
$rec{$id}->{'day'} = sprintf "%d", $day;
$rec{$id}->{'time'} = sprintf "%s", $time;
}
$rec{$id}->{$1} = $2;
}
}
}
}
close(MAIL);
($year) = (localtime)[5];
$timy = ("%02d\n", $year + 1900);
foreach my $id (sort { $rec{$a}->{'time'} cmp $rec{$b}->{'time'} } keys %rec)
{
$rec{$id}->{'client'} =~ s/(.+)\[(\d+\.\d+\.\d+\.\d+)\]/$2/;
$rec{$id}->{'from'} =~ s/<(.+)>/$1/;
$rec{$id}->{'to'} =~ s/<(.+)>/$1/;
if (
$rec{$id}->{'removed'}
&&
$rec{$id}->{'client'} ne '127.0.0.1'
)
{
if ($rec{$id}->{'from'} ne 'root@fortero.su')
{
$sth1 = $dbh->selectrow_arrayref("SELECT COUNT(*) FROM mails");
$iddt = "$sth1->[0]";
$idd = $iddt + 1;
$sth->execute($idd,$timy,$rec{$id}->{'month'},$rec{$id}->{'day'},$rec{$id}->{'time'},$rec{$id}->{'client'},$rec{$id}->{'from'},$rec{$id}->{'to'},$rec{$id}->{'size'});
}
}
}
$sth1->finish;
$sth->finish;
$dbh->disconnect;
Делаем его исполняемым:
Код: Выделить всё
chmod 770 /root/scripts/maillog.pl
Код: Выделить всё
/root/scripts/maillog.pl
Код: Выделить всё
echo > /var/log/maillog
Если база набивается, а проверить можно подключившись выше упомянуто к базе и сделать запрос:
Код: Выделить всё
select * from mails;
А если иначе, значит, что то не так...(
Ну если всё хорошо, теперь автоматизируем, добавим в крон вод такую строку:
Код: Выделить всё
cat /etc/crontab
*/59 * * * * root /root/scripts/maillog.pl
Перезапускаем крон:
Код: Выделить всё
/etc/rc.d/cron restart
Код: Выделить всё
cat /var/log/cron | grep maillog.pl
Jul 11 00:59:00 fortero /usr/sbin/cron[1986]: (root) CMD (/root/scripts/maillog.pl)
Качаем мордочку:
http://forum.lissyara.su/download/file.php?id=2301
Закидываем её на сервер в директорию
/usr/local/www/data
Распаковываем:
Код: Выделить всё
bzip2 -d statmail.tar.bz2
tar -xf statmail.tar
Можно обойтись без этого просто править хост файл на удалённой машине, это вы сами решите…
А вот apache я вам помогу поправить, идём вот сюда /usr/local/etc/apache
И правим конф httpd.conf
Добавим в конф:
Код: Выделить всё
<VirtualHost 192.168.64.254:80>
ServerAdmin admin@muzdrama.com
DocumentRoot /usr/local/www/data/statmail
ServerName statmail.dram.lh
<Directory "/usr/local/www/data/statmail">
Options none
AllowOverride Limit
Order Deny,Allow
Deny from all
Allow from 127.0.0.1 192.168.0.0/16
DirectoryIndex index.php
</Directory>
</VirtualHost>
После чего перезапускаем apache:
Код: Выделить всё
/usr/local/etc/rc.d/apache.sh restart
Код: Выделить всё
ee /usr/local/www/data/statmail/config.php
Теперь проверяем, если всё получилось, то зайдя в браузере на нашу страничку мы пройдём логин пароль и увидим примерно это:
Ну вот и всё, это моя первая статья здесь, по этому не судите меня строга за ошибки, и может быть это особо не кому и не надо, но жалко творение пропадает из-за одной организации!)))
Пишите всем постараюсь ответить и помочь, фиксить ошибки!
В будущем я ещё выложу пару админок для впн сервера, squidguarda…
Ну ладно это будет в будущем, всем спасибо за внимание!)))