On Wednesday 10 August 2005 04:36, you wrote:
> On 8/9/05, Wagner, David --- Senior Programmer Analyst --- WGO
>
> <[EMAIL PROTECTED]> wrote:
> > Alex wrote:
> > > Hello everyone,
> > >
> > > I need some help to fix a problem in mailgraph.pl script. I'm not a
> > > perl programmer, so i hope to find a little help here...
> > >
> > > I need to translate an old code which is parsing my maillog file, into
> > > new one, related to my present needs.
> > >
> > > The old code has worked with old vexira logging style (now
> > > deprecated).... Lines in my maillog was something like:
> > >
> > > Aug 7 13:40:28 pharma vgatefwd[1532]: VIRUS bla bla bla
> > >
> > > Here comes old code:
> > > elsif($prog eq 'vagatefwd') {
> > > # Vexira antivirus
> > > if($text =~ /^VIRUS/) {
> > > event($time, 'virus');
> > > }
> > > }
> > >
> > > The new code (rewrited by me), should work with new vexira logging
> > > style... lines in my maillog as following:
> > >
> > > Aug 7 13:40:28 pharma hook[2446]: ***** Virus (I-Worm.Netsky.Q1)
> > > killed with file delete!
> > >
> > > Here come the new code....
> > > elsif($prog eq 'hook') {
> > > # Vexira antivirus
> > > if($text =~ /^\([\*]+\) Virus\b/) {
> >
> > No it won't work for you. You are asking for a start of line then
> > a paren followed by zero or more * then a paren, a space the the word
> > Virus. You can try something like:
> >
> > if($text =~ /\s\*{1,}\s{1,}Virus\b/)
> > where you are looing for a space followed by 1 or more *, 1 or more
> > spaces then Virus.
> >
> > Wags ;)
> >
> > > event($time, 'virus');
> > > }
> > > }
> > >
> > > Is my new code correct? If no, how should it be?
> > >
> > > Regards,
> > > Alex
>
> There must be more going on here. The original regex matches at the
> beginning of the line--'^VIRUS'--so everything up to the space
> following the colon must be stripped before the regex in the if
> conditional gets it. '$text =~ /^VIRUS/' doesn't match on 'Aug 7 blah
> blah blah'. In that case, simply replacing /^VIRUS/ with /^Virus/
> should work fine. or better yet:
>
> if ( $text =~ /^virus/i ) {
>
> I think we need to see more of the code, though, to be sure of what's going
> on.
>
> HTH,
>
> --jay
> --------------------------------------------------
> This email and attachment(s): [ ] blogable; [ x ] ask first; [ ]
> private and confidential
>
> daggerquill [at] gmail [dot] com
> http://www.tuaw.com http://www.dpguru.com http://www.engatiki.org
Yes indeed.... here comes more explanations:
1. Because i don't have old vexira software, i will post here an working
spamassasin example, which is almost identical to old vgatefwd functionality.
Here comes mailgraph.pl code.
sub process_line($)
{
my $sl = shift;
my $time = $sl->[0];
my $prog = $sl->[2];
my $text = $sl->[4];
if($prog =~ /^postfix\/(.*)/) {
........
}
elsif($prog eq 'vagatefwd') {
# Vexira antivirus
if($text =~ /^VIRUS/) {
event($time, 'virus');
}
}
elsif($prog eq 'spamd') {
if($text =~ /^identified spam/) {
event($time, 'spam');
}
}
}
in my /var/log/maillog, when and email is tagged as spam comes:
Aug 7 05:13:29 pharma spamd[11623]: identified spam (15.3/5.0) for
[EMAIL PROTECTED]:12347 in 1.7 seconds, 19833 bytes.
Aug 7 05:13:29 pharma spamd[11623]: result: Y 15 - bla bla bla
2. Now, when a message is infected, vexira put in my /var/log/maillog the
following lines:
Aug 7 13:40:28 pharma hook[2446]: Virus scanning in attachment
'noname_1248.txt'
Aug 7 13:40:28 pharma hook[2446]: Scanning object...
Aug 7 13:40:28 pharma hook[2446]: Virus Scanning in: $noname_1248.txt
Aug 7 13:40:28 pharma hook[2446]: Callback entry point
Aug 7 13:40:28 pharma hook[2446]: Callback: scanFound
Aug 7 13:40:28 pharma hook[2446]: ***** Found mutant 'Exploit.IFrame.B' -
Killable with delete.
Aug 7 13:40:28 pharma hook[2446]: Callback entry point
Aug 7 13:40:28 pharma hook[2446]: Callback: actionDone
Aug 7 13:40:28 pharma hook[2446]: Callback: actionDone = 2
Aug 7 13:40:28 pharma hook[2446]: ***** Virus (Exploit.IFrame.B) killed with
file delete!
Aug 7 13:40:28 pharma hook[2446]: Virus Scanning done in: $noname_1248.txt
Aug 7 13:40:28 pharma hook[2446]: Object scanning done...
Aug 7 13:40:28 pharma hook[2446]: Generated virus toplist 'Daily'
So, interesting lines in /var/log/maillog should contain "***** Virus" string
and are generated by 'hook' daemon.
3. Now, at the beginig at mailgraph.pl, is defined who is $prog and $text:
sub _next_syslog($)
{
my ($self) = @_;
while($self->{_repeat}>0) {
$self->{_repeat}--;
return $self->{_repeat_data};
}
line: while(my $str = $self->_next_line()) {
# date, time and host
$str =~ /^
(\S{3})\s+(\d+) # date -- 1, 2
\s
(\d+):(\d+):(\d+) # time -- 3, 4, 5
(?:\s<\w+\.\w+>)? # FreeBSD's verbose-mode
\s
([-\w\.]+) # host -- 6
\s+
(.*) # text -- 7
$/x or do
{
warn "WARNING: line not in syslog format: $str";
next line;
};
........
# marks
next if $text eq '-- MARK --';
# some systems send over the network their
# hostname prefixed to the text. strip that.
$text =~ s/^$host\s+//;
# discard ':' in HP-UX 'su' entries like this:
# Apr 24 19:09:40 remedy : su : + tty?? root-oracle
$text =~ s/^:\s+//;
$text =~ /^
([^:]+?) # program -- 1
(?:\[(\d+)\])? # PID -- 2
:\s+
(?:\[ID\ (\d+)\ ([a-z0-9]+)\.([a-z]+)\]\ )? # Solaris 8 "message
id" -- 3, 4, 5
(.*) # text -- 6
$/x or do
{
warn "WARNING: line not in syslog format: $str";
next line;
};
if($self->{arrayref}) {
$self->{_last_data}{$host} = [
$time, # 0: timestamp
$host, # 1: host
$1, # 2: program
$2, # 3: pid
$6, # 4: text
];
}
else {
$self->{_last_data}{$host} = {
timestamp => $time,
host => $host,
program => $1,
pid => $2,
msgid => $3,
facility => $4,
level => $5,
text => $6,
};
}
return $self->{_last_data}{$host};
}
return undef;
}
Finally, i want to mention that the code posted by Wags is not working:
elsif($prog eq 'hook') {
# Vexira antivirus
if($text =~ /\s\*{1,}\s{1,}Virus\b/) {
event($time, 'virus');
}
}
Also, correction posted by Jay, is not applicabile because we have more lines
containing "Virus" word and only one should be counted (***** Virus).
Alex
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>