Страница 1 из 1

Протоколирование заданий печати (ВыньХР/2003)

Добавлено: 2007-05-03 14:20:24
Urgor
Приперло тут руководству знать кто куда и сколько печатал.... Вариант собрать все принтеры в одну комнату и поставить жандарма почему-то не вызвал энтузиазма :) Пришлось искать другие решения... Поглядев сторонние софтины пришел к выводу что они не обладают нужной гибкостью :( Прикинув создал табличку:

Код: Выделить всё

CREATE TABLE `printers` (
  `rowid` int(11) NOT NULL auto_increment,
  `pname` char(20) default NULL,
  `puser` char(15) default NULL,
  `mname` char(15) default NULL,
  `document` char(80) default NULL,
  `pages` int(2) default '0',
  `jobid` int(4) default '0',
  `ptime` datetime default NULL,
  `stat` int(2) default NULL,
  PRIMARY KEY  (`rowid`),
  UNIQUE KEY `ux_jobid` (`jobid`,`ptime`,`pname`),
) ENGINE=MyISAM;
И склепал скриптик для выборки данных и засылки всем желающим на почту: (это за предыдущий день... думаю переписать чтоб за месяц/год/век генерило труда не составит :) )

Код: Выделить всё

/root/>cat print-daily.pl
#!/usr/bin/perl -w

# MySQL - хост где БД
$db_host = 'localhost';
# MySQL юзер
$db_user = 'printlogger';
# MySQL пароль
$db_password = 'printlogger';
# MySQL база данных
$db_database = 'printer';
# подрубаем модуль для работы с MySQL
use DBI;

$admemail="admin\@mydomain.ru";
$RobotName="Stat robot";
$RobotAddr="no-reply\@mydomain.ru";
my @monthstr = ('января','февраля','марта','апреля',
                'мая','июня','июля','августа',
                'сентября','октября','ноября','декабря');

sub SendEMail {
    open (SENDMAIL, "|/usr/sbin/sendmail -t") or die "sendmail not ready";
    print SENDMAIL "From: $RobotName <$RobotAddr>\n";
    print SENDMAIL "To: $_[0]\n";
    print SENDMAIL "Reply-To: Admin <$admemail>\n";
    print SENDMAIL "Content-Type: text/plain; charset=win-1251\n";
    print SENDMAIL "Subject: $_[1]\n\n";
    print SENDMAIL "$_[2]";
    close (SENDMAIL) or warn "sendmail didn`t close nicely";
  };

my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst)=localtime(time);
$year=$year + 1900;
++$month;
if ($month < 10) {$month = '0' . $month};
if ($mday  < 10) {$mday  = '0' . $mday};

my $dsn = "DBI:mysql:database=$db_database;host=$db_host";
my $dbh = DBI->connect($dsn, $db_user, $db_password);
  $sql = "select pname, sum(pages) as pages from printers where ptime like '$year-$month-$mday%' group by pname order by pages;";
  $body="Отпечатано\tПринтер\n";
  my $pages = 0;
  my $sth = $dbh->prepare($sql);
  $sth->execute();
  while (@tmp = $sth->fetchrow_array()) {
        ($pname, $pages) = @tmp;
    $body=$body . "${pages}\t\t${pname}\n";
  }
  $sth->finish();

  $subj = 'Отчет по отпечатанному за '. $mday .' ' . $monthstr[$month - 1] . ' '. $year . ' года';
  $msg = $subj . "\n\n" . $body;
  SendEMail('admin@mydomain.ru', $subj, $msg);
  SendEMail('bigboss@mydomain.ru', $subj, $msg);
1;
Сама прога лежит здесь
О конфиге:
После решетки `#` можно писать что угодно, а вот в присвоении пробелы не переваривает. Потом добавлю вызовы trim(), хотя задача стояла не в написании парсера конфига :)
Установка осуществляется:
1. Распаковать куда-нибудь
2. Отредактировать конфиг (если поменяли название проги меняйте и имя конфига)
3. Запускаете printlogger.exe -install чтоб прописалось в список сервисов и стартовало при старте машины автоматом. Соответственно printlogger.exe -deinstall убирает из сервисов.
4. Зайти в остнастку службы и запустить сервис PrintJobLogger
Гм. Вроде все :)

Добавлено: 2007-05-03 14:41:34
Urgor
Да, совсем забыл: надо докинуть в папку с прогой libmySQL.dll той версии что у вас сервер. Берется это чудо на http://www.mysql.org

Добавлено: 2007-05-03 15:29:01
alex3
мож в "скрипты, написанные на коленках"?

Добавлено: 2007-05-03 20:33:37
Sova
alex3 писал(а):мож в "скрипты, написанные на коленках"?
Туда его - вещь нужная

Добавлено: 2007-05-04 7:48:51
Happy_demon
в мускуле не силен. создаю таблицу. если через пхпадмин, то

Код: Выделить всё

