Установил сервер FTP, все достаточно стандартно. Но вот захотелось смотреть статистику - детальную и общую. С детальной проблем не возникло - awstats мой выбор ) А вот с простым графиком - пользователи в онлайн в разерезе "авторизованные - анонимные" поначалу поставил в тупик, но все решилось за один вечер.
Для всего этого будем использовать cacti и туда же вставим ссылку на awstats чтобы все было в одном месте.
Установку Cacti не рассматриваю. Идем на cacti.net и на форуме качаем скрипт для определения пользователей online. После этого создаем
- Data input
- Data template
- Graph template
Data input - то как получаем данные для графика
В данном случае мы используем скрипт - unix_proftpd_who.pl вот он
#!/usr/bin/perl
#===============================================================================
#
# FILE: unix_proftpd_who.pl
#
# USAGE: ./unix_proftpd_who.pl [--user|--host|--server] parameter
#
# DESCRIPTION: Print out user|client|server count and total users count for cacti use
#
# OPTIONS: ---
# REQUIREMENTS: Installed and configured ProFTPD
# BUGS: ---
# NOTES: ---
# AUTHOR: Dennis Yusupoff (dyr), denissia@mail.ru
# COMPANY: Smart-Telecom ISP
# VERSION: 1.0
# CREATED: 04.06.2009 18:46:55
# REVISION: ---
#===============================================================================
use strict;
use warnings;
use Getopt::Long;
my $cmd = "/usr/local/bin/ftpwho";
my $args = " -v -o oneline";
my (%hash,$user,$client,$server,$help);
my $total = 0;
GetOptions('user=s' => \$user,
'client=s' => \$client,
'server=s' => \$server,
'help|?' => \$help);
&usage if $help;
&usage if ( $user ? ($client || $server) : ($client && $server) ); #Allow only one parameter
open(FH, "$cmd $args |") or die "Cannon execute command: $!\n";
while() {
if ($client) {
if (/client:\s(.+)\s\[(\d+\.\d+\.\d+\.\d+)\]/){
#$1 - client host name (ReverseDns)
#$2 - client host ip
$hash{$1}++;
#Or by ip
$hash{$2}++ unless ($1 eq $2); #Prevent to duplicate ip if UseReverseDNS is Off in proftpd.conf
$total++;
}
}elsif ($server) {
if (/server:\s(\d+\.\d+\.\d+\.\d+):(\d+)\s\((.+)\)/){
#$1 - server ip
#$2 - server port
#$3 - server name
$hash{$1}++;
$hash{$3}++ unless ($3 eq $1); #Prevent to duplicate servername if it equal ip
$total++;
}
}else {
if (/^\s*(\d+)\s(\w+)\s+.+client:\s(.+)\s\[(\d+\.\d+\.\d+\.\d+)\]/){
#$1 - ID
#$2 - username
$hash{$2}++;
$total++;
}
}
}
close(FH);
if ($server) {
print "selected:".($hash{$server} || 0);
}elsif ($client) {
print "selected:".($hash{$client} || 0);
}elsif ($user) {
print "selected:".($hash{$user} || 0);
}else {
print "selected:U";
}
print " total:$total\n";
sub usage {
print "Usage: @_ [--user|--host|--server] parameter\n";
exit 0;
}
в системе должен быть установлен perl
Добавляем этот скрипт в папку установки cacti - обычно /usr/local/share/cacti/scripts/
после этого создаем Data Input Methods
скрипт имеет вводные параматры и выводные данные, поэтому создаем соответсвующие поля
вводные данные - их надо будет определить далее
выводные данные - cacti требует чтобы все выводные данные отделялись знаком ":"
Data template - как мы представляем то, что получаем
создаем новый data template- обращаю внимание на то, что у нас 2 поля вывода
и второе поле
Graph template - как мы показываем то, что представляем. Ну тут уже все просто :)
вверху grath template items - как все будет видется -
На графике я сделал так - total это area (залито все цветом), а anonymous это line1 (линия). Ведь total всегда либо больше, либо равно anonymous %) и получаем в принципе читаемый график.
Вот примерно такой график. Вообще правильнее назвать его надо - соединения с ftp сервером :)
Ну вот и все...но тут есть один минус - точную статистику вы все равно не получите. Поясню, например я качаю download master с ftp файл - так вот он создает 5 секций и (в каждой! ) идет авторизация и получаем мы 5 анонимных пользователей с одного ip. Парсить же уникальные ip тоже не выход...а если сеть за шлюзом и nat - опять получаем вроде 1 ip но коннектов куча. Как вариант ограничить с одного ip по одному коннекту, но тогда попадают пользователи за nat. В итоге забил на это и оставил как есть, все равно более менее точная статистика есть в awstats, а данный график скорее быстрая пристрелка на нагрузку.