summaryrefslogtreecommitdiffstats
path: root/perl-install/network
diff options
context:
space:
mode:
Diffstat (limited to 'perl-install/network')
-rw-r--r--perl-install/network/ndiswrapper.pm108
-rw-r--r--perl-install/network/netconnect.pm57
-rw-r--r--perl-install/network/wireless.pm111
3 files changed, 150 insertions, 126 deletions
diff --git a/perl-install/network/ndiswrapper.pm b/perl-install/network/ndiswrapper.pm
new file mode 100644
index 000000000..cedb03321
--- /dev/null
+++ b/perl-install/network/ndiswrapper.pm
@@ -0,0 +1,108 @@
+package network::ndiswrapper;
+
+use strict;
+use common;
+use modules;
+use detect_devices;
+
+my $ndiswrapper_prefix = "$::prefix/etc/ndiswrapper";
+
+sub installed_drivers() {
+ grep { -d "$ndiswrapper_prefix/$_" } all($ndiswrapper_prefix);
+}
+
+sub present_devices {
+ my ($driver) = @_;
+ my @supported_devices;
+ foreach (all("$ndiswrapper_prefix/$driver")) {
+ my ($ids) = /^([0-9A-Z]{4}:[0-9A-Z]{4})\.[05]\.conf$/;
+ $ids and push @supported_devices, $ids;
+ }
+ grep { member(uc(sprintf("%04x:%04x", $_->{vendor}, $_->{id})), @supported_devices) } detect_devices::probeall();
+}
+
+sub get_devices {
+ my ($in, $driver) = @_;
+ my @devices = present_devices($driver);
+ @devices or $in->ask_warn(N("Error"), N("No device supporting the %s ndiswrapper driver is present!", $driver));
+ @devices;
+}
+
+sub ask_driver {
+ my ($in) = @_;
+ if (my $inf_file = $in->ask_file(N("Please select the Windows driver (.inf file)"), "/mnt/cdrom")) {
+ my $driver = basename(lc($inf_file));
+ $driver =~ s/\.inf$//;
+
+ #- first uninstall the driver if present, may solve issues if it is corrupted
+ -d "$ndiswrapper_prefix/$driver" and system('ndiswrapper', '-e', $driver);
+
+ unless (system('ndiswrapper', '-i', $inf_file) == 0) {
+ $in->ask_warn(N("Error"), N("Unable to install the %s ndiswrapper driver!", $driver));
+ return undef;
+ }
+
+ return $driver;
+ }
+ undef;
+}
+
+sub find_matching_devices {
+ my ($device) = @_;
+ my $net_path = '/sys/class/net';
+ my @devices;
+
+ foreach my $interface (all($net_path)) {
+ my $dev_path = "$net_path/$interface/device";
+ -l $dev_path or next;
+
+ my %map = (vendor => 'vendor', device => 'id');
+ if (every { hex(chomp_(cat_("$dev_path/$_"))) eq $device->{$map{$_}} } keys %map) {
+ my $driver = readlink("$net_path/$interface/driver");
+ $driver =~ s!.*/!!;
+ push @devices, [ $interface, $driver ];
+ }
+ }
+
+ @devices;
+}
+
+sub find_conflicting_devices {
+ my ($device) = @_;
+ grep { $_->[1] ne "ndiswrapper" } find_matching_devices($device);
+}
+
+sub find_interface {
+ my ($device) = @_;
+ my $dev = find { $_->[1] eq "ndiswrapper" } find_matching_devices($device);
+ $dev->[0];
+}
+
+sub setup_device {
+ my ($in, $device) = @_;
+
+ eval { modules::unload("ndiswrapper") };
+ #- unload ndiswrapper first so that the newly installed .inf files will be read
+ eval { modules::load("ndiswrapper") };
+
+ if ($@) {
+ $in->ask_warn(N("Error"), N("Unable to load the ndiswrapper module!"));
+ return;
+ }
+
+ my @conflicts = find_conflicting_devices($device);
+ if (@conflicts) {
+ $in->ask_yesorno(N("Warning"), N("The selected device has already been configured with the %s driver.
+Do you really want to use a ndiswrapper driver ?", $conflicts[0][1])) or return;
+ }
+
+ my $interface = find_interface($device);
+ unless ($interface) {
+ $in->ask_warn(N("Error"), N("Unable to find the ndiswrapper interface!"));
+ return;
+ }
+
+ $interface;
+}
+
+1;
diff --git a/perl-install/network/netconnect.pm b/perl-install/network/netconnect.pm
index e623cad3e..5a62b71be 100644
--- a/perl-install/network/netconnect.pm
+++ b/perl-install/network/netconnect.pm
@@ -90,7 +90,7 @@ sub real_main {
my ($isdn, $isdn_name, $isdn_type, %isdn_cards, @isdn_dial_methods);
my $my_isdn = join('', N("Manual choice"), " (", N("Internal ISDN card"), ")");
my (@ndiswrapper_drivers, $ndiswrapper_driver, $ndiswrapper_device);
- my ($is_wireless, $wireless_key, $wireless_use_wpa);
+ my ($is_wireless, $wireless_enc_mode, $wireless_enc_key);
my ($module, $auto_ip, $protocol, $onboot, $needhostname, $peerdns, $peeryp, $peerntpd, $hotplug, $track_network_id); # lan config
my $success = 1;
my $ethntf = {};
@@ -177,6 +177,13 @@ sub real_main {
4 => N("PAP/CHAP"),
);
+ my %wireless_enc_modes = (
+ none => N("None"),
+ open => N("Open WEP"),
+ restricted => N("Restricted WEP"),
+ 'wpa-psk' => N("WPA Pre-Shared Key"),
+ );
+
my $offer_to_connect = sub {
return "ask_connect_now" if $netc->{internet_cnx_choice} eq 'adsl' && !member($adsl_type, qw(manual dhcp));
return "ask_connect_now" if member($netc->{internet_cnx_choice}, qw(modem isdn isdn_external));
@@ -234,7 +241,7 @@ sub real_main {
};
my $ndiswrapper_do_device_selection = sub {
- $ntf_name = network::wireless::ndiswrapper_setup_device($in, $ndiswrapper_device);
+ $ntf_name = network::ndiswrapper::setup_device($in, $ndiswrapper_device);
unless ($ntf_name) {
undef $ndiswrapper_device;
return;
@@ -249,7 +256,7 @@ sub real_main {
};
my $ndiswrapper_do_driver_selection = sub {
- my @devices = network::wireless::ndiswrapper_get_devices($in, $ndiswrapper_driver);
+ my @devices = network::ndiswrapper::get_devices($in, $ndiswrapper_driver);
if (!@devices) {
undef $ndiswrapper_driver;
@@ -989,15 +996,15 @@ You can find a driver on http://eciadsl.flashtux.org/"),
},
complete => sub {
if ($ntf_name eq "Use a Windows driver (with ndiswrapper)") {
- require network::wireless;
+ require network::ndiswrapper;
unless ($in->do_pkgs->ensure_is_installed('ndiswrapper', '/usr/sbin/ndiswrapper')) {
$in->ask_warn(N("Error"), N("Could not install the %s package!", 'ndiswrapper'));
return 1;
}
undef $ndiswrapper_driver;
undef $ndiswrapper_device;
- unless (network::wireless::ndiswrapper_installed_drivers()) {
- $ndiswrapper_driver = network::wireless::ndiswrapper_ask_driver($in) or return 1;
+ unless (network::ndiswrapper::installed_drivers()) {
+ $ndiswrapper_driver = network::ndiswrapper::ask_driver($in) or return 1;
return !$ndiswrapper_do_driver_selection->();
}
}
@@ -1163,7 +1170,7 @@ notation (for example, 1.2.3.4).")),
ndiswrapper_select_driver =>
{
pre => sub {
- @ndiswrapper_drivers = network::wireless::ndiswrapper_installed_drivers();
+ @ndiswrapper_drivers = network::ndiswrapper::installed_drivers();
$ndiswrapper_driver ||= first(@ndiswrapper_drivers);
},
data => sub {
@@ -1172,7 +1179,7 @@ notation (for example, 1.2.3.4).")),
format => sub { defined $_[0] ? N("Use the ndiswrapper driver %s", $_[0]) : N("Install a new driver") } } ];
},
complete => sub {
- $ndiswrapper_driver ||= network::wireless::ndiswrapper_ask_driver($in) or return 1;
+ $ndiswrapper_driver ||= network::ndiswrapper::ask_driver($in) or return 1;
!$ndiswrapper_do_driver_selection->();
},
post => $ndiswrapper_next_step,
@@ -1182,7 +1189,7 @@ notation (for example, 1.2.3.4).")),
{
data => sub {
[ { label => N("Select a device:"), type => "list", val => \$ndiswrapper_device, allow_empty_list => 1,
- list => [ network::wireless::ndiswrapper_present_devices($ndiswrapper_driver) ],
+ list => [ network::ndiswrapper::present_devices($ndiswrapper_driver) ],
format => sub { $_[0]{description} } } ];
},
complete => sub {
@@ -1199,8 +1206,12 @@ notation (for example, 1.2.3.4).")),
$netc->{wireless_eth} = 1;
$ethntf->{WIRELESS_MODE} ||= "Managed";
$ethntf->{WIRELESS_ESSID} ||= "any";
- $wireless_use_wpa = exists $ethntf->{WIRELESS_WPA_DRIVER};
- $wireless_use_wpa or $wireless_key = network::wireless::convert_wep_key_for_iwconfig($ethntf->{WIRELESS_ENC_KEY});
+ ($wireless_enc_key, my $restricted) = network::wireless::get_wep_key_from_iwconfig($ethntf->{WIRELESS_ENC_KEY});
+ $wireless_enc_mode =
+ exists $ethntf->{WIRELESS_WPA_DRIVER} ? 'wpa-psk' :
+ !$wireless_enc_key ? 'none' :
+ $restricted ? 'restricted' :
+ 'open';
},
name => N("Please enter the wireless parameters for this card:"),
data => sub {
@@ -1213,9 +1224,10 @@ notation (for example, 1.2.3.4).")),
{ label => N("Operating frequency"), val => \$ethntf->{WIRELESS_FREQ}, advanced => 1 },
{ label => N("Sensitivity threshold"), val => \$ethntf->{WIRELESS_SENS}, advanced => 1 },
{ label => N("Bitrate (in b/s)"), val => \$ethntf->{WIRELESS_RATE}, advanced => 1 },
- { label => N("Encryption key"), val => \$wireless_key },
- #- FIXME: ask if the access point is open or restricted
- { text => N("Use Wi-Fi Protected Access (WPA)"), val => \$wireless_use_wpa, type => "bool" },
+ { label => N("Encryption mode"), val => \$wireless_enc_mode,
+ list => [ sort { $wireless_enc_modes{$a} cmp $wireless_enc_modes{$b} } keys %wireless_enc_modes ],
+ format => sub { $wireless_enc_modes{$_[0]} } },
+ { label => N("Encryption key"), val => \$wireless_enc_key, disabled => sub { $wireless_enc_mode eq 'none' } },
{ label => N("RTS/CTS"), val => \$ethntf->{WIRELESS_RTS}, advanced => 1,
help => N("RTS/CTS adds a handshake before each packet transmission to make sure that the
channel is clear. This adds overhead, but increase performance in case of hidden
@@ -1267,14 +1279,19 @@ See iwpriv(8) man page for further information."),
}
},
post => sub {
- $module =~ /^prism2_/ and network::wireless::wlan_ng_configure($in, $ethntf, $module);
- if ($wireless_use_wpa) {
- $ethntf->{WIRELESS_WPA_DRIVER} = network::wireless::wpa_supplicant_get_driver($module);
- network::wireless::wpa_supplicant_configure($in, $ethntf);
+ if ($wireless_enc_mode eq 'none') {
+ delete $ethntf->{WIRELESS_ENC_KEY};
} else {
- $ethntf->{WIRELESS_ENC_KEY} = network::wireless::get_wep_key_from_iwconfig($wireless_key);
- delete $ethntf->{WIRELESS_WPA_DRIVER};
+ #- keep the key even for WPA, so that drakconnect remembers it
+ $ethntf->{WIRELESS_ENC_KEY} = network::wireless::convert_wep_key_for_iwconfig($wireless_enc_key, $wireless_enc_mode eq 'restricted');
+ if ($wireless_enc_mode eq 'wpa-psk') {
+ $ethntf->{WIRELESS_WPA_DRIVER} = network::wireless::wpa_supplicant_get_driver($module);
+ network::wireless::wpa_supplicant_configure($in, $ethntf);
+ } else {
+ delete $ethntf->{WIRELESS_WPA_DRIVER};
+ }
}
+ $module =~ /^prism2_/ and network::wireless::wlan_ng_configure($in, $ethntf, $module);
return "static_hostname";
},
},
diff --git a/perl-install/network/wireless.pm b/perl-install/network/wireless.pm
index 564cafb9b..27f06971b 100644
--- a/perl-install/network/wireless.pm
+++ b/perl-install/network/wireless.pm
@@ -2,16 +2,14 @@ package network::wireless;
use strict;
use common;
-use modules;
-use detect_devices;
-use c;
sub convert_wep_key_for_iwconfig {
#- 5 or 13 characters, consider the key as ASCII and prepend "s:"
#- else consider the key as hexadecimal, do not strip dashes
#- always quote the key as string
- my ($key) = @_;
- member(length($key), (5, 13)) ? "s:$key" : $key;
+ my ($real_key, $restricted) = @_;
+ my $key = member(length($real_key), (5, 13)) ? "s:$real_key" : $real_key;
+ $restricted ? "restricted $key" : "open $key";
}
sub get_wep_key_from_iwconfig {
@@ -19,7 +17,8 @@ sub get_wep_key_from_iwconfig {
#- else the key as hexadecimal, do not modify
my ($key) = @_;
$key =~ s/^s:// if member(length($key), (7,15));
- $key;
+ my ($mode, $real_key) = $key =~ /^(?:(open|restricted)\s+)?(.*)$/;
+ ($real_key, $mode eq 'restricted');
}
sub convert_key_for_wpa_supplicant {
@@ -170,104 +169,4 @@ sub wpa_supplicant_add_network {
chmod 0600, $wpa_supplicant_conf;
}
-my $ndiswrapper_prefix = "$::prefix/etc/ndiswrapper";
-
-sub ndiswrapper_installed_drivers() {
- grep { -d "$ndiswrapper_prefix/$_" } all($ndiswrapper_prefix);
-}
-
-sub ndiswrapper_present_devices {
- my ($driver) = @_;
- my @supported_devices;
- foreach (all("$ndiswrapper_prefix/$driver")) {
- my ($ids) = /^([0-9A-Z]{4}:[0-9A-Z]{4})\.[05]\.conf$/;
- $ids and push @supported_devices, $ids;
- }
- grep { member(uc(sprintf("%04x:%04x", $_->{vendor}, $_->{id})), @supported_devices) } detect_devices::probeall();
-}
-
-sub ndiswrapper_get_devices {
- my ($in, $driver) = @_;
- my @devices = ndiswrapper_present_devices($driver);
- @devices or $in->ask_warn(N("Error"), N("No device supporting the %s ndiswrapper driver is present!", $driver));
- @devices;
-}
-
-sub ndiswrapper_ask_driver {
- my ($in) = @_;
- if (my $inf_file = $in->ask_file(N("Please select the Windows driver (.inf file)"), "/mnt/cdrom")) {
- my $driver = basename(lc($inf_file));
- $driver =~ s/\.inf$//;
-
- #- first uninstall the driver if present, may solve issues if it is corrupted
- -d "$ndiswrapper_prefix/$driver" and system('ndiswrapper', '-e', $driver);
-
- unless (system('ndiswrapper', '-i', $inf_file) == 0) {
- $in->ask_warn(N("Error"), N("Unable to install the %s ndiswrapper driver!", $driver));
- return undef;
- }
-
- return $driver;
- }
- undef;
-}
-
-sub ndiswrapper_find_matching_devices {
- my ($device) = @_;
- my $net_path = '/sys/class/net';
- my @devices;
-
- foreach my $interface (all($net_path)) {
- my $dev_path = "$net_path/$interface/device";
- -l $dev_path or next;
-
- my %map = (vendor => 'vendor', device => 'id');
- if (every { hex(chomp_(cat_("$dev_path/$_"))) eq $device->{$map{$_}} } keys %map) {
- my $driver = readlink("$net_path/$interface/driver");
- $driver =~ s!.*/!!;
- push @devices, [ $interface, $driver ];
- }
- }
-
- @devices;
-}
-
-sub ndiswrapper_find_conflicting_devices {
- my ($device) = @_;
- grep { $_->[1] ne "ndiswrapper" } ndiswrapper_find_matching_devices($device);
-}
-
-sub ndiswrapper_find_interface {
- my ($device) = @_;
- my $dev = find { $_->[1] eq "ndiswrapper" } ndiswrapper_find_matching_devices($device);
- $dev->[0];
-}
-
-sub ndiswrapper_setup_device {
- my ($in, $device) = @_;
-
- eval { modules::unload("ndiswrapper") };
- #- unload ndiswrapper first so that the newly installed .inf files will be read
- eval { modules::load("ndiswrapper") };
-
- if ($@) {
- $in->ask_warn(N("Error"), N("Unable to load the ndiswrapper module!"));
- return;
- }
-
- my @ndiswrapper_conflicts = ndiswrapper_find_conflicting_devices($device);
- if (@ndiswrapper_conflicts) {
- $in->ask_yesorno(N("Warning"), N("The selected device has already been configured with the %s driver.
-Do you really want to use a ndiswrapper driver ?", $ndiswrapper_conflicts[0][1])) or return;
- }
-
- my $interface = ndiswrapper_find_interface($device);
- unless ($interface) {
- $in->ask_warn(N("Error"), N("Unable to find the ndiswrapper interface!"));
- return;
- }
-
- $interface;
-}
-
1;