Hi Group ,

I am trying to process a Qmail Smtp session Log file (
multilog ).

The section of the Log file is give below :

@400000004123d44320c51f3c tcpserver: ok 9198
mailgateway.foo.com:10.10.0.1:25 :20.132.29.1::60433
@400000004123d44320c52edc qmail-smtpd 9198: connection
from 200.12.239.1 (unknown) to mailgateway.foo.com
@400000004123d4451529c72c qmail-smtpd 9198:
authentication success, user Authenticated
user:[EMAIL PROTECTED]
@400000004123d4452fcdffbc qmail-smtpd 9198: mail from:
[EMAIL PROTECTED]
@400000004123d4460f3cbbe4 qmail-smtpd 9198: rcpt to:
[EMAIL PROTECTED]
@400000004123d452240346c4 tcpserver: status: 4/150
@400000004123d455142c5844 qmail-smtpd 9198: message
queued: 1092867147 qp 9200 size 84902 bytes
@400000004123d455341b60dc tcpserver: end 9198 status 0

For every user that authenticates a "Authenticated
user:" line is generated also a "pid" is assigned to
this session .The pid is the number visible after the
"qmail-smtpd" field in this case it's "9198".After the
message is transferred the line " message queued " is
generated and the no of bytes transferred is printed
just before the "bytes" field .
The pid assigned is constant till the smtp session is
live . The start of any smtp session is the line
"tcpserver: ok <pid no> <hostname>...ipaddress ..."
The end of the smtp session is marked by the line
."tcpserver: end <pid> status 0".

I am trying to match this pid for the "Authenticated
user:" to the bytes transferred.

I have written following code ,which works a bit ,but
it fails if another smtp session start before the end
of the smtp session which I am processing .

My Code .
-------------------
#!/usr/bin/perl -w
# The Log File
$logfile = shift || die "Usage:$0 <logfile>";
open FLE, "< $logfile" if defined ($logfile);
# While Start
while (<FLE>) {
        chomp;
        # We get the Authenticated Line
        if (/\s(\d{1,}): authentication success, user
Authenticated user:(.{1,})$/){ # Start IF
AUTHENTICATED
            # We assign the Pid and Auth User
            $authpid = $1; # Auth pid
            $authuser = $2; # Auth User
            $HoH{$authpid}{user} = $authuser;  # Just
create a Hash for each Pid 
            print "Pid: $authpid User: $authuser \n";
                }                   # END IF
AUTHENTICATED
        # We search the bytes transferred line
        if (/qmail-smtpd\s(\d{1,}):\smessage
queued:\s\d{1,}\sqp\s\d{1,}\ssize\s(\d{1,})\sbytes.*$/){
# IF MESSAGE QUEUED
            # We define Pid and Bytes
            $pid = $1;
            $bytes = $2;
            #$HoH{$pid}{Bytes} = $bytes if defined (
$HoH{$pid} );
                    if (defined ( $HoH{$pid})) {  #
Check if it's pid of an authenticated smtp session ,if
not it's mostly a non authenticated session 
                        print "Pid :$pid Bytes
:$bytes\n";
                                }
                } # END IF QUEUED

}

-------------------

And the output is :

-----------------
Pid: 10554 User: [EMAIL PROTECTED]
Pid :10554 Bytes :6385
Pid: 11315 User: [EMAIL PROTECTED]
Pid :11315 Bytes :1605
Pid: 11547 User: [EMAIL PROTECTED]
Pid: 11842 User: [EMAIL PROTECTED]
Pid: 11844 User: [EMAIL PROTECTED]
Pid :11844 Bytes :1112
------------------

As you can see till [EMAIL PROTECTED] I am getting the
Username & bytes properly but later after [EMAIL PROTECTED]
the bytes are lost .

My questions are :
1. When I get a pid of Authenticated User how do I
store it till the bytes are found.
2. When I get the bytes how do I destroy the Hash so
that the bytes won't get overwritten
3. When handling more than one "Authenticated user:" 
pids how to store them (pids) till the corresponding
"bytes" line is not received .

Thanx in advance for any help
BadApple

________________________________________________________________________
Yahoo! India Matrimony: Find your life partner online
Go to: http://yahoo.shaadi.com/india-matrimony

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to