Помогите пожалуйста. Нужен был скрипт, который парсит файл лога CUPS (page_log) и добавляет эти данные в Mysql таблицу.
Погуглил, ничего свежего не нашел.
Только на этом сайте нашел скрипт, но с ним возникли сложности.
http://extmemory.blogspot.ru/2009/10/cups.html
Система Ubuntu 16.04, LAMP.
Ставим LAMP, phpmyadmin, модули для perl
sudo tasksel install lamp-server
sudo apt-get install phpmyadmin
sudo apt-get install libdbi-perl
sudo apt-get install libdbd-mysql-perl
Создаем базу данных cups_stat содержащую таблицу, tasks_log:
CREATE DATABASE `cups_stat`;
USE `cups_stat`;
Создаем таблицу tasks_log
CREATE TABLE IF NOT EXISTS `tasks_log` (
`id` bigint(10) NOT NULL auto_increment,
`prn_name` varchar(50) NOT NULL,
`user_name` varchar(50) NOT NULL,
`task_id` int(10) NOT NULL,
`p_date` datetime NOT NULL,
`page_num` int(3) NOT NULL,
`rep_num` int(3) NOT NULL,
`host` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Создаем в Mysql пользователя print/print и даем ему полные права на таблицу tasks_log
Создаем Perl script
#! /usr/bin/perl
use DBI;
use Time::Local;
#Хост MySQL
$dbhost='localhost';
#Пользователь MySQL
$dbuser='print';
#Пароль пользователя MySQL
$dbpass='print';
#IP Сервера CUPS
$CupsIP='127.0.0.1';
#Имя базы MySQL
$dbname='cups_stat';
#Полное имя page_log
$log='/var/log/cups/page_log';
%mnts = (
Jan => "01",
Feb => "02",
Mar => "03",
Apr => "04",
May => "05",
Jun => "06",
Jul => "07",
Aug => "08",
Sep => "09",
Oct => "10",
Nov => "11",
Dec => "12"
);
#Получаем дату и ID последнего задания в базе
#Подключение к DB
$dbh = DBI->connect("DBI:mysql:database=$dbname;host=$dbhost",$dbuser, $dbpass) || die print "Can't connect";
$sth = $dbh->prepare(q{SELECT UNIX_TIMESTAMP(MAX(p_date)), MAX(task_id) FROM tasks_log});
$sth -> execute;
#print $sth."/n";
$cols = $sth->{NUM_OF_FIELDS}; # кол-во строк в таблице
$rows = $sth->rows; # кол-во столбцов в таблице
@FieldNames = @{ $sth->{NAME} }; # массив содержащий названия
# полей таблицы
@row = $sth->fetchrow_array;
$MaxDate=$row[0];
$MaxTaskId=$row[1];
# print $MaxTaskId."->".$MaxDate."\n";
#Открываем лог-файл cups
open (FH,$log)|| die print 'Не могу открыть файл! \n';
while (< FH >)
{
@fields=split(' ');
# print $MaxTaskId." > ".$fields[2]."\n";
#Меняем localhost на IP серевера CUPS
if ($fields[8]=="localhost")
{
$fields[8]=$CupsIP;
}
#Если ID задания из лог-файла больше либо равно ID последнего задания в базе
#и его дата больше даты в базе пишем его в базу.
#Преобразуем формат даты в понятный для MySQL datetime
if ($fields[2]=>$MaxTaskId || ! $MaxTaskId)
{
$year=substr($fields[3],8,4);
$rmon=$mnts{substr($fields[3],4,3)};
$mday=substr($fields[3],1,2);
$sec=substr($fields[3],-2);
$min=substr($fields[3],-5,2);
$hours=substr($fields[3],-8,2);
$udt=$year."-".$rmon."-".$mday." ".substr($fields[3],-8);
$fields[3]=$udt;
$TIME = timelocal($sec, $min, $hours, $mday, $rmon-1, $year);
if ($TIME>$MaxDate)
{
#Создаем запрос SQL и выполняем его
$query="insert into tasks_log (prn_name, user_name, task_id, p_date, page_num, rep_num, host) values('".$fields[0]."','".$fields[1]."','".$fields[2]."','".$fields[3]."','".$fields[5]."','".$fields[6]."','".$fields[8]."')";
$sth = $dbh->prepare(qq{$query});
$sth -> execute;
}
}
}
# Закрываем лог-файл
close(FH);
# Отключаемся от базы
$sth -> finish;
$dbh -> disconnect;
exit;
Права на файл page_log
-rw-r--r-- 1 root adm 438 дек 29 08:51 page_log
Содержимое page_log
HP_LaserJet_MFP_M129-M134 user2 17421 [29/Dec/2017:07:55:22 +0500] 1 1 - 192.168.20.102
HP_LaserJet_MFP_M129-M134 user2 17422 [29/Dec/2017:08:20:10 +0500] 1 1 - 192.168.20.102
Пытаемся выполнить скрипт:
root@ubuntu-ltsp-5:/etc/scripts# /var/www/print.pl
Month '-1' out of range 0..11 at /var/www/print.pl line 70.
Т.е. ему не нравится функция преобразования времени в скрипте:
$TIME = timelocal($sec, $min, $hours, $mday, $rmon-1, $year);
Запустил debug (perl -d)
Month '-1' out of range 0..11 at /var/www/print.pl line 70.
at /usr/share/perl/5.22/Time/Local.pm line 108.
Time::Local::timegm called at /usr/share/perl/5.22/Time/Local.pm line 155
Time::Local::timelocal("", undef, undef, undef, -1, undef) called at /var/www/print.pl line 70
Debugged program terminated. Use q to quit or R to restart,
Как можно исправить эту ошибку?
Спасибо.