diff options
Diffstat (limited to 'lib/network/netconnect.pm')
-rw-r--r-- | lib/network/netconnect.pm | 867 |
1 files changed, 867 insertions, 0 deletions
diff --git a/lib/network/netconnect.pm b/lib/network/netconnect.pm new file mode 100644 index 0000000..1f6cbc1 --- /dev/null +++ b/lib/network/netconnect.pm @@ -0,0 +1,867 @@ +package network::netconnect; # $Id$ + +use strict; +use common; +use log; +use detect_devices; +use list_modules; +use modules; +use mouse; +use services; +use network::network; +use network::tools; +use network::thirdparty; +use network::connection; + +sub detect { + my ($modules_conf, $auto_detect, $o_class) = @_; + my %l = ( + isdn => sub { + require network::connection::isdn; + $auto_detect->{isdn} = network::connection::isdn::detect_backend($modules_conf); + }, + modem => sub { + $auto_detect->{modem} = { map { $_->{description} || "$_->{MANUFACTURER}|$_->{DESCRIPTION} ($_->{device})" => $_ } detect_devices::getModem($modules_conf) }; + }, + ); + $l{$_}->() foreach $o_class || keys %l; + return; +} + +sub detect_timezone() { + my %tmz2country = ( + 'Europe/Paris' => N("France"), + 'Europe/Amsterdam' => N("Netherlands"), + 'Europe/Rome' => N("Italy"), + 'Europe/Brussels' => N("Belgium"), + 'America/New_York' => N("United States"), + 'Europe/London' => N("United Kingdom") + ); + my %tm_parse = MDK::Common::System::getVarsFromSh("$::prefix/etc/sysconfig/clock"); + my @country; + foreach (keys %tmz2country) { + if ($_ eq $tm_parse{ZONE}) { + unshift @country, $tmz2country{$_}; + } else { push @country, $tmz2country{$_} } + } + \@country; +} + +sub real_main { + my ($net, $in, $modules_conf) = @_; + #- network configuration should have been already read in $net at this point + my $mouse = $::o->{mouse} || {}; + my (@connections_list, $connection, $provider_settings, $protocol_settings, $access_settings, $control_settings); + my $connection_compat; + my ($hardware_settings, $network_access_settings, $address_settings, $hostname_settings); + my ($modem, $modem_name, $modem_dyn_dns, $modem_dyn_ip); + my ($up); + my ($isdn, $isdn_name, $isdn_type, %isdn_cards, @isdn_dial_methods); + my $my_isdn = join('', N("Manual choice"), " (", N("Internal ISDN card"), ")"); + my $success = 1; + my $has_internet = 1; + my $db_path = "/usr/share/apps/kppp/Provider"; + my (%countries, @isp, $country, $provider, $old_provider); + + my $system_file = '/etc/sysconfig/drakx-net'; + my %global_settings = getVarsFromSh($system_file); + + my $_w = N("Protocol for the rest of the world"); + my %isdn_protocols = ( + 2 => N("European protocol (EDSS1)"), + 3 => N("Protocol for the rest of the world\nNo D-Channel (leased lines)"), + ); + + $net->{autodetect} = {}; + + my %ppp_auth_methods = ( + 0 => N("Script-based"), + 1 => N("PAP"), + 2 => N("Terminal-based"), + 3 => N("CHAP"), + 4 => N("PAP/CHAP"), + ); + + my %steps_compat = ( + 'network::connection::isdn' => 'isdn', + 'network::connection::pots' => 'modem', + ); + + my $get_next = sub { + my ($step) = @_; + my @steps = ( + "select_connection" => sub { 0 }, + "configure_hardware" => sub { $connection->can('get_hardware_settings') }, + #- network is for example wireless/3G access point + "select_network" => sub { $connection->can('get_networks') }, + "configure_network_access" => sub { $connection->can('get_network_access_settings') }, + #- allow to select provider after network + "select_provider" => sub { $connection->can('get_providers') }, + #- protocol may depend on provider settings (xDSL) + "select_protocol" => sub { $connection->can('get_protocols') }, + #- peer settings may depend on provider and protocol (VPI/VCI for xDSL) + "configure_access" => sub { $connection->can('get_access_settings') }, + "configure_address" => sub { ($connection->can('get_address_settings') || $connection->can('get_hostname_settings')) && !text2bool($global_settings{AUTOMATIC_ADDRESS}) }, + "configure_control" => sub { $connection->can('get_control_settings') }, + "apply_connection" => sub { 1 }, + ); + my $can; + foreach (group_by2(@steps)) { + $can && $_->[1]->() and return $_->[0]; + $can ||= $_->[0] eq $step; + } + }; + + use locale; + set_l10n_sort(); + + require wizards; + my $wiz = wizards->new( + { + defaultimage => "drakconnect.png", + name => N("Network & Internet Configuration"), + pages => { + welcome => { + pre => sub { undef $net->{type} }, + if_(!$::isInstall, no_back => 1), + name => N("Choose the connection you want to configure") . if_($net->{PROFILE} && network::network::netprofile_count() > 0, "\n".N("Those settings will be saved for the network profile <b>%s</b>", $net->{PROFILE}) ), + if_(!$::isInstall, interactive_help_id => 'configureNetwork'), + data => [ { list => [ network::connection::get_types ], + type => 'list', val => \$net->{type}, format => sub { $_[0] && $_[0]->get_type_description }, + gtk => { use_scrolling => 1 } } ], + complete => sub { + my @packages = $net->{type}->can('get_packages') ? $net->{type}->get_packages : (); + if (@packages && !$in->do_pkgs->install(@packages)) { + $in->ask_warn(N("Error"), N("Could not install the packages (%s)!", join(', ', @packages))); + 1; + } + }, + post => sub { + if (exists $steps_compat{$net->{type}}) { + return $steps_compat{$net->{type}}; + } + @connections_list = $net->{type}->get_connections(automatic_only => text2bool($global_settings{AUTOMATIC_IFACE_CHOICE})); + @connections_list ? "select_connection" : "no_connection"; + }, + }, + + select_connection => { + name => sub { $net->{type}->get_type_name . "\n\n" . N("Select the network interface to configure:") }, + data => [ { val => \$connection, type => 'list', list => \@connections_list, + format => sub { $_[0] && N("%s: %s", $_[0]->get_interface, $_[0]->get_description) }, allow_empty_list => !text2bool($global_settings{AUTOMATIC_IFACE_CHOICE})} ], + complete => sub { + $connection->setup_thirdparty($in) or return 1; + $connection->prepare_device; + if ($connection->can("check_device") && !$connection->check_device) { + $in->ask_warn('', $connection->{device}{error}); + return 1; + } + return 0; + }, + post => sub { + $connection->load_interface_settings; + $get_next->("select_connection"); + }, + }, + + no_connection => { + name => sub { $net->{type}->get_type_name . "\n\n" . N("No device can be found for this connection type.") }, + end => 1, + }, + + configure_hardware => { + pre => sub { + $hardware_settings = $connection->get_hardware_settings; + $connection->guess_hardware_settings if $connection->can('guess_hardware_settings'); + }, + name => sub { $net->{type}->get_type_name . "\n\n" . N("Hardware Configuration") }, + data => sub { $hardware_settings }, + complete => sub { + if ($connection->can("check_hardware_settings") && !$connection->check_hardware_settings) { + $in->ask_warn('', $connection->{hardware}{error}); + return 1; + } + return 0 if !$connection->can('check_hardware') || $connection->check_hardware; + if ($connection->can('configure_hardware')) { + my $_w = $in->wait_message(N("Please wait"), N("Configuring device...")); + if (!$connection->configure_hardware) { + $in->ask_warn(N("Error"), $connection->{hardware}{error}) if $connection->{hardware}{error}; + return 1; + } + } + }, + post => sub { $get_next->("configure_hardware") }, + }, + + select_provider => { + pre => sub { + $provider_settings = $connection->get_provider_settings; + $connection->guess_provider_settings; + }, + name => sub { $net->{type}->get_type_name . "\n\n" . N("Please select your provider:") }, + data => sub { $provider_settings }, + post => sub { $get_next->("select_provider") }, + }, + + select_network => { + pre => sub { + my $_w = $in->wait_message(N("Please wait"), N("Scanning for networks...")); + $connection->get_networks($net); + }, + name => sub { $net->{type}->get_type_name . "\n\n" . N("Please select your network:") }, + data => sub { + [ { type => "list", val => \$connection->{network}, allow_empty_list => 1, + list => [ keys %{$connection->{networks}}, undef ], + format => sub { exists $connection->{networks}{$_[0]} ? + $connection->{networks}{$_[0]}{name} : + N("Unlisted - edit manually"); + } } ]; + }, + post => sub { + $get_next->("select_network"); + }, + }, + + configure_network_access => { + pre => sub { + $network_access_settings = $connection->get_network_access_settings; + $connection->guess_network_access_settings if $connection->can('guess_network_access_settings'); + }, + name => sub { $net->{type}->get_type_name . "\n\n" . $connection->get_network_access_settings_label }, + data => sub { $network_access_settings }, + complete => sub { + if ($connection->can('check_network_access_settings') && !$connection->check_network_access_settings) { + $in->ask_warn(N("Error"), $connection->{network_access}{error}{message}); + my $index = eval { find_index { $_->{val} eq $connection->{network_access}{error}{field} } @$network_access_settings }; + return 1, $index; + } + return 0; + }, + post => sub { $get_next->("configure_network_access") }, + }, + + select_protocol => { + pre => sub { + $protocol_settings = $connection->get_protocol_settings; + $connection->guess_protocol($net) if $connection->can('guess_protocol'); + }, + name => sub { $net->{type}->get_type_name . "\n\n" . N("Please select your connection protocol. +If you do not know it, keep the preselected protocol.") }, + data => sub { $protocol_settings }, + post => sub { $get_next->("select_protocol") }, + }, + + configure_access => { + pre => sub { + $access_settings = $connection->get_access_settings; + $connection->guess_access_settings if $connection->can('guess_access_settings'); + }, + name => sub { $net->{type}->get_type_name . "\n\n" . $connection->get_access_settings_label }, + data => sub { $access_settings }, + post => sub { $get_next->("configure_access") }, + }, + + configure_address => { + pre => sub { + $address_settings = $connection->can('get_address_settings') && $connection->get_address_settings; + $connection->guess_address_settings if $connection->can('guess_address_settings'); + $connection->guess_hostname_settings if $connection->can('guess_hostname_settings'); + $hostname_settings = $connection->can('get_hostname_settings') && $connection->get_hostname_settings; + }, + name => sub { $net->{type}->get_type_name . "\n\n" . $connection->get_address_settings_label }, + data => sub { [ @$address_settings, @$hostname_settings ] }, + complete => sub { + if ($connection->can('check_address_settings') && !$connection->check_address_settings($net)) { + $in->ask_warn(N("Error"), $connection->{address}{error}{message}); + my $index = eval { find_index { $_->{val} eq $connection->{address}{error}{field} } @$address_settings }; + return 1, $index; + } + return 0; + }, + post => sub { $get_next->("configure_address") }, + }, + + configure_control => { + pre => sub { + $control_settings = $connection->get_control_settings; + $connection->can('get_network_control_settings') and + push @$control_settings, @{$connection->get_network_control_settings}; + $connection->guess_control_settings if $connection->can('guess_control_settings'); + $connection->guess_network_control_settings if $connection->can('guess_network_control_settings'); + }, + name => sub { $net->{type}->get_type_name . "\n\n" . N("Connection control") }, + data => sub { $control_settings }, + post => sub { $get_next->("configure_control") }, + }, + + apply_connection => { + name => N("Do you want to start the connection now?"), + type => "yesorno", + complete => sub { + $connection->can('install_packages') && !$connection->install_packages($in); + }, + post => sub { + my ($answer) = @_; + my $_w = $in->wait_message(N("Please wait"), N("Testing your connection..."), 1); + $connection->unload_connection if $connection->can('unload_connection'); + $connection->write_settings($net, $modules_conf); + $connection->prepare_connection if $connection->can('prepare_connection'); + if ($answer) { + $connection->disconnect; + $connection->connect; + # TODO: we should have some graphical notification for these tests + #- FIXME: should use network::test for ppp (after future merge with network::connection) + #- or start interface synchronously + if (!$::isInstall) { + services::start('network-up'); + } else { + my $timeout = $connection->get_up_timeout; + while ($timeout--) { + my $status = $connection->get_status; + last if $status; + sleep 1; + } + } + $success = $connection->get_status(); + # try to resolve the network address for some time + my $timeout = 3; + while ($timeout--) { + $has_internet = network::tools::connected(); + last if $has_internet; + sleep 1; + } + } + "end"; #- handle disconnection in install? + }, + }, + + isdn_account => + { + pre => sub { + network::connection::isdn::get_info_providers_backend($isdn, $provider); + $isdn->{huptimeout} ||= 180; + }, + name => N("Connection Configuration") . "\n\n" . N("Please fill or check the field below"), + data => sub { + [ + { label => N("Your personal phone number"), val => \$isdn->{phone_in} }, + { label => N("Provider name (ex provider.net)"), val => \$net->{resolv}{DOMAINNAME2} }, + { label => N("Provider phone number"), val => \$isdn->{phone_out} }, + { label => N("Provider DNS 1 (optional)"), val => \$net->{resolv}{dnsServer2} }, + { label => N("Provider DNS 2 (optional)"), val => \$net->{resolv}{dnsServer3} }, + { label => N("Dialing mode"), list => ["auto", "manual"], val => \$isdn->{dialing_mode} }, + { label => N("Connection speed"), list => ["64 Kb/s", "128 Kb/s"], val => \$isdn->{speed} }, + { label => N("Connection timeout (in sec)"), val => \$isdn->{huptimeout} }, + { label => N("Account Login (user name)"), val => \$isdn->{login} }, + { label => N("Account Password"), val => \$isdn->{passwd}, hidden => 1 }, + { label => N("Card IRQ"), val => \$isdn->{irq}, advanced => 1 }, + { label => N("Card mem (DMA)"), val => \$isdn->{mem}, advanced => 1 }, + { label => N("Card IO"), val => \$isdn->{io}, advanced => 1 }, + { label => N("Card IO_0"), val => \$isdn->{io0}, advanced => 1 }, + { label => N("Card IO_1"), val => \$isdn->{io1}, advanced => 1 }, + ]; + }, + post => sub { + network::connection::isdn::apply_config($in, $isdn); + $net->{net_interface} = 'ippp0'; + "isdn_dial_on_boot"; + }, + }, + + isdn => + { + pre=> sub { + detect($modules_conf, $net->{autodetect}, 'isdn'); + %isdn_cards = map { $_->{description} => $_ } @{$net->{autodetect}{isdn}}; + }, + name => N("Select the network interface to configure:"), + data => sub { + [ { label => N("Net Device"), type => "list", val => \$isdn_name, allow_empty_list => 1, + list => [ $my_isdn, N("External ISDN modem"), keys %isdn_cards ] } ]; + }, + post => sub { + if ($isdn_name eq $my_isdn) { + return "isdn_ask"; + } elsif ($isdn_name eq N("External ISDN modem")) { + $net->{type} = 'isdn_external'; + return "modem"; + } + + # FIXME: some of these should be taken from isdn db + $isdn = { map { $_ => $isdn_cards{$isdn_name}{$_} } qw(description vendor id card_type driver type mem io io0 io1 irq firmware) }; + + if ($isdn->{id}) { + log::explanations("found isdn card : $isdn->{description}; vendor : $isdn->{vendor}; id : $isdn->{id}; driver : $isdn->{driver}\n"); + $isdn->{description} =~ s/\|/ -- /; + } + + network::connection::isdn::read_config($isdn); + $isdn->{driver} = $isdn_cards{$isdn_name}{driver}; #- do not let config overwrite default driver + + #- let the user choose hisax or capidrv if both are available + $isdn->{driver} ne "capidrv" && network::connection::isdn::get_capi_card($in, $isdn) and return "isdn_driver"; + return "isdn_protocol"; + }, + }, + + + isdn_ask => + { + pre => sub { + %isdn_cards = network::connection::isdn::get_cards(); + }, + name => N("Select a device!"), + data => sub { [ { label => N("Net Device"), val => \$isdn_name, type => 'list', separator => '|', list => [ keys %isdn_cards ], allow_empty_list => 1 } ] }, + pre2 => sub { + my ($label) = @_; + + #- ISDN card already detected + goto isdn_ask_step_3; + + isdn_ask_step_1: + my $e = $in->ask_from_list_(N("ISDN Configuration"), + $label . "\n" . N("What kind of card do you have?"), + [ N_("ISA / PCMCIA"), N_("PCI"), N_("USB"), N_("I do not know") ] + ) or return; + isdn_ask_step_1b: + if ($e =~ /PCI/) { + $isdn->{card_type} = 'pci'; + } elsif ($e =~ /USB/) { + $isdn->{card_type} = 'usb'; + } else { + $in->ask_from_list_(N("ISDN Configuration"), + N(" +If you have an ISA card, the values on the next screen should be right.\n +If you have a PCMCIA card, you have to know the \"irq\" and \"io\" of your card. +"), + [ N_("Continue"), N_("Abort") ]) eq 'Continue' or goto isdn_ask_step_1; + $isdn->{card_type} = 'isa'; + } + + isdn_ask_step_2: + $e = $in->ask_from_listf(N("ISDN Configuration"), + N("Which of the following is your ISDN card?"), + sub { $_[0]{description} }, + [ network::connection::isdn::get_cards_by_type($isdn->{card_type}) ]) or goto($isdn->{card_type} =~ /usb|pci/ ? 'isdn_ask_step_1' : 'isdn_ask_step_1b'); + $e->{$_} and $isdn->{$_} = $e->{$_} foreach qw(driver type mem io io0 io1 irq firmware); + + }, + post => sub { + $isdn = $isdn_cards{$isdn_name}; + return "isdn_protocol"; + } + }, + + + isdn_driver => + { + pre => sub { + $isdn_name = "capidrv"; + }, + name => N("A CAPI driver is available for this modem. This CAPI driver can offer more capabilities than the free driver (like sending faxes). Which driver do you want to use?"), + data => sub { [ + { label => N("Driver"), type => "list", val => \$isdn_name, + list => [ $isdn->{driver}, "capidrv" ] } + ] }, + post => sub { + $isdn->{driver} = $isdn_name; + return "isdn_protocol"; + } + }, + + + isdn_protocol => + { + name => N("ISDN Configuration") . "\n\n" . N("Which protocol do you want to use?"), + data => [ + { label => N("Protocol"), type => "list", val => \$isdn_type, + list => [ keys %isdn_protocols ], format => sub { $isdn_protocols{$_[0]} } } + ], + post => sub { + $isdn->{protocol} = $isdn_type; + return "isdn_db"; + } + }, + + + isdn_db => + { + name => N("ISDN Configuration") . "\n\n" . N("Select your provider.\nIf it is not listed, choose Unlisted."), + data => sub { + [ { label => N("Provider:"), type => "list", val => \$provider, separator => '|', + list => [ N("Unlisted - edit manually"), network::connection::isdn::read_providers_backend() ] } ]; + }, + next => "isdn_account", + }, + + + no_supported_winmodem => + { + name => N("Warning") . "\n\n" . N("Your modem is not supported by the system. +Take a look at http://www.linmodems.org"), + end => 1, + }, + + + modem => + { + pre => sub { + require network::modem; + detect($modules_conf, $net->{autodetect}, 'modem'); + $modem = {}; + if ($net->{type} eq 'isdn_external') { + #- FIXME: seems to be specific to ZyXEL Adapter Omni.net/TA 128/Elite 2846i + #- it does not even work with TA 128 modems + #- http://bugs.mandrakelinux.com/query.php?bug=1033 + $modem->{special_command} = 'AT&F&O2B40'; + } + }, + name => N("Select the modem to configure:"), + data => sub { + [ { label => N("Modem"), type => "list", val => \$modem_name, allow_empty_list => 1, + list => [ keys %{$net->{autodetect}{modem}}, N("Manual choice") ], } ]; + }, + complete => sub { + my $driver = $net->{autodetect}{modem}{$modem_name}{driver} or return 0; + #- some modem configuration programs modify modprobe.conf while we're loaded + #- so write it now and reload then + $modules_conf->write; + require network::connection::pots; + my $settings = network::thirdparty::apply_settings($in, 'pots', network::connection::pots::get_thirdparty_settings(), $driver); + $modem->{device} = $settings->{device} if $settings; + $modules_conf->read if $settings; + !$settings; + }, + post => sub { + return 'choose_serial_port' if $modem_name eq N("Manual choice"); + if (exists $net->{autodetect}{modem}{$modem_name}{device}) { + #- this is a serial probed modem + $modem->{device} = $net->{autodetect}{modem}{$modem_name}{device}; + } + if (exists $modem->{device}) { + return "ppp_provider"; + } else { + #- driver exists but device field hasn't been filled by network::thirdparty::setup_device + return "no_supported_winmodem"; + } + }, + }, + + + choose_serial_port => + { + pre => sub { + $modem->{device} ||= readlink "$::prefix/dev/modem"; + }, + name => N("Please choose which serial port your modem is connected to."), + if_(!$::isInstall, interactive_help_id => 'selectSerialPort'), + data => sub { + [ { val => \$modem->{device}, format => \&detect_devices::serialPort2text, type => "list", + list => [ grep { $_ ne $mouse->{device} } (detect_devices::serialPorts(), glob_("/dev/ttyUSB*"), grep { -e $_ } '/dev/modem', '/dev/ttySL0', '/dev/ttyS14',) ] } ]; + }, + post => sub { + return 'ppp_provider'; + }, + }, + + + ppp_provider => + { + pre => sub { + add2hash($modem, network::modem::ppp_read_conf()); + $in->do_pkgs->ensure_is_installed('kppp-provider', $db_path); + my $p_db_path = "$::prefix$db_path"; + @isp = map { + my $country = $_; + map { + s!$p_db_path/$country!!; + s/%([0-9]{3})/chr(int($1))/eg; + $countries{$country} ||= translate($country); + join('', $countries{$country}, $_); + } grep { !/.directory$/ } glob_("$p_db_path/$country/*"); + } map { s!$p_db_path/!!o; s!_! !g; $_ } glob_("$p_db_path/*") if !@isp; + $old_provider = $provider; + }, + name => N("Select your provider:"), + data => sub { + [ { label => N("Provider:"), type => "list", val => \$provider, separator => '/', + list => [ N("Unlisted - edit manually"), @isp ] } ]; + }, + post => sub { + if ($provider ne N("Unlisted - edit manually")) { + ($country, $provider) = split('/', $provider); + $country = { reverse %countries }->{$country}; + my %l = getVarsFromSh("$::prefix$db_path/$country/$provider"); + if (defined $old_provider && $old_provider ne $provider) { + $modem->{connection} = $l{Name}; + $modem->{phone} = $l{Phonenumber}; + $modem->{$_} = $l{$_} foreach qw(Authentication AutoName Domain Gateway IPAddr SubnetMask); + ($modem->{dns1}, $modem->{dns2}) = split(',', $l{DNS}); + } + } + return "ppp_account"; + }, + }, + + + ppp_account => + { + name => N("Dialup: account options"), + data => sub { + [ + { label => N("Connection name"), val => \$modem->{connection} }, + { label => N("Phone number"), val => \$modem->{phone} }, + { label => N("Login ID"), val => \$modem->{login} }, + { label => N("Password"), val => \$modem->{passwd}, hidden => 1 }, + { label => N("Authentication"), val => \$modem->{Authentication}, + list => [ sort keys %ppp_auth_methods ], format => sub { $ppp_auth_methods{$_[0]} } }, + ]; + }, + next => "ppp_ip", + }, + + + ppp_ip => + { + pre => sub { + $modem_dyn_ip = sub { $modem->{auto_ip} eq N("Automatic") }; + }, + name => N("Dialup: IP parameters"), + data => sub { + [ + { label => N("IP parameters"), type => "list", val => \$modem->{auto_ip}, list => [ N("Automatic"), N("Manual") ] }, + { label => N("IP address"), val => \$modem->{IPAddr}, disabled => $modem_dyn_ip }, + { label => N("Subnet mask"), val => \$modem->{SubnetMask}, disabled => $modem_dyn_ip }, + ]; + }, + next => "ppp_dns", + }, + + + ppp_dns => + { + pre => sub { + $modem_dyn_dns = sub { $modem->{auto_dns} eq N("Automatic") }; + }, + name => N("Dialup: DNS parameters"), + data => sub { + [ + { label => N("DNS"), type => "list", val => \$modem->{auto_dns}, list => [ N("Automatic"), N("Manual") ] }, + { label => N("Domain name"), val => \$modem->{domain}, disabled => $modem_dyn_dns }, + { label => N("First DNS Server (optional)"), val => \$modem->{dns1}, disabled => $modem_dyn_dns }, + { label => N("Second DNS Server (optional)"), val => \$modem->{dns2}, disabled => $modem_dyn_dns }, + { text => N("Set hostname from IP"), val => \$modem->{AutoName}, type => 'bool', disabled => $modem_dyn_dns }, + ]; + }, + next => "ppp_gateway", + }, + + + ppp_gateway => + { + name => N("Dialup: IP parameters"), + data => sub { + [ + { label => N("Gateway"), type => "list", val => \$modem->{auto_gateway}, list => [ N("Automatic"), N("Manual") ] }, + { label => N("Gateway IP address"), val => \$modem->{Gateway}, + disabled => sub { $modem->{auto_gateway} eq N("Automatic") } }, + ]; + }, + post => sub { + network::modem::ppp_configure($net, $in, $modem); + $net->{net_interface} = 'ppp0'; + "configure_control_compat"; + }, + }, + + + configure_control_compat => { + pre => sub { + $connection_compat = $net->{type}->new($connection || {}); + network::connection::guess_control_settings($connection_compat); + $control_settings = network::connection::get_control_settings($connection_compat); + }, + name => sub { N("Connection control") }, + data => sub { $control_settings }, + post => sub { + $net->{ifcfg}{$net->{net_interface}}{USERCTL} = bool2yesno($connection_compat->{control}{userctl}); + $net->{ifcfg}{$net->{net_interface}}{ONBOOT} = bool2yesno($connection_compat->{control}{onboot}); + network::network::configure_network($net, $in, $modules_conf); + "ask_connect_now"; + }, + }, + + isdn_dial_on_boot => + { + pre => sub { + $net->{ifcfg}{ippp0} ||= {}; # we want the ifcfg-ippp0 file to be written + $net->{ifcfg}{ippp0}{DEVICE} = "ippp0"; + @isdn_dial_methods = ({ name => N("Automatically at boot"), + ONBOOT => 1, DIAL_ON_IFUP => 1 }, + { name => N("By using Net Applet in the system tray"), + ONBOOT => 0, DIAL_ON_IFUP => 1 }, + { name => N("Manually (the interface would still be activated at boot)"), + ONBOOT => 1, DIAL_ON_IFUP => 0 }); + my $method = find { + $_->{ONBOOT} eq text2bool($net->{ifcfg}{ippp0}{ONBOOT}) && + $_->{DIAL_ON_IFUP} eq text2bool($net->{ifcfg}{ippp0}{DIAL_ON_IFUP}); + } @isdn_dial_methods; + #- use net_applet by default + $isdn->{dial_method} = $method->{name} || $isdn_dial_methods[1]{name}; + }, + name => N("How do you want to dial this connection?"), + data => sub { + [ { type => "list", val => \$isdn->{dial_method}, list => [ map { $_->{name} } @isdn_dial_methods ] } ]; + }, + post => sub { + my $method = find { $_->{name} eq $isdn->{dial_method} } @isdn_dial_methods; + $net->{ifcfg}{ippp0}{$_} = bool2yesno($method->{$_}) foreach qw(ONBOOT DIAL_ON_IFUP); + return "configure_control_compat"; + }, + }, + + ask_connect_now => + { + name => N("Do you want to try to connect to the Internet now?"), + type => "yesorno", + post => sub { + my ($a) = @_; + my $type = $net->{type}; + $up = 1; + if ($a) { + # local $::isWizard = 0; + my $_w = $in->wait_message(N("Please wait"), N("Testing your connection..."), 1); + network::tools::stop_net_interface($net, 0); + sleep 1; + network::tools::start_net_interface($net, 1); + my $s = 30; + $type =~ /modem/ and $s = 50; + $type =~ /isdn/ and $s = 20; + sleep $s; + $up = network::tools::connected(); + } + $success = $up; + return $a ? "disconnect" : "end"; + } + }, + + + disconnect => + { + name => sub { + $up ? N("The system is now connected to the Internet.") . + if_($::isInstall, N("For security reasons, it will be disconnected now.")) : + N("The system does not seem to be connected to the Internet. +Try to reconfigure your connection."); + }, + no_back => 1, + end => 1, + post => sub { + $::isInstall and network::tools::stop_net_interface($net, 0); + return "end"; + }, + }, + + + end => + { + name => sub { + if (!$success) { + return join("\n\n", N("Problems occured during the network connectivity test."), + N("This can be caused by invalid network configuration, or problems with your modem or router."), + N("You might want to relaunch the configuration to verify the connection settings.")); + } + if (!$has_internet) { + return join("\n\n", N("Congratulations, the network configuration is finished."), N("However, the Internet connectivity test failed. You should test your connection manually, and verify your Internet modem or router."), + N("If your connection does not work, you might want to relaunch the configuration.")); + } + return join("\n\n", N("Congratulations, the network and Internet configuration are finished."), if_($::isStandalone && $in->isa('interactive::gtk'), + N("After this is done, we recommend that you restart your X environment to avoid any hostname-related problems."))); + }, + end => 1, + }, + }, + }); + $wiz->process($in); + + #- keeping the translations in case someone want to restore these texts + if_(0, + N("Alcatel speedtouch USB modem"), + N("Sagem USB modem"), + N("Bewan modem"), + N("Bewan modem"), + N("ECI Hi-Focus modem"), # this one needs eci agreement + N("LAN connection"), + N("Wireless connection"), + N("ADSL connection"), + N("Cable connection"), + N("ISDN connection"), + N("Modem connection"), + N("DVB connection"), + # keep b/c of translations in case they can be reused somewhere else: + N("(detected on port %s)", 'toto'), + #-PO: here, "(detected)" string will be appended to eg "ADSL connection" + N("(detected %s)", 'toto'), N("(detected)"), + N("Network Configuration"), + N("Zeroconf hostname resolution"), + N("If desired, enter a Zeroconf hostname. +This is the name your machine will use to advertise any of +its shared resources that are not managed by the network. +It is not necessary on most networks."), + N("Zeroconf Host name"), + N("Zeroconf host name must not contain a ."), + N("Because you are doing a network installation, your network is already configured. +Click on Ok to keep your configuration, or cancel to reconfigure your Internet & Network connection. +"), + N("The network needs to be restarted. Do you want to restart it?"), + N("A problem occurred while restarting the network: \n\n%s", 'foo'), + N("We are now going to configure the %s connection.\n\n\nPress \"%s\" to continue.", 'a', 'b'), + N("Configuration is complete, do you want to apply settings?"), + N("You have configured multiple ways to connect to the Internet.\nChoose the one you want to use.\n\n"), + N("Internet connection"), + N("Select the network interface to configure:"), + N("Configuring network device %s (driver %s)", '', ''), + N("The following protocols can be used to configure a LAN connection. Please choose the one you want to use."), + N("Please enter your host name. +Your host name should be a fully-qualified host name, +such as ``mybox.mylab.myco.com''. +You may also enter the IP address of the gateway if you have one."), + # better looking text (to be merged into texts since some languages (eg: ja) doesn't need it + N("Last but not least you can also type in your DNS server IP addresses."), + N("DNS server address should be in format 1.2.3.4"), + N("Gateway address should be in format 1.2.3.4"), + N("Gateway device"), + ); +} + +sub safe_main { + my ($net, $in, $modules_conf) = @_; + eval { real_main($net, $in, $modules_conf) }; + my $err = $@; + if ($err) { # && $in->isa('interactive::gtk') + $err =~ /wizcancel/ and $in->exit(0); + + local $::isEmbedded = 0; # to prevent sub window embedding + local $::isWizard = 0 if !$::isInstall; # to prevent sub window embedding + #err_dialog(N("Error"), N("An unexpected error has happened:\n%s", $err)); + $in->ask_warn(N("Error"), N("An unexpected error has happened:\n%s", $err)); + } +} + +1; + +=head1 network::netconnect::detect() + +=head2 example of usage + + use lib qw(/usr/lib/libDrakX); + use network::netconnect; + use modules; + use Data::Dumper; + + my %i; + my $modules_conf = modules::any_conf->read; + network::netconnect::detect($modules_conf, \%i); + print Dumper(\%i),"\n"; + +=cut |