diff options
Diffstat (limited to 'perl-install/network/tools.pm')
| -rw-r--r-- | perl-install/network/tools.pm | 112 |
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; |
