home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / boot / i386 / root / usr / share / YaST2 / clients / inst_mode.ycp < prev    next >
Text File  |  2006-11-29  |  9KB  |  395 lines

  1. /**
  2.  *
  3.  * Authors:    Klaus K├ñmpf <kkaempf@suse.de>
  4.  *        Arvin Schnell <arvin@suse.de>
  5.  *
  6.  * Purpose:    Ask for the installation method:
  7.  *        - New installation
  8.  *        - Update
  9.  *        - Repair
  10.  *        - Boot installed system
  11.  *
  12.  *        Arguments:
  13.  *
  14.  *        Args(0): symbol `AskUser if this is called by the proposal
  15.  *             AskUser() function
  16.  *
  17.  *        Returns automatically if no Linux partition is found or an
  18.  *        update is not supported.
  19.  *
  20.  * $Id: inst_mode.ycp 24242 2005-07-21 15:02:50Z fehr $
  21.  *
  22.  */
  23. {
  24.     import "Mode";
  25.     import "Product";
  26.     import "Wizard";
  27.     import "Popup";
  28.     import "Label";
  29.     import "ProductControl";
  30.     import "FileSystems";
  31.     import "Storage";
  32.     import "Kernel";
  33.     import "RootPart";
  34.     import "Update";
  35.     import "Linuxrc";
  36.  
  37.     textdomain "installation";
  38.  
  39.     string start_mode = Mode::mode ();
  40.  
  41.     define symbol handle_boot ()
  42.     {
  43.     y2milestone( "User wishes to boot installed system" );
  44.  
  45.     if (!RootPart::didSearchForRootPartitions)
  46.     {
  47.         UI::OpenDialog (`opt(`decorated ),
  48.                 // label
  49.                 `Label(_("Evaluating root partition. One moment please...")));
  50.         RootPart::FindRootPartitions ();
  51.         UI::CloseDialog ();
  52.     }
  53.  
  54.     if (RootPart::numberOfValidRootPartitions == 0)
  55.     {
  56.         // a popup
  57.         Popup::Message(_("No Linux root partition found."));
  58.         return `cancel;
  59.     }
  60.  
  61.     // We must only change RootPart::selectedRootPartition if booting
  62.     // is inevitable.
  63.  
  64.     if (RootPart::numberOfValidRootPartitions == 1)
  65.     {
  66.         RootPart::SetSelectedToValid ();
  67.     }
  68.     else
  69.     {
  70.         if (WFM::CallFunction ("inst_rootpart", [true, true, `boot_popup]) != `next)
  71.         return `cancel;
  72.     }
  73.  
  74.     string root_part = RootPart::selectedRootPartition;
  75.  
  76.     UI::OpenDialog( `opt(`decorated),
  77.             // Information popup: Inform user what partition
  78.             // will be booted from after user selected
  79.             // "Boot installed system"
  80.             `Label( sformat(_("Booting from %1"), root_part ) ) );
  81.  
  82.     Update::Detach ();
  83.     RootPart::UnmountPartitions (false);
  84.  
  85.     sleep (1000);
  86.  
  87.     if ( ! Mode::test () )
  88.     {
  89.         Linuxrc::WriteYaSTInf ($["Root" : root_part]);
  90.         Storage::ActivateHld(true);
  91.     }
  92.  
  93.     UI::CloseDialog ();
  94.  
  95.     return `finish;
  96.     }
  97.  
  98.  
  99.     boolean called_from_ask_user = false;
  100.     if ( size( WFM::Args() ) > 0
  101.      && is( WFM::Args(0), symbol )
  102.      && WFM::Args(0) == `AskUser )
  103.     {
  104.     called_from_ask_user = true;
  105.     }
  106.  
  107.  
  108.     boolean offer_update = false;
  109.     if (contains (Product::flags, "update") || Kernel::GetSuSEUpdate ())
  110.     {
  111.     offer_update = true;
  112.     }
  113.  
  114.  
  115.     boolean have_linux = false;
  116.     if (Storage::HaveLinuxPartitions ())
  117.     {
  118.     have_linux = true;
  119.     }
  120.  
  121.     if (Mode::autoinst ())
  122.     {
  123.     return `auto;
  124.     }
  125.  
  126.     if (!called_from_ask_user && (!offer_update || !have_linux))
  127.     {
  128.     // Initially force new installation , no update possible
  129.     Mode::SetMode ("installation");
  130.     return `auto;
  131.     }
  132.  
  133.  
  134.     //---------------------------------------------------------------
  135.  
  136.  
  137.     string help_text = "";
  138.  
  139.     if (have_linux)
  140.     {
  141.     // help text for installation method
  142.     help_text = help_text + _("\
  143. <p>
  144. It appears that your machine has a Linux system installed.
  145. </p>");
  146.     }
  147.     else
  148.     {
  149.     // help text for installation method
  150.     help_text = help_text + _("<p>
  151. It appears that your machine does not have a Linux system installed.  
  152. Only a new installation is possible.
  153. </p>");
  154.     }
  155.  
  156.  
  157.     // help text for installation method
  158.     help_text = help_text + _("\
  159. <p>
  160. Please choose what to do:
  161. </p>");
  162.  
  163.     // help text for installation method
  164.     help_text = help_text + _("<p>
  165. Select <b>New Installation</b> if there is no existing Linux system on your
  166. machine or if you want to replace an existing Linux system completely,
  167. abandoning all its configuration data.
  168. </p>");
  169.  
  170.     if (have_linux)
  171.     {
  172.     if (offer_update)
  173.     {
  174.         // help text for installation method
  175.         help_text = help_text + _("<p>
  176. Select <b>Update an Existing System</b> to update a Linux system already
  177. installed on your machine. This option preserves configuration settings
  178. from your existing system whenever possible.
  179. </p>");
  180.     }
  181.     else
  182.     {
  183.         // help text for installation method
  184.         help_text = help_text + _("<p>
  185. This product does not offer an update.</p>");
  186.     }
  187.     }
  188.  
  189.     if (have_linux)
  190.     {
  191.     // help text for installation method
  192.     help_text = help_text + _("<p>
  193. Select <b>Repair Installed System</b> if you have a damaged Linux system on
  194. your hard disk. With this option, try to fix problems automatically.
  195. </p>");
  196.     }
  197.  
  198.     if (have_linux)
  199.     {
  200.     // help text for installation method
  201.     help_text = help_text + _("<p>
  202. Select <b>Boot Installed System</b> if you have a Linux system on your hard
  203. disk that will not boot. With this option, try to fix problems manually.
  204. </p>");
  205.     }
  206.  
  207.  
  208.     term radio_buttons = `VBox (`VSpacing (0.4));
  209.  
  210.     if (true)
  211.     {
  212.     radio_buttons = add (radio_buttons, `Left(`RadioButton(`id(`install),
  213.                 // label for radio button 1, New installation
  214.                 _("New &installation"), Mode::installation ())));
  215.     }
  216.  
  217.     if (have_linux && offer_update)
  218.     {
  219.     radio_buttons = add (radio_buttons, `VSpacing(0.2));
  220.     radio_buttons = add (radio_buttons, `Left(`RadioButton(`id(`update),
  221.                 // label for radio button 2, update
  222.                 _("&Update an existing system"), Mode::update ())));
  223.     }
  224.  
  225.     if (have_linux)
  226.     {
  227.     radio_buttons = add (radio_buttons, `VSpacing(0.2));
  228.     radio_buttons = add (radio_buttons, `Left(`RadioButton(`id(`repair),
  229.                 // label for radio button 3: Start repair system
  230.                 _("&Repair Installed System"), false)));
  231.     }
  232.  
  233.     if (have_linux)
  234.     {
  235.     radio_buttons = add (radio_buttons, `VSpacing(0.2));
  236.     radio_buttons = add (radio_buttons, `Left(`RadioButton(`id(`boot),
  237.                 // label for radio button 4: Boot installed system
  238.                 _("&Boot installed system"), false)));
  239.     }
  240.  
  241.     if ( ! called_from_ask_user )
  242.     {
  243.     // If this is _not_ called from the proposal's ask_user function but
  244.     // initially, the user _must_ make a decision, but there should clearly
  245.     // be a safe exit - so let's give him an "abort installation" option.
  246.  
  247.     radio_buttons = add( radio_buttons, `VSpacing(1.2) );
  248.     radio_buttons = add( radio_buttons,
  249.                  `Left(`RadioButton(`id(`abort), Label::AbortInstallationButton ()))
  250.                  );
  251.     }
  252.  
  253.     term radio_box = `RadioButtonGroup( `id( `options ),
  254.                     `HSquash(
  255.                          `Frame (
  256.                              // message above radiobuttons (installation/update)
  257.                              _("Please select"),
  258.                              `HBox(
  259.                                    `HSpacing(1),
  260.                                    radio_buttons
  261.                                    )
  262.                              )
  263.                          )
  264.                     );
  265.  
  266.     term buttons = `PushButton(`id(`ok), `opt(`default), Label::OKButton() );
  267.  
  268.     if ( called_from_ask_user )
  269.     {
  270.     // If we were called from the proposal's ask_user function, there must
  271.     // be a cancel button as a safe exit.
  272.  
  273.     buttons = `HBox(
  274.             `HWeight( 1, `PushButton(`id(`ok), `opt(`default), Label::OKButton() ) ),
  275.             `HSpacing( 1 ),
  276.             `HWeight( 1, `PushButton(`id(`cancel), Label::CancelButton() ) )
  277.             );
  278.  
  279.     }
  280.  
  281.     term ask_mode_dialog = `HBox(`id(`ask_mode_dialog ),
  282.                  `VSpacing( 15 ),        // force dialog height
  283.                  `VBox(
  284.                        `HSpacing( 30 ),    // force help text width
  285.                        `RichText( help_text )
  286.                        ),
  287.                  `HSpacing( 3 ),
  288.                  `VBox(
  289.                        `VSpacing( 1 ),
  290.                        `Top( radio_box ),
  291.                        buttons
  292.                        ),
  293.                  `HSpacing( 3 )
  294.                  );
  295.  
  296.  
  297.  
  298.     // Event handling
  299.  
  300.     UI::OpenDialog( ask_mode_dialog );
  301.  
  302.     any ret = nil;
  303.  
  304.     while ( true )
  305.     {
  306.     if (!Mode::autoinst ())
  307.     {
  308.         ret = UI::UserInput();
  309.     }
  310.     else
  311.     {
  312.         ret = `ok;
  313.     }
  314.  
  315.     if ( ret == `abort )    // the abort button (not check box!)
  316.     {
  317.         if (Popup::ConfirmAbort (`painless))
  318.         break;
  319.     }
  320.  
  321.     if ( ret == `cancel )
  322.         break;
  323.  
  324.     if (ret == `ok || ret == `next || ret == `accept)
  325.     {
  326.         ret = `next;
  327.  
  328.         any newmode = UI::QueryWidget(`id(`options), `CurrentButton);
  329.  
  330.         if (newmode == nil)
  331.         {
  332.         // this is a label of a message box
  333.         Popup::Message(_("Choose one of the\noptions to continue."));
  334.         continue;
  335.         }
  336.  
  337.         if (newmode == `abort) // the abort check box (not button!)
  338.         {
  339.         if (Popup::ConfirmAbort (`painless))
  340.         {
  341.             ret = `abort;
  342.             break;
  343.         }
  344.  
  345.         continue;
  346.         }
  347.  
  348.         if (newmode == `install)
  349.         {
  350.         Mode::SetMode ("installation");
  351.         break;
  352.         }
  353.  
  354.         if (newmode == `update)
  355.         {
  356.         Mode::SetMode ("update");
  357.         break;
  358.         }
  359.  
  360.         if (newmode == `repair)
  361.         {
  362.         Mode::SetMode ("repair");
  363.         ret = `finish;
  364.         break;
  365.         }
  366.  
  367.         if (newmode == `boot)
  368.         {
  369.         if (handle_boot () == `finish)
  370.         {
  371.             Mode::SetMode ("");
  372.             ret = `finish;
  373.             break;
  374.         }
  375.         }
  376.     }
  377.     }
  378.  
  379.     UI::CloseDialog();
  380.  
  381.     if (Mode::mode () != start_mode)
  382.     {
  383.     ProductControl::UpdateWizardSteps ([$["stage":"initial", "mode":Mode::mode ()],
  384.                         $["stage":"continue", "mode":Mode::mode ()]]);
  385.     y2milestone ("Switching Steps from %1 to %2 ", start_mode, Mode::mode ());
  386.     }
  387.  
  388.     if (Mode::repair ())
  389.     {
  390.     WFM::CallFunction ("inst_repair");
  391.     }
  392.  
  393.     return (symbol)ret;
  394. }
  395.