diff options
-rw-r--r-- | docs/TODO | 2 | ||||
-rw-r--r-- | perl-install/common.pm | 43 | ||||
-rw-r--r-- | perl-install/detect_devices.pm | 8 | ||||
-rw-r--r-- | perl-install/install2.pm | 39 | ||||
-rw-r--r-- | perl-install/install_steps.pm | 22 | ||||
-rw-r--r-- | perl-install/install_steps_interactive.pm | 12 | ||||
-rw-r--r-- | perl-install/my_gtk.pm | 36 | ||||
-rw-r--r-- | perl-install/network.pm | 33 | ||||
-rw-r--r-- | perl-install/resize_fat/directory.pm | 2 |
9 files changed, 121 insertions, 76 deletions
@@ -19,6 +19,8 @@ replace in place catchable die's by cdie's (as in partition_table::load) Xconfigurator: simplify Monitors possibility to show card autodetected + too slow at startup (when card autodetected) + the wait_message is nasty (just pops half second) use the VideoRam for skeeping some tests (not all the 32 24 16 15 8) in package choosing, the group (on the left) is no more `selected' (gtk focus) when clicking on a package (on the right) diff --git a/perl-install/common.pm b/perl-install/common.pm index 78533befc..e1b44ac2d 100644 --- a/perl-install/common.pm +++ b/perl-install/common.pm @@ -7,7 +7,7 @@ use vars qw(@ISA %EXPORT_TAGS @EXPORT_OK $printable_chars $sizeof_int $bitof_int @ISA = qw(Exporter); %EXPORT_TAGS = ( common => [ qw(__ min max sum sign product bool ikeys member divide is_empty_array_ref add2hash set_new set_add round_up round_down first second top uniq translate untranslate warp_text) ], - functional => [ qw(fold_left difference2 before_leaving catch_cdie cdie) ], + functional => [ qw(fold_left map_index mapn mapn_ difference2 before_leaving catch_cdie cdie) ], file => [ qw(dirname basename touch all glob_ cat_ chop_ mode) ], system => [ qw(sync makedev unmakedev psizeof strcpy gettimeofday syscall_ crypt_ getVarsFromSh setVarsInSh) ], constant => [ qw($printable_chars $sizeof_int $bitof_int $SECTORSIZE) ], @@ -21,14 +21,21 @@ $SECTORSIZE = 512; 1; +sub fold_left(&@) { + my $f = shift; + local $a = shift; + foreach $b (@_) { $a = &$f() } + $a +} + sub _ { my $s = shift @_; sprintf translate($s), @_ } #delete $main::{'_'}; sub __ { $_[0] } -sub min { fold_left(sub { $a < $b ? $a : $b }, @_) } -sub max { fold_left(sub { $a > $b ? $a : $b }, @_) } -sub sum { fold_left(sub { $a + $b }, @_) } +sub min { fold_left { $a < $b ? $a : $b } @_ } +sub max { fold_left { $a > $b ? $a : $b } @_ } +sub sum { fold_left { $a + $b } @_ } sub sign { $_[0] <=> 0 } -sub product { fold_left(sub { $a * $b }, @_) } +sub product { fold_left { $a * $b } @_ } sub first { $_[0] } sub second { $_[1] } sub top { $_[$#_] } @@ -68,13 +75,31 @@ sub touch { utime $now, $now, $f; } -sub fold_left(&$@) { +sub map_index(&@) { my $f = shift; - local $a = shift; - foreach $b (@_) { $a = &$f() } - $a + my @l; + local $::i = 0; + foreach (@_) { push @l, &$f($::i); $::i++; } + @l; } +sub smapn { + my $f = shift; + my $n = shift; + my @r = (); + for (my $i = 0; $i < $n; $i++) { push @r, &$f(map { $_->[$i] } @_); } + @r +} +sub mapn(&@) { + my $f = shift; + smapn($f, min(map { scalar @$_ } @_), @_); +} +sub mapn_(&@) { + my $f = shift; + smapn($f, max(map { scalar @$_ } @_), @_); +} + + sub add_f4before_leaving { my ($f, $b, $name) = @_; diff --git a/perl-install/detect_devices.pm b/perl-install/detect_devices.pm index d226d033b..327f12754 100644 --- a/perl-install/detect_devices.pm +++ b/perl-install/detect_devices.pm @@ -128,12 +128,8 @@ sub getDAC960() { } -sub getNet() { - # I should probably ask which device to use if multiple ones are available -- oh well :-( - foreach (qw(eth0 tr0 plip0 plip1 plip2 fddi0)) { - hasNetDevice($_) and log::l("$_ is available -- using it for networking"), return $_; - } - undef; +sub getNet() { + grep { hasNetDevice($_) } qw(eth0 tr0 plip0 plip1 plip2 fddi0); } sub getPlip() { foreach (0..2) { diff --git a/perl-install/install2.pm b/perl-install/install2.pm index 90b8d8b2d..457b5bf83 100644 --- a/perl-install/install2.pm +++ b/perl-install/install2.pm @@ -100,15 +100,15 @@ appropriate to you."), my @installStepsFields = qw(text redoable onError needs); my @installSteps = ( -# selectLanguage => [ __("Choose your language"), 1, 1 ], -# selectPath => [ __("Choose install or upgrade"), 0, 0 ], -# selectInstallClass => [ __("Select installation class"), 1, 1, "selectPath" ], -# setupSCSI => [ __("Setup SCSI"), 1, 0 ], -# partitionDisks => [ __("Setup filesystems"), 1, 0 ], -# formatPartitions => [ __("Format partitions"), 1, -1, "partitionDisks" ], -# choosePackages => [ __("Choose packages to install"), 1, 1, "selectInstallClass" ], -# doInstallStep => [ __("Install system"), 1, -1, ["formatPartitions", "selectPath"] ], -## configureMouse => [ __("Configure mouse"), 0, 0 ], + selectLanguage => [ __("Choose your language"), 1, 1 ], + selectPath => [ __("Choose install or upgrade"), 0, 0 ], + selectInstallClass => [ __("Select installation class"), 1, 1, "selectPath" ], + setupSCSI => [ __("Setup SCSI"), 1, 0 ], + partitionDisks => [ __("Setup filesystems"), 1, 0 ], + formatPartitions => [ __("Format partitions"), 1, -1, "partitionDisks" ], + choosePackages => [ __("Choose packages to install"), 1, 1, "selectInstallClass" ], + doInstallStep => [ __("Install system"), 1, -1, ["formatPartitions", "selectPath"] ], +# configureMouse => [ __("Configure mouse"), 0, 0 ], configureNetwork => [ __("Configure networking"), 1, 1, "formatPartitions" ], # configureTimezone => [ __("Configure timezone"), 0, 0 ], # configureServices => [ __("Configure services"), 0, 0 ], @@ -168,6 +168,7 @@ $o = $::o = { # isUpgrade => 0, # installClass => 'beginner', + intf => [ { DEVICE => "eth0", IPADDR => '1.2.3.4', NETMASK => '255.255.255.128' } ], default => $default, steps => \%installSteps, orderedSteps => \@orderedInstallSteps, @@ -243,16 +244,12 @@ sub partitionDisks { sub formatPartitions { $o->choosePartitionsToFormat($o->{fstab}); - $::testing and return; - - $o->formatPartitions(@{$o->{fstab}}); - - fs::mount_all([ grep { isExt2($_) || isSwap($_) } @{$o->{fstab}} ], $o->{prefix}); - + unless ($::testing) { + $o->formatPartitions(@{$o->{fstab}}); + fs::mount_all([ grep { isExt2($_) || isSwap($_) } @{$o->{fstab}} ], $o->{prefix}); + } mkdir "$o->{prefix}/$_", 0755 foreach qw(dev etc etc/sysconfig etc/sysconfig/network-scripts home mnt tmp var var/tmp var/lib var/lib/rpm); - network::add2hosts("$o->{prefix}/etc/hosts", "127.0.0.1", "localhost.localdomain"); - pkgs::init_db($o->{prefix}, $o->{isUpgrade}); } sub choosePackages { @@ -272,12 +269,13 @@ sub choosePackages { } sub doInstallStep { + $o->beforeInstallPackages; $o->installPackages($o->{packages}); $o->afterInstallPackages; } sub configureMouse { $o->mouseConfig } -sub configureNetwork { $o->configureNetwork } +sub configureNetwork { $o->configureNetwork($o->{steps}{$o->{step}}{entered} == 1 && !$_[0]) } sub configureTimezone { $o->timeConfig } sub configureServices { $o->servicesConfig } sub setRootPassword { $o->setRootPassword } @@ -331,11 +329,10 @@ sub main { $o = install_steps_graphical->new($o); - # all information is put in {intf}, but don't let network be aware of this :) - $o->{intf} = network::read_conf("/tmp/network"); + $o->{netc} = network::read_conf("/tmp/network"); if (my ($file) = glob_('/tmp/ifcfg-*')) { log::l("found network config file $file"); - $o->{intf} = network::read_interface_conf($file); + push @{$o->{intf}}, network::read_interface_conf($file); } modules::load_deps("/modules/modules.dep"); diff --git a/perl-install/install_steps.pm b/perl-install/install_steps.pm index a42cb57bd..af02ae1d6 100644 --- a/perl-install/install_steps.pm +++ b/perl-install/install_steps.pm @@ -69,7 +69,10 @@ sub leavingStep($$) { } while (my $f = shift @{$o->{steps}{$step}{toBeDone} || []}) { - &$f(); + eval { &$f() }; + $o->ask_warn(_("Error"), [ +_("An error occured, i don't know how to handle it nicely, +so continue at your own risk :("), $@ ]) if $@; } } @@ -118,6 +121,13 @@ sub choosePackages($$$) { my ($o, $packages, $compss) = @_; } +sub beforeInstallPackages { + my ($o) = @_; + + network::add2hosts("$o->{prefix}/etc/hosts", "localhost.localdomain", "127.0.0.1"); + pkgs::init_db($o->{prefix}, $o->{isUpgrade}); +} + sub installPackages($$) { my ($o, $packages) = @_; my $toInstall = [ grep { $_->{selected} && !$_->{installed} } values %$packages ]; @@ -140,15 +150,13 @@ sub mouseConfig($) { sub configureNetwork($) { my ($o) = @_; my $etc = "$o->{prefix}/etc"; - - # all information is in {intf}, but don't let network be aware of this :) # # rc = checkNetConfig(&$o->{intf}, &$o->{netc}, &$o->{intfFinal}, # &$o->{netcFinal}, &$o->{driversLoaded}, $o->{direction}); - network::write_conf("$etc/sysconfig/network", $o->{intf}); - network::write_interface_conf("$etc/sysconfig/network-scripts/ifcfg-$o->{intf}{DEVICE}", $o->{intf}); - network::write_resolv_conf("$etc/resolv.conf", $o->{intf}); - network::add2hosts("$etc/hosts", $o->{intf}{IPADDR}, $o->{intf}{HOSTNAME}); + network::write_conf("$etc/sysconfig/network", $o->{netc}); + network::write_resolv_conf("$etc/resolv.conf", $o->{netc}); + network::write_interface_conf("$etc/sysconfig/network-scripts/ifcfg-$_->{DEVICE}", $_) foreach @{$o->{intf}}; + network::add2hosts("$etc/hosts", $o->{netc}{HOSTNAME}, map { $_->{IPADDR} } @{$o->{intf}}); # syscall_('sethostname', $hostname, length $hostname) or warn "sethostname failed: $!"; #res_init(); # reinit the resolver so DNS changes take affect } diff --git a/perl-install/install_steps_interactive.pm b/perl-install/install_steps_interactive.pm index dca0255d0..1ad5d3e2a 100644 --- a/perl-install/install_steps_interactive.pm +++ b/perl-install/install_steps_interactive.pm @@ -10,6 +10,7 @@ use vars qw(@ISA); use common qw(:common); use partition_table qw(:types); use install_steps; +use network; use modules; use lang; use fs; @@ -122,7 +123,16 @@ sub configureNetwork($) { } if ($r !~ /^Keep/) { - $o->configureNetworkAsk or return; + my @l = first(network::getNet()); + @l = ($l[0]) unless $::expert; # keep only one + + foreach my $dev (@l) { + my ($l) = grep { $_->{DEVICE} eq $dev } @{$o->{intf}}; + + push @{$o->{intf}}, $l = { DEVICE => $dev } unless $l; + $o->configureNetworkIntf($l); + } + $o->configureNetworkNet($o->{netc} ||= {}); } $o->SUPER::configureNetwork; } diff --git a/perl-install/my_gtk.pm b/perl-install/my_gtk.pm index 469f4c2d4..887bc3e0f 100644 --- a/perl-install/my_gtk.pm +++ b/perl-install/my_gtk.pm @@ -15,7 +15,7 @@ $EXPORT_TAGS{all} = [ map { @$_ } values %EXPORT_TAGS ]; use Gtk; use c; -use common qw(:common); +use common qw(:common :functional); my $forgetTime = 1000; # in milli-seconds $border = 5; @@ -229,17 +229,17 @@ sub create_adjustment($$$) { sub create_packtable($@) { my $options = shift; my $w = new Gtk::Table(0, 0, $options->{homogeneous} || 0); - my $i = 0; foreach (@_) { - for (my $j = 0; $j < @$_; $j++) { - if (defined $_->[$j]) { - my $l = $_->[$j]; - ref $l or $l = new Gtk::Label($l); - $w->attach_defaults($l, $j, $j + 1, $i, $i + 1); - $l->show; + map_index { + my ($i) = @_; + map_index { + my ($j) = @_; + if (defined $_) { + ref $_ or $_ = new Gtk::Label($_); + $w->attach_defaults($_, $j, $j + 1, $i, $i + 1); + $_->show; } - } - $i++; - } + } @$_; + } @_; $w->set_col_spacings($options->{col_spacings} || 0); $w->set_row_spacings($options->{row_spacings} || 0); $w @@ -341,10 +341,10 @@ sub _ask_from_list($$$$) { $o->{retval} = $l->[$list->child_position($_[1])]; Gtk->main_quit; }); - for (my $i = 0; $i < @$l; $i++) { - my $focused = $i; - $def = $i if $l->[$i] eq $def; - my $w = new Gtk::ListItem($l->[$i]); + map_index { + my ($i) = @_; + $def = $i if $_ eq $def; + my $w = new Gtk::ListItem($_); my $id = $w->signal_connect(key_press_event => sub { my ($w, $e) = @_; my $c = chr $e->{keyval}; @@ -353,11 +353,11 @@ sub _ask_from_list($$$$) { if ($e->{keyval} >= 0x100) { if ($c eq "\r" || $c eq "\x8d") { - $list->select_item($focused); + $list->select_item($i); } $starting_word = ''; } else { - my $curr = $focused + bool($starting_word eq '' || $starting_word eq $c); + my $curr = $i + bool($starting_word eq '' || $starting_word eq $c); $starting_word .= $c unless $starting_word eq $c; my $j; for ($j = 0; $j < @$l; $j++) { @@ -373,7 +373,7 @@ sub _ask_from_list($$$$) { }); push @::ask_from_list_widgets, $w; # hack!! to not get SIGSEGV push @widgets, $w; - } + } @$l; gtkadd($list, @widgets); gtkadd($o->{window}, gtkpack($o->create_box_with_title(@$messages), diff --git a/perl-install/network.pm b/perl-install/network.pm index b97a043ed..bce10e35a 100644 --- a/perl-install/network.pm +++ b/perl-install/network.pm @@ -5,7 +5,7 @@ use strict; use Socket; -use common qw(:common :file :system); +use common qw(:common :file :system :functional); use detect_devices; use modules; use log; @@ -66,13 +66,20 @@ sub write_resolv_conf { sub write_interface_conf { my ($file, $intf) = @_; - add2hash($intf, { ONBOOT => "yes" }); + 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 => "yes", + }); setVarsInSh($file, $intf, qw(DEVICE BOOTPROTO IPADDR NETMASK NETWORK BROADCAST ONBOOT)); } sub add2hosts { - my ($file, $ip, $hostname) = @_; - my %l = ($ip => $hostname); + my ($file, $hostname, @ips) = @_; + my %l; + $l{$_} = $hostname foreach @ips; local *F; if (-e $file) { @@ -116,17 +123,17 @@ sub addDefaultRoute { c::addDefaultRoute($netc->{gateway}) if $netc->{gateway} || !$::testing; } -sub getAvailableNetDevice { - my $device = detect_devices::getNet(); +sub dnsServers { + my ($netc) = @_; + map { $netc->{$_} } qw(dnsServer dnsServer2 dnsServer3); +} - unless ($device) { +sub getNet() { + my @l = detect_devices::getNet(); + unless (@l) { modules::load_thiskind('net') or return; - $device = detect_devices::getNet(); + @l = detect_devices::getNet(); } - $device; + @l; } -sub dnsServers { - my ($netc) = @_; - map { $netc->{$_} } qw(dnsServer dnsServer2 dnsServer3); -} diff --git a/perl-install/resize_fat/directory.pm b/perl-install/resize_fat/directory.pm index ab8ec5328..00ae6a870 100644 --- a/perl-install/resize_fat/directory.pm +++ b/perl-install/resize_fat/directory.pm @@ -34,7 +34,7 @@ sub entry_size { psizeof($format) } sub traverse($$$) { my ($fs, $directory, $f) = @_; - for (my $i = 0; 1; $i++) { + for (my $i = 0;; $i++) { my $raw = \substr($directory, $i * psizeof($format), psizeof($format)); # empty entry means end of directory |