# 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 = "$module_root_directory/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 driver sub 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 undef sub is_driver { if (!$_[0]) { return { 'mode' => 0, 'desc' => 'None' }; } open(DRV, $_[0]); local @lines = ; 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 = ; 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 " %s\n", $mode == 0 ? 'checked' : '', $text{'caldera_none'}; print "($text{'caldera_nonemsg'}) \n"; printf " %s", $mode == 2 ? 'checked' : '', $text{'caldera_prog'}; printf " \n", $mode == 2 ? $_[0]->{'iface'} : ''; # Normal driver options printf " %s\n", $mode == 1 ? 'checked' : '', $text{'caldera_coas'}; print "\n"; print "\n"; print "\n"; print "\n"; printf "\n", $_[1]->{'eof'} eq 'true' ? '' : 'checked'; print "\n"; print "\n"; printf "\n", $_[1]->{'double'} eq 'true' ? '' : 'checked'; print "\n"; printf "\n", $_[1]->{'gsopts'}; print "
$text{'caldera_printer'}
$text{'caldera_eof'} $text{'yes'}\n", $_[1]->{'eof'} eq 'true' ? 'checked' : ''; printf " $text{'no'}$text{'caldera_paper'}
$text{'caldera_double'} $text{'yes'}\n", $_[1]->{'double'} eq 'true' ? 'checked' : ''; printf " $text{'no'}$text{'caldera_gsopts'}
\n"; # Uniprint driver options printf " %s\n", $mode == 3 ? 'checked' : '', $text{'caldera_uniprint'}; print "\n"; print "\n"; print "\n"; print "\n"; printf "\n", $_[1]->{'eof'} eq 'true' ? '' : 'checked'; print "\n"; print "\n"; printf "\n", $_[1]->{'double'} eq 'true' ? '' : 'checked'; print "
$text{'caldera_printer'}
$text{'caldera_eof'} $text{'yes'}\n", $_[1]->{'eof'} eq 'true' ? 'checked' : ''; printf " $text{'no'}$text{'caldera_paper'}
$text{'caldera_double'} $text{'yes'}\n", $_[1]->{'double'} eq 'true' ? 'checked' : ''; printf " $text{'no'}
\n"; return < 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 0) { res.options[sel].selected = true; } } setres($select_res); EOF } # parse_driver() # Parse driver selection from %in and return a driver structure sub parse_driver { if ($in{'mode'} == 0) { return { 'mode' => 0 }; } elsif ($in{'mode'} == 2) { $in{'program'} =~ /^(\S+)/ && -x $1 || &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;