Ошибка
SQL-запрос: 

CREATE TABLE `printers` (

`rowid` int( 11 ) NOT NULL AUTO_INCREMENT ,
`pname` char( 20 ) default NULL ,
`puser` char( 15 ) default NULL ,
`mname` char( 15 ) default NULL ,
`document` char( 80 ) default NULL ,
`pages` int( 2 ) default '0',
`jobid` int( 4 ) default '0',
`ptime` datetime default NULL ,
`stat` int( 2 ) default NULL ,
PRIMARY KEY ( `rowid` ) ,
UNIQUE KEY `ux_jobid` ( `jobid` , `ptime` , `pname` ) ,
) ENGINE = MYISAM 

Ответ MySQL:  

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') ENGINE=MyISAM' at line 13 
через консоль тоже

Код: Выделить всё

[root@bc ~]# mysql -u root -p printer < printers.sql
Enter password:
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 13
не подскажете, где искать?

Добавлено: 2007-05-04 7:54:22
Alex Keda

Код: Выделить всё

UNIQUE KEY `ux_jobid` ( `jobid` , `ptime` , `pname` ) , 
запятой в конце строки не должно быть.
и оно явно на это ругается.

Добавлено: 2007-05-04 8:06:28
Happy_demon
вот честно, хотел свое сообщение отредактировать или удалить-сам допер (тут в мускуле разбираться не нужно, тут с орфографией как и в любом языке надо разобраться), а мне уже ответили. Прияяятно. Спасибо.

Добавлено: 2007-05-04 9:57:51
Happy_demon
ну вот уже почти. прога архи нужная. вот что пишит лог

Код: Выделить всё

2007-05-04 10:27:42 2003 - Can't connect to MySQL server on '192.168.25.2' (10061)
2007-05-04 10:27:42 Server: 
2007-05-04 10:27:42 Client: 4.1.21
2007-05-04 10:27:42 Protocol: 0
2007-05-04 10:32:41 Ошибка при пинге: 2006 - MySQL server has gone away
2007-05-04 10:37:41 Ошибка при пинге: 2006 - MySQL server has gone away
2007-05-04 10:42:41 Ошибка при пинге: 2006 - MySQL server has gone away
2007-05-04 10:47:41 Ошибка при пинге: 2006 - MySQL server has gone away
ну сначала- там просто пользователь был с локалхоста, исправил. насчет dll. на серваке

Код: Выделить всё

mysql  Ver 14.7 Distrib 4.1.22, for portbld-freebsd6.1 (i386) using  5.0
а на сайте мускула нашел под винду только 4.1.21, может в этом проблема?
конфиг вроде исправил по минимуму

Код: Выделить всё

# Файл логов
log_file=c:\temp\printers.log
# Хост с мускулом
Host=192.168.25.2
# Порт слушаемый мускулом
Port=3306
# База куда будем гадить
DataBase=printer
# Юзер, которому можно гадить
# (нужен только insert)
User_Name=printeradmin
# Пароль юзера
Password=pr1nter
единственное, что этот юзер может в этой базе все, не только инсерт, может еще и в этом проблема?

Добавлено: 2007-05-04 10:06:31
Urgor
фарвол? с твоей машины соединение на 192.168.25.2:3306 доступно?

Добавлено: 2007-05-04 10:41:45
Happy_demon
нет, файера не было. на серваке просто было

Код: Выделить всё

[root@bc /usr/local/etc/squid]# cat /etc/my.cnf | grep bind
bind-address=127.0.0.1
закаментировал эту строку-могу подключиться по телнету
Z:\>telnet 192.168.25.2 3306 с виндовой машины
теперь в логах

Код: Выделить всё

2007-05-04 11:27:12 Stopping service.....
2007-05-04 11:27:13 Connected to MySQL server at 192.168.25.2 via TCP/IP
2007-05-04 11:27:13 Server: 4.1.22-log
2007-05-04 11:27:13 Client: 4.1.21
2007-05-04 11:27:13 Protocol: 10
но в базе - пусто. я пару страниц отпечатал, тишина...

Добавлено: 2007-05-04 10:53:16
Urgor
но в базе - пусто. я пару страниц отпечатал, тишина...
На локальный принтер печатаешь или сетевой? Прога пасет только ЛОКАЛЬНЫЕ, т.е. те которые заведены как "локальный принтер, подключенный к этому компухтеру". Те же которые ссылаются на шары с другой машины не будет брать...

Добавлено: 2007-05-04 11:26:04
Happy_demon
действительно, поставил доменный принтер как локальный, только с айпи портом- все забегало, заплясало!!!! сегодня поставлю на сам сервак. письма мне постольку-поскольку, а веб морду простенькую я обязательно замутю.
СПАСИБО ЗА ЭТУ ПРОГРАММУ!

Добавлено: 2007-06-08 9:58:18
Urgor
Кто скачал -- обновитесь. Поправил досадный баг с утечкой памяти...