diff options
Diffstat (limited to 'perl-install/install_any.pm')
-rw-r--r-- | perl-install/install_any.pm | 144 |
1 files changed, 115 insertions, 29 deletions
diff --git a/perl-install/install_any.pm b/perl-install/install_any.pm index 5bd607909..6e9984f2a 100644 --- a/perl-install/install_any.pm +++ b/perl-install/install_any.pm @@ -584,6 +584,7 @@ sub g_auto_install(;$) { if ($o->{X}{default_depth} and my $depth = $card->{depth}{$o->{X}{default_depth}}) { $depth ||= []; $o->{X}{resolution_wanted} ||= join "x", @{$depth->[0]} unless is_empty_array_ref($depth->[0]); + $o->{X}{monitor} = $::o->{X}{monitor} if $::o->{X}{monitor}{manual}; } } @@ -873,61 +874,146 @@ sub generate_ks_cfg { sub partitionWizard { my ($o, $hds, $fstab, $readonly) = @_; - my $wizlog; - my @solutions; + my @wizlog; + my (@solutions, %solutions); my $min_linux = 500 << 11; + my $max_linux = 2500 << 11; + my $min_swap = 50 << 11; + my $max_swap = 300 << 11; my $min_freewin = 100 << 11; - # each solutions is a [ text, function ], where the function retunrs true if succeeded + # each solution is a [ score, text, function ], where the function retunrs true if succeeded + if (fsedit::free_space(@$hds) > $min_linux and !$readonly) { - push @solutions, [ _("Use free space"), sub { fsedit::auto_allocate($hds, $o->{partitions}); 1 } ]; + $solutions{free_space} = [ 20, _("Use free space"), sub { fsedit::auto_allocate($hds, $o->{partitions}); 1 } ] } else { - $wizlog .= _("Not enough free space to allocate new partitions"); + push @wizlog, _("Not enough free space to allocate new partitions"); } - if (my @l = grep { isTrueFS($_) } @$fstab) { - push @solutions, [ _("Use existing partition"), sub { $o->ask_mntpoint_s($o->{fstab}) } ]; + if (@$fstab) { + my $truefs = grep { isTrueFS($_) } @$fstab; + #- value twice the ext2 partitions + $solutions{existing_part} = [ 6 + $truefs + @$fstab, _("Use existing partition"), sub { $o->ask_mntpoint_s($fstab) } ] } else { - $wizlog .= _("There is no existing linux partition to use"); + push @wizlog, _("There is no existing partition to use"); } - if (my @l = grep { isFat($_) } @$fstab) { - fs::df($_) foreach @l; - my @ok_forloopback = sort { $b->{free} <=> $a->{free} } grep { $_->{free} > $min_linux + $min_freewin } @l - or $wizlog .= _("There is not enough space left on the FAT partition(s) (or the FAT partition is corrupted)"); - - push @solutions, [ _("Use the FAT partition for loopback"), - sub { $o->doPartitionDisksLnx4win(@ok_forloopback) } ]; - - my @ok_forresizing = grep { - !$readonly && eval { - my $resize_fat = resize_fat::main->new($_->{device}, devices::make($_->{device})); + my @fats = grep { isFat($_) } @$fstab; + fs::df($_) foreach @fats; + if (my @ok_forloopback = sort { $b->{free} <=> $a->{free} } grep { $_->{free} > $min_linux + $min_freewin } @fats) { + $solutions{loopback} = + [ 5 - @fats, _("Use the FAT partition for loopback"), + sub { + my ($s_root, $s_swap); + my $part = $o->ask_from_listf('', _("Which partition do you want to use to put Linux4Win?"), \&partition_table_raw::description, \@ok_forloopback) or return; + $o->ask_from_entries_refH('', _("Choose the sizes"), [ + _("Root partition size in MB: ") => { val => \$s_root, min => 1 + ($min_linux >> 11), max => min($part->{free} - 2 * $max_swap - $min_freewin, $max_linux) >> 11, type => 'range' }, + _("Swap partition size in MB: ") => { val => \$s_swap, min => 1 + ($min_swap >> 11), max => 2 * $max_swap >> 11, type => 'range' }, + ]) or return; + push @{$part->{loopback}}, + { type => 0x83, loopback_file => '/lnx4win/linuxsys.img', mntpoint => '/', size => $s_root << 11, device => $part, notFormatted => 1 }, + { type => 0x82, loopback_file => '/lnx4win/swapfile', mntpoint => 'swap', size => $s_swap << 11, device => $part, notFormatted => 1 }; + 1; + } ]; + $solutions{resize_fat} = + [ 6 - @fats, _("Use the free space on the FAT partition"), + sub { + my $part = $o->ask_from_listf('', _("Which partition do you want to resize?"), \&partition_table_raw::description, \@ok_forloopback) or return; + my $w = $o->wait_message(_("Resizing"), _("Computing FAT filesystem bounds")); + my $resize_fat = eval { resize_fat::main->new($part->{device}, devices::make($part->{device})) }; + $@ and die _("The FAT resizer is unable to handle your partition, +the following error occured: %s", $@); my $min_win = $resize_fat->min_size; - $_->{size} > $min_linux + $min_freewin + $min_win; - } && !$@; - } @ok_forloopback or $wizlog .= _("The FAT resizer can't find enough space left on the FAT partition(s)"); + $part->{size} > $min_linux + $min_freewin + $min_win or die _("Your windows partition is too fragmented, please run ``defrag'' first"); + $o->ask_okcancel('', _("WARNING! + +DrakX will now resize your Windows partition. Be careful: this operation is +dangerous. If you have not already done so, you should first exit the +installation, run scandisk under Windows (and optionally run defrag), then +restart the installation. You should also backup your data. +When sure, press Ok.")) or return; + + my $size = $part->{size}; + $o->ask_from_entries_refH('', _("Which size do you want to keep for windows on"), [ + _("partition %s", partition_table_raw::description($part)) => { val => \$size, min => 1 + ($min_win >> 11), max => ($part->{size} - $min_linux) >> 11, type => 'range' }, + ]) or return; + $size <<= 11; + + local *log::l = sub { $w->set(join(' ', @_)) }; + eval { $resize_fat->resize($size) }; + $@ and die _("FAT resizing failed: %s", $@); + + $part->{size} = $size; + $part->{isFormatted} = 1; + + my ($hd) = grep { $_->{device} eq $part->{rootDevice} } @$hds; + $hd->{isDirty} = $hd->{needKernelReread} = 1; + $hd->adjustEnd($part); + partition_table::adjust_local_extended($hd, $part); + partition_table::adjust_main_extended($hd); + + fsedit::auto_allocate($hds, $o->{partitions}); + 1; + } ] if !$readonly; } else { - $wizlog .= _("There is no FAT partitions to resize or to use as loopback"); + push @wizlog, _("There is no FAT partitions to resize or to use as loopback (or not enough space left)"); } if (@$fstab && !$readonly) { require diskdrake; - push @solutions, - [ _("Take over the hard drive (beware!)"), + $solutions{wipe_drive} = + [ 10, fsedit::is_one_big_fat($hds) ? _("Remove Windows(TM)") : _("Take over the hard drive"), sub { my $hd = $o->ask_from_listf('', _("You have more than one hard drive, which one do you install linux on?"), - \&partition_table_raw::description, @$hds) or return; + \&partition_table_raw::description, $hds) or return; $o->ask_okcancel('', _("All existing partitions and their data will be lost on drive %s", $hd->{device})) or return; partition_table_raw::zero_MBR($hd); fsedit::auto_allocate($hds, $o->{partitions}); 1; } ]; } - if (!$readonly) { - push @solutions, - [ _("Use diskdrake"), sub { diskdrake::main($hds, $o->{raid}, interactive_gtk->new, $o->{partitions}); 1 } ]; + + if (!$readonly && ref($o) =~ /gtk/) { #- diskdrake only available in gtk for now + $solutions{diskdrake} = + [ 0, _("Use diskdrake"), sub { + my $ok = 1; + do { + diskdrake::main($hds, $o->{raid}, interactive_gtk->new, $o->{partitions}); + my @fstab = fsedit::get_fstab(@$hds); + + unless (fsedit::get_root(\@fstab)) { + $ok = 0; + $o->ask_okcancel('', _("You must have a root partition. +For this, create a partition (or click on an existing one). +Then choose action ``Mount point'' and set it to `/'"), 1) or return; + } + if (!grep { isSwap($_) } @fstab) { + $o->ask_warn('', _("You must have a swap partition")), $ok=0 if $::beginner; + $ok &&= $::expert || $o->ask_okcancel('', _("You don't have a swap partition\n\nContinue anyway?")); + } + } until $ok; + 1; + } ]; + } + + if (!$readonly) { #- diskdrake only available in gtk for now + $solutions{fdisk} = + [ -10, _("Use fdisk"), sub { + $o->suspend; + foreach (@$hds) { + print "\n" x 10, _("You can now partition %s. +When you are done, don't forget to save using `w'", partition_table_raw::description($_)); + print "\n\n"; + my $pid = fork or exec "fdisk", devices::make($_->{device}); + waitpid($pid, 0); + } + $o->resume; + 0; + } ]; } + log::l("partitioning wizard log:\n", (map { ">>wizlog>>$_\n" } @wizlog)); + %solutions; } 1; |