diff options
author | Francois Pons <fpons@mandriva.com> | 1999-11-26 18:53:55 +0000 |
---|---|---|
committer | Francois Pons <fpons@mandriva.com> | 1999-11-26 18:53:55 +0000 |
commit | 481c1e409ed37daad82aaf3e9e6344379b87fd27 (patch) | |
tree | 1e3f321087dd32186139fe36bff2533dd5d1ff59 /perl-install/printerdrake.pm | |
parent | 6dbd6e6db0495ddd9774f20f0fb3c239b15e13a2 (diff) | |
download | drakx-481c1e409ed37daad82aaf3e9e6344379b87fd27.tar drakx-481c1e409ed37daad82aaf3e9e6344379b87fd27.tar.gz drakx-481c1e409ed37daad82aaf3e9e6344379b87fd27.tar.bz2 drakx-481c1e409ed37daad82aaf3e9e6344379b87fd27.tar.xz drakx-481c1e409ed37daad82aaf3e9e6344379b87fd27.zip |
*** empty log message ***
Diffstat (limited to 'perl-install/printerdrake.pm')
-rw-r--r-- | perl-install/printerdrake.pm | 260 |
1 files changed, 260 insertions, 0 deletions
diff --git a/perl-install/printerdrake.pm b/perl-install/printerdrake.pm new file mode 100644 index 000000000..28bcd3b1e --- /dev/null +++ b/perl-install/printerdrake.pm @@ -0,0 +1,260 @@ +package printerdrake; + +use diagnostics; +use strict; + +use common qw(:common :file :functional :system); +use detect_devices; +use run_program; +use commands; +use modules; +use log; +use printer; + +1; + +sub getinfo($) { + my ($prefix) = @_; + my $entry = {}; + + printer::set_prefix($prefix); + printer::read_configured_queue($entry); + + add2hash($entry, { + want => 0, + complete => 0, + str_type => $printer::printer_type_default, + QUEUE => "lp", + SPOOLDIR => "/var/spool/lpd/lp", + DBENTRY => "PostScript", + PAPERSIZE => "legal", + CRLF => 0, + AUTOSENDEOF => 1, + + DEVICE => "/dev/lp0", + + REMOTEHOST => "", + REMOTEQUEUE => "", + + NCPHOST => "", #-"printerservername", + NCPQUEUE => "", #-"queuename", + NCPUSER => "", #-"user", + NCPPASSWD => "", #-"pass", + + SMBHOST => "", #-"hostname", + SMBHOSTIP => "", #-"1.2.3.4", + SMBSHARE => "", #-"printername", + SMBUSER => "", #-"user", + SMBPASSWD => "", #-"passowrd", + SMBWORKGROUP => "", #-"AS3", + }); + $entry; +} + +sub copy_printer_params($$) { + my ($from, $to) = @_; + + foreach (keys %$from) { + $to->{$_} = $from->{$_} if $_ ne 'configured'; #- avoid cycles. + } +} + +#- Program entry point. +sub main($$$$) { + my ($prefix, $printer, $in, $install) = @_; + + unless ($::testing) { + printer::set_prefix($prefix); + &$install('rhs-printfilters'); + } + printer::read_printer_db(); + + $printer->{complete} = 0; + if ($::expert || scalar keys %{$printer->{configured}}) { + $in->ask_from_entries_ref(_("Local Printer Options"), + _("Every print queue (which print jobs are directed to) needs a +name (often lp) and a spool directory associated with it. What +name and directory should be used for this queue?"), + [_("Name of queue:"), _("Spool directory:")], + [\$printer->{QUEUE}, \$printer->{SPOOLDIR}], + changed => sub + { + $printer->{SPOOLDIR} = "$printer::spooldir/$printer->{QUEUE}" unless $_[0]; + }, + ); + } + copy_printer_params($printer->{configured}{$printer->{QUEUE}}, $printer); #- get default parameters from existing queue. + + $printer->{str_type} = + $in->ask_from_list_(_("Select Printer Connection"), + _("How is the printer connected?"), + [ keys %printer::printer_type ], + $printer::printer_type_inv{$printer->{TYPE}}, + ); + $printer->{TYPE} = $printer::printer_type{$printer->{str_type}}; + + if ($printer->{TYPE} eq "LOCAL") { + { + my $w = $in->wait_message(_("Test ports"), _("Detecting devices...")); + eval { modules::load("parport_pc"); modules::load("parport_probe"); modules::load("lp"); }; + } + + my @port = (); + my @parport = detect_devices::whatPrinter(); + eval { modules::unload("parport_probe") }; + my $str; + if ($parport[0]) { + my $port = $parport[0]{port}; + $printer->{DEVICE} = $port; + my $descr = common::bestMatchSentence2($parport[0]{val}{DESCRIPTION}, @printer::entry_db_description); + $printer->{DBENTRY} = $printer::descr_to_db{$descr}; + $str = _("A printer, model \"%s\", has been detected on ", $parport[0]{val}{DESCRIPTION}) . $port; + @port = map { $_->{port}} @parport; + } else { + @port = detect_devices::whatPrinterPort(); + } + $printer->{DEVICE} = $port[0] if $port[0]; + + return if !$in->ask_from_entries_ref(_("Local Printer Device"), + _("What device is your printer connected to \n(note that /dev/lp0 is equivalent to LPT1:)?\n") . $str , + [_("Printer Device:")], + [{val => \$printer->{DEVICE}, list => \@port }], + ); + } elsif ($printer->{TYPE} eq "REMOTE") { + return if !$in->ask_from_entries_ref(_("Remote lpd Printer Options"), + _("To use a remote lpd print queue, you need to supply +the hostname of the printer server and the queue name +on that server which jobs should be placed in."), + [_("Remote hostname:"), _("Remote queue")], + [\$printer->{REMOTEHOST}, \$printer->{REMOTEQUEUE}], + ); + } elsif ($printer->{TYPE} eq "SMB") { + return if !$in->ask_from_entries_ref( + _("SMB (Windows 9x/NT) Printer Options"), + _("To print to a SMB printer, you need to provide the +SMB host name (Note! It may be different from its +TCP/IP hostname!) and possibly the IP address of the print server, as +well as the share name for the printer you wish to access and any +applicable user name, password, and workgroup information."), + [_("SMB server host:"), _("SMB server IP:"), + _("Share name:"), _("User name:"), _("Password:"), + _("Workgroup:")], + [\$printer->{SMBHOST}, \$printer->{SMBHOSTIP}, + \$printer->{SMBSHARE}, \$printer->{SMBUSER}, + {val => \$printer->{SMBPASSWD}, hidden => 1}, \$printer->{SMBWORKGROUP} + ], + complete => sub { + unless (network::is_ip($printer->{SMBHOSTIP})) { + $in->ask_warn('', _("IP address should be in format 1.2.3.4")); + return (1,1); + } + return 0; + }, + ); + &$install('samba'); + } elsif ($printer->{TYPE} eq "NCP") { + return if !$in->ask_from_entries_ref(_("NetWare Printer Options"), + _("To print to a NetWare printer, you need to provide the +NetWare print server name (Note! it may be different from its +TCP/IP hostname!) as well as the print queue name for the printer you +wish to access and any applicable user name and password."), + [_("Printer Server:"), _("Print Queue Name:"), + _("User name:"), _("Password:")], + [\$printer->{NCPHOST}, \$printer->{NCPQUEUE}, + \$printer->{NCPUSER}, {val => \$printer->{NCPPASSWD}, hidden => 1}], + ); + &$install('ncpfs'); + } + + my $action; + my @action = qw(ascii ps both done); + my %action = ( + ascii => _("Yes, print ASCII test page"), + ps => _("Yes, print PostScript test page"), + both => _("Yes, print both test pages"), + done => _("No"), + ); + + do { + $printer->{DBENTRY} ||= $printer::thedb_gsdriver{$printer->{GSDRIVER}}{ENTRY}; + $printer->{DBENTRY} = + $printer::descr_to_db{ + $in->ask_from_list_(_("Configure Printer"), + _("What type of printer do you have?"), + [@printer::entry_db_description], + $printer::db_to_descr{$printer->{DBENTRY}}, + ) + }; + + my %db_entry = %{$printer::thedb{$printer->{DBENTRY}}}; + + my @list_res = @{$db_entry{RESOLUTION} || []}; + my @res = map { "$_->{XDPI}x$_->{YDPI}" } @list_res; + my @list_col = @{$db_entry{BITSPERPIXEL} || []}; + my @col = map { "$_->{DEPTH} $_->{DESCR}" } @list_col; + my %col_to_depth = map { ("$_->{DEPTH} $_->{DESCR}", $_->{DEPTH}) } @list_col; + my %depth_to_col = reverse %col_to_depth; + my $is_uniprint = $db_entry{GSDRIVER} eq "uniprint"; + + $printer->{RESOLUTION} = "Default" unless @list_res; + $printer->{CRLF} = $db_entry{DESCR} =~ /HP/; + $printer->{BITSPERPIXEL} = "Default" unless @list_col; + + $printer->{BITSPERPIXEL} = $depth_to_col{$printer->{BITSPERPIXEL}} || $printer->{BITSPERPIXEL}; #- translate. + + $in->ask_from_entries_refH('', _("Printer options"), [ +_("Paper Size") => { val => \$printer->{PAPERSIZE}, type => 'list', , not_edit => !$::expert, list => \@printer::papersize_type }, +_("Eject page after job?") => { val => \$printer->{AUTOSENDEOF}, type => 'bool' }, +@list_res > 1 ? ( +_("Resolution") => { val => \$printer->{RESOLUTION}, type => 'list', , not_edit => !$::expert, list => \@res } ) : (), +_("Fix stair-stepping text?") => { val => \$printer->{CRLF}, type => "bool" }, +@list_col > 1 ? ( +$is_uniprint ? ( +_("Uniprint driver options") => { val => \$printer->{BITSPERPIXEL}, type => 'list', , not_edit => !$::expert, list => \@col } ) : ( +_("Color depth options") => { val => \$printer->{BITSPERPIXEL}, type => 'list', , not_edit => !$::expert, list => \@col } ), ) : () +]);; + + $printer->{BITSPERPIXEL} = $col_to_depth{$printer->{BITSPERPIXEL}} || $printer->{BITSPERPIXEL}; #- translate. + + $printer->{complete} = 1; + copy_printer_params($printer, $printer->{configured}{$printer->{QUEUE}} ||= {}); + printer::configure_queue($printer); + $printer->{complete} = 0; + + $action = ${{reverse %action}}{$in->ask_from_list('', _("Do you want to test printing?"), + [ map { $action{$_} } @action ], $action{'done'})}; + + my $pidlpd; + my @testpages; + push @testpages, "/usr/lib/rhs/rhs-printfilters/testpage.asc" + if $action eq "ascii" || $action eq "both"; + push @testpages, "/usr/lib/rhs/rhs-printfilters/testpage". ($printer->{PAPERSIZE} eq 'a4' && '-a4') .".ps" + if $action eq "ps" || $action eq "both"; + + if (@testpages) { + my $w = $in->wait_message('', _(@testpages > 1 ? "Printing tests pages..." : "Printing test page...")); + + #- restart lpd with blank spool queue. + foreach (("/var/spool/lpd/$printer->{QUEUE}/lock", "/var/spool/lpd/lpd.lock")) { + $pidlpd = (cat_("$prefix$_"))[0]; kill 'TERM', $pidlpd if $pidlpd; + unlink "$prefix$_"; + } + run_program::rooted($prefix, "lprm", "-P$printer->{QUEUE}", "-"); sleep 1; + run_program::rooted($prefix, "lpd"); sleep 1; + + run_program::rooted($prefix, "lpr", "-P$printer->{QUEUE}", $_) foreach @testpages; + + sleep 3; #- allow lpr to send pages. + local *F; open F, "chroot $prefix/ /usr/bin/lpq -P$printer->{QUEUE} |"; + my @lpq_output = grep { !/^no entries/ && !(/^Rank\s+Owner/ .. /^\s*$/) } <F>; + + undef $w; #- erase wait message window. + if (@lpq_output) { + $action = $in->ask_yesorno('', _("Is this correct? Printing status:\n%s", "@lpq_output"), 1) ? 'done' : 'change'; + } else { + $action = $in->ask_yesorno('', _("Is this correct?"), 1) ? 'done' : 'change'; + } + } + } while ($action ne 'done'); + $printer->{complete} = 1; +} |