This is now in the LPRng UTILS directory as the 'VeryFlexibleChooser.pl'
script.
Version LPRng-3.8.26 - Tue Feb 3 16:58:00 PST 2004
ADDITION to UTILS:
VeryFlexibleChooser.pl script uses SNMP to get printer
status and selects printer.
(Contributed by: Henrik Edlund <[EMAIL PROTECTED]>)
> From [EMAIL PROTECTED] Thu Nov 27 10:16:08 2003
> Date: Thu, 27 Nov 2003 17:54:01 +0100 (CET)
> From: Henrik Edlund <[EMAIL PROTECTED]>
> To: [EMAIL PROTECTED]
> Subject: LPRng: Chooser script using SNMP
>
> I hereby release the following Chooser script into the public domain on 27
> November 2003.
>
> The following Chooser script uses SNMP to check printer status, and then
> uses the status information to in a smart way select the _most_ available
> printer. A printer without toner/paper warnings is always chosen over one
> with toner/paper warnings. Within each of those groups; an idle printer is
> chosen first, then a standby printer (after idle because it takes time for
> it to warm up), then a printing printer, and last a warming up printer
> (after printing as it has most likely received a print job and given the
> guess that each print job is of equal size, a printing printer will be
> done before a printer in warm up).
>
> This script is known to fully work with the Xerox Phaser 4400 and the
> Xerox DocuPrint N32. Your mileage may vary with printers from other
> manufacturers.
>
> Yours,
> Henrik
>
> PS. There are "spies" from Xerox on this list; so *wink* *wink* to the
> fellas over at Xerox.
>
> --snip--
>
> #!/usr/local/bin/perl
>
> # Released into the Public Domain by Henrik Edlund <[EMAIL PROTECTED]>
> # 27 November 2003
>
> # This program is distributed in the hope that it will be useful, but
> # WITHOUT ANY WARRANTY; without even the implied warranty of
> # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
>
> use strict;
> use warnings;
>
> use Net::SNMP;
>
> my $printers;
> my $exit_job_fail = 1;
> my $printer;
> my $priority;
> my $session;
> my $error;
> my $result;
> my $snmp_hr_device_status = '1.3.6.1.2.1.25.3.2.1.5.1';
> my $snmp_hr_printer_status = '1.3.6.1.2.1.25.3.5.1.1.1';
> my @printers = ([], [], [], [], [], [], [], []);
> my $exit_job_success = 0;
>
> # get printers from STDIN
> $printers = <STDIN>;
> if (not(defined($printers))) {
> # no printers given, try again in a while
> exit($exit_job_fail);
> }
> chomp($printers);
>
> foreach $printer (split(/,/, $printers)) {
> $priority = -1;
> # talk SNMP to printer
> ($session, $error) = Net::SNMP->session(-hostname => $printer);
> if (defined($session)) {
> # fetch hrDeviceStatus and hrPrinterStatus
> $result = $session->get_request(-varbindlist =>
> [$snmp_hr_device_status,
> $snmp_hr_printer_status]);
> # check status of printer and assign priority
> if (defined($result)) {
> if ($result->{$snmp_hr_device_status} == 2) { # running
> if ($result->{$snmp_hr_printer_status} == 3) { # idle
> $priority = 0;
> }
> elsif ($result->{$snmp_hr_printer_status} == 1) { # standby
> $priority = 1;
> }
> elsif ($result->{$snmp_hr_printer_status} == 4) { # printing
> $priority = 2;
> }
> elsif ($result->{$snmp_hr_printer_status} == 5) { # warmup
> $priority = 3;
> }
> }
> elsif ($result->{$snmp_hr_device_status} == 3) { # warning
> if ($result->{$snmp_hr_printer_status} == 3) { # idle
> $priority = 4;
> }
> elsif ($result->{$snmp_hr_printer_status} == 1) { # standby
> $priority = 5;
> }
> elsif ($result->{$snmp_hr_printer_status} == 4) { # printing
> $priority = 6;
> }
> elsif ($result->{$snmp_hr_printer_status} == 5) { # warmup
> $priority = 7;
> }
> }
> if ($priority != -1) {
> push(@{$printers[$priority]}, $printer);
> }
> }
> # close the udp transport layer to printer
> $session->close();
> }
> }
>
> # of those available with highest priority; pick a random one
> foreach $priority (@printers) {
> $printers = scalar(@$priority);
> if ($printers > 0) {
> # success, found available printer
> print "$priority->[rand($printers)]\n";
> exit($exit_job_success);
> }
> }
>
> # no printers available right now, try again in a while
> exit($exit_job_fail);
-----------------------------------------------------------------------------
YOU MUST BE A LIST MEMBER IN ORDER TO POST TO THE LPRNG MAILING LIST
The address you post from MUST be your subscription address
If you need help, send email to [EMAIL PROTECTED] (or lprng-requests
or lprng-digest-requests) with the word 'help' in the body. For the impatient,
to subscribe to a list with name LIST, send mail to [EMAIL PROTECTED]
with: | example:
subscribe LIST <mailaddr> | subscribe lprng-digest [EMAIL PROTECTED]
unsubscribe LIST <mailaddr> | unsubscribe lprng [EMAIL PROTECTED]
If you have major problems, send email to [EMAIL PROTECTED] with the word
LPRNGLIST in the SUBJECT line.
-----------------------------------------------------------------------------