-URGENT--------------------------------------------------------------------------------- check for fpons/pixel BOTH that resize_fat is clean for current version relative to 7.0-2. heavy testing of diskdrake to avoid corrupting partition table, current version should be available to fix bogus partition table, writing enabled only when partition is Ok (fixme? allow primary partition inside extended one, but with warning on diskdrake startup, made them as warning ?). -to test-------------------------------------------------------------------------------- tree for choosing monitors (buggy?) configure services at install what happens if a module fails to insmod (scsi step), in beginner/normal/expert fstab must be sorted (/usr/local after /usr) diskdrake should warn if nb_ide_parts > 63, nb_scsi_parts > 15 RAID upgrades add choice clean /tmp or not in expert kernel chosen by default must be the one according to supermount/secure bug if ide-scsi, no more hdX, but scd0 (aka sr0) (and add alias block-major-11 ide-scsi ?) -features------------------------------------------------------------------------------- let diskdrake have dos/win partition automatically set up with mount point, this will help loopback too. handle NT (add entry for it in lilo, put it in fstab) (7.1) rewrite crypto stuff (NEED 7.1) auto-install for corporate, very important (need consolidation). (7.1 or later) clean SCSI CDROM autoboot. (7.1) sparc ehancement, avoid V7+ machine target (div and mul not in v7 standard) (7.1) improve printerdrake to at least have the same functionalities as printtool. (7.1)better help for partitioning in newbie (7.1 or later?)help in some configuration files. (7.1)progression bar on crypto. (?)firewall configuration (instant firewalling?) (7.1)syslinux in graphical mode to be improved for heavily bogus BIOSes. (7.1)install in 800x600 - need handling of both 640x480 (mostly for VGA16) and 800x600 (7.1)index/compress hdlist? (for multi-cd) ! for multi-cd live is mandatory, small transaction are mandatory too. (7.1, other persons)rescue: - small modification for stage1 to get the rescue stage2 - create a stage2 with many tools (fdisk, bash...) the rescue could be on another cd (if multi-cd) ! care must be taken about modules (if ide is in module...) (7.1)Improved network configuration (PPP and/or Ethernet) PPPoE install and configuration (SuSE includes it, DHCP-like) (7.1?)loopback partitions (even root one) (7.1)standalone applications for configuration (netdrake, timetool, authentificationconf, soundcard) (7.1)feature missing: cancel installation crypto: add a cancel & progress bar while downloading error handling (like reading hdlist) (7.1)Generally improved package selection /ergonmic issue. Tree -> CTree, ``all'' branch with all packages show the value associated (100->a must, 90->great, 80->nice, ... 10->useless, 0->do not install) (7.1?)grub, chos, gag (?)enable the testing of the mouse type (under X) (wheel) possibility to specify the mouse (7.2 or later)horizontal sub-steps (7.2 or later)diskdrake in text mode (7.1 or later)widget for displaying fdisk (dindinx) (see above)add fdisk using the zvt widget (taken in gnome-libs) (done,pix,7.1)manage a lot of language (ergonomic issue as it already exists) (done,pix,7.1)tree for choosing things like timezone, monitors, graphic cards, modules, mice, keyboard? ... (done,pix,7.1)sound config, although very simple, no dedicated steps and only PCI (or maybe ISA-PNP if time left ?) (done,pix,7.1)partitioning, keyboard shortcut. ---- (?) paride in stage1 (?) msec custom stage1 & network: add ability to choose the network interface to use stage1 & cdrom: add ability in expert to choose the scsi cdrom drive to use ability to add nfs/weird_fs entries in fstab (obsolete) pb with dependencies ``missing'': icewm do not require XFree86 and so you can have icewm but no X server auto ppp-configure with free provider -easy fixes----------------------------------------------------------------------------- in ok_cancel, focus has 3 states, should be 2 (ask dindinx) rpmdrake proposition for cdrom labels use option nocheck to mount for upgrades -fixes needing thinking----------------------------------------------------------------- with /usr, /usr/local and /usr/local/e mount points i get an error at step mounting local filesystems ask network configuration only if NIC found? configure DHCP for newbies if ethernet & DHCP card available xvidtune like screen configuration (see SuSE's yast) live cdrom for alpha (sparc?) network boot get the error when getting/reading .rpm files fail better timeout handling for network installs handle not enough room for update (fpons)verify the free space is big enough. missing feature in lilo configuration: can't give hda2 with /boot/vmlinuz if already hda1 with /boot/vmlinuz the XFdrake test does not handle the fontset > Here I go into the printer configuration select 'HP Deskjet 722C Colour', > print a test ASCII page, pressing 'No' when prompted to indicate the page did > not print OK and then hitting cancel when prompted to choose a printer type > again. > ask_from_list cancel at /usr/lib/libDrakX/my_gtk.pm line 504. bug in ext2resizing (no sparse superbloc, don't finish properly) diskdrake: take from parted mklabel, hide(?) bug in kde desktop if keeps home but not an upgrade bug in users: mandrake user is added twice in strange installs (mixed of security 0 + ???) bugs rpmdrake: - just after installing a package, switch to `Installed', the package has wrong name - refresh the kde desktop after package installation in rpmdrake (restart kpanel) - rpmdrake and same name packages urpmi: pb if XXX-devel requires XXX = 1.2.3 and we updgrade XXX-1.2.3 bug in defcfg in with lang=fr_FR, display is buggy bug keyboard focus: after switch in console at Xconfig step -to look at-------------------------------------------------------------------------- adduserdrake to remove/update users (???)free provider auto configuration facility (to be discussed). (?)on laptop, configure the MMU to use swap not very often (?)checkboxes in groups based on compssList (and availableSpace?) (?)see what can be done with nvram (50 bytes to save information) better wacom support (obsolete) bug in diskdrake: can in strange cases create a primary partition at sector #0 (done,pix(partly, protection against bugging))bug in diskdrake: in expert: blank, create hda5 at beginning, create hda6 at the end, create hda7 in the middle, remove the first one. Result hda5 at the end and bug. (fpons)bug: CANON BJC 4X00 do not work with current rhs-printfilters (work with magicfilters (debian)) (should be handled by ghostscript BJC600's driver) (pix)install text on mem=8M, mem=16M? (pix)kickstart partitioning? raid? X configuration and bootloader in kickstart XFdrake chooseResolutions with ask_from_list do not permit ``Show all'' (obsolete) have a better time estimation of the remaining time in install packages (?) options in mkfs, progress bar when formatting (?) when some error occurs, partition must be unset isFormatted -hardware------------------------------------------------------------------------------- - with no floppy drive, mkbootdisk step fails badly - try detect_devices::floppies (and how are scsi floppies handled?) maybe: do a iotcl FDGETPRM to detect fd1, fd0. need a simple solution to precise mouse type (syslinux option?) ELSA Gloria has bad ddc info token ring is tr0 not eth0 I have Mandrake 6.1 installed and working on a ThinkPad 770. To enable the PCMCIA Token ring I have to append the following line to /etc/pcmcia/config.opts module "ibmtr_cs" opts "mmiobase=0xd2000 srambase=0xd4000" smp not detected (mhoward@memphisonline.com on cooker, bios=BP6PW) UDMA66 (ultra66.o for promise) aha152x needs "insmod aha152x.o aha152x=0x140,11,7" (obsolete) usb module not removed if no mouse found (fpons)handle dat drives hibernation on laptop -> clock not restored # in 2.3.15 "Silicon Integrated Systems [SiS]|SiS900 10/100 Ethernet" is handled -(?)--------------------------------------------------------------------------------- (?)using setxkb, enable the testing of the keyboard (?)XFdrake does not handle fbdev (?) Je viens de faire une installation sur une machine où seul Be était installé. Je l'ai supprimé et installé (mode recommandé) Oxygen. Au redémarrage, le boot manager de Be apparaît et il est impossible de démarrer Linux. Pourquoi ne pas installer LILO si on supprime toutes les partitions ? (?)initrd in bzip2 (?)smaller zsh (or ash in initrd) (?)is configureNetworkNet needed with dhcp/bootp? (?)bug in upgrade: install from hda1:/usr/local/blah with hda1:/ (?)mandrake_desk was not installed while kdebase it there on upgrade (?)when clicking on X configuration, installation of packages is not displayed (?)maybe remove commented lines in /usr/lib/perl5/... files (?)timezone using a picture (pb: how to delimit zones) when asking GMT or not, display the time for each possibility the list is too big for USA (?)ability to select the type of install when booting of cdrom (?)use the ability of el torito to handle 2.88MB or more (obsolete)lilo-deinstallation in case of lilo auto-installation for beginners (?)loadFont sucks (obsolete)trash on the screen when X first starts (?)remove the gray line surrounding the logo (?)cleanup /etc/services & /etc/protocols (?)strange: no scsi of type 'fd', only 'tape' (?)remount ro before X test. (?)remove every << and >> (doesn't handle > 32bits) -done--------------------------------------------------------------------------------- (done,fpons)diskdrake can olverlap partitions (resize lower, resize original typically after clear all and auto allocate, try maximal size available). (done,fpons)rewrite mouseconfig in perl? (done,pix)kudzu or not in miscellaneous (done,pix)warn the user if not enough ram to fulfill install (done,fpons)test after printer config (done,pix)ask for more than the memory size detected (done,fpons)modem config (done,pix)call kudzu in batch to initialize its list (done,pix)standalone generator of mdkinst_stage2.gz (done,pix)text install (done,pix) if u choose mouse usb != found mouse, it fails at X config (done,pix) diskdrake bug: saved information on floppy contains isMounted. (done,pix) update devices.c from modules.pm (done,pix) in lilo.conf, put disk=/dev/hdb bios=0x80 (done,pix) diskdrake auto_partitions suggested partition tables must be better foreach installClass (done,pix) update the list of modules (in update_kernel) (done,pix) language support: only choose the right locales and upmark the packages requiring it (done,pix) move security question before isntallation of packages (done,pix) install ssh (done,fpons,pix) change the boot message of syslinux (have something different from RedHat) (done,pix) install_steps.pm: 569 (128M + 3) (done,pix) bug: mouse freeze just before network configuration (mouse primax) (was kudzu) (done,pix) signal 11 in stage1 nfs kickstart mount failed (done,pix) ask supermount or not, no supermount with kernel-secure (done,pix) fix bug in g_auto_install (can't go through all) (done,pix) bug: install from ciril.fr fails (done,pix)wizard for partitioning in case of one full vfat (done,dindinx)app for choosing drakxtools (drakxconf) (done,pix)verify being root (done,pix)log::l -> initlog (done,pix)install apmd for laptops (maybe not start apmd though) (done,pix)icewm apm (sh icewm_apm) (done,pix)kde apm (put Kapm.kdelnk in ~/Desktop/Autostart) (done,pix)bug in adduserdrake: missing pwconv in md5 (done,pix)correct the default value of draksec (cp draksec) (done,pix)in draksec, (and maybe others) have --expert as default if /etc/sysconfig/system has TYPE=expert (done,pix)bug in XFdrake in install, cancel in choose Card do not close the window (done,pix)in XFdrake, testing should not overwrite /etc/X11/XF86Config (done,pix) hwiz and supermount and eject :( (done(replaced by msec's),pix) bug: usermod -G urpmi a not done (full install) (done,pix)perl and .ph's (done,pix) BUG bootp in network install sigsegv (done,pix) move the last done stuff before Xconfiguration if possible (done,pix)draksec is buggy, don't try security >= 4 (done,pix)install apmd on laptops?? (maybe ask emcweb@btinernet.com (see alix)) (done,pix)missing alias ll for root (done,pix)urpmi.addmedia: |gzip instead of doing it afterwards (done,pix)locale (and fonts?) buggy in case ramdisk is used (done,pix)rpmdrake: Installed packages not in hdlist should be there (done)in ftp install, locale not installed properly (done,pix)pcmcia.img does not handle hd/cdrom (done,pix)cyrillic font buggy in DrakX (done,fred)remove xfs user from kdm (done,pix)bug with 2 cdrom drives (.kdelnk to there for 1st drive) (done,pix(works))test ramdisk stage2 and romanian (done,pix)kfmrc (done,pix)on laptop, default to 1024x768 (done,pix)mkinitrd and deps (done,fred(removed the call))XFdrake and mousedrake freeze if lothar launches them (done,pix)crypto message (done,pix)test bug with lilo and windows (if not on mbr) (done,pix)removed icons come back later (kde desktop) (done,pix(was bug in upgrade reading old config)) segfault in linuxconf (adapter 1 empty) (test with the sysconfig sent) (done,fpons)bug: Lrosqu'on effectue une mise à jour et que /etc/lilo.conf contient la variable « default » positionnée sur autre chose que « linux » ou « windows », DrakX est incapable de générer LILO. (done,fpons)bug: GeForce and hd.img? (done,fpons)for upgrade in expert, give choice of packages to install choosing packages available in upgrade? (done,pix)rpmdrake: pb uninstalling package with dependencies (rpmdrake is killed?!) (as root too) (done,pix)noatime option for ext2 fs on laptops (do not wake up the hd) Do not update inode access times on this file system (e.g, for faster access on the news spool to speed up news servers). (done,pix)kde's icons: 28 horiz and 25 vert grid for big icons (done,pix)bug: DrakConf don't follow the charset -> add setlocale(LC_ALL, "") (done,pix)for ko|ja|zh, gnome-terminal should point to rxvt (-CLE) (done,pix)group cdrom in /etc/group (gid=22) (done,pix)drakxtools should require urpmi (done,pix)bug: gdm unset LANG (done,pix) zip with automount -> ppa not autoloaded (done,pix)when you set the kde icons to Large, maybe it'd be good to chown the .kderc (done,pix)lilo in russian/japaneese is horrible (ok,pix)test ide burners (ok)test check bad blocks optional for mke2fs (done,pix)hd install: no umount is done at the end of install :( just before release: (done,pix)- mandrake_doc-xx, the symlink is no good in /usr/doc/mandrake as (done,pix)- crypto dependencies to update (done,pix)- update kudzu's pcitable (done,pix)- update pcitable for 86C368 if 3.3.6 (and other S3 3D's) ("ATI|3D Rage P/M Mobility AGP 2x" -> changed to Server:Mach64) (done,pix)with 2MB of video ram, chooses 8bpp instead of 16bpp (done,pix) replace { device => "loop7", type => 0x83, size => ((cat_('/dos/lnx4win/size.txt'))[0]*2048), mntpoint => "/", isFormatted => 1, isMounted => 1 }, by { device => "loop7", type => 0x83, size => cat_('/dos/lnx4win/size.txt') * 2048, mntpoint => "/", isFormatted => 1, isMounted => 1 }, (done,fpons)in ftp install, bug with X server install with wu-ftpd 2.6 (see http://www.wu-ftpd.org/broken-clients.html) (done,pix)ask package installation languages (must be put in RPM_INSTALL_LANG) (done,pix)bug (by dadou): Si la partition racine est trop petite pour installer le système, un message d'erreur apparaît pour signaler le problème (bien) mais on ne peut en sortir. La seule solution est de redémarrer. (obsolete)bug when selecting compssUsers, do not deselect after (if u deselect) (done,pix)detect ide burners and then add hdX=ide-scsi to kernel cmdline (done,pix)urpmi: handle many args on cmd-line (done,pix)fix any // in path to ftp server otherwise windobe server bug :( (done,pix)diskdrake and auto partitioning, may have the last creation of partition rejected, try to figure why? (done,pix)in chooseResolutions: display the graphic card found (done,pix)with pcmcia, need ONBOOT=no (fpons,done) XFree: handle by card options eg: SIS6326 needs "no_bitblt" "no_bltimage" and 24bpp instead of 32bpp (done,pix) Xconfiguration: if "can't open fixed font", relaunch xfs. #n308'>308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733

package install2; # $Id$

use diagnostics;
use strict;
use Data::Dumper;

use vars qw($o $version);

#-######################################################################################
#- misc imports
#-######################################################################################
use common qw(:common :file :system :functional);
use install_any qw(:all);
use install_steps;
use commands;
use lang;
use keyboard;
use mouse;
use fsedit;
use devices;
use partition_table qw(:types);
use modules;
use detect_devices;
use run_program;
use log;
use fs;

$::VERSION = "7.1";
#-$::corporate=1;

#-######################################################################################
#- Steps table
#-######################################################################################
my (%installSteps, @orderedInstallSteps);
{    
    my @installStepsFields = qw(text redoable onError hidden needs); 
    #entered reachable toBeDone next done;
    my @installSteps = (
  selectLanguage     => [ __("Choose your language"), 1, 1, '' ],
  selectInstallClass => [ __("Select installation class"), 1, 1, '' ],
  setupSCSI          => [ __("Hard drive detection"), 1, 0, '' ],
  selectMouse        => [ __("Configure mouse"), 1, 1, '', "selectInstallClass" ],
  selectKeyboard     => [ __("Choose your keyboard"), 1, 1, '', "selectInstallClass" ],
  miscellaneous      => [ __("Miscellaneous"), 1, 1, '$::beginner' ],
  doPartitionDisks   => [ __("Setup filesystems"), 1, 0, '$o->{lnx4win}', "selectInstallClass" ],
  formatPartitions   => [ __("Format partitions"), 1, -1, '', "doPartitionDisks" ],
  choosePackages     => [ __("Choose packages to install"), 1, -2, '$::beginner', "formatPartitions" ],
  installPackages    => [ __("Install system"), 1, -1, '', ["formatPartitions", "selectInstallClass"] ],
  configureNetwork   => [ __("Configure networking"), 1, 1, '', "formatPartitions" ],
#-  installCrypto      => [ __("Cryptographic"), 1, 1, '!$::expert', "configureNetwork" ],
  configureTimezone  => [ __("Configure timezone"), 1, 1, '', "installPackages" ],
  configureServices  => [ __("Configure services"), 1, 1, '!$::expert', "installPackages" ],
  configurePrinter   => [ __("Configure printer"), 1, 0, '', "installPackages" ],
  setRootPassword    => [ __("Set root password"), 1, 1, '', "installPackages" ],
  addUser            => [ __("Add a user"), 1, 1, '', "installPackages" ],
arch() !~ /alpha/ ? (
  createBootdisk     => [ __("Create a bootdisk"), 1, 0, '$::o->{lnx4win} && !$::expert', "installPackages" ],
) : (),
  setupBootloader    => [ __("Install bootloader"), 1, 1, '$::o->{lnx4win} && !$::expert', "installPackages" ],
  configureX         => [ __("Configure X"), 1, 1, '', ["formatPartitions", "setupBootloader"] ],
arch() !~ /alpha/ ? (
  generateAutoInstFloppy => [ __("Auto install floppy"), 1, 1, '!$::expert || $o->{lnx4win}', "installPackages" ],
) : (),
  exitInstall        => [ __("Exit install"), 0, 0, '$::beginner' ],
);
    for (my $i = 0; $i < @installSteps; $i += 2) {
	my %h; @h{@installStepsFields} = @{ $installSteps[$i + 1] };
	$h{next}    = $installSteps[$i + 2];
	$h{entered} = 0;
	$h{onError} = $installSteps[$i + 2 * $h{onError}];
	$h{reachable} = !$h{needs};
	$installSteps{ $installSteps[$i] } = \%h;
	push @orderedInstallSteps, $installSteps[$i];
    }
    $installSteps{first} = $installSteps[0];
}
#-#####################################################################################
#-INTERNAL CONSTANT
#-#####################################################################################

my @install_classes = qw(normal developer server);

#-#####################################################################################
#-Default value
#-#####################################################################################
#- partition layout
my %suggestedPartitions = (
arch() =~ /^sparc/ ? (
  normal => [
    { mntpoint => "/",     size => 150 << 11, type => 0x83, ratio => 1, maxsize =>1000 << 11 },
    { mntpoint => "swap",  size =>  64 << 11, type => 0x82, ratio => 1, maxsize => 250 << 11 },
    { mntpoint => "/usr",  size => 300 << 11, type => 0x83, ratio => 4, maxsize =>3000 << 11 },
    { mntpoint => "/home", size => 300 << 11, type => 0x83, ratio => 3 },
  ],
) : (
  normal => [
    { mntpoint => "/",     size => 300 << 11, type => 0x83, ratio => 5, maxsize =>3500 << 11 },
    { mntpoint => "swap",  size =>  64 << 11, type => 0x82, ratio => 1, maxsize => 250 << 11 },
    { mntpoint => "/home", size => 300 << 11, type => 0x83, ratio => 3 },
  ],
),
  developer => [
    { mntpoint => "/",     size => 150 << 11, type => 0x83, ratio => 1, maxsize => 500 << 11 },
    { mntpoint => "swap",  size =>  64 << 11, type => 0x82, ratio => 1, maxsize => 250 << 11 },
    { mntpoint => "/usr",  size => 300 << 11, type => 0x83, ratio => 4, maxsize =>3000 << 11 },
    { mntpoint => "/home", size => 100 << 11, type => 0x83, ratio => 5 },
  ],
  server => [
    { mntpoint => "/",     size => 150 << 11, type => 0x83, ratio => 1, maxsize => 250 << 11 },
    { mntpoint => "swap",  size =>  64 << 11, type => 0x82, ratio => 2, maxsize => 400 << 11 },
    { mntpoint => "/usr",  size => 300 << 11, type => 0x83, ratio => 3, maxsize =>3000 << 11 },
    { mntpoint => "/var",  size => 100 << 11, type => 0x83, ratio => 4 },
    { mntpoint => "/home", size => 100 << 11, type => 0x83, ratio => 5 },
  ],
);
$suggestedPartitions{corporate} = $suggestedPartitions{server};

#-#######################################################################################
#-$O
#-the big struct which contain, well everything (globals + the interactive methods ...)
#-if you want to do a kickstart file, you just have to add all the required fields (see for example
#-the variable $default)
#-#######################################################################################
$o = $::o = {
#    bootloader => { linear => 0, lba32 => 1, message => 1, timeout => 5, restricted => 0 },
    autoSCSI   => 0,
    mkbootdisk => 1, #- no mkbootdisk if 0 or undef, find a floppy with 1, or fd1
#-    packages   => [ qw() ],
    partitioning => { clearall => 0, eraseBadPartitions => 0, auto_allocate => 0 }, #-, readonly => 0 },
#-    security => 2,
#arch() =~ /^sparc/ ? (
#  partitions => [
#    { mntpoint => "/",     size => 600 << 11, type => 0x83, ratio => 5, maxsize =>1000 << 11 },
#    { mntpoint => "swap",  size => 128 << 11, type => 0x82, ratio => 1, maxsize => 400 << 11 },
#    { mntpoint => "/usr",  size => 300 << 11, type => 0x83, ratio => 3, maxsize =>1500 << 11 },
#    { mntpoint => "/home", size => 300 << 11, type => 0x83, ratio => 5 },
#  ],
#) : (
#  partitions => [
#    { mntpoint => "/boot", size =>  10 << 11, type => 0x83, maxsize => 30 << 11 },
#    { mntpoint => "/",     size => 300 << 11, type => 0x83, ratio => 5, maxsize => 1500 << 11 },
#    { mntpoint => "swap",  size =>  64 << 11, type => 0x82, ratio => 1, maxsize => 250 << 11 },
#    { mntpoint => "/home", size => 300 << 11, type => 0x83, ratio => 5 },
#  ],
#),
#-    partitions => [
#-		      { mntpoint => "/boot", size =>  16 << 11, type => 0x83 },
#-		      { mntpoint => "/",     size => 256 << 11, type => 0x83 },
#-		      { mntpoint => "/usr",  size => 512 << 11, type => 0x83, growable => 1 },
#-		      { mntpoint => "/var",  size => 256 << 11, type => 0x83 },
#-		      { mntpoint => "/home", size => 512 << 11, type => 0x83, growable => 1 },
#-		      { mntpoint => "swap",  size =>  64 << 11, type => 0x82 }
#-		    { mntpoint => "/boot", size =>  16 << 11, type => 0x83 },
#-		    { mntpoint => "/",     size => 300 << 11, type => 0x83 },
#-		    { mntpoint => "swap",  size =>  64 << 11, type => 0x82 },
#-		   { mntpoint => "/usr",  size => 400 << 11, type => 0x83, growable => 1 },
#-	     ],
    authentication => { md5 => 1, shadow => 1 },
    lang         => 'en_US',
    isUpgrade    => 0,
    toRemove     => [],
    toSave       => [],
#-    simple_themes => 1,
#-    installClass => "normal",

    timezone => {
#-                   timezone => "Europe/Paris",
#-                   UTC      => 1,
                },
#-    superuser => { password => 'a', shell => '/bin/bash', realname => 'God' },
#-    user => { name => 'foo', password => 'bar', home => '/home/foo', shell => '/bin/bash', realname => 'really, it is foo' },

#-    keyboard => 'de',
#-    display => "192.168.1.19:1",
    steps        => \%installSteps,
    orderedSteps => \@orderedInstallSteps,

#- for the list of fields available for user and superuser, see @etc_pass_fields in install_steps.pm
#-    intf => { eth0 => { DEVICE => "eth0", IPADDR => '1.2.3.4', NETMASK => '255.255.255.128' } },

#-step : the current one
#-prefix
#-mouse
#-keyboard
#-netc
#-autoSCSI drives hds  fstab
#-methods
#-packages compss
#-printer haveone entry(cf printer.pm)

};

#-######################################################################################
#- Steps Functions
#- each step function are called with two arguments : clicked(because if you are a
#- beginner you can force the the step) and the entered number
#-######################################################################################

#------------------------------------------------------------------------------
sub selectLanguage {
    $::live and return;
    $o->selectLanguage($_[1] == 1);

    addToBeDone {
	lang::write($o->{prefix});
	keyboard::write($o->{prefix}, $o->{keyboard}, lang::lang2charset($o->{lang}));
    } 'installPackages' unless $::g_auto_install;
}

#------------------------------------------------------------------------------
sub selectMouse {
    $::live and return;
    my ($first_time) = $_[1] == 1;

    add2hash($o->{mouse} ||= {}, mouse::read($o->{prefix})) if $o->{isUpgrade} && $first_time;

    $o->selectMouse(!$first_time);
    addToBeDone { mouse::write($o->{prefix}, $o->{mouse}) } 'installPackages';
}

#------------------------------------------------------------------------------
sub setupSCSI {
    $::live and return;
    my ($clicked) = $_[0];
    $o->{autoSCSI} ||= $::beginner;

    $o->setupSCSI($o->{autoSCSI} && !$clicked, $clicked);
}

#------------------------------------------------------------------------------
sub selectKeyboard {
    $::live and return;
    my ($clicked) = $_[0];

    return if !$o->{isUpgrade} && $::beginner && !$clicked;

    $o->{keyboard} = keyboard::read($o->{prefix}) if $o->{isUpgrade} && !$clicked && $o->{keyboard_unsafe};
    $o->selectKeyboard;

    #- if we go back to the selectKeyboard, you must rewrite
    addToBeDone {
	lang::write($o->{prefix});
	keyboard::write($o->{prefix}, $o->{keyboard}, lang::lang2charset($o->{lang}));
    } 'installPackages' unless $::g_auto_install;
}

#------------------------------------------------------------------------------
sub selectInstallClass {
    $::live and return;
    $o->selectInstallClass(@install_classes);
   
    $o->{partitions} ||= $suggestedPartitions{$o->{installClass}};

    if ($o->{steps}{choosePackages}{entered} >= 1 && !$o->{steps}{installPackages}{done}) {
        $o->setPackages(\@install_classes);
        $o->selectPackagesToUpgrade if $o->{isUpgrade};
    }
    if ($o->{isUpgrade}) {
	@{$o->{orderedSteps}} = map { /setupSCSI/ ? ($_, "doPartitionDisks") : $_ } 
	                        grep { !/doPartitionDisks/ } @{$o->{orderedSteps}};
	my $s; foreach (@{$o->{orderedSteps}}) {
	    $s->{next} = $_ if $s;
	    $s = $o->{steps}{$_};
	}
    }
}

#------------------------------------------------------------------------------
sub doPartitionDisks {
    $::live and return;
    $o->{steps}{formatPartitions}{done} = 0;
    $o->doPartitionDisksBefore;
    $o->doPartitionDisks;
    $o->doPartitionDisksAfter;
}

sub formatPartitions {
    $::live and return;
    unless ($o->{isUpgrade}) {
	$o->choosePartitionsToFormat($o->{fstab});
	$o->formatMountPartitions($o->{fstab}) unless $::testing;
    }
    mkdir "$o->{prefix}/$_", 0755 foreach 
      qw(dev etc etc/profile.d etc/sysconfig etc/sysconfig/console etc/sysconfig/network-scripts
	home mnt tmp var var/tmp var/lib var/lib/rpm var/lib/urpmi);
    mkdir "$o->{prefix}/$_", 0700 foreach qw(root);

    require raid;
    raid::prepare_prefixed($o->{raid}, $o->{prefix});

    my $d = "/initrd/loopfs/lnx4win";
    if (-d $d) {
#-	install_any::useMedium(0);
	install_any::getAndSaveFile("lnx4win/$_", "$d/$_") foreach qw(ctl3d32.dll loadlin.exe linux.pif lnx4win.exe lnx4win.ico rm.exe uninstall.bat uninstall.pif);
    }

#-    chdir "$o->{prefix}"; was for core dumps

    #-noatime option for ext2 fs on laptops (do not wake up the hd)
    #-	 Do  not  update  inode  access times on this
    #-	 file system (e.g, for faster access  on  the
    #-	 news spool to speed up news servers).
    $o->{pcmcia} and $_->{options} = "noatime" foreach grep { isTrueFS($_) } @{$o->{fstab}};
}

#------------------------------------------------------------------------------
sub choosePackages {
    require pkgs;

    #- always setPackages as it may have to copy hdlist files and depslist file.
    $o->setPackages;

    #- for the first time, select package to upgrade.
    #- TOCHECK this may not be the best place for that as package are selected at some other point.
    if ($_[1] == 1) {
	$o->selectPackagesToUpgrade if $o->{isUpgrade};

	$o->{compssUsersChoice}{$_} = 1 foreach @{$o->{compssUsersSorted}}, 'Miscellaneous';
	# $o->{compssUsersChoice}{KDE} = 0 if $o->{lang} =~ /ja|el|ko|th|vi|zh/; #- gnome handles much this fonts much better
    }

    $o->choosePackages($o->{packages}, $o->{compss}, 
		       $o->{compssUsers}, $o->{compssUsersSorted}, $_[1] == 1);
    my $pkg = pkgs::packageByName($o->{packages}, 'kdesu');
    pkgs::unselectPackage($o->{packages}, $pkg) if $pkg && $o->{security} > 3;

    #- check pre-condition where base backage has to be selected.
    pkgs::packageFlagSelected(pkgs::packageByName($o->{packages}, 'basesystem')) or die "basesystem package not selected";

    #- check if there are package that need installation.
    $o->{steps}{installPackages}{done} = 0 if $o->{steps}{installPackages}{done} && pkgs::packagesToInstall($o->{packages}) > 0;
}

#------------------------------------------------------------------------------
sub installPackages {
    $o->readBootloaderConfigBeforeInstall if $_[1] == 1;

    $o->beforeInstallPackages;
    $o->installPackages;
    $o->afterInstallPackages;
}
#------------------------------------------------------------------------------
sub miscellaneous {
    $::live and return;
    $o->miscellaneousBefore($_[0]);
    $o->miscellaneous($_[0]);

    addToBeDone {
	setVarsInSh("$o->{prefix}/etc/sysconfig/system", { 
            CLEAN_TMP => $o->{miscellaneous}{CLEAN_TMP},
            CLASS => $::expert && "expert" || $::beginner && "beginner" || "medium",
            TYPE => $o->{installClass},
            SECURITY => $o->{security},
	    META_CLASS => $o->{meta_class} || 'PowerPack',
        });

	my $f = "$o->{prefix}/etc/sysconfig/usb";
	output $f,
"USB=yes
MOUSE=
KEYBOARD=
STORAGE=
VISOR=no
" if modules::get_alias("usb-interface") && ! -e $f;

	install_any::fsck_option($o);
    } 'installPackages';
}

#------------------------------------------------------------------------------
sub configureNetwork {
    $::live and return;
    #- get current configuration of network device.
    require network;
    eval { network::read_all_conf($o->{prefix}, $o->{netc} ||= {}, $o->{intf} ||= {}) };
    $o->configureNetwork($_[1] == 1);
}
#------------------------------------------------------------------------------
sub installCrypto { $::live or $o->installCrypto }
#------------------------------------------------------------------------------
sub configureTimezone {
    $::live and return;
    my ($clicked) = @_;
    my $f = "$o->{prefix}/etc/sysconfig/clock";

    require timezone;
    if ($o->{isUpgrade} && -r $f && -s $f > 0) {
	return if $_[1] == 1 && !$clicked;
	#- can't be done in install cuz' timeconfig %post creates funny things
	add2hash($o->{timezone}, { timezone::read($f) });
    }
    $o->{timezone}{timezone} ||= timezone::bestTimezone(lang::lang2text($o->{lang}));
    $o->{timezone}{UTC} = !$::beginner && !grep { isFat($_) || isNT($_) } @{$o->{fstab}} unless exists $o->{timezone}{UTC};
    $o->configureTimezone($f, $clicked);
}
#------------------------------------------------------------------------------
sub configureServices { $::live or $::expert and $o->configureServices }
#------------------------------------------------------------------------------
sub configurePrinter  { $::live or $o->configurePrinter($_[0]) }
#------------------------------------------------------------------------------
sub setRootPassword {
    return if $o->{isUpgrade};

    $o->setRootPassword($_[0]);
    addToBeDone { install_any::setAuthentication($o) } 'installPackages';
}
#------------------------------------------------------------------------------
sub addUser {
    return if $o->{isUpgrade} && !$_[0];

    $o->addUser($_[0]);
    install_any::setAuthentication($o);
}

#------------------------------------------------------------------------------
sub createBootdisk {
    $::live and return;
    modules::write_conf($o->{prefix});
    $o->createBootdisk($_[1] == 1);
}

#------------------------------------------------------------------------------
sub setupBootloader {
    $::live and return;
    return if $::g_auto_install;

    modules::write_conf($o->{prefix});

    $o->setupBootloaderBefore if $_[1] == 1;
    $o->setupBootloader($_[1] - 1);
    
    local $ENV{DRAKX_PASSWORD} = $o->{bootloader}{password};
    run_program::rooted($o->{prefix}, "/usr/sbin/msec", $o->{security});
}
#------------------------------------------------------------------------------
sub configureX {
    $::live and return;
    my ($clicked) = $_[0];

    #- done here and also at the end of install2.pm, just in case...
    fs::write($o->{prefix}, $o->{fstab}, $o->{manualFstab}, $o->{useSupermount});
    modules::write_conf($o->{prefix});

    $o->configureX if pkgs::packageFlagInstalled(pkgs::packageByName($o->{packages}, 'XFree86')) && !$o->{X}{disabled} || $clicked;
}
#------------------------------------------------------------------------------
sub generateAutoInstFloppy { $::live or $o->generateAutoInstFloppy }

#------------------------------------------------------------------------------
sub exitInstall { $::live or $o->exitInstall(getNextStep() eq "exitInstall") }


#-######################################################################################
#- MAIN
#-######################################################################################
sub main {
    $SIG{__DIE__} = sub { chomp(my $err = $_[0]); log::l("warning: $err") };
    $SIG{SEGV} = sub { my $msg = "segmentation fault: seems like memory is missing as the install crashes"; print "$msg\n"; log::l($msg);
		       $o->ask_warn('', $msg);
		       setVirtual(1);
		       require install_steps_auto_install;
		       install_steps_auto_install::errorInStep();
		   };
    $ENV{SHARE_PATH} ||= "/usr/share";
    $ENV{PERL_BADLANG} = 1;

    $::beginner = $::expert = $::g_auto_install = 0;

#-    c::unlimit_core() unless $::testing;

    my ($cfg, $patch, $oem, @auto);
    my %cmdline; map { 
	my ($n, $v) = split '=';
	$cmdline{$n} = $v || 1;
    } split ' ', cat_("/proc/cmdline");

    my $opt; foreach (@_) {
	if (/^--?(.*)/) {
	    $cmdline{$opt} = 1 if $opt;
	    $opt = $1;
	} else {
	    $cmdline{$opt} = $_ if $opt;
	    $opt = '';
	}
    } $cmdline{$opt} = 1 if $opt;
    
    $::beginner = 1;

    map_each {
	my ($n, $v) = @_;
	my $f = ${{
	    oem       => sub { $oem = $v },
	    lang      => sub { $o->{lang} = $v },
	    flang     => sub { $o->{lang} = $v ; push @auto, 'selectLanguage' },
	    method    => sub { $o->{method} = $v },
	    pcmcia    => sub { $o->{pcmcia} = $v },
	    vga16     => sub { $o->{vga16} = $v },
	    vga       => sub { $o->{vga} = $v },
	    step      => sub { $o->{steps}{first} = $v },
	    expert    => sub { $::expert = 1; $::beginner = 0 },
	    beginner  => sub { $::beginner = $v },
	    class     => sub { $o->{installClass} = $v },
	    fclass    => sub { $o->{installClass} = $v; push @auto, 'selectInstallClass' },
	    desktop   => sub { $o->{meta_class} = 'desktop' },
	    lnx4win   => sub { $o->{lnx4win} = 1 },
	    readonly  => sub { $o->{partitioning}{readonly} = $v ne "0" },
	    display   => sub { $o->{display} = $v },
	    security  => sub { $o->{security} = $v },
	    live      => sub { $::live = 1 },
	    noauto    => sub { $::noauto = 1 },
	    test      => sub { $::testing = 1 },
            nopci     => sub { $::nopci = 1 },
	    patch     => sub { $patch = 1 },
	    defcfg    => sub { $cfg = $v },
	    newt      => sub { $o->{interactive} = "newt" },
	    text      => sub { $o->{interactive} = "newt" },
	    stdio     => sub { $o->{interactive} = "stdio"},
	    corporate => sub { $::corporate = 1 },
	    kickstart => sub { $::auto_install = $v },
	    auto_install => sub { $::auto_install = $v },
	    simple_themes => sub { $o->{simple_themes} = 1 },
	    useless_thing_accepted => sub { $o->{useless_thing_accepted} = 1 },
	    alawindows => sub { $o->{security} = 0; $o->{partitioning}{clearall} = 1; $o->{bootloader}{crushMbr} = 1 },
	    fdisk => sub { $o->{partitioning}{fdisk} = 1 },
	    g_auto_install => sub { $::testing = $::g_auto_install = 1; $o->{partitioning}{auto_allocate} = 1 },
	    nomouseprobe => sub { $o->{nomouseprobe} = $v },
	}}{lc $n}; &$f if $f;
    } %cmdline;

    undef $::auto_install if $cfg;
    if ($::g_auto_install) {
	(my $root = `/bin/pwd`) =~ s|(/[^/]*){5}$||;
	symlinkf $root, "/tmp/rhimage" or die "unable to create link /tmp/rhimage";
	$o->{method} ||= "cdrom";
	$o->{mkbootdisk} = 0;
    }
    unless ($::testing || $::live) {
	unlink $_ foreach ( $o->{pcmcia} ? () : ("/sbin/install"), #- #- install include cardmgr!
			   "/modules/modules.cgz",
			   "/sbin/insmod", "/sbin/rmmod",
			   "/modules/pcmcia_core.o", #- always use module from archive.
			   "/modules/i82365.o",
			   "/modules/tcic.o",
			   "/modules/ds.o",
			   );
    }

    print STDERR "in second stage install\n";
    log::openLog(($::testing || $o->{localInstall}) && 'debug.log');
    log::l("second stage install running");
    log::ld("extra log messages are enabled");

    eval { spawnShell() };

    $o->{prefix} = $::testing ? "/tmp/test-perl-install" : $::live ? "" : "/mnt";
    $o->{root}   = $::testing ? "/tmp/root-perl-install" : "/";
    if ($::live) {
	@{$o->{orderedSteps}} = grep { /choosePackages/ || /installPackages/ } @{$o->{orderedSteps}};
	my $s; foreach (@{$o->{orderedSteps}}) {
	    $s->{next} = $_ if $s;
	    $s = $o->{steps}{$_};
	}
	$o->{isUpgrade} = 1;
	$::beginner = 0; #- use custom by default.
	$::expert = 1;
    }
    mkdir $o->{prefix}, 0755;
    mkdir $o->{root}, 0755;

    #-  make sure we don't pick up any gunk from the outside world
    my $remote_path = "$o->{prefix}/sbin:$o->{prefix}/bin:$o->{prefix}/usr/sbin:$o->{prefix}/usr/bin:$o->{prefix}/usr/X11R6/bin";
    $ENV{PATH} = "/usr/bin:/bin:/sbin:/usr/sbin:/usr/X11R6/bin:$remote_path" unless $::g_auto_install;

    $o->{interactive} ||= 'gtk';
    if ($o->{interactive} eq "gtk" && availableMemory < 22 * 1024) {
	log::l("switching to newt install cuz not enough memory");
	$o->{interactive} = "newt";
    }

    if ($::auto_install) {
	require install_steps_auto_install;
	eval { $o = $::o = install_any::loadO($o, $::auto_install) };
	if ($@) {
	    log::l("error using auto_install, continuing");
	    undef $::auto_install;
	} else {
	    log::l("auto install config file loaded successfully");
	}
    }
    unless ($::auto_install) {
	$o->{interactive} ||= 'gtk';
	require"install_steps_$o->{interactive}.pm";
    }
    eval { $o = $::o = install_any::loadO($o, "patch") } if $patch;
    eval { $o = $::o = install_any::loadO($o, $cfg) } if $cfg;

    $o->{prefix} = $::testing ? "/tmp/test-perl-install" : $::live ? "" : "/mnt";
    mkdir $o->{prefix}, 0755;

    modules::unload($_) foreach qw(vfat msdos fat);
    modules::load_deps(($::testing ? ".." : "") . "/modules/modules.dep");
    modules::read_stage1_conf("/tmp/conf.modules");
    modules::read_already_loaded();

    eval { modules::load("af_packet") };

    map_index {
	modules::add_alias("sound-slot-$::i", $_->{driver});
    } modules::get_that_type('sound');

    #- needed very early for install_steps_gtk
    modules::load_thiskind("usb"); 
    eval { ($o->{mouse}, $o->{wacom}) = mouse::detect() } unless $o->{nomouseprobe} || $o->{mouse};

    lang::set($o->{lang}); #- mainly for defcfg

    $o->{allowFB} = listlength(cat_("/proc/fb"));

    my $o_;
    while (1) {
	require"install_steps_$o->{interactive}.pm";
    	$o_ = $::auto_install ?
    	  install_steps_auto_install->new($o) :
    	    $o->{interactive} eq "stdio" ?
    	  install_steps_stdio->new($o) :
    	    $o->{interactive} eq "newt" ?
    	  install_steps_newt->new($o) :
    	    $o->{interactive} eq "gtk" ?
    	  install_steps_gtk->new($o) :
    	    die "unknown install type";
	$o_ and last;

	$o->{interactive} = "newt";
	require install_steps_newt;
    }
    $o->{meta_class} = 'desktop' if cat__(install_any::getFile("VERSION")) =~ /desktop/i;
    if ($o->{meta_class} eq 'desktop') {
	$o->{installClass} = 'normal';
	push @auto, 'selectInstallClass';
    }
    if ($oem) {
	push @auto, 'selectInstallClass', 'selectMouse', 'configureTimezone', 'exitInstall';
    }
    foreach (@auto) {
	eval "undef *" . (!/::/ && "install_steps_interactive::") . $_;
	my $s = $o->{steps}{/::(.*)/ ? $1 : $_} or next;
	$s->{hidden} = 1;
    }

    $::o = $o = $o_;

    if (-e "/tmp/network") {
	require network;
	#- get stage1 network configuration if any.
	$o->{netc} ||= network::read_conf("/tmp/network");
	if (my ($file) = glob_('/tmp/ifcfg-*')) {
	    log::l("found network config file $file");
	    my $l = network::read_interface_conf($file);
	    add2hash(network::findIntf($o->{intf} ||= {}, $l->{DEVICE}), $l);
	}
    }

    #-the main cycle
    my $clicked = 0;
    MAIN: for ($o->{step} = $o->{steps}{first};; $o->{step} = getNextStep()) {
	$o->{steps}{$o->{step}}{entered}++;
	$o->enteringStep($o->{step});
	eval {
	    &{$install2::{$o->{step}}}($clicked, $o->{steps}{$o->{step}}{entered});
	};
	$o->kill_action;
	$clicked = 0;
	while ($@) {
	    local $_ = $@;
	    $o->kill_action;
	    if (/^setstep (.*)/) {
		$o->{step} = $1;
		$o->{steps}{$1}{done} = 0;
		$clicked = 1;
		redo MAIN;
	    }
	    /^theme_changed$/ and redo MAIN;
	    unless (/^already displayed/ || /^ask_from_list cancel/) {
		eval { $o->errorInStep($_) };
		$@ and next;
	    }
	    $o->{step} = $o->{steps}{$o->{step}}{onError};
	    next MAIN unless $o->{steps}{$o->{step}}{reachable}; #- sanity check: avoid a step not reachable on error.
	    redo MAIN;
	}
	$o->{steps}{$o->{step}}{done} = 1;
	$o->leavingStep($o->{step});

	last if $o->{step} eq 'exitInstall';
    }
    install_any::clean_postinstall_rpms();
    install_any::ejectCdrom();

    $::live or fs::write($o->{prefix}, $o->{fstab}, $o->{manualFstab}, $o->{useSupermount});
    modules::write_conf($o->{prefix});

    #- to ensure linuxconf doesn't cry against those files being in the future
    foreach ('/etc/modules.conf', '/etc/crontab', '/etc/sysconfig/mouse', '/etc/sysconfig/network', '/etc/X11/fs/config') {
	my $now = time - 24 * 60 * 60;
	utime $now, $now, "$o->{prefix}/$_";
    }
    $::live or install_any::killCardServices();

    #- make sure failed upgrade will not hurt too much.
    install_steps::cleanIfFailedUpgrade($o);

    -e "$o->{prefix}/usr/bin/urpmi" or eval { commands::rm("-rf", "$o->{prefix}/var/lib/urpmi") };

    #- mainly for auto_install's
    run_program::rooted($o->{prefix}, "sh", "-c", $o->{postInstall}) if $o->{postInstall};
    do { local $ENV{PATH} = $remote_path;
	 run_program::run("bash", "-c", $o->{postInstallNonRooted}) } if $o->{postInstallNonRooted};

    #- have the really bleeding edge ddebug.log
    eval { commands::cp('-f', "/tmp/ddebug.log", "$o->{prefix}/root") };

    #- ala pixel? :-) [fpons]
    sync(); sync();

    log::l("installation complete, leaving");
    print "\n" x 80;
}

#-######################################################################################
#- Wonderful perl :(
#-######################################################################################
1;