>Добрый день,
>Подскажите, как на перле сделать такое:
>ведется лог файл и перенаправляется на стандартый ввод скрипта на перле.
>Как написать этот скрипт? Подскажите общее направление. Например нужно, чтобы некоторый строки
>лога игнорировались (происходил поиск по шаблону),
>что-то перенаправлялось в другой лог, извлекать определенные данные, записывать их в переменные
>и т.п. Как сделать это разбор строки в реал тайме? Покажите
>примерное решение.
>Всем большое спасибо.
Мне нужно было чтобы ipchains log попадал в БД
syslog настроил что бы писал в PIPE
#!/usr/bin/perl
use POSIX;
use Pg;
$pghost="localhost";
$pgport="5432";
$pgoptions="";
$pgtty="";
$dbname="log";
$login="postgres";
$passwd="123456";
$pid=fork(); # create new process and exit from parent
exit if $pid;
die "Couldn't fork: $!" unless defined($pid);
POSIX::setsid() or die "Can't start new session: $!"; # delete link with terminal
-p "/var/log/all" or die "Couldn't find pipe: $!";
open(PIPE,"</var/log/all") or die "Could open pipe: $!";
$conn = Pg::setdbLogin($pghost, $pgport, $pgoptions, $pgtty, $dbname, $login, $passwd);
$errorMessage=$conn->errorMessage;
if ($errorMessage ) {
print STDERR $errorMessage;
exit 1;
};
while (<PIPE>){
$link='';
$link=fillvalues($_);
if ($link) {
$result = $conn->exec("INSERT INTO ipchainslog (dt,hostname,chainsname,job,\
int,proto,srcip,srcport,dstip,dstport,length,numberrule)VALUES \
('$link->{'dt'}', '$link->{'hostname'}', '$link->{'chainsname'}',\
'$link->{'job'}', '$link->{'int'}', $link->{'proto'}, '$link->{'srcip'}',\
$link->{'srcport'}, '$link->{'dstip'}', $link->{'dstport'},\
$link->{'length'}, $link->{'numberrule'})");
};
$errorMessage=$conn->errorMessage;
if ($errorMessage ) {
print STDERR $errorMessage;
exit 1;
};
};
#########################################################################################
sub fillvalues {
my($log_string,$link);
$log_string=shift @_;
chomp $log_string;
if ($log_string=~/^(\w{3,3} \d \d\d:\d\d:\d\d )(.+?) kernel: Packet log: (.+?) (.+?) (.+?) PROTO=(\d{1,3}) (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}):(\d{1,5}) (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}):(\d{1,5}) L=(\d{1,5}).+? \(\#(\d{1,5})\)/){
$link->{'dt'}=$1.((gmtime)[5]+1900);
$link->{'hostname'}=$2;
$link->{'chainsname'}=$3;
$link->{'job'}=$4;
$link->{'int'}=$5;
$link->{'proto'}=$6;
$link->{'srcip'}=$7;
$link->{'srcport'}=$8;
$link->{'dstip'}=$9;
$link->{'dstport'}=$10;
$link->{'length'}=$11;
$link->{'numberrule'}=$12;
};
return $link;
};
долько долго не пинайте если что не так :)
чем не realtime не знаю слово слишком заумное а со своей работой пока справляется;
а вот у меня самого вопрос при как проверить существует ли процесс с таким номером и если существует как инфу о нем узнать?