summaryrefslogtreecommitdiffstats
path: root/perl-install/standalone/scannerdrake
diff options
context:
space:
mode:
authorMystery Man <unknown@mandriva.org>2004-11-06 08:30:59 +0000
committerMystery Man <unknown@mandriva.org>2004-11-06 08:30:59 +0000
commit42e38e074bf1200783849ea85e205e6614f988d7 (patch)
tree3c218a7ef3c66c8064eb2f6fa84ef44cef7b55a6 /perl-install/standalone/scannerdrake
parenta4a67fd68bcffc42eb98871618c8f07b55157d5e (diff)
downloaddrakx-topic/a.tar
drakx-topic/a.tar.gz
drakx-topic/a.tar.bz2
drakx-topic/a.tar.xz
drakx-topic/a.zip
This commit was manufactured by cvs2svn to create branch 'a'.topic/a
Diffstat (limited to 'perl-install/standalone/scannerdrake')
-rwxr-xr-xperl-install/standalone/scannerdrake950
1 files changed, 0 insertions, 950 deletions
diff --git a/perl-install/standalone/scannerdrake b/perl-install/standalone/scannerdrake
deleted file mode 100755
index 09508e280..000000000
--- a/perl-install/standalone/scannerdrake
+++ /dev/null
@@ -1,950 +0,0 @@
-#!/usr/bin/perl
-
-# scannerdrake $Id$
-# Yves Duret <yduret at mandrakesoft.com>
-# Till Kamppeter <till at mandrakesoft.com>
-# Copyright (C) 2001-2004 Mandrakesoft
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
-use lib qw(/usr/lib/libDrakX);
-use strict;
-use standalone; #- warning, standalone must be loaded very first, for 'explanations'
-use common;
-
-use interactive;
-use scanner;
-use handle_configs;
-use services;
-
-my $companyname = "Mandrakesoft";
-my $distroname = "Mandrakelinux";
-my $shortdistroname = "Mandrakelinux";
-my $domainname = "mandrakesoft.com";
-
-foreach (@ARGV) {
- /^--update-usbtable$/ and do { scanner::updateScannerDBfromUsbtable(); exit() };
- /^--update-sane=(.*)$/ and do { scanner::updateScannerDBfromSane($1); exit() };
- /^--manual$/ and $::Manual=1;
- /^--dynamic=(.*)$/ and do { dynamic(); exit() };
-}
-
-$ugtk2::wm_icon = "scannerdrake";
-my $in = 'interactive'->vnew('su');
-if (!files_exist(qw(/usr/bin/scanimage
- /etc/sane.d/dll.conf)) ||
- (!files_exist(qw(/usr/bin/xsane)) &&
- !files_exist(qw(/usr/bin/kooka)) &&
- !$in->do_pkgs->is_installed('scanner-gui'))) {
- if (!$in->ask_yesorno(N("Warning"), N("SANE packages need to be installed to use scanners.
-
-Do you want to install the SANE packages?"))) {
- $in->ask_warn("Scannerdrake",
- N("Aborting Scannerdrake."));
- exit 0;
- }
- if (!$in->do_pkgs->install('sane-backends', 'scanner-gui')) {
- $in->ask_warn(N("Error"),
- N("Could not install the packages needed to set up a scanner with Scannerdrake.") . " " .
- N("Scannerdrake will not be started now."));
- exit 0;
- }
-}
-if ($::Manual) { manual(); quit() }
-my $wait = $in->wait_message(N("Scannerdrake"),
- N("Searching for configured scanners..."));
-my @c = scanner::configured();
-$wait = undef;
-$wait = $in->wait_message(N("Scannerdrake"),
- N("Searching for new scanners..."));
-my @f = scanner::detect(@c);
-$wait = undef;
-my $changed = 0;
-@f and $changed = auto();
-if ($changed) {
- my $_wait =
- $in->wait_message(N("Scannerdrake"),
- N("Re-generating list of configured scanners..."));
- @c = scanner::configured();
-}
-mainwindow(@c);
-quit();
-
-sub removeverticalbar {
- my ($s) = @_;
- $s =~ s/\|/ /g;
- my $searchmake = handle_configs::searchstr(first($s =~ /^\s*(\S+)\s+/));
- $s =~ s/($searchmake)\s*$searchmake/$1/;
- return $s;
-}
-
-sub auto() {
- my $changed = 0;
- foreach (@f) {
- my $c = 0;
- if (member($_->{val}{DESCRIPTION}, keys %$scanner::scannerDB)) {
- my $name = $_->{val}{DESCRIPTION};
- $name =~ s/\s$//; # some HP entries have a trailing space, i will correct usbtable asap
- if ($scanner::scannerDB->{$name}{flags}{unsupported}) {
- $in->ask_warn('Scannerdrake', N("The %s is not supported by this version of %s.", removeverticalbar($name), $distroname));
- next;
- }
- if ($in->ask_yesorno('Scannerdrake', N("%s found on %s, configure it automatically?", removeverticalbar($name), $_->{port}),1)) {
- $c = (tryConfScanner($name, $_->{port},
- $_->{val}{vendor},
- $_->{val}{id}) ||
- manual($_->{port}, $_->{val}{vendor},
- $_->{val}{id}, $name));
- } else {
- $c = manual($_->{port}, $_->{val}{vendor},
- $_->{val}{id}, $name);
- }
- } else {
- $in->ask_yesorno('Scannerdrake',
- N("%s is not in the scanner database, configure it manually?",
- removeverticalbar($_->{val}{DESCRIPTION})),1)
- and $c =
- manual($_->{port}, $_->{val}{vendor}, $_->{val}{id},
- $_->{val}{DESCRIPTION});
- }
- $changed ||= $c;
- }
- return $changed;
-}
-
-sub manual {
- my ($port, $vendor, $product, $name) = @_;
- my $s =
- $in->ask_from_treelist('Scannerdrake',
- N("Select a scanner model") .
- if_($port || $name, N(" (")) .
- if_($name, N("Detected model: %s",
- removeverticalbar($name))) .
- if_($port && $name, N(", ")) .
- if_($port, N("Port: %s", $port)) .
- if_($port || $name, N(")")),
- '|', [' None', keys %$scanner::scannerDB],
- '') or return 0;
- return 0 if $s eq ' None';
- if ($scanner::scannerDB->{$s}{flags}{unsupported}) {
- $in->ask_warn('Scannerdrake', N("The %s is not supported by this version of %s.", removeverticalbar($s), $distroname));
- return 0;
- }
- return tryConfScanner($s, $port, $vendor, $product);
-}
-
-sub dynamic() {
- @f = scanner::detect();
- my $name;
- foreach (@f) {
- if (member($_->{val}{DESCRIPTION}, keys %$scanner::scannerDB)) {
- $name = $_->{val}{DESCRIPTION};
- $name =~ s/\s$//; #some HP entry have a trailing space, i will correct usbtable asap
- next if ($scanner::scannerDB->{$name}{flags}{unsupported});
- scanner::confScanner($name, $_->{port},
- $_->{val}{vendor}, $_->{val}{id}, "");
- }
- }
-}
-
-sub installfirmware {
- my ($model, $backend) = @_;
- my $firmware;
- my $choice = N("Do not install firmware file");
- while (1) {
- # Tell user about firmware installation
- $in->ask_from('Scannerdrake',
- N("It is possible that your %s needs its firmware to be uploaded everytime when it is turned on.", removeverticalbar($model)) . " " .
- N("If this is the case, you can make this be done automatically.") . " " .
- N("To do so, you need to supply the firmware file for your scanner so that it can be installed.") . " " .
- N("You find the file on the CD or floppy coming with the scanner, on the manufacturer's home page, or on your Windows partition."),
- [
- { label => N("Install firmware file from"),
- val => \$choice,
- list => [N("CD-ROM"),
- N("Floppy Disk"),
- N("Other place"),
- N("Do not install firmware file")],
- not_edit => 1, sort => 0 },
- ],
- ) or return "///";
- my $dir;
- if ($choice eq N("CD-ROM")) {
- $dir = "/mnt/cdrom";
- } elsif ($choice eq N("Floppy Disk")) {
- $dir = "/mnt/floppy";
- } elsif ($choice eq N("Other place")) {
- $dir = "/mnt";
- } else {
- return "";
- }
- # Let user select a firmware file from a floppy, hard disk, ...
- $firmware = $in->ask_file(N("Select firmware file"), "$dir");
- last if !$firmware || (-r $firmware);
- $in->ask_warn(N("Error"),
- N("The firmware file %s does not exist or is unreadable!",
- $firmware));
-
- }
- # Install the firmware file in /usr/share/sane/firmware
- $firmware = scanner::installfirmware($firmware, $backend);
- return $firmware;
-}
-
-sub updatefirmware {
- my (@configured) = @_;
- my $firmware;
- my @scanners =
- map {
- $_->{val}{DESCRIPTION}
- } grep {
- $_->{val}{FIRMWARELINE}
- } @configured;
- my ($scannerchoice, $mediachoice);
- while (1) {
- # Tell user about firmware installation
- $in->ask_from('Scannerdrake',
- ($#scanners > 0 ?
- N("It is possible that your scanners need their firmware to be uploaded everytime when they are turned on.") :
- N("It is possible that your %s needs its firmware to be uploaded everytime when it is turned on.", $scanners[0])) . " " .
- N("If this is the case, you can make this be done automatically.") . " " .
- ($#scanners > 0 ?
- N("To do so, you need to supply the firmware files for your scanners so that it can be installed.") :
- N("To do so, you need to supply the firmware file for your scanner so that it can be installed.")) . " " .
- N("You find the file on the CD or floppy coming with the scanner, on the manufacturer's home page, or on your Windows partition.") . "\n" .
- N("If you have already installed your scanner's firmware you can update the firmware here by supplying the new firmware file."),
- [
- { label => N("Install firmware for the"),
- val => \$scannerchoice,
- list => \@scanners,
- not_edit => 1, sort => 1 },
- { label => N("Install firmware file from"),
- val => \$mediachoice,
- list => [N("CD-ROM"),
- N("Floppy Disk"),
- N("Other place")],
- not_edit => 1, sort => 0 },
- ],
- ) or return 0;
- my $dir;
- if ($mediachoice eq N("CD-ROM")) {
- $dir = "/mnt/cdrom";
- } elsif ($mediachoice eq N("Floppy Disk")) {
- $dir = "/mnt/floppy";
- } elsif ($mediachoice eq N("Other place")) {
- $dir = "/mnt";
- } else {
- return 0;
- }
- # Let user select a firmware file from a floppy, hard disk, ...
- $firmware = $in->ask_file(N("Select firmware file for the %s",
- $scannerchoice), "$dir");
- last if !$firmware || (-r $firmware);
- $in->ask_warn(N("Error"),
- N("The firmware file %s does not exist or is unreadable!",
- $firmware));
-
- }
-
- return 0 if !$firmware;
-
- foreach (@configured) {
- next if $_->{val}{DESCRIPTION} ne $scannerchoice;
- # Install the firmware file in /usr/share/sane/firmware
- my $backend = $_->{val}{BACKEND};
- $firmware = scanner::installfirmware($firmware, $backend);
- if (!$firmware) {
- $in->ask_warn('Error',
- N("Could not install the firmware file for the %s!",
- $scannerchoice));
- return 0;
- }
- # Enter the path to the firmware in the appropriate config file
- my $firmwareline =$_->{val}{FIRMWARELINE};
- $firmwareline =~ s/\$FIRMWARE/$firmware/sg;
- scanner::setfirmware($backend, $firmwareline);
- last;
- }
-
- # Success message
- $in->ask_warn('Scannerdrake',
- N("The firmware file for your %s was successfully installed.",
- $scannerchoice));
-
- return 1;
-}
-
-sub tryConfScanner {
- # take care if interactive output is needed (unsupported, parallel..)
- my ($model, $port, $vendor, $product) = @_;
- if ($scanner::scannerDB->{$model}{flags}{unsupported}) {
- $in->ask_warn('Scannerdrake', N("The %s is unsupported",
- removeverticalbar($model)));
- return 0;
- }
- if ($scanner::scannerDB->{$model}{server} =~ /(printerdrake|hpoj)/i) {
- $in->ask_warn('Scannerdrake', N("The %s must be configured by printerdrake.\nYou can launch printerdrake from the %s Control Center in Hardware section.", removeverticalbar($model), $shortdistroname));
- return 0;
- }
- if ($scanner::scannerDB->{$model}{ask} =~ /DEVICE/ || !$port) {
- $port ||= N("Auto-detect available ports");
- $in->ask_from('Scannerdrake',
- N("Please select the device where your %s is attached", removeverticalbar($model)) . " " .
- N("(Note: Parallel ports cannot be auto-detected)"),
- [
- { label => N("choose device"),
- val => \$port,
- list => [N("Auto-detect available ports"),
- '/dev/scanner',
- '/dev/usb/scanner0',
- '/dev/usb/scanner1',
- '/dev/usb/scanner2',
- 'libusb:001:001',
- 'libusb:001:002',
- 'libusb:001:003',
- 'libusb:001:004',
- 'libusb:001:005',
- 'libusb:001:006',
- 'libusb:001:007',
- 'libusb:001:008',
- 'libusb:001:009',
- 'libusb:001:010',
- '/dev/sg0',
- '/dev/sg1',
- '/dev/sg2',
- '/dev/sg3',
- '/dev/sg4',
- '/dev/parport0',
- '/dev/parport1',
- '/dev/parport2',
- '/dev/pt_drv',
- '/dev/ttyS0',
- '/dev/ttyS1',
- '/dev/ttyS2'],
- not_edit => 0, sort => 0 },
- ],
- ) or return 0;
- if ($port eq N("Auto-detect available ports")) {
- $wait = $in->wait_message(N("Scannerdrake"),
- N("Searching for scanners..."));
- my @d = scanner::detect();
- undef $wait;
- my @list = map {
- $_->{port} . " (" .
- removeverticalbar($_->{val}{DESCRIPTION}) . ")";
- } @d;
- $port ||= $list[0];
- $in->ask_from('Scannerdrake',
- N("Please select the device where your %s is attached", removeverticalbar($model)),
- [
- { label => N("choose device"),
- val => \$port,
- list => \@list,
- not_edit => 1, sort => 0 },
- ],
- ) or return 0;
- $port =~ s/^\s*([^\(\s]*)\s*\(.*$/$1/;
- foreach (@d) {
- next if $_->{port} ne $port;
- $vendor = $_->{val}{vendor};
- $product = $_->{val}{id};
- last;
- }
- }
- }
- ($vendor, $product) = scanner::get_usb_ids_for_port($port);
- my $firmware;
- if (grep { /FIRMWARELINE/ } @{$scanner::scannerDB->{$model}{lines}} ) {
- $firmware = installfirmware($model,
- $scanner::scannerDB->{$model}{server});
- return 0 if $firmware eq "///";
- }
- scanner::confScanner($model, $port, $vendor, $product, $firmware);
- $in->ask_warn(N("Congratulations!"),
- N("Your %s has been configured.\nYou may now scan documents using \"XSane\" or \"Kooka\" from Multimedia/Graphics in the applications menu.", removeverticalbar($model)));
- return 1;
-}
-
-sub quit() {
- $in->exit(0);
-}
-
-sub mainwindow {
- my @configured = @_;
- # main loop
- my $maindone;
- while (!$maindone) {
- # Generate list of configured scanners
- my $msg = do {
- if (@configured) {
- my @scannerlist =
- map {
- my $entry = $_->{val}{DESCRIPTION};
- if_($entry, " - $entry\n");
- } @configured;
- if (@scannerlist) {
- my $main_msg =
- @scannerlist > 1 ?
- N_("The following scanners\n\n%s\nare available on your system.\n") :
- N_("The following scanner\n\n%s\nis available on your system.\n");
- sprintf($main_msg, join('', @scannerlist));
- } else {
- N("There are no scanners found which are available on your system.\n");
- }
- } else {
- N("There are no scanners found which are available on your system.\n");
- }
- };
- my $buttonclicked;
- #- Show dialog
- if ($in->ask_from_
- (
- {
- title => N("Scannerdrake"),
- messages => $msg,
- ok => "",
- cancel => "",
- },
- [
- { val => N("Search for new scanners"),
- type => 'button',
- clicked_may_quit => sub {
- $buttonclicked = "autoadd";
- 1;
- } },
- { val => N("Add a scanner manually"),
- type => 'button',
- clicked_may_quit => sub {
- $buttonclicked = "manualadd";
- 1;
- } },
- ( (grep { $_->{val}{FIRMWARELINE} } @configured) ?
- { val => N("Install/Update firmware files"),
- type => 'button',
- clicked_may_quit => sub {
- $buttonclicked = "firmware";
- 1;
- } } : () ),
- { val => N("Scanner sharing"),
- type => 'button',
- clicked_may_quit => sub {
- $buttonclicked = "sharing";
- 1;
- } },
- { val => N("Quit"),
- type => 'button',
- clicked_may_quit => sub {
- $buttonclicked = "quit";
- 1;
- } },
- ]
- )
- ) {
- my $changed = 0;
- if ($buttonclicked eq "autoadd") {
- # Do scanner auto-detection
- my $wait =
- $in->wait_message(N("Scannerdrake"),
- N("Searching for configured scanners..."));
- @configured = scanner::configured();
- $wait =
- $in->wait_message(N("Scannerdrake"),
- N("Searching for new scanners..."));
- my @f = scanner::detect(@configured);
- $wait = undef;
- if (@f) {
- $changed = auto();
- }
- } elsif ($buttonclicked eq "manualadd") {
- # Show dialogs to manually add a scanner
- $changed = manual();
- } elsif ($buttonclicked eq "sharing") {
- # Show dialog to set up scanner sharing
- $changed = sharewindow(@configured);
- } elsif ($buttonclicked eq "firmware") {
- # Show dialog to select the firmware file
- updatefirmware(@configured);
- } elsif ($buttonclicked eq "quit") {
- # We have clicked "Quit"
- $maindone = 1;
- }
- if ($changed) {
- my $_wait =
- $in->wait_message(N("Scannerdrake"),
- N("Re-generating list of configured scanners..."));
- @configured = scanner::configured();
- }
- } else {
- # Cancel clicked
- $maindone = 1;
- }
- }
-}
-
-sub makeexportmenues {
- my @exports = @_;
- my %menuexports = map {
- ($_ eq '+' ? N("All remote machines") : $_) => $_;
- } map {
- # Remove comments and blank lines
- (/^\s*($|#)/ ? () : chomp_($_));
- } @exports;
- my %menuexports_inv = reverse %menuexports;
- return (\%menuexports, \%menuexports_inv);
-}
-
-sub makeimportmenues {
- my @imports = @_;
- my %menuimports = map {
- ($_ eq 'localhost' ? N("This machine") : $_) => $_;
- } map {
- # Remove comments and blank lines
- if_(!/^\s*($|#)/, chomp_($_));
- } @imports;
- my %menuimports_inv = reverse %menuimports;
- return (\%menuimports, \%menuimports_inv);
-}
-
-sub sharewindow {
- my @_configured = @_;
- # Read list of hosts to where to export the local scanners
- my @exports = cat_("/etc/sane.d/saned.conf");
- my ($menuexports, $menuexports_inv) =
- makeexportmenues(@exports);
- # Read list of hosts from where to import scanners
- my @imports = cat_("/etc/sane.d/net.conf");
- my ($menuimports, $menuimports_inv) =
- makeimportmenues(@imports);
- # Is saned running?
- my $sanedrunning = services::starts_on_boot("saned");
- my $oldsanedrunning = $sanedrunning;
- # Is the "net" SANE backend active
- my $netbackendactive = grep { /^\s*net\s*$/ }
- cat_("/etc/sane.d/dll.conf");
- my $oldnetbackendactive = $netbackendactive;
- # Set this to 1 to tell the caller that the list of locally available
- # scanners has changed (Here if the SANE client configuration has
- # changed)
- my $changed = 0;
- my $importschanged = 0;
- # main loop
- my $maindone;
- while (!$maindone) {
- my $buttonclicked;
- #- Show dialog
- if ($in->ask_from_
- (
- {
- title => N("Scannerdrake"),
- messages => N("Here you can choose whether the scanners connected to this machine should be accessible by remote machines and by which remote machines.") .
- N("You can also decide here whether scanners on remote machines should be made available on this machine."),
- },
- [
- { text => N("The scanners on this machine are available to other computers"), type => 'bool',
- val => \$sanedrunning },
- { val => N("Scanner sharing to hosts: ") .
- (keys %$menuexports > 0 ?
- (keys %$menuexports > 2 ?
- join(", ", (keys %$menuexports)[0,1]) . " ..." :
- join(", ", keys %$menuexports)) :
- N("No remote machines")),
- type => 'button',
- clicked_may_quit => sub {
- $buttonclicked = "exports";
- 1;
- },
- disabled => sub {
- !$sanedrunning;
- } },
- { text => N("Use scanners on remote computers"),
- type => 'bool',
- val => \$netbackendactive },
- { val => N("Use the scanners on hosts: ") .
- (keys %$menuimports > 0 ?
- (keys %$menuimports > 2 ?
- join(", ", (keys %$menuimports)[0,1]) . " ..." :
- join(", ", keys %$menuimports)) :
- N("No remote machines")),
- type => 'button',
- clicked_may_quit => sub {
- $buttonclicked = "imports";
- 1;
- },
- disabled => sub {
- !$netbackendactive;
- } },
- ]
- )
- ) {
- if ($buttonclicked eq "exports") {
- # Show dialog to add hosts to share scanners to
- my $subdone = 0;
- my $choice;
- while (!$subdone) {
- my @list = keys %$menuexports;
- # Entry should be edited when double-clicked
- $buttonclicked = "edit";
- $in->ask_from_
- (
- { title => N("Sharing of local scanners"),
- messages => N("These are the machines on which the locally connected scanner(s) should be available:"),
- ok => "",
- cancel => "",
- },
- # List the hosts
- [ { val => \$choice, format => \&translate,
- sort => 0, separator => "####",
- tree_expanded => 1,
- quit_if_double_click => 1,
- allow_empty_list => 1,
- list => \@list },
- { val => N("Add host"),
- type => 'button',
- clicked_may_quit => sub {
- $buttonclicked = "add";
- 1;
- } },
- { val => N("Edit selected host"),
- type => 'button',
- clicked_may_quit => sub {
- $buttonclicked = "edit";
- 1;
- },
- disabled => sub {
- return ($#list < 0);
- } },
- { val => N("Remove selected host"),
- type => 'button',
- clicked_may_quit => sub {
- $buttonclicked = "remove";
- 1;
- },
- disabled => sub {
- return ($#list < 0);
- } },
- { val => N("Done"),
- type => 'button',
- clicked_may_quit => sub {
- $buttonclicked = "";
- $subdone = 1;
- 1;
- } },
- ]
- );
- if ($buttonclicked eq "add" ||
- $buttonclicked eq "edit") {
- my ($hostchoice, $ip);
- if ($buttonclicked eq "add") {
- # Use first entry as default for a new entry
- $hostchoice =
- N("Name/IP address of host:");
- } else {
- if ($menuexports->{$choice} eq '+') {
- # Entry is "All hosts"
- $hostchoice = $choice;
- } else {
- # Entry is a name/an IP address
- $hostchoice =
- N("Name/IP address of host:");
- $ip = $choice;
- }
- }
- my @menu = (N("All remote machines"),
- N("Name/IP address of host:"));
- # Show the dialog
- my $address;
- my $oldaddress =
- ($buttonclicked eq "edit" ?
- $menuexports->{$choice} : "");
- if ($in->ask_from_
- (
- { title => N("Sharing of local scanners"),
- messages => N("Choose the host on which the local scanners should be made available:"),
- callbacks => {
- complete => sub {
- if ($hostchoice eq $menu[0]) {
- $address = "+";
- } elsif ($hostchoice eq $menu[1]) {
- $address = $ip;
- }
- # Do not allow an empty address
- if ($address !~ /\S/) {
- $in->ask_warn(N("Error"),
- N("You must enter a host name or an IP address.\n"));
- return (1,0);
- }
- # Strip off leading and trailing
- # spaces
- $address =~ s/^\s*(.*?)\s*$/$1/;
- # Check whether item is duplicate
- if ($address ne $oldaddress &&
- member("$address\n",
- @exports)) {
- $in->ask_warn(N("Error"),
- N("This host is already in the list, it cannot be added again.\n"));
- return (1,1);
- }
- return 0;
- },
- },
- },
- # List the host types
- [ { val => \$hostchoice, format => \&translate,
- type => 'list',
- sort => 0,
- list => \@menu },
- { val => \$ip,
- disabled => sub {
- $hostchoice ne
- N("Name/IP address of host:");
- } },
- ],
- )) {
- # OK was clicked, insert new item into the list
- if ($buttonclicked eq "add") {
- handle_configs::set_directive(\@exports,
- $address);
- } else {
- handle_configs::replace_directive(\@exports,
- $oldaddress,
- $address);
- }
- # Refresh list of hosts
- ($menuexports, $menuexports_inv) =
- makeexportmenues(@exports);
- # Position the list cursor on the new/modified
- # item
- $choice = $menuexports_inv->{$address};
- }
- } elsif ($buttonclicked eq "remove") {
- my $address = $menuexports->{$choice};
- handle_configs::remove_directive(\@exports,
- $address);
- # Refresh list of hosts
- ($menuexports, $menuexports_inv) =
- makeexportmenues(@exports);
- }
- }
- } elsif ($buttonclicked eq "imports") {
- # Show dialog to add hosts on which the scanners should be
- # used
- my $subdone = 0;
- my $choice;
- while (!$subdone) {
- my @list = keys %$menuimports;
- # Entry should be edited when double-clicked
- $buttonclicked = "edit";
- $in->ask_from_
- (
- { title => N("Usage of remote scanners"),
- messages => N("These are the machines from which the scanners should be used:"),
- ok => "",
- cancel => "",
- },
- # List the hosts
- [ { val => \$choice, format => \&translate,
- sort => 0, separator => "####",
- tree_expanded => 1,
- quit_if_double_click => 1,
- allow_empty_list => 1,
- list => \@list },
- { val => N("Add host"),
- type => 'button',
- clicked_may_quit => sub {
- $buttonclicked = "add";
- 1;
- } },
- { val => N("Edit selected host"),
- type => 'button',
- clicked_may_quit => sub {
- $buttonclicked = "edit";
- 1;
- },
- disabled => sub {
- return ($#list < 0);
- } },
- { val => N("Remove selected host"),
- type => 'button',
- clicked_may_quit => sub {
- $buttonclicked = "remove";
- 1;
- },
- disabled => sub {
- return ($#list < 0);
- } },
- { val => N("Done"),
- type => 'button',
- clicked_may_quit => sub {
- $buttonclicked = "";
- $subdone = 1;
- 1;
- } },
- ]
- );
- if ($buttonclicked eq "add" ||
- $buttonclicked eq "edit") {
- my ($hostchoice, $ip);
- if ($buttonclicked eq "add") {
- # Use first entry as default for a new entry
- $hostchoice =
- N("Name/IP address of host:");
- } else {
- if ($menuimports->{$choice} eq 'localhost') {
- # Entry is "This machine"
- $hostchoice = $choice;
- } else {
- # Entry is a name/an IP address
- $hostchoice =
- N("Name/IP address of host:");
- $ip = $choice;
- }
- }
- my @menu = (N("This machine"),
- N("Name/IP address of host:"));
- # Show the dialog
- my $address;
- my $oldaddress =
- ($buttonclicked eq "edit" ?
- $menuimports->{$choice} : "");
- if ($in->ask_from_
- (
- { title => N("Sharing of local scanners"),
- messages => N("Choose the host on which the local scanners should be made available:"),
- callbacks => {
- complete => sub {
- if ($hostchoice eq $menu[0]) {
- $address = 'localhost';
- } elsif ($hostchoice eq $menu[1]) {
- $address = $ip;
- }
- # Do not allow an empty address
- if ($address !~ /\S/) {
- $in->ask_warn(N("Error"),
- N("You must enter a host name or an IP address.\n"));
- return (1,0);
- }
- # Strip off leading and trailing
- # spaces
- $address =~ s/^\s*(.*?)\s*$/$1/;
- # Check whether item is duplicate
- if ($address ne $oldaddress &&
- member("$address\n",
- @imports)) {
- $in->ask_warn(N("Error"),
- N("This host is already in the list, it cannot be added again.\n"));
- return (1,1);
- }
- return 0;
- },
- },
- },
- # List the host types
- [ { val => \$hostchoice, format => \&translate,
- type => 'list',
- sort => 0,
- list => \@menu },
- { val => \$ip,
- disabled => sub {
- $hostchoice ne
- N("Name/IP address of host:");
- } },
- ],
- )) {
- # OK was clicked, insert new item into the list
- if ($buttonclicked eq "add") {
- handle_configs::set_directive(\@imports,
- $address);
- } else {
- handle_configs::replace_directive(\@imports,
- $oldaddress,
- $address);
- }
- $importschanged = 1;
- # Refresh list of hosts
- ($menuimports, $menuimports_inv) =
- makeimportmenues(@imports);
- # Position the list cursor on the new/modified
- # item
- $choice = $menuimports_inv->{$address};
- }
- } elsif ($buttonclicked eq "remove") {
- my $address = $menuimports->{$choice};
- handle_configs::remove_directive(\@imports,
- $address);
- # Refresh list of hosts
- ($menuimports, $menuimports_inv) =
- makeimportmenues(@imports);
- $importschanged = 1;
- }
- }
- } else {
- # We have clicked "OK"
- $maindone = 1;
- if ($importschanged) {
- $changed = 1;
- }
- # Write /etc/sane.d/saned.conf
- output("/etc/sane.d/saned.conf", @exports);
- # Write /etc/sane.d/net.conf
- output("/etc/sane.d/net.conf", @imports);
- # Turn on/off saned
- if ($sanedrunning != $oldsanedrunning) {
- if ($sanedrunning) {
- # Make sure saned and xinetd is installed and
- # running
- if (!files_exist('/usr/sbin/xinetd',
- '/usr/sbin/saned')) {
- if (!$in->ask_yesorno(N("Warning"), N("saned needs to be installed to share the local scanner(s).
-
-Do you want to install the saned package?"))) {
- $in->ask_warn("Scannerdrake",
- N("Your scanner(s) will not be available on the network."));
- } elsif (!$in->do_pkgs->install('xinetd', 'saned')) {
- $in->ask_warn(N("Error"),
- N("Could not install the packages needed to share your scanner(s).") . " " .
- N("Your scanner(s) will not be available on the network."));
- }
- }
- # Start saned and make sure that it gets started on
- # every boot
- services::start_service_on_boot("saned");
- services::start_service_on_boot("xinetd");
- services::restart("xinetd");
- } else {
- # Stop saned and make sure that it does not get
- # started when booting
- services::do_not_start_service_on_boot("saned");
- services::restart("xinetd");
- }
- }
- # Turn on/off "net" SANE backend
- if ($netbackendactive != $oldnetbackendactive) {
- my @dllconf = cat_("/etc/sane.d/dll.conf");
- if ($netbackendactive) {
- handle_configs::set_directive(\@dllconf, "net");
- } else {
- handle_configs::comment_directive(\@dllconf, "net");
- }
- output("/etc/sane.d/dll.conf", @dllconf);
- $changed = 1;
- }
- }
- } else {
- # Cancel clicked
- $maindone = 1;
- }
- }
- return $changed;
-}