#!/usr/local/bin/perl # Log Analyser - analyse new and old logs (Oracle logs for example) # # Parameter - Ini_File # IniFile # # $HOME *.log error|ora # # In создается файл la.dir.ctl, который содержит имена и # контрольные суммы файлов. В случае если они изменились, производится # проверка на наличие в новом содержимом контрольных слов # # alert.log 23455 # # Важно - в случае пересечения директорий будет проиводиться # двойная работа !├ # # Строка в cron может выглядеть так # 0,5,10,15,20,25,30,35,40,45,50,55 * * * * /export/home/demiurg/bin/la.sh # use lib qw(/export/home/demiurg/dvp/backup/lib); use File::Basename; use dbautil; # Глобальные переменные $ctl = "la.dir.ctl"; $status = 0; $ffound = 0; $output=""; # # Открываем файл параметров # open (INPUT, $ARGV[0]) || die "Missing or Bad option.\nUsage: la "; # Читаем из него имена директорий и обходим их while () { # $ic = 0; $if = 0; @realfilelist = (); @updatedlist = (); # my ($dirname, $fmask, $pattern) = split(/;+/, $_ ); unless ( -d $dirname ) { next; } # В каждой директории должен быть ctl файл $ctlfilename = $dirname."/". $ctl; # Возмем сразу и список файлов в директории $cmd = "/usr/bin/find ". $dirname." ".$fmask." -print"; chomp(@filelist = sort `$cmd`); # Если нет ctl файла то создать его unless ( -e $ctlfilename) { open (CTL,">$ctlfilename") || die "Can't open file"; for ( @filelist) { print CTL "$fname -s $fname\n"; } close CTL; printf ("Create ctl .. done \n"); } # Сверим списки файлов в ctl и реально сущствующие chomp(@ctlfilelist = sort `/usr/bin/cat $ctlfilename`); # Цикл по списку файлов в директории с целью найти изменения while (defined ($filelist[$if]) && defined ( $ctlfilelist[$ic])) { # Получим my ($ctlentry, $cksum) = split(/\s+/, $ctlfilelist[$ic]); $realentry = $filelist[$if]; $realcksum = -s $filelist[$if]; # Новый файл появился, добавим его if ($realentry lt $ctlentry) { push (@realfilelist, $realentry." 0"); $if++; } # Если файл удалили, пропустим его elsif ($realentry gt $ctlentry) { $ic++; } # Если файл обнаружен, возмем старую сумму else { push (@realfilelist, $ctlentry." ".$cksum); $if++; $ic++; } } # Если добавляли много файлов в конец списка while ( defined ($filelist[$if]) ) { $realentry = $filelist[$if]; $realcksum = -s $filelist[$if]; push (@realfilelist, $realentry." ".$realcksum); $if++; } # Идти по построенному списку for (sort @realfilelist) { my ($fname, $fsize) = split(/\s+/, $_ ); # printf ("\n$fname $fsize bytes ..."); # Проверяем размер файла if ( $fnewsize = -s $fname ) { $fpos = $fnewsize >= $fsize ? $fsize : 0; # printf ("Start at $fpos"); open (FH, "$fname") || die "Could not open $fname"; seek (FH, $fpos, 0 ); # print "\n Pattern is ". $pattern; $ffound = 0; while ( ) { if (/$pattern/i) { chop; if ( $ffound == 0 ) { $output=$output.basename($fname).$_; print basename($fname); $ffound = 1; } else { $output = $output.$_; print $_; } $status = 1; } } close FH; push (@updatedlist, $fname." ".$fnewsize); } # printf " - OK\n"; } # Сохраним правильный список c обновленными именами и размерами open (CTL,">$ctlfilename") || die "Can't open file"; print CTL join ("\n",@updatedlist) ,"\n"; close (CTL); } close (INPUT); if ( $status ) { h_send_mail ({ 'From' => 'Statserv', 'To' =>'demiurg@zenon.net,7334@pager.portal.ru', 'Subject'=> 'Err' }, $output); } exit ($status);