📄 caldera-driver.pl
字号:
# caldera-driver.pl# Functions for printer drivers as generated by COAS%paper_sizes = ( 'a4', 'A4', 'a3', 'A3', 'a5', 'A5', 'letter', 'US Letter', 'legal', 'Legal', 'ledger', 'Ledger' );$driver_dir = "/etc/sysconfig/printers";$base_driver = "base_coas_driver";$webmin_windows_driver = 1;# is_windows_driver(path)# Returns the server, share, username, password, workgroup, program# if path is a webmin windows driversub is_windows_driver{return &is_webmin_windows_driver(@_);}# is_driver(path)# Returns the driver name and dpi if some path is a webmin driver, or undefsub is_driver{if (!$_[0]) { return { 'mode' => 0, 'desc' => 'None' }; }open(DRV, $_[0]);local @lines = <DRV>;close(DRV);if ($lines[1] =~ /^source ($driver_dir\/\S+)/) { # Looks like a caldera driver! Read the sysconfig file local %conf; &read_env_file($1, \%conf); if ($conf{'GSDEVICE'} eq 'NET' || $conf{'GSDEVICE'} eq 'RAW') { # Driver isn't even used return { 'mode' => 0, 'desc' => 'None' }; } elsif ($conf{'GSDEVICE'} eq 'uniprint') { # Uniprint driver foreach $u (&list_uniprint()) { $desc = $u->[1] if ($u->[0] eq $conf{'UPP'}); } $desc =~ s/,.*$//g; return { 'mode' => 3, 'upp' => $conf{'UPP'}, 'paper' => $conf{'PAPERSIZE'}, 'double' => lc($conf{'DOUBLEPAGE'}), 'eof' => lc($conf{'SENDEOF'}), 'desc' => $desc ? $desc : $conf{'UPP'} }; } else { # A caldera printer driver open(COAS, $config{'coas_printers'}); local $plist = &parse_coas(COAS); close(COAS); local ($desc, $p); foreach $p (values %$plist) { $desc = $p->{'description'} if ($p->{'type'}->{'0'} eq $conf{'GSDEVICE'} && !$desc); } return { 'mode' => 1, 'gsdevice' => $conf{'GSDEVICE'}, 'gsname' => $conf{'GSNAME'}, 'res' => $conf{'RESOLUTION'}, 'paper' => $conf{'PAPERSIZE'}, 'eof' => lc($conf{'SENDEOF'}), 'double' => lc($conf{'DOUBLEPAGE'}), 'gsopts' => $conf{'GSOPTS'}, 'desc' => $conf{'GSNAME'} ? $conf{'GSNAME'} : $desc }; } }else { # A driver of some kind, but not caldera's return { 'mode' => 2, 'file' => $_[0], 'desc' => $_[0] }; }}# create_windows_driver(&printer, &driver)sub create_windows_driver{return &create_webmin_windows_driver(@_);}# create_driver(&printer, &driver)sub create_driver{if ($_[1]->{'mode'} == 0) { return undef; }elsif ($_[1]->{'mode'} == 2) { return $_[1]->{'file'}; }else { # Create or update the parameters file local %conf; &read_env_file("$driver_dir/$_[0]->{'name'}", \%conf); $conf{'GSDEVICE'} = $_[1]->{'gsdevice'}; $conf{'GSNAME'} = $_[1]->{'gsname'}; $conf{'NAME'} = $_[0]->{'name'}; $conf{'RESOLUTION'} = $_[1]->{'res'}; $conf{'PAPERSIZE'} = $_[1]->{'paper'}; $conf{'DESC'} = $_[0]->{'desc'}; $conf{'SENDEOF'} = $_[1]->{'eof'}; $conf{'DOUBLEPAGE'} = $_[1]->{'double'}; $conf{'GSOPTS'} = $_[1]->{'gsopts'}; $conf{'UPP'} = $_[1]->{'upp'}; &write_env_file("$driver_dir/$_[0]->{'name'}", \%conf); # Create the standard driver program open(DRIVER, $base_driver); local @lines = <DRIVER>; close(DRIVER); $lines[1] = "source $driver_dir/$_[0]->{'name'}\n"; mkdir("$config{'spool_dir'}/$_[0]->{'name'}", 0755); local $drv = "$config{'spool_dir'}/$_[0]->{'name'}/printfilter"; open(DRV, ">$drv"); print DRV @lines; close(DRV); return $drv; }}# delete_driver(name)sub delete_driver{&delete_webmin_driver($_[0]);unlink("$driver_dir/$_[0]");}# driver_input(&printer, &driver)sub driver_input{local $mode = $_[0]->{'rhost'} ? 0 : $_[1]->{'mode'};printf "<tr> <td><input type=radio name=mode value=0 %s> %s</td>\n", $mode == 0 ? 'checked' : '', $text{'caldera_none'};print "<td>($text{'caldera_nonemsg'})</td> </tr>\n";printf "<tr> <td><input type=radio name=mode value=2 %s> %s</td>", $mode == 2 ? 'checked' : '', $text{'caldera_prog'};printf "<td><input name=program size=40 value='%s'></td> </tr>\n", $mode == 2 ? $_[0]->{'iface'} : '';# Normal driver optionsprintf "<tr> <td valign=top><input type=radio name=mode value=1 %s> %s</td>\n", $mode == 1 ? 'checked' : '', $text{'caldera_coas'};print "<td><table width=100%>\n";print "<tr> <td valign=top><b>$text{'caldera_printer'}</b></td>\n";print "<td colspan=3><select size=5 name=gsdevice onChange='setres(0)'>\n";open(COAS, $config{'coas_printers'});local $plist = &parse_coas(COAS);close(COAS);local ($i, $j, $p, $k, $found, $select_res);foreach $p (values %$plist) { if ($p->{'description'} eq $_[1]->{'gsname'} && $p->{'type'}->{'0'} ne $_[1]->{'gsdevice'}) { # COAS has changed the device $_[1]->{'gsname'} = undef; } }foreach $k (sort { $a <=> $b } keys %$plist) { $p = $plist->{$k}; next if ($p->{'type'}->{'0'} =~ /NET|RAW/); local @thisres = values %{$p->{'resolution'}}; local $got = ($_[1]->{'gsname'} eq $p->{'description'} && $_[1]->{'gsdevice'} eq $p->{'type'}->{'0'}) || (!$_[1]->{'gsname'} && !$found && $_[1]->{'gsdevice'} eq $p->{'type'}->{'0'}); printf "<option %s value='%s'>%s\n", $got ? 'selected' : '', $p->{'description'}.";".join(";", @thisres), $p->{'description'}; $found++ if ($got); $select_res = &indexof($_[1]->{'res'}, @thisres) if ($got); map { $gotres{$_}++ } @thisres; }print "</select><select name=res size=5>\n";foreach $r (sort { $a <=> $b} keys %gotres) { printf "<option %s>%s\n", $_[1]->{'res'} eq $r ? 'selected' : '', $r; }print "</select></td> </tr>\n";print "<tr> <td><b>$text{'caldera_eof'}</b></td>\n";printf "<td><input type=radio name=eof value=true %s> $text{'yes'}\n", $_[1]->{'eof'} eq 'true' ? 'checked' : '';printf "<input type=radio name=eof value=false %s> $text{'no'}</td>\n", $_[1]->{'eof'} eq 'true' ? '' : 'checked';print "<td><b>$text{'caldera_paper'}</b></td> <td><select name=paper>\n";foreach $p (sort { $a cmp $b } keys %paper_sizes) { printf "<option value='%s' %s>%s\n", $p, $_[1]->{'paper'} eq $p ? 'selected' : '', $paper_sizes{$p}; }print "</select></td> </tr>\n";print "<tr> <td><b>$text{'caldera_double'}</b></td>\n";printf "<td><input type=radio name=double value=true %s> $text{'yes'}\n", $_[1]->{'double'} eq 'true' ? 'checked' : '';printf "<input type=radio name=double value=false %s> $text{'no'}</td>\n", $_[1]->{'double'} eq 'true' ? '' : 'checked';print "<td><b>$text{'caldera_gsopts'}</b></td>\n";printf "<td><input name=gsopts size=30 value='%s'></td> </tr>\n", $_[1]->{'gsopts'};print "</table></td></tr>\n";# Uniprint driver optionsprintf "<tr> <td valign=top><input type=radio name=mode value=3 %s> %s</td>\n", $mode == 3 ? 'checked' : '', $text{'caldera_uniprint'};print "<td><table width=100%>\n";print "<tr> <td valign=top><b>$text{'caldera_printer'}</b></td>\n";print "<td colspan=3><select name=uniprint size=5>\n";foreach $u (&list_uniprint()) { printf "<option value=%s %s>%s\n", $u->[0], $u->[0] eq $_[1]->{'upp'} ? 'selected' : '', $u->[1]; }closedir(DIR);print "</select></td> </tr>\n";print "<tr> <td><b>$text{'caldera_eof'}</b></td>\n";printf "<td><input type=radio name=ueof value=true %s> $text{'yes'}\n", $_[1]->{'eof'} eq 'true' ? 'checked' : '';printf "<input type=radio name=ueof value=false %s> $text{'no'}</td>\n", $_[1]->{'eof'} eq 'true' ? '' : 'checked';print "<td><b>$text{'caldera_paper'}</b></td> <td><select name=upaper>\n";foreach $p (sort { $a cmp $b } keys %paper_sizes) { printf "<option value='%s' %s>%s\n", $p, $_[1]->{'paper'} eq $p ? 'selected' : '', $paper_sizes{$p}; }print "</select></td> </tr>\n";print "<tr> <td><b>$text{'caldera_double'}</b></td>\n";printf "<td><input type=radio name=udouble value=true %s> $text{'yes'}\n", $_[1]->{'double'} eq 'true' ? 'checked' : '';printf "<input type=radio name=udouble value=false %s> $text{'no'}</td>\n", $_[1]->{'double'} eq 'true' ? '' : 'checked';print "</table></td></tr>\n";return <<EOF;<script>function setres(sel){var idx = document.forms[0].gsdevice.selectedIndex;var v = new String(document.forms[0].gsdevice.options[idx].value);var vv = v.split(";");var res = document.forms[0].res;res.length = 0;for(var i=1; i<vv.length; i++) { res.options[i-1] = new Option(vv[i], vv[i]); }if (res.length > 0) { res.options[sel].selected = true; }}setres($select_res);</script>EOF}# parse_driver()# Parse driver selection from %in and return a driver structuresub parse_driver{if ($in{'mode'} == 0) { return { 'mode' => 0 }; }elsif ($in{'mode'} == 2) { -x $in{'program'} || &error(&text('caldera_eprog', $in{'program'})); return { 'mode' => 2, 'file' => $in{'program'} }; }elsif ($in{'mode'} == 1) { # Normal ghostscript driver open(COAS, $config{'coas_printers'}); local $plist = &parse_coas(COAS); close(COAS); $in{'gsdevice'} || &error($text{'caldera_edriver'}); $in{'gsdevice'} =~ s/;(.*)$//; local ($p, $gsdevice); foreach $p (values %$plist) { $gsdevice = $p->{'type'}->{'0'} if ($p->{'description'} eq $in{'gsdevice'}); } $gsdevice eq 'PostScript' || $in{'res'} || &error($text{'caldera_eres'}); return { 'mode' => 1, 'gsdevice' => $gsdevice, 'gsname' => $in{'gsdevice'}, 'res' => $in{'res'}, 'paper' => $in{'paper'}, 'eof' => $in{'eof'}, 'double' => $in{'double'}, 'gsopts' => $in{'gsopts'} }; }else { # Uniprint ghostscript driver $in{'uniprint'} || &error($text{'caldera_edriver'}); return { 'mode' => 3, 'gsdevice' => 'uniprint', 'upp' => $in{'uniprint'}, 'paper' => $in{'upaper'}, 'eof' => $in{'ueof'}, 'double' => $in{'udouble'} }; }}# parse_coas(handle)sub parse_coas{local $h = $_[0];local (%rv, $_);while(<$h>) { s/#.*$//g; s/\r|\n//g; if (/^\s*(\S+)\s+{/) { # start of a section local $k = $1; $rv{$k} = &parse_coas($h); } elsif (/^\s*}/) { # end of a section last; } elsif (/^\s*(\S+)\s+(.*)/) { # a value in a section $rv{$1} = $2; } }return \%rv;}1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -