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. -----------------------------------------------------------------------------