2 # Functions for irix-style printer management
4 $irix_iface_path = "/var/spool/lp/interface";
7 # Returns an array of known printer names
11 open(STAT, "/usr/bin/lpstat -p |");
13 if (/^printer\s+(\S+)/) { push(@rv, $1); }
19 # get_printer(name, [nostatus])
20 # Returns a reference to an associative array of printer details
23 local($stat, @rv, $body, $body, $avl, $con, $sys, %prn, $_, $out);
24 local $esc = quotemeta($_[0]);
25 $out = &backquote_command("/usr/bin/lpstat -p$esc", 1);
26 if ($out =~ /^printer\s+(\S+)\s*(.*)\s+(enabled|disabled)\s+since\s+(.+?)\n?(.*)?$/) {
29 $prn{'enabled'} = $3 eq "enabled";
38 $prn{'iface'} = "$irix_iface_path/$prn{'name'}";
41 local $wdrv = &is_windows_driver($prn{'iface'});
42 local $hdrv = &is_hpnp_driver($prn{'iface'});
43 $prn{'desc'} = $wdrv ? &grep_interface($wdrv->{'program'}) :
44 $hdrv ? &grep_interface($hdrv->{'program'}) :
45 &grep_interface($prn{'iface'});
48 if (!$prn{'enabled'} && $body =~ /^\s+(.*)/) {
49 $prn{'enabled_why'} = $1 eq "reason unknown" ? "" : $1;
53 # request availability
54 $avl = &backquote_command("/usr/bin/lpstat -a$esc 2>&1", 1);
55 if ($avl =~ /^\S+\s+not accepting.*\n\s+(.*)/) {
56 $prn{'accepting'} = 0;
57 $prn{'accepting_why'} = $1;
58 if ($prn{'accepting_why'} eq "reason unknown") {
59 $prn{'accepting_why'} = "";
62 else { $prn{'accepting'} = 1; }
66 $con = &backquote_command("/usr/bin/lpstat -v$esc 2>&1", 1);
67 if ($con =~ /^device for \S+:\s+(\S+)\n\s+(remote to:)\s+(\S+)\s+(on)\s+(\S+)/) {
71 elsif ($con =~ /^device for \S+:\s+(\S+)/) { $prn{'dev'} = $1; }
73 # Check if this is the default printer
74 if (&backquote_command("$lpstat -d 2>&1", 1) =~ /destination:\s+(\S+)/ &&
85 local $esc = quotemeta($_[0]);
86 open(STAT, "/usr/bin/lpstat -o$esc |");
88 if (/^(\S+-\d+)\s+(\S+)\s+(\d+)\s+(\S+ \d+ \d+:\d+)\s+(.*)/) {
89 local(%job, $d, $f, @pf);
95 $job{'printing'} = ($5 =~ /^on /);
96 # if ($job{'user'} =~ /(\S+)\!/ &&
97 # -d ($d="/var/spool/lp/tmp/$1")) {
99 # foreach $f (readdir(DIR)) {
100 # push(@pf, "$d/$f") if ($f =~ /^$id-[1-9]/);
103 # $job{'printfile'} = @pf ? \@pf : undef;
113 # grep_interface($iface)
114 # try to find a description in the interface/model
117 local($iface, $desc, $out);
120 local $drv = &is_driver($iface);
121 if ($drv->{'mode'} == 1) {
122 $desc = $drv->{'desc'};
124 elsif ($drv->{'mode'} == 2) {
125 $out = &backquote_command("head $drv->{'prog'} | grep -e interface -e Printer -e /model/", 1);
126 if ($out =~ /interface for\s+(.*)/) { $desc = $1; }
127 elsif ($out =~ /\s+(\S.*)interface/) { $desc = $1; }
128 elsif ($out =~ /Printer Command Language level\s+(\S+)/) { $desc = "PCL$1"; }
129 elsif ($out =~ /\/model\/(\S+).*/) { $desc = $1; }
130 elsif ($out =~ /^#\s+(.*)/) { $desc = $1; }
131 else { $desc = "None"; }
139 # printer_support(option)
142 return $_[0] !~ /^(allow|alias|ctype|banner|desc|editdest|msize|direct|rnoqueue|ipp)$/;
146 # Returns an associative array of print classes
150 $stat = &backquote_command("/usr/bin/lpstat -c 2>&1", 1);
151 while($stat =~ /^members of class (\S+):\n((\s+\S+\n)+)([\000-\377]*)$/) {
153 $rv{$1} = [ grep { $_ ne "" } split(/\s+/, $2) ];
158 # create_printer(&details)
159 # Create a new printer
162 local(%prn, $cmd, $out, $model, $dummy, $scheduler);
164 #local $wdrv = &is_windows_driver($prn{'iface'});
165 #local $hdrv = &is_hpnp_driver($prn{'iface'});
166 #$scheduler = &sched_running();
167 #$dummy = "webmin.tmp"; `touch $config{'model_path'}/$dummy`;
169 # create lpadmin command
170 local $esc = quotemeta($prn{'name'});
171 $cmd = "/usr/lib/lpadmin -p$esc";
173 ## remote unix printer
176 &error("lpadmin failed : <pre>No model allowed for remote unix printer.</pre>");
178 ©_netface_driver($_[0]);
179 $cmd .= " -i$irix_iface_path/$esc.tmp";
180 $cmd .= " -v/dev/null";
183 ## remote windows printer
185 # $cmd .= " -m$dummy";
186 # $cmd .= " -v/dev/null";
189 ## remote HPNP printer
191 # $cmd .= " -m$dummy";
192 # $cmd .= " -v/dev/null";
195 ## local printer with webmin driver
196 #elsif ($prn{'iface'} eq "$drivers_directory/$prn{'name'}") {
197 # $cmd .= " -m$dummy";
198 # $cmd .= " -v".quotemeta($prn{'dev'});
201 ## local printer with IRIX model
202 elsif ($prn{'iface'} =~ $config{'model_path'}) {
203 $model = substr($prn{'iface'}, length($config{'model_path'}) + 1);
205 $cmd .= " -v".quotemeta($prn{'dev'});
208 &error("lpadmin failed : <pre>Action not supported.</pre>");
212 #$out = &backquote_logged("/usr/lib/lpshut 2>&1");
215 $out = &backquote_logged("$cmd 2>&1");
216 if ($?) { &error("lpadmin failed : <pre>$out</pre>"); }
219 &unlink_file("$irix_iface_path/$prn{'name'}.tmp");
222 ## Link to windows webmin driver
223 #&lock_file("$irix_iface_path/$prn{'name'}");
225 # `rm $irix_iface_path/$prn{'name'}`;
226 # `ln -s $drivers_directory/$prn{'name'}.smb $irix_iface_path/$prn{'name'}`;
229 ## Link to webmin hpnp driver
231 # `rm $irix_iface_path/$prn{'name'}`;
232 # `ln -s $drivers_directory/$prn{'name'}.hpnp $irix_iface_path/$prn{'name'}`;
235 ## Link to webmin driver
236 #if ($prn{'iface'} eq "$drivers_directory/$prn{'name'}" && !$wdrv) {
237 # `rm $irix_iface_path/$prn{'name'}`;
238 # `ln -s $drivers_directory/$prn{'name'} $irix_iface_path/$prn{'name'}`;
240 #&unlock_file("$irix_iface_path/$prn{'name'}");
241 #&lock_file("$config{'model_path'}/$dummy");
242 #`rm $config{'model_path'}/$dummy`;
243 #&unlock_file("$config{'model_path'}/$dummy");
247 # $out = &backquote_logged("/usr/lib/lpsched 2>&1");
248 # if ($?) { &error("lpsched failed : <pre>$out</pre>"); }
251 #change printer parameters
252 &modify_printer($_[0]);
255 # copy_netface_driver(&prn)
256 # Copies netface driver to interfaces directory and changes
257 # remote host address, name and type of remote printer.
258 sub copy_netface_driver {
261 my ($cmd, $rname, $rtype, $nettype, $driver_file ) = ();
263 if ( $prn{'rtype'} eq "s5" ) {
265 $cmd = "/usr/bsd/rsh -l lp $prn{'rhost'} "
266 . "\'grep \"^NAME\" $irix_iface_path/$prn{'rqueue'}\'";
267 $rname = &backquote_logged("$cmd");
268 if ($?) { &error("Failed to read remote printer's name : <pre>$rname</pre>"); }
269 $cmd = "/usr/bsd/rsh -l lp $prn{'rhost'} "
270 . "\'grep \"^TYPE\" $irix_iface_path/$prn{'rqueue'}\'";
271 $rtype = &backquote_logged("$cmd");
272 if ($?) { &error("Failed to read remote printer's type : <pre>$rtype</pre>"); }
275 $rname = "BSD Printer";
276 $rtype = "PostScript";
279 open (NETFACE,"<$config{'model_path'}/netface") or &error("Failed to open netface driver.");
280 $driver_file = <NETFACE>;
283 $driver_file =~ s/^TYPE=unknown/$rtype/m;
284 $driver_file =~ s/^NAME=/$rname/m;
285 $driver_file =~ s/^NETTYPE=/NETTYPE=$nettype/m;
286 $driver_file =~ s/^HOSTNAME=/HOSTNAME=$prn{'rhost'}/m;
287 $driver_file =~ s/^HOSTPRINTER=/HOSTPRINTER=$prn{'rqueue'}/m;
289 &open_tempfile(INTERFACE,">$irix_iface_path/$prn{'name'}.tmp", 1) ||
290 &error("Failed to open interface for $prn{'name'}.");
291 &print_tempfile(INTERFACE, $driver_file);
292 &close_tempfile(INTERFACE);
298 # modify_printer(&details)
299 # Change an existing printer
302 local(%prn, $cmd, $out);
306 local $esc = quotemeta($prn{'name'});
307 if ($prn{'default'}) {
308 $out = &backquote_logged("/usr/lib/lpadmin -d$esc 2>&1");
309 if ($?) { &error("Failed to set default : <pre>$out</pre>"); }
313 if ($prn{'enabled'}) { $cmd = "/usr/bin/enable $esc"; }
314 elsif ($prn{'enabled_why'}) {
315 local $wesc = quotemeta($prn{'enabled_why'});
316 $cmd = "/usr/bin/enable $esc ; /usr/bin/disable -r$wesc $esc";
318 else { $cmd = "/usr/bin/enable $esc ; /usr/bin/disable $esc"; }
319 $out = &backquote_logged("$cmd 2>&1");
321 # accepting or rejecting requests
322 if ($prn{'accepting'}) { $cmd = "/usr/lib/accept $esc"; }
323 elsif ($prn{'accepting_why'}) {
324 local $wesc = quotemeta($prn{'accepting_why'});
325 $cmd = "/usr/lib/accept $esc ; /usr/lib/reject -r$wesc $esc";
327 else { $cmd = "/usr/lib/accept $esc ; /usr/lib/reject $esc"; }
328 $out = &backquote_logged("$cmd 2>&1");
331 # delete_printer(name)
332 # Deletes some existing printer
335 local($out, $scheduler);
336 #$scheduler = &sched_running();
337 local $esc = quotemeta($_[0]);
340 $out = &backquote_logged("/usr/bin/cancel -a $esc 2>&1");
341 if ($?) { &error("cancel failed : <pre>$out</pre>"); }
344 $out = &backquote_logged("/usr/lib/lpadmin -x$esc 2>&1");
345 if ($?) { &error("lpadmin failed : <pre>$out</pre>"); }
348 # cancel_job(printer, id)
349 # Cancels some print job
353 local $iesc = quotemeta($_[1]);
354 $out = &backquote_logged("/usr/bin/cancel $iesc 2>&1");
355 if ($?) { &error("cancel failed : <pre>$out</pre>"); }
360 # Returns 1 if running and 0 if not running
363 local $out = &backquote_command("lpstat -r 2>&1", 1);
364 if ($out =~ /not/) { return 0; }
372 my $cmd = "/usr/lib/lpshut > /dev/null 2>&1;"
373 . "/sbin/killall lpautoenable;"
374 . "rm -f /var/spool/lp/SCHEDLOCK /var/spool/lp/FIFO;"
375 . "/usr/lib/lpsched 2>&1";
376 local $out = &backquote_logged($cmd);
377 if ($?) { &error("failed to start lpsched : <tt>$out</tt>"); }
381 # Stop the running lpsched process
384 local $out = &backquote_logged("/usr/lib/lpshut 2>&1");
385 if ($?) { &error("lpshut failed : <tt>$out</tt>"); }
388 # print_command(printer, file)
389 # Returns the command to print some file on some printer
392 local $esc = quotemeta($_[0]);
393 local $fesc = quotemeta($_[1]);
394 return "lp -d$esc $fesc";
397 # check_print_system()
398 sub check_print_system
400 &has_command("lpstat") || return &text('irix_ecmd', "<tt>lpstat</tt>");
401 -d $irix_iface_path || return &text('irix_eiface',"<tt>$irix_iface_path</tt>");
405 @device_files = ("/dev/plp",
406 "/dev/ttyd1", "/dev/ttyd2",
408 @device_names = ("Parallel",
409 "Serial 1", "Serial 2",