2 # Functions for AIX-style printer management
10 open(CONF, $config{'printcap_file'});
16 # Start of a new printer
17 $prn = { 'name' => $1,
22 elsif (/^\s+(\S+)\s*=\s*(.*)/ && $prn) {
23 # Variable within a printer
24 $prn->{'eline'} = $lnum;
25 $prn->{'values'}->{lc($1)} = $2;
34 # Returns an array of known printer names
37 local @qc = &get_qconfig();
40 if ($q->{'values'}->{'device'}) {
42 push(@rv, $q->{'name'});
48 # get_printer(name, [nostatus])
49 # Returns a reference to an associative array of printer details
52 if (!%enabled_cache) {
53 %enabled_cache = &get_enabled();
56 # Find the printer in qconfig
57 local @qc = &get_qconfig();
59 local ($real) = grep { $_->{'name'} eq $_[0] } @qc;
60 return undef if (!$real);
61 local ($device) = grep { $_->{'name'} eq $real->{'values'}->{'device'} &&
62 $_->{'line'} > $real->{'line'} } @qc;
64 # Construct info object
66 $prn{'accepting'} = uc($real->{'values'}->{'up'}) ne 'FALSE';
67 $prn{'enabled'} = $enabled_cache{$_[0]};
68 $prn{'desc'} = $real->{'values'}->{'device'}; # XXX
69 if ($real->{'values'}->{'rq'}) {
71 $prn{'rhost'} = $real->{'values'}->{'host'};
72 $prn{'rqueue'} = $real->{'values'}->{'rq'};
73 if ($real->{'values'}->{'s_statfilter'} =~ /bsdshort/) {
76 elsif ($real->{'values'}->{'s_statfilter'} =~ /attshort/) {
79 elsif ($real->{'values'}->{'s_statfilter'} =~ /aixv2short/) {
80 $prn{'type'} = 'aix2';
83 # Assume AIX by default
87 elsif ($device->{'values'}->{'backend'} =~ /piojetd\s+(\S+)\s+(\d+)/) {
94 $prn{'dev'} = "/dev/$_[0]"; # XXX
96 $prn{'banner'} = 1 if (lc($device->{'values'}->{'header'}) eq 'always');
98 $device->{'values'}->{'backend'} !~ /(rembak|piojetd|piob)/) {
99 $prn{'iface'} = $device->{'values'}->{'backend'};
103 # XXX user access control
104 # XXX default printer?
105 # XXX remote system type
112 local $esc = quotemeta($_[0]);
114 open(LPQ, "lpq -P$esc |");
120 elsif ($doneheader &&
121 /^\s+(\S+)\s+(\d+)\s+(\S+)\s+(\S+)/) {
122 local $job = { 'id' => $2,
125 'printing' => lc($1) eq "active" };
133 # printer_support(option)
136 return $_[0] !~ /^(why|allow|default|msize|ctype|alias|sysv|ipp|rnoqueue)$/;
139 # create_printer(&details)
140 # Create a new printer
143 local $lref = &read_file_lines($config{'printcap_file'});
144 push(@$lref, &qconfig_real_lines($_[0]));
145 push(@$lref, &qconfig_device_lines($_[0]));
147 &enable_disable($_[0]);
150 # modify_printer(&details)
151 # Change an existing printer
155 local @qc = &get_qconfig();
156 local ($real) = grep { $_->{'name'} eq $_[0]->{'name'} } @qc;
157 $real || &error("Failed to find old printer!");
158 local ($device) = grep { $_->{'name'} eq $real->{'values'}->{'device'} &&
159 $_->{'line'} > $real->{'line'} } @qc;
161 # Update lines in file
162 local $lref = &read_file_lines($config{'printcap_file'});
164 splice(@$lref, $device->{'line'},
165 $device->{'eline'} - $device->{'line'} + 1,
166 &qconfig_device_lines($_[0], $device));
169 splice(@$lref, $real->{'eline'} + 1, 0,
170 &qconfig_device_lines($_[0]));
172 splice(@$lref, $real->{'line'}, $real->{'eline'} - $real->{'line'} + 1,
173 &qconfig_real_lines($_[0], $real));
175 &enable_disable($_[0]);
178 # enable_disable(&printer)
179 # Enable or disable some printer
182 local %ena = &get_enabled();
183 if ($_[0]->{'enabled'} && !$ena{$_[0]->{'name'}}) {
184 &system_logged("enable ".quotemeta($_[0]->{'name'}));
186 elsif (!$_[0]->{'enabled'} && $ena{$_[0]->{'name'}}) {
187 &system_logged("disable ".quotemeta($_[0]->{'name'}));
192 # Returns a hash from printer names to their enabled statuses
196 open(ENA, "lpstat -s -W |");
199 next if (/^Queue|\-\-\-\-/);
200 if (/^\s*(\S+)\s+(\S+)\s+(\S+)/) {
201 $ena{$1} = $3 eq 'READY';
208 # delete_printer(name)
209 # Deletes some existing printer
213 local @qc = &get_qconfig();
214 local ($real) = grep { $_->{'name'} eq $_[0] } @qc;
215 local ($device) = grep { $_->{'name'} eq $real->{'values'}->{'device'} &&
216 $_->{'line'} > $real->{'line'} } @qc;
218 # Take lines out of file
219 local $lref = &read_file_lines($config{'printcap_file'});
221 splice(@$lref, $device->{'line'},
222 $device->{'eline'} - $device->{'line'} + 1);
224 splice(@$lref, $real->{'line'},
225 $real->{'eline'} - $real->{'line'} + 1);
229 # qconfig_real_lines(&printer, [&old-real])
230 sub qconfig_real_lines
232 local $real = $_[1] || { 'name' => $_[0]->{'name'},
234 $_[0]->{'desc'} ||= "$_[0]->{'name'}_device";
235 $real->{'values'}->{'device'} = $_[0]->{'desc'};
236 if ($_[0]->{'accepting'}) {
237 delete($real->{'values'}->{'up'});
240 $real->{'values'}->{'up'} = 'FALSE';
242 if ($_[0]->{'rhost'}) {
243 $real->{'values'}->{'host'} = $_[0]->{'rhost'};
244 $real->{'values'}->{'rq'} = $_[0]->{'rqueue'};
245 if ($_[0]->{'type'} eq 'bsd') {
246 $real->{'values'}->{'s_statfilter'} = "/usr/lpd/bsdshort";
247 $real->{'values'}->{'l_statfilter'} = "/usr/lpd/bsdlong";
249 elsif ($_[0]->{'type'} eq 's5') {
250 $real->{'values'}->{'s_statfilter'} = "/usr/lpd/attshort";
251 $real->{'values'}->{'l_statfilter'} = "/usr/lpd/attlong";
253 elsif ($_[0]->{'type'} eq 'aix2') {
254 $real->{'values'}->{'s_statfilter'} = "/usr/lpd/aixv2short";
255 $real->{'values'}->{'l_statfilter'} = "/usr/lpd/aixv2long";
258 $real->{'values'}->{'s_statfilter'} = "/usr/lpd/aixshort";
259 $real->{'values'}->{'l_statfilter'} = "/usr/lpd/aixlong";
263 delete($real->{'values'}->{'host'});
264 delete($real->{'values'}->{'rq'});
265 delete($real->{'values'}->{'s_statfilter'});
266 delete($real->{'values'}->{'l_statfilter'});
268 return &qconfig_lines($real);
271 # qconfig_device_lines(&printer, [&old-device])
272 sub qconfig_device_lines
274 local $device = $_[1] || { 'name' => $_[0]->{'desc'},
276 if ($_[0]->{'rhost'}) {
277 $device->{'values'}->{'backend'} = "/usr/lib/lpd/rembak";
279 elsif ($_[0]->{'dhost'}) {
280 $device->{'values'}->{'backend'} = "/usr/lib/lpd/pio/etc/piojetd $_[0]->{'dhost'} $_[0]->{'dport'}";
281 if (!$device->{'values'}->{'file'}) {
282 local $dfile = "/var/spool/lpd/pio/\@local/dev/hp\@$_[0]->{'dhost'}#hpJetDirect#$_[0]->{'dport'}";
283 $device->{'values'}->{'file'} = $dfile;
284 &open_tempfile(DFILE, ">$dfile");
285 &print_tempfile(DFILE, "desc\t=\thpJetDirect\n");
286 &close_tempfile(DFILE);
289 elsif ($_[0]->{'iface'}) {
290 $device->{'values'}->{'backend'} = $_[0]->{'iface'};
293 $device->{'values'}->{'backend'} = "/usr/lib/lpd/piobe";
295 if ($_[0]->{'banner'}) {
296 $device->{'values'}->{'header'} = "always";
299 $device->{'values'}->{'header'} = "never";
301 return &qconfig_lines($device);
306 local @rv = ( "$_[0]->{'name'}:" );
308 foreach $k (keys %{$_[0]->{'values'}}) {
309 push(@rv, "\t$k = $_[0]->{'values'}->{$k}");
314 # cancel_job(printer, id)
315 # Cancels some print job
318 local $esc = quotemeta($_[0]);
319 local $iesc = quotemeta($_[1]);
320 local $out = &backquote_logged("lprm -P $esc $iesc 2>&1");
321 if ($?) { &error("cancel failed : <pre>$out</pre>"); }
326 # Returns the pid if lpsched is running, 0 if not, -1 if cannot be stopped
329 local @qpid = &find_byname("qdaemon");
330 local @lpid = &find_byname("lpd");
331 if (@qpid && @lpid) { return $qpid[0]; }
340 foreach $s ("qdaemon", "lpd") {
341 if (!&find_byname($s)) {
342 local $out = &backquote_logged("/usr/bin/startsrc -s$s 2>&1");
343 if ($?) { &error("failed to start $s : <tt>$out</tt>"); }
349 # Stop the running lpsched process
353 foreach $s ("qdaemon", "lpd") {
354 if (&find_byname($s)) {
355 local $out = &backquote_logged("/usr/bin/stopsrc -s$s 2>&1");
356 if ($?) { &error("failed to start $s : <tt>$out</tt>"); }
361 # print_command(printer, file)
362 # Returns the command to print some file on some printer
365 local $esc = quotemeta($_[0]);
366 local $fesc = quotemeta($_[1]);
367 return "lpr -P $esc $fesc";
370 # check_print_system()
371 sub check_print_system
373 &has_command("qdaemon") || return &text('aix_ecmd', "<tt>qdaemon</tt>");
377 # validate_printer(&printer)
378 # Performs extra OS-specific printer validation, and returns an error message
379 # if there is a problem
382 return $text{'aix_edesc'} if ($_[0]->{'desc'} !~ /^[a-z0-9\-\.\_\@]*$/i);
386 sub remote_printer_types
388 return ( [ 'aix', 'AIX' ], [ 'bsd', 'BSD' ],
389 [ 's5', 'ATT SysV' ], [ 'aix2', 'AIX v2' ] );
392 @device_files = ("/dev/lp0", "/dev/lp1", "/dev/null" );
393 @device_names = (&text('aix_port', "0"), &text('aix_port', "1"),
394 $text{'solaris_null'});