summaryrefslogtreecommitdiffstats
path: root/perl-install
diff options
context:
space:
mode:
Diffstat (limited to 'perl-install')
-rw-r--r--perl-install/printer.pm44
-rw-r--r--perl-install/printerdrake.pm296
2 files changed, 226 insertions, 114 deletions
diff --git a/perl-install/printer.pm b/perl-install/printer.pm
index 208fd55b6..a592dbcb8 100644
--- a/perl-install/printer.pm
+++ b/perl-install/printer.pm
@@ -430,6 +430,50 @@ sub read_cups_options ($) {
}
#------------------------------------------------------------------------------
+
+sub read_cups_printer_list {
+ # This function reads in a list of all printers which the local CUPS
+ # daemon currently knows, including remote ones.
+ local *F;
+ open F, ($::testing ? "$prefix" : "chroot $prefix/ ") .
+ "lpstat -v |" || return ();
+ my @printerlist = ();
+ my $line;
+ while ($line = <F>) {
+ if ($line =~ m/^\s*device\s+for\s+([^:\s]+):\s*(\S+)\s*$/) {
+ my $queuename = $1;
+ my $comment = "";
+ if ($2 =~ m!^ipp://([^/:]+)[:/]!) {
+ $comment = _("(on %s)", $1);
+ } else {
+ $comment = _("(on this machine)");
+ }
+ push (@printerlist, "$queuename $comment");
+ }
+ }
+ close F;
+ return @printerlist;
+}
+
+sub get_cups_default_printer {
+ local *F;
+ open F, ($::testing ? "$prefix" : "chroot $prefix/ ") .
+ "lpstat -d |" || return undef;
+ my $line;
+ while ($line = <F>) {
+ if ($line =~ /^\s*system\s*default\s*destination:\s*(\S*)$/) {
+ return $1;
+ }
+ }
+ return undef;
+}
+
+sub set_cups_default_printer {
+ my $default = $_[0];
+ run_program::rooted($prefix, "lpoptions",
+ "-d", $default) || return;
+}
+
sub read_cupsd_conf {
my @cupsd_conf;
local *F;
diff --git a/perl-install/printerdrake.pm b/perl-install/printerdrake.pm
index 4c3485f4c..13a705f31 100644
--- a/perl-install/printerdrake.pm
+++ b/perl-install/printerdrake.pm
@@ -25,8 +25,8 @@ sub choose_printer_type {
($printer->{SPOOLER} eq "cups" ?
_("
Printers on remote CUPS servers you do not have to configure
-here; these printers will be automatically detected. In case
-of doubt, select \"Printer on remote CUPS server\".") : ()),
+here; these printers will be automatically detected. Please
+select \"Printer on remote CUPS server\" in this case.") : ()),
[ printer::printer_type($printer) ],
$printer->{str_type},
) or return 0;
@@ -40,87 +40,112 @@ sub setup_remote_cups_server {
my $queue = $printer->{OLD_QUEUE};
#- hack to handle cups remote server printing,
#- first read /etc/cups/cupsd.conf for variable BrowsePoll address:port
- my @cupsd_conf = printer::read_cupsd_conf();
- my ($server, $port);
-
- foreach (@cupsd_conf) {
- /^\s*BrowsePoll\s+(\S+)/ and $server = $1, last;
- }
- $server =~ /([^:]*):(.*)/ and ($server, $port) = ($1, $2);
-
- #- then ask user for this combination
- #- and rewrite /etc/cups/cupsd.conf according to new settings.
- #- there are no other point where such information is written in this file.
- if ($in->ask_from_entries_refH
- (_("Remote CUPS server"),
-_("With a remote CUPS server, you do not have to configure
-any printer here; printers will be automatically detected
-unless you have a server on a different network; in the
-latter case, you have to give the CUPS server IP address
-and optionally the port number."),
- [
- { label => _("CUPS server IP"), val => \$server },
- { label => _("Port"), val => \$port } ],
- complete => sub {
- unless (!$server || network::is_ip($server)) {
- $in->ask_warn('', _("IP address should be in format 1.2.3.4"));
- return (1,0);
- }
- if ($port !~ /^\d*$/) {
- $in->ask_warn('', _("Port number should be numeric"));
- return (1,1);
- }
- return 0;
- },
- )) {
- $server && $port and $server = "$server:$port";
- if ($server) {
- @cupsd_conf = map { $server and s/^\s*BrowsePoll\s+(\S+)/BrowsePoll $server/ and $server = '';
- $_ } @cupsd_conf;
- $server and push @cupsd_conf, "\nBrowsePoll $server\n";
+ my ($server, $port, $default);
+ # Return value: 0 when nothing was changed ("Apply" never pressed), 1
+ # when "Apply" was at least pressed once.
+ my $retvalue = 0;
+ while (1) {
+ # Read CUPS config file
+ my @cupsd_conf = printer::read_cupsd_conf();
+ foreach (@cupsd_conf) {
+ /^\s*BrowsePoll\s+(\S+)/ and $server = $1, last;
+ }
+ $server =~ /([^:]*):(.*)/ and ($server, $port) = ($1, $2);
+ # Read printer list
+ my @queuelist = printer::read_cups_printer_list();
+ if ($#queuelist >=0) {
+ $default = printer::get_cups_default_printer();
+ my $queue;
+ for $queue (@queuelist) {
+ if ($queue =~ /^\s*$default/) {
+ $default = $queue;
+ }
+ }
} else {
- @cupsd_conf = map { s/^\s*BrowsePoll\s+(\S+)/\#BrowsePoll $1/;
- $_ } @cupsd_conf;
+ push(@queuelist, "None");
+ $default = "None";
}
- printer::write_cupsd_conf(@cupsd_conf);
- } else {
- return 0;
- }
- 1;
-}
+ #- Remember the server/port settings to check whether the user changed
+ #- them.
+ my $oldserver = $server;
+ my $oldport = $port;
-sub choose_printer_name {
- my ($printer, $in) = @_;
- # Name, description, location
- my $queue = $printer->{OLD_QUEUE};
- $in->set_help('configurePrinterLocal') if $::isInstall;
- $in->ask_from_entries_refH_powered
- (
- { title => _("Enter Printer Name and Comments"),
- #cancel => !$printer->{configured}{$queue} ? '' : _("Remove queue"),
- callbacks => { complete => sub {
- unless ($printer->{currentqueue}{'queue'} =~ /^\w+$/) {
- $in->ask_warn('', _("Name of printer should contain only letters, numbers and the underscore"));
- return (1,0);
- }
- return 0;
- },
- },
- messages =>
-_("Every printer needs a name (for example lp).
-The Description and Location fields do not need
-to be filled in. They are comments for the users.") },
- [
- { label => _("Name of printer"),
- val => \$printer->{currentqueue}{'queue'} },
- { label => _("Description"),
- val => \$printer->{currentqueue}{'desc'} },
- { label => _("Location"),
- val => \$printer->{currentqueue}{'loc'} },
- ]) or return 0;
+ #- then ask user for this combination and rewrite /etc/cups/cupsd.conf
+ #- according to new settings. There are no other point where such
+ #- information is written in this file.
- $printer->{QUEUE} = $printer->{currentqueue}{'queue'};
- 1;
+ print "##### @queuelist $default\n";
+ if ($in->ask_from_entries_refH_powered
+ ({ title => _("Remote CUPS server"),
+ messages => _("With a remote CUPS server, you do not have to configure any
+printer here; CUPS servers inform your machine automatically
+about their printers. All printers known to your machine
+currently are listed in the \"Default printer\" field. Choose
+the default printer for your machine there and click the
+\"Apply/Re-read printers\" button. Click the same button to
+refresh the list (it can take up to 30 seconds after the start
+of CUPS until all remote printers are visible).
+When your CUPS server is in a different network, you have to
+give the CUPS server IP address and optionally the port number
+to get the printer information from the server, otherwise leave
+these fields blank."),
+ cancel => _("Close"),
+ ok => _("Apply/Re-read printers"),
+ callbacks => { complete => sub {
+ unless (!$server || network::is_ip($server)) {
+ $in->ask_warn('', _("IP address should be in format 1.2.3.4"));
+ return (1,0);
+ }
+ if ($port !~ /^\d*$/) {
+ $in->ask_warn('',
+ _("Port number should be an integer number"));
+ return (1,1);
+ }
+ return 0;
+ } }
+ },
+ [
+ { label => _("Default printer"), val => \$default,
+ not_edit => 0, list => \@queuelist},
+ #{ label => _("Default printer") },
+ #{ val => \$default,
+ # format => \&translate, not_edit => 0, list => \@queuelist},
+ { label => _("CUPS server IP"), val => \$server },
+ { label => _("Port"), val => \$port }
+ ]
+ )) {
+ # We have clicked "Apply/Re-read"
+ $retvalue = 1;
+ # Set default printer
+ if ($default =~ /^\s*([^\s\(\)]+)\s*\(/) {
+ $default = $1;
+ }
+ if ($default ne "None") {
+ printer::set_cups_default_printer($default);
+ }
+ # Set BrowsePoll line
+ if (($server ne $oldserver) || ($port ne $oldport)) {
+ $server && $port and $server = "$server:$port";
+ if ($server) {
+ @cupsd_conf =
+ map { $server and
+ s/^\s*BrowsePoll\s+(\S+)/BrowsePoll $server/ and
+ $server = '';
+ $_ } @cupsd_conf;
+ $server and push @cupsd_conf, "\nBrowsePoll $server\n";
+ } else {
+ @cupsd_conf =
+ map { s/^\s*BrowsePoll\s+(\S+)/\#BrowsePoll $1/;
+ $_ } @cupsd_conf;
+ }
+ printer::write_cupsd_conf(@cupsd_conf);
+ sleep 3;
+ }
+ } else {
+ last;
+ }
+ }
+ return $retvalue;
}
sub setup_printer_connection {
@@ -234,7 +259,7 @@ sub setup_lpd {
}
return if !$in->ask_from_entries_refH(_("Remote lpd Printer Options"),
-_("To use a remote lpd print, you need to supply
+_("To use a remote lpd printer, you need to supply
the hostname of the printer server and the printer name
on that server."), [
{ label => _("Remote host name"), val => \$remotehost },
@@ -441,7 +466,10 @@ sub setup_socket {
return if !$in->ask_from_entries_refH(_("Socket Printer Options"),
_("To print to a socket printer, you need to provide the
-host name of the printer and optionally the port number."), [
+host name of the printer and optionally the port number.
+On HP JetDirect servers the port number is usually 9100,
+on other servers it can vary. See the manual of your
+hardware."), [
{ label => _("Printer host name"), val => \$remotehost },
{ label => _("Port"), val => \$remoteport } ],
complete => sub {
@@ -537,6 +565,47 @@ complete => sub {
1;
}
+sub choose_printer_name {
+ my ($printer, $in) = @_;
+ # Name, description, location
+ $in->set_help('configurePrinterLocal') if $::isInstall;
+ my $default = $printer->{currentqueue}{'queue'};
+ $in->ask_from_entries_refH_powered
+ (
+ { title => _("Enter Printer Name and Comments"),
+ #cancel => !$printer->{configured}{$queue} ? '' : _("Remove queue"),
+ callbacks => { complete => sub {
+ unless ($printer->{currentqueue}{'queue'} =~ /^\w+$/) {
+ $in->ask_warn('', _("Name of printer should contain only letters, numbers and the underscore"));
+ return (1,0);
+ }
+ if (($printer->{configured}{$printer->{currentqueue}{'queue'}})
+ && ($printer->{currentqueue}{'queue'} ne $default) &&
+ (!$in->ask_yesorno('', _("The printer \"%s\" already exists,\ndo you really want to overwrite its configuration?",
+ $printer->{currentqueue}{'queue'}),
+ 0))) {
+ return (1,0); # Let the user correct the name
+ }
+ return 0;
+ },
+ },
+ messages =>
+_("Every printer needs a name (for example lp).
+The Description and Location fields do not need
+to be filled in. They are comments for the users.") },
+ [
+ { label => _("Name of printer"),
+ val => \$printer->{currentqueue}{'queue'} },
+ { label => _("Description"),
+ val => \$printer->{currentqueue}{'desc'} },
+ { label => _("Location"),
+ val => \$printer->{currentqueue}{'loc'} },
+ ]) or return 0;
+
+ $printer->{QUEUE} = $printer->{currentqueue}{'queue'};
+ 1;
+}
+
sub get_db_entry {
my ($printer) = @_;
#- Read the printer driver database if necessary
@@ -781,7 +850,12 @@ sub setup_options {
}
return 0 if !$in->ask_from_entries_refH
($windowtitle,
- _("Printer options"), \@widgets,
+ _("Printer default settings
+You should make sure that the page size and the
+ink type (if available) are set correctly. Note
+that with a very high printout quality printing
+can get substantially slower."),
+ \@widgets,
complete => sub {
my $i;
for ($i = 0; $i <= $#{$printer->{ARGS}}; $i++) {
@@ -920,22 +994,6 @@ It may take some time before the printer starts.\n");
return 0;
}
-sub setup_gsdriver {
- my ($printer, $in, $upNetwork) = @_;
- my $queue = $printer->{OLD_QUEUE};
- while (1) {
- get_db_entry($printer);
- choose_model($printer, $in) || return;
- get_printer_info($printer);
- setup_options($printer, $in) || return;
- $printer->{complete} = 1;
- printer::configure_queue($printer);
- $printer->{complete} = 0;
- print_testpages($printer, $in, $upNetwork) && last;
- }
- $printer->{complete} = 1;
-}
-
sub setup_default_spooler {
my ($printer, $in) = @_;
$printer->{SPOOLER} ||= 'cups';
@@ -962,7 +1020,8 @@ sub install_spooler {
my ($printer, $in) = @_;
if (!$::testing) {
if ($printer->{SPOOLER} eq "cups") {
- $in->do_pkgs->install(('cups', 'xpp', 'qtcups', 'kups',
+ $in->do_pkgs->install(('cups', 'xpp', 'qtcups',
+ if_($in->do_pkgs->is_installed('kdebase'), 'kups'),
($::expert ? 'cups-drivers' : ())));
# Start daemon
printer::start_service("cups");
@@ -1008,7 +1067,8 @@ sub main {
}
# Control variables for the main loop
- my ($queue, $continue, $newqueue, $editqueue) = ('', 1, 0, 0);
+ my ($queue, $continue, $newqueue, $editqueue, $expertswitch) =
+ ('', 1, 0, 0, 0);
# Cursor position in queue modification window
my $modify = _("Printer options");
while ($continue) {
@@ -1050,10 +1110,14 @@ sub main {
# Cancelling the printer type dialog should leed to this
# dialog
$continue = 1;
- $in->ask_from_entries_refH_powered(
+ # $expertwitch gets one when the "Expert mode"/
+ # "Standard mode" button is clicked.
+ $expertswitch = !$in->ask_from_entries_refH_powered(
{messages =>
_("The following printers are configured.\nYou can add some more or modify the existing ones."),
- cancel => '',
+ cancel => ($::isInstall ?
+ ('') : ($::expert ?
+ 'Normal Mode' : 'Expert Mode')),
},
# List the queues
[ { val => \$queue, format => \&translate,
@@ -1087,12 +1151,20 @@ sub main {
next;
}
}
+ # Toggle expert mode and standard mode
+ if ($expertswitch) {
+ $expertswitch = 0;
+ $::expert = !$::expert;
+ # Read printer database for the new user mode
+ %printer::thedb = ();
+ printer::read_printer_db($printer->{SPOOLER});
+ next;
+ }
# Save the default spooler
printer::set_default_spooler($printer);
#- Close printerdrake
$queue eq _("Done") and last;
}
-
if ($newqueue) {
#- Set default values for a new queue
$printer::printer_type_inv{$printer->{TYPE}} or
@@ -1111,23 +1183,19 @@ sub main {
$printer->{OLD_QUEUE} = $printer->{QUEUE} = $queue;
#- Do all the configuration steps for a new queue
choose_printer_type($printer, $in) or next;
- #- Cancelling one of the following dialogs should restart
- #- printerdrake
- $continue = 1;
if ($printer->{TYPE} eq 'CUPS') {
- if (setup_remote_cups_server($printer, $in)) {
- $continue = $::expert || !$::isInstall;
- } else {
- $continue = 1;
- }
+ setup_remote_cups_server($printer, $in);
next;
}
+ #- Cancelling one of the following dialogs should restart
+ #- printerdrake
+ $continue = 1;
setup_printer_connection($printer, $in) or next;
choose_printer_name($printer, $in) or next;
get_db_entry($printer);
- choose_model($printer, $in) || return;
+ choose_model($printer, $in) or next;
get_printer_info($printer);
- setup_options($printer, $in) || return;
+ setup_options($printer, $in) or next;
$printer->{complete} = 1;
printer::configure_queue($printer);
$printer->{complete} = 0;
@@ -1140,7 +1208,7 @@ sub main {
} else {
# Modify a queue, ask which part should be modified
if ($in->ask_from_entries_refH_powered
- ({ title => _("Modify printer"),
+ ({ title => _("Modify printer configuration"),
messages => _("Printer %s: %s %s
What do you want to modify on this printer?",
$queue,