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_system_analysis.ycp < prev    next >
Text File  |  2006-11-29  |  12KB  |  481 lines

  1. /**
  2.  * File:    clients/inst_system_analysis.ycp
  3.  * Package:    Installation
  4.  * Summary:    Installation mode selection, system analysis
  5.  * Authors:    Jiri Srain <jsrain@suse.cz>
  6.  *
  7.  * $Id: inst_system_analysis.ycp 33978 2006-11-01 17:43:03Z locilka $
  8.  *
  9.  */
  10.  
  11. {
  12.  
  13. textdomain "installation";
  14.  
  15. import "AddOnProduct";
  16. import "GetInstArgs";
  17. import "Installation";
  18. import "Kernel";
  19. import "Label";
  20. import "Linuxrc";
  21. import "Mode";
  22. import "Packages";
  23. import "Popup";
  24. import "PackageCallbacksInit";
  25. import "Product";
  26. import "ProductControl";
  27. import "RootPart";
  28. import "Stage";
  29. import "Storage";
  30. import "Update";
  31. import "Wizard";
  32.  
  33. include "installation/misc.ycp";
  34. include "packager/storage_include.ycp";
  35.  
  36. string start_mode = Mode::mode ();
  37.  
  38.  
  39. // FIXME copy-paste from inst_mode
  40.     define symbol handle_boot ()
  41.     {
  42.     y2milestone( "User wishes to boot installed system" );
  43.  
  44.     if (!RootPart::didSearchForRootPartitions)
  45.     {
  46.         UI::OpenDialog (`opt(`decorated ),
  47.                 // label
  48.                 `Label(_("Evaluating root partition. One moment please...")));
  49.         RootPart::FindRootPartitions ();
  50.         UI::CloseDialog ();
  51.     }
  52.  
  53.     if (RootPart::numberOfValidRootPartitions == 0)
  54.     {
  55.         // a popup
  56.         Popup::Message(_("No Linux root partition found."));
  57.         return `cancel;
  58.     }
  59.  
  60.     // We must only change RootPart::selectedRootPartition if booting
  61.     // is inevitable.
  62.  
  63.     if (RootPart::numberOfValidRootPartitions == 1)
  64.     {
  65.         RootPart::SetSelectedToValid ();
  66.     }
  67.     else
  68.     {
  69.         if (WFM::CallFunction ("inst_rootpart", [true, true, `boot_popup]) != `next)
  70.         return `cancel;
  71.     }
  72.  
  73.     string root_part = RootPart::selectedRootPartition;
  74.  
  75.     UI::OpenDialog( `opt(`decorated),
  76.             // Information popup: Inform user what partition
  77.             // will be booted from after user selected
  78.             // "Boot installed system"
  79.             `Label( sformat(_("Booting from %1"), root_part ) ) );
  80.  
  81.     Update::Detach ();
  82.     RootPart::UnmountPartitions (false);
  83.  
  84.     sleep (1000);
  85.  
  86.     if ( ! Mode::test () )
  87.     {
  88.         Linuxrc::WriteYaSTInf ($["Root" : root_part]);
  89.         Storage::ActivateHld(true);
  90.     }
  91.  
  92.     UI::CloseDialog ();
  93.  
  94.     return `finish;
  95.     }
  96.  
  97. // help text for installation method
  98. string help_text = _("<p><big><b>Installation Mode</b></big><br>
  99. Select what to do:</p>");
  100.  
  101. // help text for installation method
  102. help_text = help_text + _("<p>
  103. Select <b>New Installation</b> if there is no existing Linux system on your
  104. machine or if you want to replace an existing Linux system completely,
  105. abandoning all its configuration data.
  106. </p>");
  107.  
  108. // help text for installation method
  109. help_text = help_text + _("<p>
  110. Select <b>Update an Existing System</b> to update a Linux system already
  111. installed on your machine. This option preserves configuration settings
  112. from your existing system whenever possible.
  113. </p>");
  114.  
  115. // help text for installation method
  116. help_text = help_text + _("<p>
  117. To install an add-on product from separate media together with &product;, select
  118. <b>Include Add-On Products from Separate Media</b>.</p>
  119. ");
  120.  
  121. // help text for installation method
  122. help_text = help_text + _("<p>Select <b>Other Options</b> then
  123. select <b>Repair Installed System</b> if you have a damaged Linux system on
  124. your hard disk. This option can try to fix problems automatically.
  125. </p>");
  126.  
  127. // help text for installation method
  128. help_text = help_text + _("<p>Select <b>Other Options</b> then
  129. select <b>Boot Installed System</b> if you have a Linux system on your hard
  130. disk that will not boot. With this option, try to fix problems manually.
  131. </p>");
  132.  
  133. symbol current_expert_mode = `repair;
  134.  
  135. // see bugzilla #156529
  136. term InstModeDialogContent (symbol pre_selected) {
  137.     term other_options_layout_fix = `Empty();
  138.     term other_options            = `Empty();
  139.  
  140.     if (pre_selected == `expert) {
  141.     other_options_layout_fix = `VSpacing(2.1);
  142.     other_options = `RadioButtonGroup (
  143.         `id (`expert_options),
  144.         `HBox (
  145.         `HSpacing (6),
  146.         `VBox (
  147.             `Left (`RadioButton (`id (`repair), `opt (`notify),
  148.             // radio button
  149.             _("Re&pair Installed System"), (current_expert_mode == `repair))),
  150.             `Left (`RadioButton (`id (`boot), `opt (`notify),
  151.             // radio button
  152.             _("Boot Installed &System"), (current_expert_mode == `boot)))
  153.         )
  154.         )
  155.     );
  156.     }
  157.  
  158.     return `VBox (
  159.     `VWeight (60, `HVCenter (
  160.         `MarginBox (
  161.         `leftMargin (1),
  162.         `rightMargin (1.5),
  163.         `topMargin (0.5),
  164.         `bottomMargin (0.5),
  165.         `VBox (
  166.         other_options_layout_fix,
  167.         `Frame (
  168.             // frame
  169.             _("Select Mode"),
  170.             `VBox (
  171.             // Basis RadioButtonGroup
  172.             `RadioButtonGroup (
  173.                 `id (`inst_mode),
  174.                 `VBox (
  175.                 // radio button
  176.                 `Left (`RadioButton (`id (`install), `opt(`notify), _("New &Installation"),
  177.                     ! Mode::update ())),
  178.                 `VSpacing( 0.3 ),
  179.                 // radio button
  180.                 `Left (`RadioButton (`id (`update), `opt(`notify), _("&Update"),
  181.                     Mode::update ())),
  182.                 `VSpacing( 1.3 ),
  183.                 `Left (`RadioButton (`id (`expert), `opt(`notify), _("&Other Options")))
  184.                 )
  185.             ),
  186.             // Other RadioButtonGroup
  187.             other_options
  188.             )
  189.         ),
  190.         `VSpacing (2),
  191.         `Left (`CheckBox (`id (`add_on), `opt(`notify),
  192.             // check box
  193.             _("In&clude Add-On Products from Separate Media"))
  194.         )
  195.         )
  196.     )
  197.     )),
  198.     `VWeight (20, `Empty ())
  199.     );
  200. }
  201.  
  202. Wizard::SetContents (_("Analyzing the Computer"), `Empty (), "", false, false);
  203. Wizard::SetTitleIcon ("yast-inst-mode");
  204.  
  205. // Do hardware probing
  206. //
  207. // This must happen before submodule descriptions are initialized; module
  208. // constructors might depend on it.
  209. // In autoinst mode, this has been called already.
  210.  
  211. y2milestone ("Probing done: %1", Installation::probing_done);
  212. if (! Installation::probing_done)
  213. {
  214.     if (!Mode::autoinst ())
  215.     {
  216.     WFM::CallFunction("inst_startup", []);
  217.     WFM::CallFunction("inst_features", []);
  218.     Installation::probing_done = true;
  219.     }
  220. }
  221.  
  222. // FIXME copy-paste from inst_mode
  223.     boolean offer_update = false;
  224.     y2milestone ("Product flags: %1", Product::flags);
  225.     if (contains (Product::flags, "update") || Kernel::GetSuSEUpdate ())
  226.     {
  227.     offer_update = true;
  228.     }
  229.  
  230. // FIXME copy-paste from inst_mode
  231.     boolean have_linux = false;
  232.     if (Storage::HaveLinuxPartitions ())
  233.     {
  234.     have_linux = true;
  235.     }
  236.  
  237. y2milestone ("Have Linux: %1, Offer Update: %2", have_linux, offer_update);
  238.  
  239. boolean other_options_disabled = false;
  240. if (! (have_linux && offer_update))
  241. {
  242.     // to offer add-on products
  243.     // Mode::SetMode ("installation");
  244.     // return `auto;
  245.     other_options_disabled = true;
  246. }
  247.  
  248. // bugzilla #208222
  249. // Release disk used as the installation source
  250. ReleaseHDDUsedAsInstallationSource();
  251.  
  252. if (Mode::autoinst ()) {
  253.     y2milestone ("Autoinst -> returning `auto");
  254.     return `auto;
  255. }
  256.  
  257. Wizard::SetContents (
  258.     // dialog caption
  259.     _("Installation Mode"), InstModeDialogContent(`install), help_text, true, true
  260. );
  261. Wizard::SetTitleIcon ("yast-software");
  262.  
  263. symbol ret = nil;
  264. symbol new_mode = Mode::update () ? `update : `install;
  265.  
  266. string umount_result = Linuxrc::InstallInf ("umount_result");
  267. string media = Linuxrc::InstallInf ("InstMode");
  268. y2milestone ("Umont result: %1, inst mode: %2", umount_result, media);
  269. if (umount_result != "0" && (media == "cd" || media == "dvd"))
  270.     UI::ChangeWidget (`id (`add_on), `Enabled, false);
  271.  
  272. // only installation (and addon products) enabled
  273. if (other_options_disabled) {
  274.     UI::ChangeWidget (`id (`update), `Enabled, false);
  275.     UI::ChangeWidget (`id (`expert), `Enabled, false);
  276. }
  277.  
  278. // --> Handling User Input in Installation Mode
  279.  
  280. boolean add_on_selected = (boolean) UI::QueryWidget (`id (`add_on), `Value);
  281. // Probably buggy UI, in case of two radio button groups, the second one
  282. // doesn't work (RadioButtonGroup (`id (`expert_options)))
  283. repeat {
  284.     ret = (symbol) UI::UserInput();
  285.     y2milestone("ret: %1", ret);
  286.  
  287.     // Use-Add-On-Product status changed
  288.     if (ret == `add_on) {
  289.     add_on_selected = (boolean) UI::QueryWidget (`id (`add_on), `Value);
  290.     ret = nil;
  291.     continue;
  292.     }
  293.     // Other Options - Boot
  294.     else if (ret == `boot) {
  295.     current_expert_mode = `boot;
  296.  
  297.     ret = nil;
  298.     continue;
  299.     // Other Options - Repair
  300.     } else if (ret == `repair) {
  301.     current_expert_mode = `repair;
  302.  
  303.     ret = nil;
  304.     continue;
  305.     }
  306.     // Adjusting current UI - Other Options
  307.     else if (ret == `expert) {
  308.     // Remembering add-on state, switching off and disabling
  309.     add_on_selected = (boolean) UI::QueryWidget (`id (`add_on), `Value);
  310.  
  311.     // Show other options
  312.     Wizard::SetContents (
  313.         // dialog caption
  314.         _("Installation Mode"), InstModeDialogContent(`expert), help_text, true, true
  315.     );
  316.     
  317.     UI::ChangeWidget (`id(`add_on), `Value, false);
  318.     UI::ChangeWidget (`id(`add_on), `Enabled, false);
  319.     UI::ChangeWidget (`id(`inst_mode), `CurrentButton, `expert);
  320.     
  321.     ret = nil;
  322.     continue;
  323.     }
  324.     // Adjusting current UI - Hide Other Options
  325.     // in case of `install or `update clicked
  326.     else if (contains([`install, `update], ret)) {
  327.     symbol selected_mode = (symbol)  UI::QueryWidget (`id (`inst_mode), `CurrentButton);
  328.  
  329.     // Hide other options
  330.     Wizard::SetContents (
  331.         // dialog caption
  332.         _("Installation Mode"), InstModeDialogContent(`install), help_text, true, true
  333.     );
  334.  
  335.     // Enabling add-on, adjusting previous state (selected)
  336.     UI::ChangeWidget  (`id(`add_on), `Enabled, true);
  337.     UI::ChangeWidget  (`id(`add_on), `Value, add_on_selected);
  338.     // Can be either `install or `update
  339.     UI::ChangeWidget  (`id(`inst_mode), `CurrentButton, selected_mode);
  340.     }
  341.  
  342.     // Next button
  343.     if (ret == `next)
  344.     {
  345.     new_mode = (symbol) UI::QueryWidget (`id (`inst_mode), `CurrentButton);
  346.     if (new_mode == nil)
  347.     {
  348.         // this is a label of a message box
  349.         Popup::Message(_("Choose one of the\noptions to continue."));
  350.         ret = nil;
  351.         continue;
  352.     }
  353.     
  354.     // Repair or Boot
  355.     if (new_mode == `expert) {
  356.         if (! contains([`boot, `repair], current_expert_mode)) {
  357.         y2error("Internal error: Widget `expert_mode selected item: %1", current_expert_mode);
  358.         ret = nil;
  359.         continue;
  360.         }
  361.         new_mode = current_expert_mode;
  362.         
  363.         // Boot was selected
  364.         if (new_mode == `boot) {
  365.         if (handle_boot() != `finish) {
  366.             y2milestone("Not booting any OS");
  367.             ret = nil;
  368.             continue;
  369.         }
  370.         }
  371.     }
  372.     }
  373.     else if (ret == `abort)
  374.     {
  375.     if (Popup::ConfirmAbort (Stage::initial () ? `painless : `incomplete))
  376.         return `abort;
  377.     ret = nil;
  378.     continue;
  379.     }
  380. } until (ret == `back || ret == `next);
  381.  
  382. // <-- Handling User Input in Installation Mode
  383.  
  384. y2milestone("Selected mode: %1, Return: %2", new_mode, ret);
  385. if (ret == `next)
  386. {
  387.     if (new_mode == `install)
  388.     {
  389.     Mode::SetMode ("installation");
  390.     }
  391.  
  392.     if (new_mode == `update)
  393.     {
  394.     Mode::SetMode ("update");
  395.     }
  396.  
  397.     if (new_mode == `repair)
  398.     {
  399.     Mode::SetMode ("repair");
  400.     }
  401.  
  402.     if (new_mode == `boot)
  403.     {
  404.     Mode::SetMode ("");
  405.     ret = `finish;
  406.     }
  407.  
  408.     if (new_mode == `install || new_mode == `update)
  409.     {
  410.     boolean add_on = (boolean)UI::QueryWidget (`id (`add_on), `Value);
  411.     ProductControl::DisabledModules = filter (string m, ProductControl::DisabledModules, {
  412.         return m != "add-on" && m != "inst_add-on";
  413.     });
  414.     if (! add_on)
  415.     {
  416.         ProductControl::DisabledModules = add (ProductControl::DisabledModules, "add-on");
  417.         ProductControl::DisabledModules = add (ProductControl::DisabledModules, "inst_add-on");
  418.     }
  419.     }
  420. }
  421.  
  422. if (ret == `back || ret == `finish) {
  423.     y2milestone("Returning: %1", ret);
  424.     return ret;
  425. }
  426.  
  427. if (Mode::repair ())
  428. {
  429.     y2milestone("Calling inst_repair");
  430.     WFM::CallFunction ("inst_repair");
  431.     return `finish;
  432. }
  433.  
  434. Packages::InitializeCatalogs ();
  435. if (Packages::InitFailed ())
  436. {
  437.     // popup message
  438.     Popup::Message (_("Failed to initialize catalogs.
  439. Aborting the installation."));
  440.     return `abort;
  441. }
  442. Packages::InitializeAddOnProducts ();
  443.  
  444. if (Mode::mode () != start_mode)
  445. {
  446.     y2milestone ("Switching Steps from %1 to %2 ", start_mode, Mode::mode ());
  447.     UpdateWizardSteps ();
  448.     y2milestone ("Resetting disk target to read values");
  449.     Storage::ResetOndiskTarget ();
  450.     y2debug ("Original target map (from disk): %1", Storage::GetTargetMap ());
  451.     y2milestone ("Resetting package manager");
  452.     Kernel::ProbeKernel();
  453.     Pkg::TargetFinish ();
  454.     Pkg::PkgReset ();
  455.     Packages::Init( true );
  456.  
  457.     if (! Mode::repair ())
  458.     {
  459.     ret = ProductControl::RunFrom (
  460.         ProductControl::CurrentStep () + 1,
  461.         false);
  462.     if (ret == `next)
  463.         ret = `finish;
  464.     }
  465. }
  466. else if (! Mode::repair())
  467. {
  468.     UpdateWizardSteps ();
  469.     ret = ProductControl::RunFrom (
  470.     ProductControl::CurrentStep () + 1,
  471.     false);
  472.     if (ret == `next)
  473.     ret = `finish;
  474.  
  475. }
  476.  
  477. return ret;
  478.  
  479. /* EOF */
  480. }
  481.