summaryrefslogtreecommitdiffstats
path: root/perl-install/network/tools.pm
diff options
context:
space:
mode:
Diffstat (limited to 'perl-install/network/tools.pm')
-rw-r--r--perl-install/network/tools.pm112
1 files changed, 91 insertions, 21 deletions
diff --git a/perl-install/network/tools.pm b/perl-install/network/tools.pm
index aae98c90d..14fe48e3f 100644
--- a/perl-install/network/tools.pm
+++ b/perl-install/network/tools.pm
@@ -3,12 +3,13 @@ package network::tools; # $Id$
use strict;
use common;
use run_program;
+use fsedit;
use c;
use vars qw(@ISA @EXPORT @EXPORT_OK);
use MDK::Common::System qw(getVarsFromSh);
@ISA = qw(Exporter);
-@EXPORT = qw(connect_backend connected connected_bg disconnect_backend is_dynamic_ip passwd_by_login read_secret_backend set_cnx_script test_connected write_cnx_script remove_initscript write_secret_backend);
+@EXPORT = qw(connect_backend connected connected_bg disconnect_backend is_dynamic_ip passwd_by_login read_secret_backend set_cnx_script test_connected write_cnx_script remove_initscript write_secret_backend start_interface stop_interface);
our $connect_prog = "/etc/sysconfig/network-scripts/net_cnx_pg";
our $connect_file = "/etc/sysconfig/network-scripts/net_cnx_up";
@@ -71,11 +72,37 @@ sub passwd_by_login {
}
}
-sub connect_backend() { run_program::rooted($::prefix, "$connect_file &") }
+sub connect_backend {
+ my ($netc) = @_;
+ run_program::rooted($::prefix, "ifup $netc->{NET_INTERFACE} &");
+}
-sub disconnect_backend() { run_program::rooted($::prefix, "$disconnect_file &") }
+sub disconnect_backend {
+ my ($netc) = @_;
+ run_program::rooted($::prefix, "ifdown $netc->{NET_INTERFACE} &");
+}
-sub connected() { gethostbyname("mandrakesoft.com") ? 1 : 0 }
+sub bg_command_as_root {
+ my ($name, @args) = @_;
+ #- FIXME: duplicate code from common::require_root_capability
+ if (check_for_xserver() && fuzzy_pidofs(qr/\bkwin\b/) > 0) {
+ run_program::raw({ detach => 1 }, "kdesu", "--ignorebutton", "-c", "$name @args");
+ } else {
+ run_program::raw({ detach => 1 }, [ 'consolehelper', $name ], @args);
+ }
+}
+
+sub start_interface {
+ my ($intf) = @_;
+ bg_command_as_root('/sbin/ifup', $intf);
+}
+
+sub stop_interface {
+ my ($intf) = @_;
+ bg_command_as_root('/sbin/ifdown', $intf);
+}
+
+sub connected() { gethostbyname("mandriva.com") ? 1 : 0 }
# request a ref on a bg_connect and a ref on a scalar
sub connected_bg__raw {
@@ -145,21 +172,18 @@ sub check_link_beat() {
sub remove_initscript() {
$::testing and return;
- -e "$::prefix/etc/rc.d/init.d/internet" and do {
- $::isStandalone ? system("/sbin/chkconfig --del internet") : do {
- rm_rf("$::prefix/etc/rc.d/rc$_") foreach '0.d/K11internet', '1.d/K11internet', '2.d/K11internet',
- '3.d/S89internet', '5.d/S89internet', '6.d/K11internet';
- };
+ if (-e "$::prefix/etc/rc.d/init.d/internet") {
+ run_program::rooted($::prefix, "/sbin/chkconfig", "--del", "internet");
rm_rf("$::prefix/etc/rc.d/init.d/internet");
log::explanations("Removed internet service");
- };
+ }
}
sub use_windows {
my ($file) = @_;
my $all_hds = fsedit::get_hds({}, undef);
- fs::get_info_from_fstab($all_hds, '');
- my $part = find { $_->{device_windobe} eq 'C' } fsedit::get_fstab(@{$all_hds->{hds}});
+ fs::get_info_from_fstab($all_hds);
+ my $part = find { $_->{device_windobe} eq 'C' } fs::get::fstab($all_hds);
$part or my $failed = N("No partition available");
my $source = find { -d $_ && -r "$_/$file" } map { "$part->{mntpoint}/$_" } qw(windows/system winnt/system windows/system32/drivers winnt/system32/drivers);
log::explanations($failed || "Seek in $source to find firmware");
@@ -189,20 +213,12 @@ sub is_dynamic_host {
any { defined $_->{DHCP_HOSTNAME} } values %$intf;
}
-sub reread_net_conf {
- my ($netcnx, $netc, $intf) = @_;
- network::netconnect::read_net_conf('', $netcnx, $netc);
- modules::load_category('net');
- network::netconnect::load_conf($netcnx, $netc, $intf);
-}
-
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) = @_;
- unquotify \$key;
- member(length($key), (5, 13)) ? qq("s:$key") : qq("$key");
+ member(length($key), (5, 13)) ? "s:$key" : $key;
}
sub get_wep_key_from_iwconfig {
@@ -213,4 +229,58 @@ sub get_wep_key_from_iwconfig {
$key;
}
+
+#- returns interface whose IP address matchs given IP address, according to its network mask
+sub find_matching_interface {
+ my ($intf, $address) = @_;
+ my @ip = split '\.', $address;
+ find {
+ my @intf_ip = split '\.', $intf->{$_}{IPADDR} or return;
+ my @mask = split '\.', $intf->{$_}{NETMASK} or return;
+ every { $_ } mapn { ($_[0] & $_[2]) == ($_[1] & $_[2]) } \@intf_ip, \@ip, \@mask;
+ } sort keys %$intf;
+}
+
+#- returns gateway interface if found
+sub get_default_gateway_interface {
+ my ($netc, $intf) = @_;
+ my @intfs = sort keys %$intf;
+ `$::prefix/sbin/ip route show` =~ /^default.*\s+dev\s+(\S+)/m && $1 ||
+ $netc->{GATEWAYDEV} ||
+ $netc->{GATEWAY} && find_matching_interface($intf, $netc->{GATEWAY}) ||
+ (find { get_interface_type($intf->{$_}) eq 'adsl' } @intfs) ||
+ (find { get_interface_type($intf->{$_}) eq 'isdn' && text2bool($intf->{$_}{DIAL_ON_IFUP}) } @intfs) ||
+ (find { get_interface_type($intf->{$_}) eq 'modem' } @intfs) ||
+ (find { get_interface_type($intf->{$_}) eq 'ethernet' && $intf->{$_}{BOOTPROTO} eq 'dhcp' } @intfs);
+}
+
+#- returns (gateway_interface, interface is up, gateway address, dns server address)
+sub get_internet_connection {
+ my ($netc, $intf, $o_gw_intf) = @_;
+ my @routes = `$::prefix/sbin/ip route show`;
+ my ($gw_intf, $is_up, $gw_address);
+ $gw_intf = $o_gw_intf || get_default_gateway_interface($netc, $intf) or return;
+ $is_up = to_bool(grep { /\s+dev\s+$gw_intf(?:\s+|$)/ } @routes);
+ ($gw_address) = join('', @routes) =~ /^default\s+via\s+(\S+).*\s+dev\s+$gw_intf(?:\s+|$)/m;
+ return $gw_intf, $is_up, $gw_address, $netc->{dnsServer};
+}
+
+sub get_interface_type {
+ my ($interface) = @_;
+ member($interface->{TYPE}, "xDSL", "ADSL") && "adsl" ||
+ $interface->{DEVICE} =~ /^(eth|ath|wlan)/ && "ethernet" ||
+ $interface->{DEVICE} =~ /^ippp/ && "isdn" ||
+ $interface->{DEVICE} =~ /^ppp/ && "modem" ||
+ "unknown";
+}
+
+sub get_default_metric {
+ my ($type) = @_;
+ my @known_types = ("ethernet_gigabit", "ethernet", "adsl", "isdn", "modem", "unknown");
+ my $idx;
+ eval { $idx = find_index { $type eq $_ } @known_types };
+ $idx = @known_types if $@;
+ $idx * 10;
+}
+
1;