diff options
Diffstat (limited to 'perl-install/network')
-rw-r--r-- | perl-install/network/adsl.pm | 200 | ||||
-rw-r--r-- | perl-install/network/ethernet.pm | 117 | ||||
-rw-r--r-- | perl-install/network/isdn.pm | 268 | ||||
-rw-r--r-- | perl-install/network/modem.pm | 88 | ||||
-rw-r--r-- | perl-install/network/netconnect.pm | 597 | ||||
-rw-r--r-- | perl-install/network/network.pm | 486 | ||||
-rw-r--r-- | perl-install/network/tools.pm | 76 |
7 files changed, 1832 insertions, 0 deletions
diff --git a/perl-install/network/adsl.pm b/perl-install/network/adsl.pm new file mode 100644 index 000000000..a09f58823 --- /dev/null +++ b/perl-install/network/adsl.pm @@ -0,0 +1,200 @@ +package network::adsl; + +#use network::tools; + +use vars qw(@ISA @EXPORT); + +@ISA = qw(Exporter); +@EXPORT = qw(adsl_ask_info adsl_detect adsl_conf adsl_conf_backend); + +sub configure{ + $::isInstall and $in->set_help('configureNetworkADSL'); + conf_adsl_step1: + my $type = $in->ask_from_list_(_("Connect to the Internet"), + _("The most common way to connect with adsl is pppoe. +Some connections use pptp, a few ones use dhcp. +If you don't know, choose 'use pppoe'"), [__("use pppoe"), __("use pptp"), __("use dhcp")]) or return; + $type =~ s/use //; + if ($type eq 'pppoe') { + $install->("rp-$type"); + $netcnx->{type} = "adsl_$type"; + $netcnx->{"adsl_$type"} = {}; + adsl_conf($netcnx->{"adsl_$type"}, $netc, $intf, $type) or goto conf_adsl_step1; + #-network::configureNetwork($prefix, $netc, $in, $intf, $first_time); + if ($::isStandalone and $netc->{NET_DEVICE}) { + $in->ask_yesorno(_("Network interface"), + _("I'm about to restart the network device %s. Do you agree?", $netc->{NET_DEVICE}), 1) + and system("$prefix/sbin/ifdown $netc->{NET_DEVICE}; $prefix/sbin/ifup $netc->{NET_DEVICE}"); + } + } + if ($type eq 'dhcp') { + $install->(qw(dhcpcd)); + go_ethernet($netc, $intf, 'dhcp', '', '', $first_time) or goto conf_adsl_step1; + } + if ($type eq 'pptp') { + $install->(qw(pptp-adsl-fr)); + $netcnx->{type} = "adsl_$type"; + $netcnx->{"adsl_$type"} = {}; + adsl_conf($netcnx->{"adsl_$type"}, $netc, $intf, $type) or goto conf_adsl_step1; + } + 1; +} + +sub adsl_ask_info { + my ($adsl, $netc, $intf) = @_; + add2hash($netc, { dnsServer2 => '', dnsServer3 => '', DOMAINNAME2 => '' }); + add2hash($adsl, { login => '', passwd => '', passwd2 => '' }); + ask_info2($adsl, $netc); +} + +#- adsl_detect : detect adsl modem on a given interface +#- input : +#- $interface : interface where the modem is supposed to be connected : should be "ethx" +#- output: +#- true/false : success|failed +sub adsl_detect { + return; + my ($interface) = @_; + run_program::rooted($prefix, "ifconfig $interface 10.0.0.10 netmask 255.255.255.0"); + my $ret=run_program::rooted($prefix, "/bin/ping -c 1 10.0.0.138 2> /dev/null"); + run_program::rooted($prefix, "ifconfig $interface 0.0.0.0 netmask 255.255.255.0"); + $ret; +} + +sub adsl_conf { + my ($adsl, $netc, $intf, $adsl_type) = @_; + + adsl_conf_step_1: + adsl_ask_info ($adsl, $netc, $intf) or return; + adsl_conf_step_2: + conf_network_card ($in, $netc, $intf, 'static' , '10.0.0.10' ) or goto adsl_conf_step_1; + adsl_conf_backend($adsl, $netc, $adsl_type); + + adsl_conf_step_3: + $adsl->{atboot} = $in->ask_yesorno(_("ADSL configuration"), + _("Do you want to start your connection at boot?") + ); + $::isStandalone and ask_connect_now($adsl, 'ppp0'); + 1; +} + +#- adsl_conf_backend : write adsl configuration +#- input : +#- $adsl +#- $netc +#- $adsl_type : type of cnx : string : "pptp" or "pppoe" +#- $adsl input: +#- $adsl->{login}, $adsl->{passwd}, $adsl->{atboot} +#- $netc input: +#- $netc->{NET_DEVICE} +#- $netc->{dnsServer2} +#- $netc->{dnsServer3} +#- $netc->{DOMAINNAME2} +#- $netc output: +#- $netc->{NET_INTERFACE} is set to "ppp0" +sub adsl_conf_backend { + my ($adsl, $netc, $adsl_type) = @_; + + output("$prefix/etc/ppp/options", + $adsl_type eq 'pptp' ? +"lock +noipdefault +noauth +usepeerdns +defaultroute +" : +"noipdefault +usepeerdns +hide-password +defaultroute +persist +lock +") if $adsl_type =~ /pptp|pppoe/; + + write_secret_backend($adsl->{login}, $adsl->{passwd}); + + if ($adsl_type eq 'pppoe') { + substInFile { + s/ETH=.*\n/ETH=$netc->{NET_DEVICE}\n/; + s/USER=.*\n/USER=$adsl->{login}\n/; + } "$prefix/etc/ppp/pppoe.conf"; + } + + output ("$prefix$connect_file", + $adsl_type eq 'pptp' ? +"#!/bin/bash +/sbin/route del default +/usr/bin/pptp 10.0.0.138 name $adsl->{login} +" +: +"#!/bin/bash +/sbin/route del default +LC_ALL=C LANG=C LANGUAGE=C LC_MESSAGES=C /usr/sbin/adsl-start $netc->{NET_DEVICE} $adsl->{login} +"); + output ("$prefix$disconnect_file", + $adsl_type eq 'pptp' ? + "#!/bin/bash +/usr/bin/killall pptp pppd +" +: +"#!/bin/bash +/usr/sbin/adsl-stop +/usr/bin/killall pppoe pppd +"); + chmod 0755, "$prefix$disconnect_file"; + chmod 0755, "$prefix$connect_file"; + + if ($adsl->{atboot}) { + output ("$prefix/etc/rc.d/init.d/adsl", + qq{ +#!/bin/bash +# +# adsl Bring up/down adsl connection +# +# chkconfig: 2345 11 89 +# description: Activates/Deactivates the adsl interfaces + case "$1" in + start) + echo -n "Starting adsl connection: " + $connect_file + touch /var/lock/subsys/adsl + echo -n adsl + echo + ;; + stop) + echo -n "Stopping adsl connection: " + $disconnect_file + echo -n adsl + echo + rm -f /var/lock/subsys/adsl + ;; + restart) + $0 stop + echo -n "Waiting 10 sec before restarting adsl." + sleep 10 + $0 start + ;; + status) + ;; + *) + echo "Usage: adsl {start|stop|status|restart}" + exit 1 +esac +exit 0 + }); + chmod 0755, "$prefix/etc/rc.d/init.d/adsl"; + $::isStandalone ? system("/sbin/chkconfig --add adsl") : do { + symlinkf ("../init.d/adsl", "$prefix/etc/rc.d/rc$_") foreach + '0.d/K11adsl', '1.d/K11adsl', '2.d/K11adsl', '3.d/S89adsl', '5.d/S89adsl', '6.d/K11adsl'; + }; + } + else { + -e "$prefix/etc/rc.d/init.d/adsl" and do{ + system("/sbin/chkconfig --del adsl"); + unlink "$prefix/etc/rc.d/init.d/adsl"; + }; + } + $netc->{NET_INTERFACE}="ppp0"; +} + +1; diff --git a/perl-install/network/ethernet.pm b/perl-install/network/ethernet.pm new file mode 100644 index 000000000..c03d64e9a --- /dev/null +++ b/perl-install/network/ethernet.pm @@ -0,0 +1,117 @@ +package network::ethernet; + +use network; +use modules; +use any; +use detect_devices; +use common qw(:file); +use vars qw(@ISA @EXPORT); + +@ISA = qw(Exporter); +@EXPORT = qw(conf_network_card conf_network_card_backend go_ethernet); + +sub conf_network_card { + my ($netc, $intf, $type, $ipadr, $netadr) = @_; + #-type =static or dhcp + any::setup_thiskind($in, 'net', !$::expert, 1); + my @all_cards=conf_network_card_backend($prefix, $netc, $intf, $type, undef, $ipadr, $netadr); + my $interface; + @all_cards == () and $in->ask_warn('', _("No ethernet network adapter has been detected on your system. +I cannot set up this connection type.")) and return; + @all_cards == 1 and $interface = $all_cards[0]->[0] and goto l1; + again : + $interface = $in->ask_from_list(_("Choose the network interface"), + _("Please choose which network adapter you want to use to connect to Internet"), + [ map { $_->[0] . ($_->[1] ? " ( using module $_->[1] )" : "") } @all_cards ] + ) or return; + defined $interface or goto again; + l1: + $::isStandalone and modules::write_conf($prefix); + + my $device=conf_network_card_backend($prefix, $netc, $intf, $type, $interface, $ipadr, $netadr, $interface); + if ( $::isStandalone and !($type eq "dhcp")) { + $in->ask_yesorno(_("Network interface"), + _("I'm about to restart the network device:\n") . $device . _("\nDo you agree?"), 1) and network::configureNetwork2($in, $prefix, $netc, $intf) and system("$prefix/sbin/ifdown $device;$prefix/sbin/ifup $device"); + } + 1; +} + +#- conf_network_card_backend : configure the network cards and return the list of them, or configure one specified interface : WARNING, you have to setup the ethernet cards, by calling setup_thiskind($in, 'net', !$::expert, 1) or setup_thiskind_backend before calling this function. Basically, you call this function in 2 times. +#- input +#- $prefix +#- $netc +#- $intf +#- $type : type of interface, must be given if $interface is : string : "static" or "dhcp" +#- $interface : facultative, if given, set this interface and return it in a proper form. If not, return @all_cards +#- $ipadr : facultative, ip address of the interface : string +#- $netadr : facultative, netaddress of the interface : string +#- when $interface is given, informations are written in $intf and $netc. If not, @all_cards is returned. +#- $intf output: $device is the result of +#- $intf->{$device}->{DEVICE} : which device is concerned : $device is the result of $interface =~ /(eth[0-9]+)/; my $device = $1;; +#- $intf->{$device}->{BOOTPROTO} : $type +#- $intf->{$device}->{NETMASK} : '255.255.255.0' +#- $intf->{$device}->{NETWORK} : $netadr +#- $intf->{$device}->{ONBOOT} : "yes" +#- $netc output: +#- $netc->{nb_cards} : nb of ethernet cards +#- $netc->{NET_DEVICE} : this is used to indicate that this eth card is used to connect to internet : $device +#- output: +#- $all_cards : a list of a list ( [eth1, module1], ... , [ethn, modulen]). Pass the ethx as $interface in further call. +#- $device : only returned in case $interface was given it's $interface, but filtered by /eth[0-9+]/ : string : /eth[0-9+]/ +sub conf_network_card_backend { + my ($prefix, $netc, $intf, $type, $interface, $ipadr, $netadr) = @_; + #-type =static or dhcp + if (!$interface) { + my @all_cards = detect_devices::getNet(); + $netc->{nb_cards} = @all_cards; + + my @devs = modules::get_pcmcia_devices(); + modules::mergein_conf("$prefix/etc/modules.conf"); + my $saved_driver; + return map { + my $interface = $_; + my $a = modules::get_alias($interface); + my $b; + foreach (@devs) { + $_->{device} eq $interface and $b = $_->{driver}; + } + $a ||= $b; + if ($a) { $saved_driver = $a } + [$interface, $saved_driver]; + } @all_cards; + } + my ($device) = $interface =~ /(eth[0-9]+)/ or die("the interface is not an ethx"); + $netc->{NET_DEVICE} = $device; #- one consider that there is only ONE Internet connection device.. + + @{$intf->{$device}}{qw(DEVICE BOOTPROTO NETMASK NETWORK ONBOOT)} = + ($device, $type, '255.255.255.0', $netadr, 'yes'); + + $intf->{$device}->{IPADDR} = $ipadr if $ipadr; + $device; +} + +sub go_ethernet { + my ($netc, $intf, $type, $ipadr, $netadr, $first_time) = @_; + conf_network_card($netc, $intf, $type, $ipadr, $netadr) or return; + $netc->{NET_INTERFACE}=$netc->{NET_DEVICE}; + network::configureNetwork($prefix, $netc, $in, $intf, $first_time) or return; + output "$prefix$connect_file", + qq( +#!/bin/bash +ifup $netc->{NET_DEVICE} +); + output "$prefix$disconnect_file", + qq( +#!/bin/bash +ifdown $netc->{NET_DEVICE} +); + chmod 0755, "$prefix$disconnect_file"; + chmod 0755, "$prefix$connect_file"; + if ( $::isStandalone and $netc->{NET_DEVICE}) { + $in->ask_yesorno(_("Network interface"), + _("I'm about to restart the network device $netc->{NET_DEVICE}. Do you agree?"), 1) and system("$prefix/sbin/ifdown $netc->{NET_DEVICE}; $prefix/sbin/ifup $netc->{NET_DEVICE}"); + } + 1; +} + +1; diff --git a/perl-install/network/isdn.pm b/perl-install/network/isdn.pm new file mode 100644 index 000000000..25c18cebf --- /dev/null +++ b/perl-install/network/isdn.pm @@ -0,0 +1,268 @@ +package network::isdn; + +#use network::tools; +use modules; +use common qw(:file); +use vars qw(@ISA @EXPORT); + +@ISA = qw(Exporter); +@EXPORT = qw(isdn_write_config isdn_write_config_backend get_info_providers_backend isdn_ask_info isdn_ask_protocol isdn_ask isdn_detect isdn_detect_backend isdn_get_list isdn_get_info); + +sub configure { + my ($netcnx, $netc) = @_; + isdn_step_1: + defined $netc->{autodetect}{isdn}{id} and goto intern_pci; + $::isInstall and $in->set_help('configureNetworkISDN'); + my $e = $in->ask_from_list_(_("Network Configuration Wizard"), + _("What kind is your ISDN connection?"), [ __("Internal ISDN card"), __("External ISDN modem")] + ) or return; + if ($e =~ /card/) { + intern_pci: + $netcnx->{type}='isdn_internal'; + $netcnx->{isdn_internal}={}; + $netcnx->{isdn_internal}{$_} = $netc->{autodetect}{isdn}{$_} foreach ('description', 'vendor', 'id', 'driver', 'card_type', 'type'); + isdn_detect($netcnx->{isdn_internal}, $netc) or return; + } else { + $netcnx->{type}='isdn_external'; + $netcnx->{isdn_external}={}; + $netcnx->{isdn_external}{device}=$netc->{autodetect}{modem}; + $netcnx->{isdn_external}{special_command}='AT&F&O2B40'; + pppConfig($netcnx->{isdn_external}, $mouse, $netc) or goto isdn_step_1; + } + 1; +} + +sub isdn_write_config { + my ($isdn) = @_; + isdn_write_config_step_1: + my $e = $in->ask_from_list_(_("Network Configuration Wizard"), + _("Which ISDN configuration do you prefer? + +* The full configuration uses isdn4net. It contains powerfull tools, but is tricky to configure for a newbie, and not standard. + +* The light configuration is easier to understand, more standard, but with less tools. + +We recommand the light configuration. + +"), [ __("Light configuration"), __("Full configuration (isdn4net)")] + ) or return; + $install->($e =~ /Light/ ? 'isdn-light' : 'isdn4net', 'isdn4k-utils'); + isdn_write_config_backend($isdn, $e =~ /Light/); + $::isStandalone and ask_connect_now($isdn, 'ippp0'); + 1; +} + +#- isdn_write_config_backend : write isdn info, only for ippp0 -> ask_connect_now +#- input : +#- $isdn +#- $light : boolean : if yes : uses the isdn-light package, if not, isdn4net +#- $isdn input: +#- $isdn->{login} $isdn->{passwd} $isdn->{phone_in} $isdn->{phone_out} $isdn->{dialing_mode} +#- $isdn->{driver} $isdn->{type} $isdn->{irq} $isdn->{mem} $isdn->{io} $isdn->{io0} $isdn->{io1} +sub isdn_write_config_backend { + my ($isdn, $light) = @_; + if ($light) { + any::setup_thiskind($in, 'isdn', !$::expert, 1); + foreach my $f ('ioptions1B', 'ioptions2B') { + substInFile { s/^name .*\n//; $_ .= "name $isdn->{login}\n" if eof } "$prefix/etc/ppp/$f"; + chmod 0600, $f; + } + foreach my $f ('isdn1B.conf', 'isdn2B.conf') { + substInFile { + s/EAZ = .*\n/EAZ = $isdn->{phone_in}/; + s/PHONE_OUT = .*\n/PHONE_OUT = $isdn->{phone_out}/; + } "$prefix/etc/isdn/$f"; + chmod 0600, $f; + } + } else { + my $f = "$prefix/etc/isdn/profile/link/myisp"; + output $f, + qq( +I4L_USERNAME="$isdn->{login}" +I4L_SYSNAME="" +I4L_LOCALMSN="$isdn->{phone_in}" +I4L_REMOTE_OUT="$isdn->{phone_out}" +I4L_DIALMODE="$isdn->{dialing_mode}" +); + chmod 0600, $f; + + output "$prefix/etc/isdn/profile/card/mycard", + qq( +I4L_MODULE="$isdn->{driver}" +I4L_TYPE="$isdn->{type}" +I4L_IRQ="$isdn->{irq}" +I4L_MEMBASE="$isdn->{mem}" +I4L_PORT="$isdn->{io}" +I4L_IO0="$isdn->{io0}" +I4L_IO1="$isdn->{io1}" +); + + output "$prefix/etc/ppp/ioptions", + "lock +usepeerdns +defaultroute +"; + system "$prefix/etc/rc.d/init.d/isdn4linux restart"; + } + write_secret_backend($isdn->{login}, $isdn->{passwd}); + + output "$prefix$connect_file", + "#!/bin/bash +/sbin/route del default +/sbin/ifup ippp0 +/sbin/isdnctrl dial ippp0 +"; + + output "$prefix$disconnect_file", + "#!/bin/bash +/sbin/isdnctrl hangup ippp0 +/sbin/ifdown ippp0 +"; + chmod 0755, "$prefix$disconnect_file"; + chmod 0755, "$prefix$connect_file"; + 1; +} + +#- get_info_isdn_backend : fills the infos from the line of the tree returned into $isdn and $netc +#- input : +#- $isdn +#- $netc +#- $name : the line choosen in the tree of ISP : string : /^(.*)\|(.*)\|(.*)$/ with $1=Land $2=City $3=ISP_name +#- $file : 1st location of the file : ISDN_DB_FILE +#- $file2 : 2nd location of the file : ISDN_DB_FILE +#- $isdn ouput +#- $isdn->{user_name}, $isdn->{phone_out}, $netc->{DOMAINNAME2}, $netc->{dnsServer2}, $netc->{dnsServer3}, +#- $netc output +#- $netc->{DOMAINNAME2}, $netc->{dnsServer2}, $netc->{dnsServer3} +sub get_info_providers_backend { + my ($isdn, $netc, $name, $file) = @_; + $name eq 'Unlisted - edit manually' and return; + foreach (catMaybeCompressed($file)) { + chop; + my ($name_, $phone, $real, $dns1, $dns2) = split '=>'; + if ($name eq $name_) { + @{$isdn}{qw(user_name phone_out DOMAINNAME2 dnsServer3 dnsServer2)} = + ((split(/\|/, $name_))[2], $phone, $real, $dns1, $dns2); + } + } +} + +sub isdn_ask_info { + my ($isdn, $netc) = @_; + my $f = "$ENV{SHARE_PATH}/ldetect-lst/isdn.db"; + $f = "$prefix$f" if !-e $f; + my $str= $in->ask_from_treelist( _("ISDN Configuration"), _("Select your provider.\n If it's not in the list, choose Unlisted"), + '|', ['Unlisted - edit manually', + netconnect::read_providers_backend($f)], 'Unlisted - edit manually') + or return; + get_info_providers_backend($isdn, $netc, $str || 'Unlisted - edit manually', $f); + $isdn->{$_} ||= '' foreach qw(phone_in phone_out dialing_mode login passwd passwd2 idl); + add2hash($netc, { dnsServer2 => '', dnsServer3 => '', DOMAINNAME2 => '' }); + ask_info2($isdn, $netc); +} + +sub isdn_ask_protocol { + my @toto=( + { description => $::expert ? _("Europe (EDSS1)") : _("Europe"), + protokol => 2}, + { description => $::expert ? _("Rest of the world \n no D-Channel (leased lines)") : _("Rest of the world"), + protokol => 3} + ); + my $e = $in->ask_from_listf(_("ISDN Configuration"), + _("Which protocol do you want to use ?"), + sub { $_[0]{description} }, + \@toto ) or return 0; + $e->{protokol}; +} + +sub isdn_ask { + my ($isdn, $netc, $label) = @_; + isdn_ask_step_1: + my $e = $in->ask_from_list_(_("ISDN Configuration"), + $label . "\n" . _("What kind of card do you have?"), + [ __("ISA / PCMCIA"), __("PCI"), __("I don't know") ] + ) or return; + if ($e =~ /PCI/) { + $isdn->{card_type} = 'pci'; + } else { + $in->ask_from_list_(_("ISDN Configuration"), + _(" +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. +"), + [ __("Continue"), __("Abort") ]) eq 'Continue' or goto isdn_ask_step_1; + $isdn->{card_type} = 'isa'; + } + + isdn_ask_step_2: + $e = $in->ask_from_listf(_("ISDN Configuration"), + _("Which is your ISDN card ?"), + sub { $_[0]{description} }, + [ grep {$_->{card} eq $isdn->{card_type}; } @isdndata ] ) or goto isdn_ask_step_1; + $isdn->{driver}='hisax'; + $e->{$_} and $isdn->{$_} = $e->{$_} foreach qw(type mem io io0 io1 irq); + + isdn_ask_step_3: + $isdn->{protocol} = isdn_ask_protocol() or goto isdn_ask_step_2; + isdn_ask_step_4: + isdn_ask_info($isdn, $netc) or goto isdn_ask_step_3; + isdn_write_config($isdn) or goto isdn_ask_step_4; + 1; +} + +sub isdn_detect { + my ($isdn, $netc) = @_; + if ($isdn->{id}) { + log::l("found isdn card : $isdn->{description}; vendor : $isdn->{vendor};id : $isdn->{id}; driver : $isdn->{driver}\n"); + $isdn->{description} =~ s/\|/ -- /; + if ($isdn->{type} eq '') { + isdn_ask($isdn, $netc, _("I have detected an ISDN PCI Card, but I don't know the type. Please select one PCI card on the next screen.")) or return; + } else { + isdn_detect_step_1: + $isdn->{protocol}=isdn_ask_protocol() or return; + isdn_detect_step_2: + isdn_ask_info($isdn, $netc) or goto isdn_detect_step_1; + isdn_write_config($isdn) or goto isdn_detect_step_2; + } + } else { + isdn_ask($isdn, $netc, _("No ISDN PCI card found. Please select one on the next screen.")) or return; + } + $netc->{$_}='ippp0' foreach 'NET_DEVICE', 'NET_INTERFACE'; + 1; +} + +#- isdn_detect_backend : detects isdn pci card and fills the infos in $isdn : only detects one card +#- input +#- $isdn +#- $isdn output: +#- $isdn->{description} $isdn->{vendor} $isdn->{id} $isdn->{driver} $isdn->{card_type} $isdn->{type} + +sub isdn_detect_backend { + my ($isdn) = @_; + if (my ($c) = (modules::get_that_type('isdn'))) { + $isdn->{$_} = $c->{$_} foreach qw(description vendor id driver options); + $isdn->{$_} = sprintf("%0x", $isdn->{$_}) foreach ('vendor', 'id'); + $isdn->{card_type} = 'pci'; + $isdn->{type} = $isdnid2type{$isdn->{vendor} . $isdn->{id}}; #If the card is not listed, type is void. You have to ask it then. + } +} + +#- isdn_get_list : return isdn cards descriptions list. This function is not use internally. +#- output : descriptions : list of strings + +sub isdn_get_list { + map { $_->{description} } @isdndata; +} + +#- isdn_get_info : return isdn card infos. This function is not use internally. +#- input : the description of the card (see isdn_get_list) +#- output : a reference on the decription of the card. : ref on a hash(description,type,irq,mem,io,io0,io1card,) + +sub isdn_get_info { + my ($desc) = @_; + foreach (@isdndata) { + return $_ if ($_->{description} eq $desc); + } +} + +1; diff --git a/perl-install/network/modem.pm b/perl-install/network/modem.pm new file mode 100644 index 000000000..e97ad13fd --- /dev/null +++ b/perl-install/network/modem.pm @@ -0,0 +1,88 @@ +package network::modem; +use common qw(:common :file); +use network::tools; +use vars qw(@ISA @EXPORT); + +@ISA = qw(Exporter); +@EXPORT = qw(pppConfig modem_detect_backend); + +sub configure{ + my ($netcnx, $mouse, $netc) = @_; + $netcnx->{type}='modem'; + $netcnx->{$netcnx->{type}}={}; + $netcnx->{modem}{device}=$netc->{autodetect}{modem}; + modem_step_1: + pppConfig($netcnx->{$netcnx->{type}}, $mouse, $netc) or return; + output "$prefix$connect_file", + q(#!/bin/bash +ifup ppp0 +); + output "$prefix$disconnect_file", + q(#!/bin/bash +ifdown ppp0 +killall pppd +); + chmod 0755, "$prefix$disconnect_file"; + chmod 0755, "$prefix$connect_file"; + if ($::isStandalone) { ask_connect_now($netcnx->{$netcnx->{type}}, 'ppp0') or goto modem_step_1 } + 1; +} + +sub pppConfig { + my ($modem, $mouse, $netc) = @_; + + $mouse ||={}; + $mouse->{device} ||= readlink "$prefix/dev/mouse"; + $::isInstall and $in->set_help('selectSerialPort'); + $modem->{device} ||= $in->ask_from_listf('', _("Please choose which serial port your modem is connected to."), + \&mouse::serial_port2text, + [ grep { $_ ne $mouse->{device} } (mouse::serial_ports, if_(-e '/dev/modem', '/dev/modem')) ]) || return; + + $::isStandalone || $in->set_help('configureNetworkISP'); + $in->ask_from_entries_refH('', _("Dialup options"), [ +{ label => _("Connection name"), val => \$modem->{connection} }, +{ label => _("Phone number"), val => \$modem->{phone} }, +{ label => _("Login ID"), val => \$modem->{login} }, +{ label => _("Password"), val => \$modem->{passwd}, hidden => 1 }, +{ label => _("Authentication"), val => \$modem->{auth}, list => [ __("PAP"), __("Terminal-based"), __("Script-based") ] }, +{ label => _("Domain name"), val => \$modem->{domain} }, +{ label => _("First DNS Server (optional)"), val => \$modem->{dns1} }, +{ label => _("Second DNS Server (optional)"), val => \$modem->{dns2} }, + ]) or return; + any::pppConfig($modem, $install); + $netc->{$_}='ppp0' foreach 'NET_DEVICE', 'NET_INTERFACE'; + 1; +} +#-AT&F&O2B40 +#- DialString=ATDT0231389595(( + +#- modem_detect_backend : detects modem on serial ports and fills the infos in $modem : detects only one card +#- input +#- $modem +#- $mouse : facultative, hash containing device to exclude not to test mouse port : ( device => /ttyS[0-9]/ ) +#- output: +#- $modem->{device} : device where the modem were detected +sub modem_detect_backend { + my ($modem, $mouse) = @_; + $mouse ||={}; + $mouse->{device} ||= readlink "/dev/mouse"; + my $serdev = arch() =~ /ppc/ ? "macserial" : "serial"; + eval { modules::load("$serdev") }; + + detect_devices::probeSerialDevices(); + foreach ('modem', map { "ttyS$_" } (0..7)) { + next if $mouse->{device} =~ /$_/; + next unless -e "/dev/$_"; + detect_devices::hasModem("/dev/$_") and $modem->{device} = "$_", last; + } + + #- add an alias for macserial on PPC + modules::add_alias('serial', $serdev) if (arch() =~ /ppc/ && $modem->{device}); + my @devs = modules::get_pcmcia_devices(); + foreach (@devs) { + $_->{type} =~ /serial/ and $modem->{device} = $_->{device}; + } + +} + +1; diff --git a/perl-install/network/netconnect.pm b/perl-install/network/netconnect.pm new file mode 100644 index 000000000..73a00a64e --- /dev/null +++ b/perl-install/network/netconnect.pm @@ -0,0 +1,597 @@ + +package netconnect; + +use diagnostics; +use strict; +use vars qw($in $install $prefix $isdn_init @isdndata %isdnid2type $connect_file $disconnect_file $connect_prog); + +use common qw(:common :file :functional :system); +use log; +use detect_devices; +use run_program; +use network::netconnect_consts; +use modules; +use any; +use mouse; +use network; +use commands; +#require Data::Dumper; + +use network::tools; + +$connect_file = "/etc/sysconfig/network-scripts/net_cnx_up"; +$disconnect_file = "/etc/sysconfig/network-scripts/net_cnx_down"; +$connect_prog = "/etc/sysconfig/network-scripts/net_cnx_pg"; + +sub init { ($prefix, $in, $install) = @_ } + +#- intro is called only in standalone. +sub intro { + ($prefix, my $netcnx, $in, $install) = @_; + my ($netc, $mouse, $intf) = ({}, {}, {}); + my $text; + my $connected; + read_net_conf($netcnx, $netc); + if (!$::isWizard) { + if (connected($netc)) { + $text=_("You are currently connected to internet.") . (-e $disconnect_file ? _("\nYou can disconnect or reconfigure your connection.") : _("\nYou can reconfigure your connection.")); + $connected=1; + } else { + $text=_("You are not currently connected to Internet.") . (-e $connect_file ? _("\nYou can connect to Internet or reconfigure your connection.") : _("\nYou can reconfigure your connection.")); + $connected=0; + } + my @l=( + !$connected && -e $connect_file ? { description => _("Connect to Internet"), + c => 1} : (), + $connected && -e $disconnect_file ? { description => _("Disconnect from Internet"), + c => 2} : (), + { description => _("Configure network connection (LAN or Internet)"), + c => 3}, + ); + my $e = $in->ask_from_listf(_("Internet connection & configuration"), + _($text), + sub { $_[0]{description} }, + \@l ); + run_program::rooted($prefix, $connect_prog) if ($e->{c}==1); + run_program::rooted($prefix, $disconnect_file) if ($e->{c}==2); + main($prefix, $netcnx, $netc, $mouse, $in, $intf, $install, 0, 0) if ($e->{c}==3); + } else { + main($prefix, $netcnx, $netc, $mouse, $in, $intf, $install, 0, 0); + } +} + +sub detect { + my ($auto_detect, $net_install) = @_; + my $isdn={}; + require network::isdn; + network::isdn->import; + isdn_detect_backend($isdn); + $auto_detect->{isdn}{$_}=$isdn->{$_} foreach qw(description vendor id driver card_type type); + $auto_detect->{isdn}{description} =~ s/.*\|//; + + any::setup_thiskind_backend('net', undef); + require network::ethernet; + network::ethernet->import; + my @all_cards = conf_network_card_backend ('', undef, undef, undef, undef, undef, undef); + require network::adsl; + network::adsl->import; + map { + ( !$net_install and adsl_detect("", $_->[0]) ) ? $auto_detect->{adsl}=$_->[0] : $auto_detect->{lan}{$_->[0]}=$_->[1]; } @all_cards; + my $modem={}; + require network::modem; + network::modem->import; + modem_detect_backend($modem);#, $mouse); + $modem->{device} and $auto_detect->{modem}=$modem->{device}; +} + +sub main { + ($prefix, my $netcnx, my $netc, my $mouse, $in, my $intf, $install, my $first_time, my $direct_fr) = @_; + $netc->{minus_one}=0; #When one configure an eth in dhcp without gateway + $::isInstall and $in->set_help('configureNetwork'); + my $continue = !(!$::expert && values %$intf > 0 && $first_time); + $::isStandalone and read_net_conf($netcnx, $netc); # REDONDANCE with intro. FIXME + $netc->{NET_DEVICE}=$netcnx->{NET_DEVICE} if $netcnx->{NET_DEVICE}; # REDONDANCE with read_conf. FIXME + $netc->{NET_INTERFACE}=$netcnx->{NET_INTERFACE} if $netcnx->{NET_INTERFACE}; # REDONDANCE with read_conf. FIXME + network::read_all_conf($prefix, $netc ||= {}, $intf ||= {}); +# $in->set_help('') unless $::isStandalone; + +#use network::adsl; +#use network::ethernet; +#use network::isdn; +#use network::modem; + + my $configure_modem = sub { + require network::modem; + network::modem::configure($netcnx, $mouse, $netc); + }; + + my $configure_isdn = sub { + require network::isdn; + network::isdn::configure($netcnx, $netc); + }; + my $configure_adsl = sub { + require network::adsl; + network::adsl::configure($netcnx, $netc); + }; + my $configure_cable = sub { + $::isInstall and $in->set_help('configureNetworkCable'); + $netcnx->{type}='cable'; + # $netcnx->{cable}={}; + # $in->ask_from_entries_ref(_("Cable connection"), + # _("Please enter your host name if you know it. + # Some DHCP servers require the hostname to work. + # Your host name should be a fully-qualified host name, + # such as ``mybox.mylab.myco.com''."), + # [_("Host name:")], [ \$netcnx->{cable}{hostname} ]); + if ($::expert) { + #- dhcpcd, etc are program names; no need to translate them. + my @m=( + { description => "dhcpcd", + c => 1}, + { description => "dhcpxd", + c => 3}, + { description => "dhcp-client", + c => 4}, + ); + if (my $f = $in->ask_from_listf(_("Connect to the Internet"), + _("Which dhcp client do you want to use? +Default is dhcpcd"), + sub { $_[0]{description} }, + \@m )) { + $f->{c}==1 and $netcnx->{dhcp_client}="dhcpcd" and $install->(qw(dhcpcd)); + $f->{c}==3 and $netcnx->{dhcp_client}="dhcpxd" and $install->(qw(dhcpxd)); + $f->{c}==4 and $netcnx->{dhcp_client}="dhcp-client" and $install->(qw(dhcp-client)); + } + } else { + $install->(qw(dhcpcd)); + } + go_ethernet($netc, $intf, 'dhcp', '', '', $first_time); + }; + my $configure_lan = sub { + $::isInstall and $in->set_help('configureNetworkIP'); + network::configureNetwork($prefix, $netc, $in, $intf, $first_time) or return; + network::configureNetwork2($in, $prefix, $netc, $intf, $install); + if ($::isStandalone and $in->ask_yesorno(_("Network configuration"), + _("Do you want to restart the network"), 1)) { + run_program::rooted($prefix, "/etc/rc.d/init.d/network stop"); + if (!run_program::rooted($prefix, "/etc/rc.d/init.d/network start")) { + $in->ask_okcancel(_("Network Configuration"), _("A problem occured while restarting the network: \n\n%s", `/etc/rc.d/init.d/network start`), 0) or return; + } + } + $netc->{NETWORKING} = "yes"; + if ($netc->{GATEWAY}) { + $netcnx->{type}='lan'; + $netcnx->{NET_DEVICE} = $netc->{NET_DEVICE} = ''; + $netcnx->{NET_INTERFACE} = 'lan';#$netc->{NET_INTERFACE}; + } + output "$prefix$connect_file", + qq( +#!/bin/bash +/etc/rc.d/init.d/network restart +); + output "$prefix$disconnect_file", + qq( +#!/bin/bash +/etc/rc.d/init.d/network stop +/sbin/ifup lo +); + chmod 0755, "$prefix$disconnect_file"; + chmod 0755, "$prefix$connect_file"; + $::isStandalone and modules::write_conf($prefix); + 1; + }; + + modules::mergein_conf("$prefix/etc/modules.conf"); + + my $direct_net_install; + if ($first_time && $::isInstall && ($in->{method} eq "ftp" || $in->{method} eq "http" || $in->{method} eq "nfs")) { + (!$::expert or $in->ask_okcancel(_("Network Configuration"), + _("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. +"), 1)) and do { + output "$prefix$connect_file", + qq( +#!/bin/bash +ifup eth0 +); + output "$prefix$disconnect_file", + qq( +#!/bin/bash +ifdown eth0 +); + chmod 0755, "$prefix$disconnect_file"; + chmod 0755, "$prefix$connect_file"; + $direct_net_install = 1; + goto step_5; +}; + } + + $netc->{autodetection}=1; + $netc->{autodetect}={}; + + step_1: + $::Wizard_no_previous=1; + my @profiles=get_profiles(); + $in->ask_from_entries_refH(_("Network Configuration Wizard"), + _("Welcome to The Network Configuration Wizard\n\nWe are about to configure your internet/network connection.\nIf you don't want to use the auto detection, deselect the checkbox.\n"), + [ + if_(@profiles > 1, { label => _("Choose the profile to configure"), val => \$netcnx->{PROFILE}, list => \@profiles }), + { label => _("Use auto detection"), val => \$netc->{autodetection}, type => 'bool' }, + ] + ) or goto step_5; + undef $::Wizard_no_previous; + set_profile($netcnx); + if ($netc->{autodetection}) { + my $w = $in->wait_message(_("Network Configuration Wizard"), _("Detecting devices...")); + detect($netc->{autodetect}, $::isInstall && ($in->{method} eq "ftp" || $in->{method} eq "http" || $in->{method} eq "nfs")); + } + + step_2: + my $set_default; + my %conf; + my @l = ( + [_("Normal modem connection"), $netc->{autodetect}{modem}, __("detected on port %s"), \$conf{modem}], + [_("ISDN connection"), $netc->{autodetect}{isdn}{description}, __("detected %s"), \$conf{isdn}], + [_("DSL (or ADSL) connection"), $netc->{autodetect}{adsl}, __("detected on interface %s"), \$conf{adsl}], + [_("Cable connection"), $netc->{autodetect}{cable}, __("cable connection detected"), \$conf{cable}], + [_("LAN connection"), $netc->{autodetect}{lan}, __("ethernet card(s) detected"), \$conf{lan}] + ); + my $i=0; + map { defined $set_default or do { $_->[1] and $set_default=$i; }; $i++; } @l; + foreach (keys %{$netc->{autodetect}}) { print "plop $_\n" }; +# my $e = $in->ask_from_listf(_("Network Configuration Wizard"), +# _("How do you want to connect to the Internet?"), sub { translate($_[0][0]) . if_($_[0][1], " - " . _ ($_[0][2], $_[0][1])) }, \@l , $l[$set_default] +# ) or goto step_1; + +# my @l2 = map { +#{ +# label => $_[0][0] . if_($_[0][1], " - " . _ ($_[0][2], $_[0][1])), +# val => $_[0][3], type => 'bool'} +# } @l; + my $e = $in->ask_from_entries_refH(_("Network Configuration Wizard"), + _("Choose"), + [ + map { { + label => $_->[0] . if_($_->[1], " - " . _ ($_->[2], $_->[1])), + val => $_->[3], type => 'bool'} } @l + ] + ) or goto step_1; + +# load_conf ($netcnx, $netc, $intf); + + $conf{modem} and do { $configure_modem->() or goto step_2 }; + $conf{isdn} and do { $configure_isdn->() or goto step_2 }; + $conf{adsl} and do { $configure_adsl->() or goto step_2 }; + $conf{cable} and do { $configure_cable->() or goto step_2 }; + $conf{lan} and do { $configure_lan->() or goto step_2 }; + + step_3: + + my $m = _("Congratulation, The network and internet configuration is finished. + +The configuration will now be applied to your system.") . if_($::isStandalone, +_("After that is done, we recommend you to restart your X +environnement to avoid hostname changing problem.")); + if ($::isWizard) { + $::Wizard_no_previous=1; + $::Wizard_finished=1; + $in->ask_okcancel(_("Network Configuration"), $m, 1); + undef $::Wizard_no_previous; + undef $::Wizard_finished; + } else { $in->ask_warn('', $m ); } + + step_5: + + network::configureNetwork2($in, $prefix, $netc, $intf, $install); + + if ($netcnx->{type} =~ /modem/ || $netcnx->{type} =~ /isdn_external/) { + output "$prefix$connect_prog", + qq( +#!/bin/bash +if [ -n "\$DISPLAY" ]; then +if [ -e /usr/bin/kppp ]; then +/usr/bin/kppp & +else +/usr/sbin/net_monitor --connect +fi +else +$connect_file +fi +); + } elsif ($netcnx->{type}) { + output "$prefix$connect_prog", + qq( +#!/bin/bash +if [ -n "\$DISPLAY" ]; then +/usr/sbin/net_monitor --connect +else +$connect_file +fi +); + } else { + output "$prefix$connect_prog", + qq( +#!/bin/bash +/usr/sbin/draknet +); + } + if ($direct_net_install) { + output "$prefix$connect_prog", + qq( +#!/bin/bash +if [ -n "\$DISPLAY" ]; then +/usr/sbin/net_monitor --connect +else +$connect_file +fi +); + } + chmod 0755, "$prefix$connect_prog"; + $netcnx->{$_}=$netc->{$_} foreach qw(NET_DEVICE NET_INTERFACE); + + $netcnx->{NET_INTERFACE} and set_net_conf($netcnx, $netc); + $netcnx->{type} =~ /adsl/ or system("/sbin/chkconfig --del adsl 2> /dev/null"); + save_conf($netcnx, $netc, $intf); + +#- if ($netc->{NET_DEVICE} and $netc->{NETWORKING} ne 'no' and $::isStandalone and $::expert) { +#- exists $netc->{nb_cards} or do { +#- any::setup_thiskind($in, 'net', !$::expert, 1); +#- $netc->{nb_cards} = listlength(detect_devices::getNet()); +#- }; +#- ($netc->{nb_cards} - $netc->{minus_one} - (get_net_device($prefix) =~ /eth.+/ ? 1 : 0) > 0) and $in->ask_okcancel(_("Network Configuration"), +#-_("Now that your Internet connection is configured, +#-your computer can be configured to share its Internet connection. +#-Note: you need a dedicated Network Adapter to set up a Local Area Network (LAN). +#- +#-Would you like to setup the Internet Connection Sharing? +#-"), 1) and system("/usr/sbin/drakgw --direct"); +#- } +} + +sub save_conf { + my ($netcnx, $netc, $intf)=@_; + my $adsl; + my $modem; + my $isdn; + $netcnx->{type} =~ /adsl/ and $adsl=$netcnx->{$netcnx->{type}}; + $netcnx->{type} eq 'isdn_external' || $netcnx->{type} eq 'modem' and $modem=$netcnx->{$netcnx->{type}}; + $netcnx->{type} eq 'isdn_internal' and $isdn=$netcnx->{$netcnx->{type}}; + any::setup_thiskind_backend('net', undef); + my @all_cards = conf_network_card_backend ($prefix, $netc, $intf, undef, undef, undef, undef); + + $intf = { %$intf }; + + output("$prefix/etc/sysconfig/network-scripts/draknet_conf", + "SystemName=" . do { $netc->{HOSTNAME} =~ /([^\.]*)\./; $1 } . " +DomainName=" . do { $netc->{HOSTNAME} =~ /\.(.*)/; $1 } . " +InternetAccessType=" . do { if ($netcnx->{type}) { $netcnx->{type}; } else { $netc->{GATEWAY} ? "lan" : ""; } } . " +InternetInterface=" . ($netc->{GATEWAY} && (!$netcnx->{type} || $netcnx->{type} eq 'lan') ? $netc->{NET_DEVICE} : $netcnx->{NET_INTERFACE}) . " +InternetGateway=$netc->{GATEWAY} +DNSPrimaryIP=$netc->{dnsServer} +DNSSecondaryIP=$netc->{dnsServer2} +DNSThirdIP=$netc->{dnsServer3} +AdminInterface= + +" . join ('', map { +"Eth${_}Known=" . ($intf->{"eth$_"}->{DEVICE} eq "eth$_" ? 'true' : 'false') . " +Eth${_}IP=" . $intf->{"eth$_"}{IPADDR} . " +Eth${_}Mask=" . $intf->{"eth$_"}{NETMASK} . " +Eth${_}Mac= +Eth${_}BootProto=" . $intf->{"eth$_"}{BOOTPROTO} . " +Eth${_}OnBoot=" . $intf->{"eth$_"}{ONBOOT} . " +Eth${_}Hostname=$netc->{HOSTNAME} +Eth${_}HostAlias=" . do { $netc->{HOSTNAME} =~ /([^\.]*)\./; $1 } . " +Eth${_}Driver=$all_cards[$_]->[1] +Eth${_}Irq= +Eth${_}Port= +Eth${_}DHCPClient=" . ($intf->{"eth$_"}{BOOTPROTO} eq 'dhcp' ? $netcnx->{dhcp_client} : '') . " +Eth${_}DHCPServerName=" . ($intf->{"eth$_"}{BOOTPROTO} eq 'dhcp' ? $netc->{HOSTNAME} : '') . "\n" + } (0..9)) . +" + +ISDNDriver=$isdn->{driver} +ISDNDeviceType=$isdn->{type} +ISDNIrq=$isdn->{irq} +ISDNMem=$isdn->{mem} +ISDNIo=$isdn->{io} +ISDNIo0=$isdn->{io0} +ISDNIo1=$isdn->{io1} +ISDNProtocol=$isdn->{protocol} +ISDNCardDescription=$isdn->{description} +ISDNCardVendor=$isdn->{vendor} +ISDNId=$isdn->{id} +ISDNProvider=$netc->{DOMAINNAME2} +ISDNProviderPhone=$isdn->{phone_out} +ISDNProviderDomain=" . do { $netc->{DOMAINNAME2} =~ /\.(.*)/; $1} . " +ISDNProviderDNS1=$netc->{dnsServer2} +ISDNProviderDNS2=$netc->{dnsServer3} +ISDNDialing=$isdn->{dialing_mode} +ISDNHomePhone=$isdn->{phone_in} +ISDNLogin=$isdn->{login} +ISDNPassword=$isdn->{passwd} +ISDNConfirmPassword=$isdn->{passwd2} + +PPPInterfacesList= +PPPDevice=$modem->{device} +PPPDeviceSpeed= +PPPConnectionName=$modem->{connection} +PPPProviderPhone=$modem->{phone} +PPPProviderDomain=$modem->{domain} +PPPProviderDNS1=$modem->{dns1} +PPPProviderDNS2=$modem->{dns2} +PPPLogin=$modem->{connection} +PPPPassword=$modem->{login} +PPPConfirmPassword=$modem->{passwd} +PPPAuthentication=$modem->{auth} +PPPSpecialCommand=" . ($netcnx->{type} eq 'isdn_external' ? $netcnx->{isdn_external}{special_command} : '' ) . " + +ADSLInterfacesList= +ADSLModem=" . q(# Obsolete information. Please don't use it.) . " +ADSLType=" . ($netcnx->{type} =~ /adsl/ ? $netcnx->{type} : '') . " +ADSLProviderDomain=$netc->{DOMAINNAME2} +ADSLProviderDNS1=$netc->{dnsServer2} +ADSLProviderDNS2=$netc->{dnsServer3} +ADSLLogin=$adsl->{login} +ADSLPassword=$adsl->{passwd} +DOMAINNAME2=$netc->{DOMAINNAME2}" + ); + chmod 0600, "$prefix/etc/sysconfig/network-scripts/draknet_conf"; + my $a = $netcnx->{PROFILE} ? $netcnx->{PROFILE} : "default"; + commands::cp("-f", "$prefix/etc/sysconfig/network-scripts/draknet_conf", "$prefix/etc/sysconfig/network-scripts/draknet_conf." . $a); + chmod 0600, "$prefix/etc/sysconfig/network-scripts/draknet_conf"; + chmod 0600, "$prefix/etc/sysconfig/network-scripts/draknet_conf." . $a; + foreach ( ["$prefix$connect_file", "up"], ["$prefix$disconnect_file", "down"], ["$prefix$connect_prog", "prog"] ) { + my $file = "$prefix/etc/sysconfig/network-scripts/net_" . $_->[1] . "." . $a; + -e ($_->[0]) and commands::cp("-f", $_->[0], $file) and chmod 0755, $file; + } +} + +sub set_profile { + my ($netcnx, $profile) = @_; + $profile ||= $netcnx->{PROFILE}; + $profile or return; + my $f = "$prefix/etc/sysconfig/network-scripts/draknet_conf"; + -e ($f . "." . $profile) or return; + $netcnx->{PROFILE}=$profile; + print "changing to $profile\n"; + commands::cp("-f", $f . "." . $profile, $f); + foreach ( ["up", "$prefix$connect_file"], ["down", "$prefix$disconnect_file"], ["prog", "$prefix$connect_prog"]) { + my $c = "$prefix/etc/sysconfig/network-scripts/net_" . $_->[0] . "." . $profile; + -e ($c) and commands::cp("-f", $c, $_->[1]); + } +} + +sub del_profile { + my ($netcnx, $profile) = @_; + $profile or return; + $profile eq "default" and return; + print "deleting $profile\n"; + commands::rm("-f", "$prefix/etc/sysconfig/network-scripts/draknet_conf." . $profile); + commands::rm("-f", "$prefix/etc/sysconfig/network-scripts/net_{up,down,prog}." . $profile); +} + +sub add_profile { + my ($netcnx, $profile) = @_; + $profile or return; + $profile eq "default" and return; + print "creating $profile\n"; + my $cmd1 = "$prefix/etc/sysconfig/network-scripts/draknet_conf." . ($netcnx->{PROFILE} ? $netcnx->{PROFILE} : "default"); + my $cmd2 = "$prefix/etc/sysconfig/network-scripts/draknet_conf." . $profile; + commands::cp("-f", $cmd1, $cmd2); +} + +sub get_profiles { + my @a; + my $i=0; + foreach (glob("/etc/sysconfig/network-scripts/draknet_conf.*")) { + s/.*\.//; + $a[$i] = $_; + $i++; + } + @a; +} + +sub load_conf { + my ($netcnx, $netc, $intf)=@_; + my $adsl_pptp={}; + my $adsl_pppoe={}; + my $modem={}; + my $isdn_external={}; + my $isdn={}; + my $system_name; + my $domain_name; + + if (-e "$prefix/etc/sysconfig/network-scripts/draknet_conf") { + foreach (cat_("$prefix/etc/sysconfig/network-scripts/draknet_conf")) { + /^DNSPrimaryIP=(.*)$/ and $netc->{dnsServer} = $1; + /^DNSSecondaryIP=(.*)$/ and $netc->{dnsServer2} = $1; + /^DNSThirdIP=(.*)$/ and $netc->{dnsServer3} = $1; + /^InternetAccessType=(.*)$/ and $netcnx->{type} = $1; + /^InternetInterface=(.*)$/ and $netcnx->{NET_INTERFACE} = $1; + /^InternetGateway=(.*)$/ and $netc->{GATEWAY} = $1; + /^SystemName=(.*)$/ and $system_name = $1; + /^DomainName=(.*)$/ and $domain_name = $1; + /^Eth([0-9])Known=true$/ and $intf->{"eth$1"}->{DEVICE} = "eth$1"; + /^Eth([0-9])IP=(.*)$/ && $intf->{"eth$1"}->{DEVICE} and $intf->{"eth$1"}{IPADDR} = $2; + /^Eth([0-9])Mask=(.*)\n/ && $intf->{"eth$1"}->{DEVICE} and $intf->{"eth$1"}{NETMASK} = $2; + /^Eth([0-9])BootProto=(.*)\n/ && $intf->{"eth$1"}->{DEVICE} and $intf->{"eth$1"}{BOOTPROTO} = $2; + /^Eth([0-9])OnBoot=(.*)\n/ && $intf->{"eth$1"}->{DEVICE} and $intf->{"eth$1"}{ONBOOT} = $2; + /^Eth([0-9])Hostname=(.*)\n/ && $intf->{"eth$1"}->{DEVICE} and $netc->{HOSTNAME} = $2; + /^Eth([0-9])Driver=(.*)\n/ && $intf->{"eth$1"}->{DEVICE} and $intf->{"eth$1"}{driver} = $2; + /^ISDNDriver=(.*)$/ and $isdn->{driver} = $1; + /^ISDNDeviceType=(.*)$/ and $isdn->{type} = $1; + /^ISDNIrq=(.*)/ and $isdn->{irq} = $1; + /^ISDNMem=(.*)$/ and $isdn->{mem} = $1; + /^ISDNIo=(.*)$/ and $isdn->{io} = $1; + /^ISDNIo0=(.*)$/ and $isdn->{io0} = $1; + /^ISDNIo1=(.*)$/ and $isdn->{io1} = $1; + /^ISDNProtocol=(.*)$/ and $isdn->{protocol} = $1; + /^ISDNCardDescription=(.*)$/ and $isdn->{description} = $1; + /^ISDNCardVendor=(.*)$/ and $isdn->{vendor} = $1; + /^ISDNId=(.*)$/ and $isdn->{id} = $1; + /^ISDNProviderPhone=(.*)$/ and $isdn->{phone_out} = $1; + /^ISDNDialing=(.*)$/ and $isdn->{dialing_mode} = $1; + /^ISDNHomePhone=(.*)$/ and $isdn->{phone_in} = $1; + /^ISDNLogin=(.*)$/ and $isdn->{login} = $1; + /^ISDNPassword=(.*)$/ and $isdn->{passwd} = $1; + /^ISDNConfirmPassword=(.*)$/ and $isdn->{passwd2} = $1; + + /^PPPDevice=(.*)$/ and $modem->{device} = $1; + /^PPPConnectionName=(.*)$/ and $modem->{connection} = $1; + /^PPPProviderPhone=(.*)$/ and $modem->{phone} = $1; + /^PPPProviderDomain=(.*)$/ and $modem->{domain} = $1; + /^PPPProviderDNS1=(.*)$/ and $modem->{dns1} = $1; + /^PPPProviderDNS2=(.*)$/ and $modem->{dns2} = $1; + /^PPPLogin=(.*)$/ and $modem->{login} = $1; + /^PPPPassword=(.*)$/ and $modem->{passwd} = $1; + /^PPPAuthentication=(.*)$/ and $modem->{auth} = $1; + if (/^PPPSpecialCommand=(.*)$/) { + $netcnx->{type} eq 'isdn_external' and $netcnx->{$netcnx->{type}}{special_command} = $1; + } + /^ADSLLogin=(.*)$/ and $adsl_pppoe->{login} = $1; + /^ADSLPassword=(.*)$/ and $adsl_pppoe->{passwd} = $1; + /^DOMAINNAME2=(.*)$/ and $netc->{DOMAINNAME2} = $1; + } + } + $system_name && $domain_name and $netc->{HOSTNAME}=join ('.', $system_name, $domain_name); + $adsl_pptp->{$_}=$adsl_pppoe->{$_} foreach ('login', 'passwd', 'passwd2'); + $isdn_external->{$_}=$modem->{$_} foreach ('device', 'connection', 'phone', 'domain', 'dns1', 'dns2', 'login', 'passwd', 'auth'); + $netcnx->{adsl_pptp}=$adsl_pptp; + $netcnx->{adsl_pppoe}=$adsl_pppoe; + $netcnx->{modem}=$modem; + $netcnx->{modem}=$isdn_external; + $netcnx->{isdn_internal}=$isdn; + -e "$prefix/etc/sysconfig/network" and put_in_hash($netc,network::read_conf("$prefix/etc/sysconfig/network")); + foreach (glob_("$prefix/etc/sysconfig/ifcfg-*")) { + my $l = network::read_interface_conf($_); + $intf->{$l->{DEVICE}} = $l; + } + my $file = "$prefix/etc/resolv.conf"; + if (-e $file) { + put_in_hash($netc, network::read_resolv_conf($file)); + } +} + +sub get_net_device { + ${{ getVarsFromSh("/etc/sysconfig/draknet") }}{NET_DEVICE}; +} + +sub read_net_conf { + my ($netcnx, $netc)=@_; + add2hash($netcnx, { getVarsFromSh("$prefix/etc/sysconfig/draknet") }); + $netc->{$_} = $netcnx->{$_} foreach 'NET_DEVICE', 'NET_INTERFACE'; +#- print "type : $netcnx->{type}\n device : $netcnx->{NET_DEVICE}\n interface : $netcnx->{NET_INTERFACE}\n"; + add2hash($netcnx->{$netcnx->{type}}, { getVarsFromSh("$prefix/etc/sysconfig/draknet." . $netcnx->{type}) }); +} + +sub set_net_conf { + my ($netcnx, $netc)=@_; + setVarsInShMode("$prefix/etc/sysconfig/draknet", 0600, $netcnx, "NET_DEVICE", "NET_INTERFACE", "type", "PROFILE" ); + setVarsInShMode("$prefix/etc/sysconfig/draknet." . $netcnx->{type}, 0600, $netcnx->{$netcnx->{type}}); #- doesn't work, don't know why + setVarsInShMode("$prefix/etc/sysconfig/draknet.netc", 0600, $netc); #- doesn't work, don't know why +} + +#--------------------------------------------- +# WONDERFULL pad +#--------------------------------------------- +1; diff --git a/perl-install/network/network.pm b/perl-install/network/network.pm new file mode 100644 index 000000000..091675646 --- /dev/null +++ b/perl-install/network/network.pm @@ -0,0 +1,486 @@ +package network::network; # $Id$ + +use diagnostics; +use strict; + +#-###################################################################################### +#- misc imports +#-###################################################################################### +use Socket; + +use common qw(:common :file :system :functional); +use detect_devices; +use run_program; +use any; +use log; +use vars qw(@ISA @EXPORT); + +@ISA = qw(Exporter); +@EXPORT = qw(resolv configureNetworkIntf netmask dns is_ip configureNetwork masked_ip findIntf addDefaultRoute all write_interface_conf read_all_conf dnsServers guessHostname configureNetworkNet read_resolv_conf getVarsFromSh read_interface_conf add2hosts gateway configureNetwork2 write_conf sethostname miscellaneousNetwork down_it read_conf write_resolv_conf up_it); + +#-###################################################################################### +#- Functions +#-###################################################################################### +sub read_conf { + my ($file) = @_; + my %netc = getVarsFromSh($file); + \%netc; +} + +sub read_resolv_conf { + my ($file) = @_; + my @l = qw(dnsServer dnsServer2 dnsServer3); + my %netc; + + local *F; open F, $file or die "cannot open $file: $!"; + local $_; + while (<F>) { + /^\s*nameserver\s+(\S+)/ and $netc{shift @l} = $1; + } + \%netc; +} + +sub read_interface_conf { + my ($file) = @_; + my %intf = getVarsFromSh($file) or die "cannot open file $file: $!"; + + $intf{BOOTPROTO} ||= 'static'; + $intf{isPtp} = $intf{NETWORK} eq '255.255.255.255'; + $intf{isUp} = 1; + \%intf; +} + +sub up_it { + my ($prefix, $intfs) = @_; + $_->{isUp} and return foreach values %$intfs; + my $f = "/etc/resolv.conf"; symlink "$prefix/$f", $f; + run_program::rooted($prefix, "/etc/rc.d/init.d/network", "start"); + $_->{isUp} = 1 foreach values %$intfs; +} +sub down_it { + my ($prefix, $intfs) = @_; + run_program::rooted($prefix, "/etc/rc.d/init.d/network", "stop"); + $_->{isUp} = 1 foreach values %$intfs; +} + +sub write_conf { + my ($file, $netc) = @_; + + add2hash($netc, { + NETWORKING => "yes", + FORWARD_IPV4 => "false", + HOSTNAME => "localhost.localdomain", + }); + ($netc->{DOMAINNAME}) = ($netc->{HOSTNAME} =~ /\.(.*)/); + + setVarsInSh($file, $netc, qw(NETWORKING FORWARD_IPV4 DHCP_HOSTNAME HOSTNAME DOMAINNAME GATEWAY GATEWAYDEV NISDOMAIN)); +} + +sub write_resolv_conf { + my ($file, $netc) = @_; + + #- get the list of used dns. + my %used_dns; @used_dns{$netc->{dnsServer}, $netc->{dnsServer2}, $netc->{dnsServer3}} = (1, 2, 3); + + unless ($netc->{DOMAINNAME} || $netc->{DOMAINNAME2} || keys %used_dns > 0) { + unlink($file); + log::l("neither domain name nor dns server are configured"); + return 0; + } + + my (%search, %dns, @unknown); + local *F; open F, $file; + local $_; + while (<F>) { + /^[#\s]*search\s+(.*?)\s*$/ and $search{$1} = $., next; + /^[#\s]*nameserver\s+(.*?)\s*$/ and $dns{$1} = $., next; + /^.*# ppp temp entry\s*$/ and next; + /^[#\s]*(\S.*?)\s*$/ and push @unknown, $1; + } + + close F; open F, ">$file" or die "cannot write $file: $!"; + print F "# search $_\n" foreach grep { $_ ne "$netc->{DOMAINNAME} $netc->{DOMAINNAME2}" } sort { $search{$a} <=> $search{$b} } keys %search; + print F "search $netc->{DOMAINNAME} $netc->{DOMAINNAME2}\n\n" if ($netc->{DOMAINNAME} || $netc->{DOMAINNAME2}); + print F "# nameserver $_\n" foreach grep { ! exists $used_dns{$_} } sort { $dns{$a} <=> $dns{$b} } keys %dns; + print F "nameserver $_\n" foreach sort { $used_dns{$a} <=> $used_dns{$b} } grep { $_ } keys %used_dns; + print F "\n"; + print F "# $_\n" foreach @unknown; + print F "\n"; + print F "# ppp temp entry\n"; + + #-res_init(); # reinit the resolver so DNS changes take affect + 1; +} + +sub write_interface_conf { + my ($file, $intf) = @_; + + my @ip = split '\.', $intf->{IPADDR}; + my @mask = split '\.', $intf->{NETMASK}; + add2hash($intf, { + BROADCAST => join('.', mapn { int $_[0] | ~int $_[1] & 255 } \@ip, \@mask), + NETWORK => join('.', mapn { int $_[0] & $_[1] } \@ip, \@mask), + ONBOOT => bool2yesno(!member($intf->{DEVICE}, map { $_->{device} } detect_devices::probeall())), + }); + setVarsInSh($file, $intf, qw(DEVICE BOOTPROTO IPADDR NETMASK NETWORK BROADCAST ONBOOT), ($intf->{wireless_eth}) ? qw(WIRELESS_MODE WIRELESS_ESSID WIRELESS_NWID WIRELESS_FREQ WIRELESS_SENS WIRELESS_RATE WIRELESS_ENC_KEY WIRELESS_RTS WIRELESS_FRAG WIRELESS_IWCONFIG WIRELESS_IWSPY WIRELESS_IWPRIV) : ()); +} + +sub add2hosts { + my ($file, $hostname, @ips) = @_; + my %l; + $l{$_} = $hostname foreach @ips; + + local *F; + if (-e $file) { + open F, $file or die "cannot open $file: $!"; + /\s*(\S+)(.*)/ and $l{$1} ||= $2 foreach <F>; + } + log::l("writing host information to $file"); + open F, ">$file" or die "cannot write $file: $!"; + while (my ($ip, $v) = each %l) { + $ip or next; + print F "$ip"; + if ($v =~ /^\s/) { + print F $v; + } else { + print F "\t\t$v"; + print F " $1" if $v =~ /(.*?)\./; + } + print F "\n"; + } +} + +# The interface/gateway needs to be configured before this will work! +sub guessHostname { + my ($prefix, $netc, $intf) = @_; + + $intf->{isUp} && dnsServers($netc) or return 0; + $netc->{HOSTNAME} && $netc->{DOMAINNAME} and return 1; + + write_resolv_conf("$prefix/etc/resolv.conf", $netc); + + my $name = gethostbyaddr(Socket::inet_aton($intf->{IPADDR}), AF_INET) or log::l("reverse name lookup failed"), return 0; + + log::l("reverse name lookup worked"); + + add2hash($netc, { HOSTNAME => $name }); + 1; +} + +sub addDefaultRoute { + my ($netc) = @_; + c::addDefaultRoute($netc->{GATEWAY}) if $netc->{GATEWAY}; +} + +sub sethostname { + my ($netc) = @_; + syscall_('sethostname', $netc->{HOSTNAME}, length $netc->{HOSTNAME}) or log::l("sethostname failed: $!"); +} + +sub resolv($) { + my ($name) = @_; + is_ip($name) and return $name; + my $a = join(".", unpack "C4", (gethostbyname $name)[4]); + #-log::l("resolved $name in $a"); + $a; +} + +sub dnsServers { + my ($netc) = @_; + my %used_dns; @used_dns{$netc->{dnsServer}, $netc->{dnsServer2}, $netc->{dnsServer3}} = (1, 2, 3); + sort { $used_dns{$a} <=> $used_dns{$b} } grep { $_ } keys %used_dns; +} + +sub findIntf { + my ($intf, $device) = @_; + $intf->{$device}->{DEVICE} = $device; + $intf->{$device}; +} +#PAD \s* a la fin +my $ip_regexp = qr/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/; +sub is_ip { + my ($ip) = @_; + return 0 unless $ip =~ $ip_regexp; + my @fields = ($1, $2, $3, $4); + foreach (@fields) { + return 0 if $_ < 0 || $_ > 255; + } + return 1; +} + +sub netmask { + my ($ip) = @_; + return "255.255.255.0" unless is_ip($ip); + $ip =~ $ip_regexp; + if ($1 >= 1 && $1 < 127) { + return "255.0.0.0"; #-1.0.0.0 to 127.0.0.0 + } elsif ($1 >= 128 && $1 <= 191 ){ + return "255.255.0.0"; #-128.0.0.0 to 191.255.0.0 + } elsif ($1 >= 192 && $1 <= 223) { + return "255.255.255.0"; + } else { + return "255.255.255.255"; #-experimental classes + } +} + +sub masked_ip { + my ($ip) = @_; + return "" unless is_ip($ip); + my @mask = netmask($ip) =~ $ip_regexp; + my @ip = $ip =~ $ip_regexp; + for (my $i = 0; $i < @ip; $i++) { + $ip[$i] &= int $mask[$i]; + } + join(".", @ip); +} + +sub dns { + my ($ip) = @_; + my $mask = masked_ip($ip); + my @masked = masked_ip($ip) =~ $ip_regexp; + $masked[3] = 2; + join (".", @masked); + +} +sub gateway { + my ($ip) = @_; + my @masked = masked_ip($ip) =~ $ip_regexp; + $masked[3] = 1; + join (".", @masked); + +} + +sub configureNetwork { + my ($prefix, $netc, $in, $intf, $first_time) = @_; + local $_; + any::setup_thiskind($in, 'net', !$::expert, 1); + my @l = detect_devices::getNet() or die _("no network card found"); + my @all_cards = netconnect::conf_network_card_backend ($prefix, $netc, $intf, undef, undef, undef, undef); + + configureNetwork_step_1: + my $n_card=0; + $netc ||= {}; + my $last; foreach (@l) { + my $intf2 = findIntf($intf ||= {}, $_); + add2hash($intf2, $last); + add2hash($intf2, { NETMASK => '255.255.255.0' }); + configureNetworkIntf($netc, $in, $intf2, $netc->{NET_DEVICE}, 0, $all_cards[$n_card]->[1]) or return; + + $last = $intf2; + $n_card++; + } + #- { + #- my $wait = $o->wait_message(_("Hostname"), _("Determining host name and domain...")); + #- network::guessHostname($o->{prefix}, $o->{netc}, $o->{intf}); + #- } + $last or return; + if ($last->{BOOTPROTO} =~ /^(dhcp|bootp)$/) { + $netc->{minus_one} = 1; + my $dhcp_hostname = $netc->{HOSTNAME}; + $::isInstall and $in->set_help('configureNetworkHostDHCP'); + $in->ask_from_entries_refH(_("Configuring network"), +_("Please enter your host name if you know it. +Some DHCP servers require the hostname to work. +Your host name should be a fully-qualified host name, +such as ``mybox.mylab.myco.com''."), + [ { label => _("Host name"), val => \$netc->{HOSTNAME} }]) or goto configureNetwork_step_1; + $netc->{HOSTNAME} ne $dhcp_hostname and $netc->{DHCP_HOSTNAME} = $netc->{HOSTNAME}; + } else { + configureNetworkNet($in, $netc, $last ||= {}, @l) or goto configureNetwork_step_1; + if ( $netc->{GATEWAY} ) { + unlink "$prefix/etc/sysconfig/network-scripts/net_cnx_up"; + unlink "$prefix/etc/sysconfig/network-scripts/net_cnx_down"; + undef $netc->{NET_DEVICE}; + } + } + miscellaneousNetwork($in); + 1; +} + + +sub configureNetworkIntf { + my ($netc, $in, $intf, $net_device, $skip, $module) = @_; + my $text; + my @wireless_modules = ("airo_cs", "netwave_cs", "ray_cs", "wavelan_cs", "wvlan_cs"); + if (member($module, @wireless_modules)) { + $intf->{wireless_eth} = 1; + $netc->{wireless_eth} = 1; + $intf->{WIRELESS_MODE} = "Managed"; + $intf->{WIRELESS_ESSID} = "any"; +#- $intf->{WIRELESS_NWID} = ""; +#- $intf->{WIRELESS_FREQ} = ""; +#- $intf->{WIRELESS_SENS} = ""; +#- $intf->{WIRELESS_RATE} = ""; +#- $intf->{WIRELESS_ENC_KEY} = ""; +#- $intf->{WIRELESS_RTS} = ""; +#- $intf->{WIRELESS_FRAG} = ""; +#- $intf->{WIRELESS_IWCONFIG} = ""; +#- $intf->{WIRELESS_IWSPY} = ""; +#- $intf->{WIRELESS_IWPRIV} = ""; + } + if ($net_device eq $intf->{DEVICE}) { + $skip and return 1; + $text = _("WARNING: This device has been previously configured to connect to the Internet. +Simply accept to keep this device configured. +Modifying the fields below will override this configuration."); + } + else { + $text = _("Please enter the IP configuration for this machine. +Each item should be entered as an IP address in dotted-decimal +notation (for example, 1.2.3.4)."); + } + my $pump = $intf->{BOOTPROTO} =~ /^(dhcp|bootp)$/; + delete $intf->{NETWORK}; + delete $intf->{BROADCAST}; + my @fields = qw(IPADDR NETMASK); + $::isStandalone or $in->set_help('configureNetworkIP'); + $in->ask_from_entries_refH(_("Configuring network device %s", $intf->{DEVICE}), + (_("Configuring network device %s", $intf->{DEVICE}) . ( $module ? _(" (driver $module)") : '' ) ."\n\n") . + $text, + [ { label => _("IP address"), val => \$intf->{IPADDR}, disabled => sub { $pump } }, + { label => _("Netmask"), val => \$intf->{NETMASK}, disabled => sub { $pump } }, + { label => _("Automatic IP"), val => \$pump, type => "bool", text => _("(bootp/dhcp)") }, + if_($intf->{wireless_eth}, + { label => "WIRELESS_MODE", val => \$intf->{WIRELESS_MODE}, list => [ "Ad-hoc", "Managed", "Master", "Repeater", "Secondary", "Auto"] }, + { label => "WIRELESS_ESSID", val => \$intf->{WIRELESS_ESSID} }, + { label => "WIRELESS_NWID", val => \$intf->{WIRELESS_NWID} }, + { label => "WIRELESS_FREQ", val => \$intf->{WIRELESS_FREQ} }, + { label => "WIRELESS_SENS", val => \$intf->{WIRELESS_SENS} }, + { label => "WIRELESS_RATE", val => \$intf->{WIRELESS_RATE} }, + { label => "WIRELESS_ENC_KEY", val => \$intf->{WIRELESS_ENC_KEY} }, + { label => "WIRELESS_RTS", val => \$intf->{WIRELESS_RTS} }, + { label => "WIRELESS_FRAG", val => \$intf->{WIRELESS_FRAG} }, + { label => "WIRELESS_IWCONFIG", val => \$intf->{WIRELESS_IWCONFIG} }, + { label => "WIRELESS_IWSPY", val => \$intf->{WIRELESS_IWSPY} }, + { label => "WIRELESS_IWPRIV", val => \$intf->{WIRELESS_IWPRIV} } + ), + ], + complete => sub { + $intf->{BOOTPROTO} = $pump ? "dhcp" : "static"; + return 0 if $pump; + for (my $i = 0; $i < @fields; $i++) { + unless (is_ip($intf->{$fields[$i]})) { + $in->ask_warn('', _("IP address should be in format 1.2.3.4")); + return (1,$i); + } + return 0; + } + if ($intf->{WIRELESS_FREQ} !~ /[0-9.]*[kGM]/) { + $in->ask_warn('', _('Freq should have the suffix k, M or G (for example, "2.46G" for 2.46 GHz fre + quency), or add enough \'0\'.')); + return (1,6); + } + if ($intf->{WIRELESS_RATE} !~ /[0-9.]*[kGM]/) { + $in->ask_warn('', _('Rate should have the suffix k, M or G (for example, "11M" for 11M), or add enough \'0\'.')); + return (1,8); + } + }, + focus_out => sub { + $intf->{NETMASK} ||= netmask($intf->{IPADDR}) unless $_[0] + } + ); +} + +sub configureNetworkNet { + my ($in, $netc, $intf, @devices) = @_; + + $netc->{dnsServer} ||= dns($intf->{IPADDR}); + $netc->{GATEWAY} ||= gateway($intf->{IPADDR}); + + $::isInstall and $in->set_help('configureNetworkHost'); + $in->ask_from_entries_refH(_("Configuring network"), +_("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"), + [ { label => _("Host name"), val => \$netc->{HOSTNAME} }, + { label => _("DNS server"), val => \$netc->{dnsServer} }, + { label => _("Gateway"), val => \$netc->{GATEWAY} }, + if_($::expert, + { label => _("Gateway device"), val => \$netc->{GATEWAYDEV}, list => \@devices }, + ), + ], + ); +} + +sub miscellaneousNetwork { + my ($in, $clicked) = @_; + my $u = $::o->{miscellaneous} ||= {}; + $::isInstall and $in->set_help('configureNetworkProxy'); + $::expert || $clicked and $in->ask_from_entries_refH('', + _("Proxies configuration"), + [ { label => _("HTTP proxy"), val => \$u->{http_proxy} }, + { label => _("FTP proxy"), val => \$u->{ftp_proxy} }, + ], + complete => sub { + $u->{http_proxy} =~ m,^($|http://), or $in->ask_warn('', _("Proxy should be http://...")), return 1,0; + $u->{ftp_proxy} =~ m,^($|ftp://), or $in->ask_warn('', _("Proxy should be ftp://...")), return 1,1; + 0; + } + ) || return; +} + +sub read_all_conf { + my ($prefix, $netc, $intf) = @_; + $netc ||= {}; $intf ||= {}; + add2hash($netc, read_conf("$prefix/etc/sysconfig/network")) if -r "$prefix/etc/sysconfig/network"; + add2hash($netc, read_resolv_conf("$prefix/etc/resolv.conf")) if -r "$prefix/etc/resolv.conf"; + foreach (all("$prefix/etc/sysconfig/network-scripts")) { + if (/ifcfg-(\w+)/ && $1 ne 'lo' && $1 !~ /ppp/) { + my $intf = findIntf($intf, $1); + add2hash($intf, { getVarsFromSh("$prefix/etc/sysconfig/network-scripts/$_") }); + } + } +} + +#- configureNetwork2 : configure the network interfaces. +#- input +#- $prefix +#- $netc +#- $intf +#- $install : a function that takes a list of package and install them : ex sub { system("urpmi --auto --best-output " . join(' ', @_)); } +#- $netc input +#- NETWORKING : networking flag : string : "yes" by default +#- FORWARD_IPV4 : forward IP flag : string : "false" by default +#- HOSTNAME : hostname : string : "localhost.localdomain" by default +#- DOMAINNAME : domainname : string : $netc->{HOSTNAME} =~ /\.(.*)/ by default +#- DOMAINNAME2 : well it's another domainname : have to look further why we used 2 +#- The following are facultatives +#- DHCP_HOSTNAME : If you have a dhcp and want to set the hostname +#- GATEWAY : gateway +#- GATEWAYDEV : gateway interface +#- NISDOMAIN : nis domain +#- $netc->{dnsServer} : dns server 1 +#- $netc->{dnsServer2} : dns server 2 +#- $netc->{dnsServer3} : dns server 3 : note that we uses the dns1 for the LAN, and the 2 others for the internet conx +#- $intf input: for each $device (for example ethx) +#- $intf->{$device}{IPADDR} : IP address +#- $intf->{$device}{NETMASK} : netmask +#- $intf->{$device}{DEVICE} : DEVICE = $device +#- $intf->{$device}{BOOTPROTO} : boot prototype : "bootp" or "dhcp" or "pump" or ... +sub configureNetwork2 { + my ($in, $prefix, $netc, $intf, $install) = @_; + my $etc = "$prefix/etc"; + + $netc->{wireless_eth} and $install->('wireless-tools'); + write_conf("$etc/sysconfig/network", $netc); + write_resolv_conf("$etc/resolv.conf", $netc); + write_interface_conf("$etc/sysconfig/network-scripts/ifcfg-$_->{DEVICE}", $_) foreach grep { $_->{DEVICE} } values %$intf; + add2hosts("$etc/hosts", $netc->{HOSTNAME}, map { $_->{IPADDR} } values %$intf); + + if (grep { $_->{BOOTPROTO} =~ /^(dhcp)$/ } values %$intf) { + $::isStandalone ? $in->standalone::pkgs_install('dhcpcd') : $install->('dhcpcd'); + } + if (grep { $_->{BOOTPROTO} =~ /^(pump|bootp)$/ } values %$intf) { + $::isStandalone ? $in->standalone::pkgs_install('pump') : $install->('pump'); + } + #-res_init(); #- reinit the resolver so DNS changes take affect + + any::miscellaneousNetwork($prefix); +} + + +#-###################################################################################### +#- Wonderful perl :( +#-###################################################################################### +1; diff --git a/perl-install/network/tools.pm b/perl-install/network/tools.pm new file mode 100644 index 000000000..8f89b9cc0 --- /dev/null +++ b/perl-install/network/tools.pm @@ -0,0 +1,76 @@ +package network::tools; + +use vars qw(@ISA @EXPORT); + +@ISA = qw(Exporter); +@EXPORT = qw(write_secret_backend ask_connect_now connect_backend disconnect_backend read_providers_backend ask_info2 connected disconnected); + +sub write_secret_backend { + my ($a, $b) = @_; + foreach ("pap-secrets", "chap-secrets") { + substInFile { s/^$a.*\n//; $_ .= "\n'$a' * '$b' * \n" if eof } "$prefix/etc/ppp/$_"; + } +} + +sub ask_connect_now { + my ($cnx, $inter) = @_; + if ($in->ask_yesorno(_("Internet configuration"), + _("Do you want to try to connect to the Internet now?") + )) { + my $up; + { + my $w = $in->wait_message('', _("Testing your connection..."), 1); + connect_backend(); + sleep 5; + my $netc = {}; + $up=connected($netc); + } + my $m = $up ? (_("The system is now connected to Internet.") . + if_($::isInstall, _("For Security reason, it will be disconnected now.")) ) : + _("The system doesn't seem to be connected to internet. +Try to reconfigure your connection."); + if ($::isWizard) { + $::Wizard_no_previous=1; + $::Wizard_finished=1; + $in->ask_okcancel(_("Network Configuration"), $m, 1); + undef $::Wizard_no_previous; + undef $::Wizard_finished; + } else { $in->ask_warn('', $m ); } + $::isInstall and disconnect_backend(); + } + 1; +} + +sub connect_backend { run_program::rooted($prefix, "$connect_prog &") } + +sub disconnect_backend { run_program::rooted($prefix, "$disconnect_file &") } + +sub read_providers_backend { my ($file) = @_; map { /(.*?)=>/ } catMaybeCompressed($file) } + +sub ask_info2 { + my ($cnx, $netc) = @_; + $::isInstall and $in->set_help('configureNetworkDNS'); + $in->ask_from_entries_refH(_("Connection Configuration"), + _("Please fill or check the field below"), + [ + if__ ($cnx->{irq}, { label => _("Card IRQ"), val => \$cnx->{irq} }) , + if__ ($cnx->{mem}, { label => _("Card mem (DMA)"), val => \$cnx->{mem} }), + if__ ($cnx->{io}, { label => _("Card IO"), val => \$cnx->{io} }), + if__ ($cnx->{io0}, { label => _("Card IO_0"), val => \$cnx->{io0} }), + if__ ($cnx->{io1}, { label => _("Card IO_1"), val => \$cnx->{io1} }), + if__ ($cnx->{phone_in}, { label => _("Your personal phone number"), val => \$cnx->{phone_in} }), + if__ ($netc->{DOMAINNAME2}, { label => _("Provider name (ex provider.net)"), val => \$netc->{DOMAINNAME2} }), + if__ ($cnx->{phone_out}, { label => _("Provider phone number"), val => \$cnx->{phone_out} }), + if__ ($netc->{dnsServer2}, { label => _("Provider dns 1"), val => \$netc->{dnsServer2} }), + if__ ($netc->{dnsServer3}, { label => _("Provider dns 2"), val => \$netc->{dnsServer3} }), + if__ ($cnx->{dialing_mode}, { label => _("Dialing mode"), val => \$cnx->{dialing_mode}, list => [ "auto", "manual"] }), + if__ ($cnx->{login}, { label => _("Account Login (user name)"), val => \$cnx->{login} }), + if__ ($cnx->{passwd}, { label => _("Account Password"), val => \$cnx->{passwd} }), + ] + ) or return; + 1; +} + +sub connected { gethostbyname("www.mandrakesoft.com") ? 1 : 0; } + +sub disconnected { } |