# 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 = "/usr/libexec/printers/genericfilter"; open(BASE, "<".$base_driver); $base_driver_text = join(); close(BASE); $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, &printer) # Returns the driver name and dpi if some path is a webmin driver, or undef sub is_driver { if (!$_[0]) { return { 'mode' => 0, 'desc' => "$text{'caldera_none'}" }; } open(DRV, "<".$_[0]); local @lines = ; close(DRV); local %conf; if ($lines[1] =~ /^source ($driver_dir\/\S+)/) { # Looks like a 2.3 caldera driver! Read the sysconfig file &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 ($prn, $p); foreach $p (values %$plist) { $prn = $p 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'}, 'ddesc' => $prn->{'description'}, 'desc' => $conf{'GSNAME'} ? $conf{'GSNAME'} : $prn->{'description'} }; } } elsif (join(@lines) eq $base_driver_text) { # Looks like a 2.4 caldera driver! &read_env_file("$driver_dir/$_[1]->{'name'}", \%conf); if ($conf{'GSDEVICE'} eq 'NET' || $conf{'GSDEVICE'} eq 'RAW') { # Driver isn't even used return { 'mode' => 0, 'desc' => 'None' }; } else { # A new caldera printer driver open(COAS, "<".$config{'coas_printers'}); local $plist = &parse_coas(COAS); close(COAS); local ($prn, $p, $type); foreach $p (values %$plist) { $type = ref($p->{'type'}) ? $p->{'type'}->{'0'} : $p->{'type'}; $prn = $p if ($type eq $conf{'GSDEVICE'} && !$prn && ($p->{'description'} eq $conf{'DESC'} || $p->{'description'} eq $conf{'GSNAME'})); } if (!$prn) { foreach $p (values %$plist) { $type = ref($p->{'type'}) ? $p->{'type'}->{'0'} : $p->{'type'}; $prn = $p if ($type eq $conf{'GSDEVICE'} && !$prn); } } 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'}, 'upp' => $conf{'UPP'}, 'ddesc' => $prn->{'description'}, 'desc' => $conf{'GSNAME'} ? $conf{'GSNAME'} : $prn->{'description'} }; } } 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 { &lock_file("$driver_dir/$_[0]->{'name'}"); if ($_[1]->{'mode'} == 0) { unlink("$driver_dir/$_[0]->{'name'}"); &unlock_file("$driver_dir/$_[0]->{'name'}"); return undef; } elsif ($_[1]->{'mode'} == 2) { unlink("$driver_dir/$_[0]->{'name'}"); &unlock_file("$driver_dir/$_[0]->{'name'}"); 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); &unlock_file("$driver_dir/$_[0]->{'name'}"); &lock_file("$config{'spool_dir'}/$_[0]->{'name'}"); mkdir("$config{'spool_dir'}/$_[0]->{'name'}", 0755); &unlock_file("$config{'spool_dir'}/$_[0]->{'name'}"); local $drv = "$config{'spool_dir'}/$_[0]->{'name'}/printfilter"; &lock_file($drv); if ($gconfig{'os_version'} >= 2.4) { # Create the 2.4 driver program ©_source_dest($base_driver, $drv); } else { # Create the 2.3 driver program open(DRIVER, "<".$base_driver); local @lines = ; close(DRIVER); &open_tempfile(DRV, ">$drv"); &print_tempfile(DRV, "#!/bin/bash\n"); &print_tempfile(DRV, "source $driver_dir/$_[0]->{'name'}\n"); &print_tempfile(DRV, @lines); &close_tempfile(DRV); } &unlock_file($drv); return $drv; } } # delete_driver(name) sub delete_driver { &delete_webmin_driver($_[0]); &lock_file("$driver_dir/$_[0]"); unlink("$driver_dir/$_[0]"); &unlock_file("$driver_dir/$_[0]"); } # driver_input(&printer, &driver) sub driver_input { local $mode = $_[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"; local $sels = $gconfig{'os_version'} < 2.4 ? 5 : 10; print "\n"; print "\n"; print "\n"; printf "\n", $_[1]->{'eof'} eq 'true' ? '' : 'checked'; print "\n"; print "\n"; printf "\n", $_[1]->{'double'} eq 'true' ? '' : 'checked'; if ($found) { $_[1]->{'gsopts'} =~ s/\s*$found->{'gsoptions'}\s*//; } 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"; if ($gconfig{'os_version'} < 2.4) { # 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, $prn); foreach $p (values %$plist) { $prn = $p if ($p->{'description'} eq $in{'gsdevice'}); } local $gsdevice = ref($prn->{'type'}) ? $prn->{'type'}->{'0'} : $prn->{'type'}, $gsdevice eq 'PostScript' || $in{'res'} || &error($text{'caldera_eres'}); if ($prn->{'gsoptions'}) { $in{'gsopts'} .= " ".$prn->{'gsoptions'}; } return { 'mode' => 1, 'gsdevice' => $gsdevice, 'upp' => $prn->{'uniprint'}, 'gsname' => $in{'gsdevice'}, 'res' => $in{'res'}, 'paper' => $in{'paper'}, 'eof' => $in{'eof'}, 'double' => $in{'double'}, 'gsopts' => $in{'gsopts'} }; } else { # Uniprint ghostscript driver under 2.3 $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;