|
XWall has an interface to collect real time statistic data that can be
used to feed another program which then creates a graphic out of the data.
The state-of-the-art program for this purpose is MRTG (Multi Router Traffic Grapher).
MRTG generates HTML pages containing GIF images which provide a LIVE visual representation of XWall's data. More info on MRTG at http://people.ee.ethz.ch/~oetiker/webtools/mrtg.
A live demo of XWall and MRTG can be found here
How it works A Perl script opens a connection on port 25 to XWall and sends a special ESMTP command.
XWall will then return the current data as a delimited list of values.
The Perl script parses the return value and extract two of the values and outputs them
in such a way that MRTG accepts the data as an input for the graph.
A sample connection looks like:
Connection opened by yourmrtg.domain.com [10.0.0.1]
> 220 yoursrv.domain.com ESMTP XWall
< HELO yourmrtg.domain.com
> 250 yoursrv.domain.com
< XBMRTG
> 250 326127,0,1143,240,7677,5035316,626304505,0,13,0
< QUIT
> 221 closing transmission channel
Connection closed with yourmrtg.domain.com [10.0.0.1]
XWall configuration By default XWall does not allow access to the data.
To allow access you need to add the following lines to XWall.ini.
MRTG=True
MRTGAllowIP=10.0.0.1
Note: Substitute 10.0.0.1 with the IP address of your MRTG machine.
Installation - (MRTG is already installed and working):
-
Download the XWall mrtg.zip file
-
Extract GetMRTG.pl file to c:\mrtg\run
-
Extract sample-mrtg.cfg to c:\mrtg\bin
-
Inside the sample-mrtg.cfg file, replace all instances of yourserver.yourdomain.com
with the hostname of the XWall server
-
Merge sample-mrtg.cfg into your existing mrtg.cfg
-
On the XWall server, add the commands from sample.ini to XWall. ini
to permit MRTG to query the XWall server
-
Run MRTG, usually by using a command line like
"C:\Program Files\Perl\bin\Perl" C:\mrtg\bin\mrtg C:\mrtg\run\mrtg.cfg
-
Look for new html files in the c:\mrtg\html folder
Installation - (MRTG is not installed):
-
Download and extract MRTG to c:\mrtg
-
Download and install ActivePerl
-
Under the c:\mrtg folder, create a folder called html and another called run
-
Download the XWall mrtg.zip file
-
Extract GetMRTG.pl file to c:\mrtg\run
-
Extract sample-mrtg.cfg to c:\mrtg\bin
-
Rename sample-mrtg.cfg to mrtg.cfg
-
Inside the mrtg.cfg file, replace all instances of yourserver.yourdomain.com
with the hostname of the XWall server
-
On the XWall server, add the commands from sample.ini to XWall. ini
to permit MRTG to query the XWall server
-
From a command line in the c:\mrtg\bin folder, type perl mrtg mrtg.cfg and press Enter
-
Look for new html files in the c:\mrtg\html folder
-
Make sure perl mrtg mrtg.cfg is running every 5 minutes or else the graphs will not update
MRTG.CFG configuration
A sample MRTG.CFG file:
# Todo:
#
# - Change yourserver.yourdomain.com to the name of the
# machine where XWall is running
#
# - Change C:\mrtg\HTML if necessary
#
# - Change C:\mrtg\run\getmrtg.pl if necessary
#
#
WorkDir: C:\mrtg\HTML\
Interval:5
# Global Definitionen
Kilo[_]: 1024
#
# Inbound and outbound SMTP queue
#
Target[xwall.qc]: `C:\mrtg\run\getmrtg.pl yourserver.yourdomain.com 1 2`
Options[xwall.qc]: gauge , absolute , unknaszero , nopercent , noinfo , integer
MaxBytes[xwall.qc]: 100000
YLegend[xwall.qc]: SMTP-Queue
ShortLegend[xwall.qc]: Msg
Legend1[xwall.qc]: Inbound SMTP-Queue
Legend2[xwall.qc]: Outbound SMTP-Queue
LegendI[xwall.qc]: In:
LegendO[xwall.qc]: Out:
Title[xwall.qc]: yourserver.yourdomain.com - XWall
PageTop[xwall.qc]: <H1>XWall - SMTP-Queue - yourserver.yourdomain.com</H1>
#
# Inbound and outbound Exchange queue
#
Target[xwall.eqc]: `C:\mrtg\run\getmrtg.pl yourserver.yourdomain.com 15 16`
Options[xwall.eqc]: gauge , absolute , unknaszero , nopercent , noinfo , integer
MaxBytes[xwall.eqc]: 100000
YLegend[xwall.eqc]: Exch-Queue
ShortLegend[xwall.eqc]: Msg
Legend1[xwall.eqc]: Incoming Exch-Queue
Legend2[xwall.eqc]: Outbound Exch-Queue
LegendI[xwall.eqc]: In:
LegendO[xwall.eqc]: Out:
Title[xwall.eqc]: yourserver.yourdomain.com - XWall
PageTop[xwall.eqc]: <H1>XWall - Exch-Queue - yourserver.yourdomain.com</H1>
#
# Inbound and outbound SMTP connection count
#
Target[xwall.cc]: `C:\mrtg\run\getmrtg.pl yourserver.yourdomain.com 7 8`
Options[xwall.cc]: gauge , absolute , unknaszero , nopercent , noinfo , integer
MaxBytes[xwall.cc]: 100000
YLegend[xwall.cc]: Connections
#ShortLegend[xwall.cc]: Connections
ShortLegend[xwall.cc]: c
Legend1[xwall.cc]: Incoming Connections
Legend2[xwall.cc]: Outbound Connections
LegendI[xwall.cc]: In:
LegendO[xwall.cc]: Out:
Title[xwall.cc]: yourserver.yourdomain.com - XWall
PageTop[xwall.cc]: <H1>XWall - Connections - yourserver.yourdomain.com</H1>
#
# Inbound and outbound SMTP message per hour
#
Options[xwall.mc]: nopercent , noinfo , integer , perhour
Target[xwall.mc]: `C:\mrtg\run\getmrtg.pl yourserver.yourdomain.com 3 4`
MaxBytes[xwall.mc]: 300000
YLegend[xwall.mc]: Messages/hour
ShortLegend[xwall.mc]: Messages/hour
Legend1[xwall.mc]: Inbound Messages
Legend2[xwall.mc]: Outbound Messages
LegendI[xwall.mc]: In:
LegendO[xwall.mc]: Out:
Title[xwall.mc]: yourserver.yourdomain.com - XWall
PageTop[xwall.mc]: <H1>XWall - Messages - yourserver.yourdomain.com </H1>
#
# Spam and block message per hour
#
Options[xwall.sc]: nopercent , noinfo , integer , perhour
Target[xwall.sc]: `C:\mrtg\run\getmrtg.pl yourserver.yourdomain.com 25 26`
MaxBytes[xwall.sc]: 300000
YLegend[xwall.sc]: Messages/hour
ShortLegend[xwall.sc]: Messages/hour
Legend1[xwall.sc]: Blocked Messages
Legend2[xwall.sc]: Spam Messages
LegendI[xwall.sc]: Block:
LegendO[xwall.sc]: Spam:
Title[xwall.sc]: yourserver.yourdomain.com - XWall
PageTop[xwall.sc]: <H1>XWall - Spam - yourserver.yourdomain.com </H1>
#
# Greylisting message per hour
#
Options[xwall.gc]: nopercent , noinfo , integer , perhour
Target[xwall.gc]: `C:\mrtg\run\getmrtg.pl yourserver.yourdomain.com 27 28`
MaxBytes[xwall.gc]: 300000
YLegend[xwall.gc]: Messages/hour
ShortLegend[xwall.gc]: Messages/hour
Legend1[xwall.gc]: Greylisting Messages
Legend2[xwall.gc]: Not Used
LegendI[xwall.gc]: Grey:
LegendO[xwall.gc]: NU:
Title[xwall.gc]: yourserver.yourdomain.com - XWall
PageTop[xwall.gc]: <H1>XWall - Greylisting - yourserver.yourdomain.com </H1>
#
# Inbound and outbound SMTP byte count
#
Target[xwall.bc]: `C:\mrtg\run\getmrtg.pl yourserver.yourdomain.com 5 6`
Options[xwall.bc]: nopercent , noinfo , integer
MaxBytes[xwall.bc]: 10737418240
YLegend[xwall.bc]:
ShortLegend[xwall.bc]:
Legend1[xwall.bc]: Inbound Bytes
Legend2[xwall.bc]: Outbound Bytes
LegendI[xwall.bc]: In:
LegendO[xwall.bc]: Out:
Title[xwall.bc]: yourserver.yourdomain.com - XWall
PageTop[xwall.bc]: <H1>XWall - Bytes - yourserver.yourdomain.com </H1>
#
# Outbound SMTP rate
#
Target[xwall.ro]: `C:\mrtg\run\getmrtg.pl yourserver.yourdomain.com 23 24`
Options[xwall.ro]: gauge , absolute , nopercent , noinfo , integer
MaxBytes[xwall.ro]: 100
AbsMax[xwall.ro]: 1000
YLegend[xwall.ro]: Rate
ShortLegend[xwall.ro]: /1000
Legend1[xwall.ro]: Messages > 60 sec
Legend2[xwall.ro]: Messages > 900 sec
LegendI[xwall.ro]: > 60 sec:
LegendO[xwall.ro]: > 900 sec:
Title[xwall.ro]: yourserver.yourdomain.com - XWall
PageTop[xwall.ro]: <H1>XWall - Rate - yourserver.yourdomain.com </H1>
Perl script for MRTG (getmrtg.pl)
This is the Perl script to collect the data:
#
# Query XWAll for statistic values to feed into MRTG
#
#
# Call with: GetMRTG hostname InData OutData Verbose
#
# Sample ( w verbose ) : GetMRTG exchange.domain.com 3 4 1
# Sample ( w/o verbose ): GetMRTG exchange.domain.com 3 4
#
# InIndex and OutIndex can be one of:
#
# 1 InboundSMTPQueueCount
# 2 OutboundSMTPQueueCount
#
# 3 InboundSMTPMsgCount
# 4 OutboundSMTPMsgCount
# 5 InboundSMTPByteCount
# 6 OutboundSMTPByteCount
# 7 InboundSMTPConnectionCount
# 8 OutboundSMTPConnectionCount
#
# 9 InboundPOP3MsgCount
# 10 OutboundPOP3MsgCount
# 11 InboundPOP3ByteCount
# 12 OutboundPOP3ByteCount
# 13 InboundPOP3ConnectionCount
# 14 OutboundPOP3ConnectionCount
#
# 15 InboundExchQueueCount
# 16 OutboundExchQueueCount
#
# 17 InboundExchByteCount
# 18 OutboundExchByteCount
# 19 InboundExchMsgCount
# 20 OutboundExchMsgCount
# 21 InboundExchConnectionCount
# 22 OutboundExchConnectionCount
#
# 23 OutboundSMTPRate1
# 24 OutboundSMTPRate1
#
# 25 InboundSMTPMsgBlockCount
# 26 InboundSMTPMsgSpamCount
#
# 27 InboundSMTPGreyCount
# 28 NotUsed
#
# 29 InboundVirusCount
# 30 OutboundVirusCount
#
use Socket;
use Text::ParseWords;
use POSIX qw(strftime);
( $Host , $InIndex , $OutIndex , $Verbose ) = @ARGV ;
$Verbose = 0 unless $Verbose ;
$Port = 25 ;
$Proto = (getprotobyname('tcp'))[2];
$ThisAddr = (gethostbyname(""))[4];
$ThisHost = gethostbyaddr($ThisAddr, AF_INET);
$SMTPAddr = (gethostbyname($Host))[4];
#$this = pack('Sna4x8', AF_INET, 0, $ThisAddr);
$smtp = pack('Sna4x8', AF_INET, $Port, $SMTPAddr);
if ( $Verbose )
{
print " Host: $Host\n" ;
print " InIndex: $InIndex\n" ;
print "OutIndex: $OutIndex\n" ;
}
if (!socket(S, AF_INET, SOCK_STREAM, $Proto)) { die $!; }
#if (!bind(S, $this)) { die $!; }
if (!connect(S, $smtp)) { die $!; }
$oldfh = select(S); $| = 1; select($oldfh);
if (eof(S))
{
print "Unable to read from Port";
exit(-1);
}
# get the greeting line
$Greeting = <S>; if (/^[45]/) { close S; die "$_\n"; }
if ( $Verbose )
{
print "$Greeting";
}
# Remove the first 4 chars from gretting ( "220 " )
$Greeting = substr( $Greeting , 4 ) ;
# Send HELO
if ( $Verbose )
{
print "HELO $ThisHost\n";
}
print S "HELO $ThisHost\r\n";
$_ = <S>; if (/^[45]/) { close S; die "$_\n"; }
if ( $Verbose )
{
print "$_";
}
# Send command to get statistic
if ( $Verbose )
{
print "XBMRTG\n";
}
print S "XBMRTG\r\n";
# Get the values
$_ = <S>; if (/^[45]/) { close S; die "$_\n"; }
if ( $Verbose )
{
print "$_";
}
# Filter OutIndex the one we need
# and print them to STDOUT
# Also save UpTime
$UpTime = 0 ;
$InData = 0 ;
$OutData = 0 ;
@words = "ewords(',', 0, "$_");
$i = 0;
foreach (@words)
{
$UpTime = substr( $_ , 4 ) if ( $i == 0 ) ;
$InData = $_ if ( $i == $InIndex ) ;
$OutData = $_ if ( $i == $OutIndex ) ;
$i++;
}
# Disconnect from host
if ( $Verbose )
{
print "QUIT\n";
}
print S "QUIT\r\n";
$_ = <S>; if (/^[45]/) { close S; die "$_\n"; }
if ( $Verbose )
{
print "$_";
}
close S;
# Print values
print "$InData\n" ;
print "$OutData\n" ;
# Print UpTime
$Days = int( $UpTime / 86400 ) ;
if ( $Days > 0 )
{
print "$Days days ";
$UpTime -= ( $Days * 86400 ) ;
}
$UpTimeStr = strftime( "%H:%M:%S", gmtime( $UpTime ) ) ;
print "$UpTimeStr\n" ;
print "$Greeting\n" ;
You can download the sample files and the Perl script from here
|