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 / bootloader_proposal.ycp < prev    next >
Text File  |  2006-11-29  |  6KB  |  208 lines

  1. /**
  2.  * Module:        bootloader_proposal.ycp
  3.  *
  4.  * $Id: bootloader_proposal.ycp 34495 2006-11-20 15:13:00Z jplack $
  5.  *
  6.  * Author:        Klaus Kaempf <kkaempf@suse.de>
  7.  *
  8.  * Purpose:        Proposal function dispatcher - bootloader.
  9.  *
  10.  *            See also file proposal-API.txt for details.
  11.  */
  12. {
  13.     textdomain "bootloader";
  14.  
  15.     import "Arch";
  16.     import "BootCommon";
  17.     import "Bootloader";
  18.     import "Storage";
  19.     import "Mode";
  20.  
  21.     include "bootloader/routines/wizards.ycp";
  22.  
  23.     string func  = (string)WFM::Args(0);
  24.     map    param = (map)WFM::Args(1);
  25.     map<string,any>    ret   = $[];
  26.  
  27.     // This will be called every time we enter the proposal widget. Here we can
  28.     // return cached data, but when force_reset is set, we must create a new
  29.     // proposal based on freshly discovered data (ie. from Storage:: and
  30.     // perl-Bootloader (etc.?)).
  31.     if ( func == "MakeProposal" )
  32.     {
  33.     boolean force_reset      = param["force_reset"     ]:false;
  34.     boolean language_changed = param["language_changed"]:false;
  35.  
  36.     // use the cache if possible
  37.         // if not asked to recreate and we have a cached proposal and
  38.     if (false
  39.         && !force_reset
  40.         && Bootloader::cached_proposal != nil
  41.  
  42.         // has the configuration been changed?
  43.         && Bootloader::cached_settings == Bootloader::Export()
  44.  
  45.         // has the partitioning been changed?
  46.         // This is correct as long as the proposal is only dependent on the
  47.         // settings in Storage. AFAICT all information relevant to a
  48.         // proposal in yast2-bootloader comes from yast2-storage. Even the
  49.         // information from perl-Bootloader only depends on the settings in
  50.         // Storage or libstorage. So this should be OK. At this point all
  51.         // changes relevant to the yast2-bootloader settings are made
  52.         // through Storage, so the change time of Storage data should be
  53.         // sufficient.
  54.         && Bootloader::cached_settings_base_data_change_time == Storage::GetTargetChangeTime())
  55.  
  56.  
  57.       // FIXME: has the software selection changed?: esp. has the
  58.       // Xen pattern been activated ? then we'd have to make the
  59.       // proposal again.
  60.  
  61.  
  62.  
  63.     {
  64.         y2milestone("Using cached proposal");
  65.         return Bootloader::cached_proposal;
  66.     }
  67.  
  68.     if (force_reset && !Mode::autoinst ())
  69.     {
  70.         // force re-calculation of bootloader proposal
  71.         // this deletes any internally cached values, a new proposal will
  72.         // not be partially based on old data now any more
  73.         y2milestone ("Recalculation of bootloader configuration forced");
  74.         Bootloader::Reset ();
  75.     }
  76.  
  77.     if (! Bootloader::proposed_cfg_changed && ! Mode::autoinst ())
  78.     {
  79.         y2milestone ("Cfg not changed before, recreating");
  80.         Bootloader::ResetEx (false);
  81.         BootCommon::setLoaderType (nil);
  82.     }
  83.  
  84.     if (Bootloader::getLoaderType () == "grub")
  85.     {
  86.         import "BootGRUB";
  87.         BootGRUB::merge_level = `main;
  88.         Bootloader::Propose ();
  89.         BootGRUB::merge_level = `none;
  90.     }
  91.     else
  92.     {
  93.         Bootloader::Propose ();
  94.     }
  95.     // to make sure packages will get installed
  96.     BootCommon::setLoaderType (BootCommon::getLoaderType (false));
  97.  
  98.     ret = $[ "raw_proposal" : Bootloader::Summary ()];
  99.  
  100.     if (Bootloader::getLoaderType () == "")
  101.         {
  102.             y2error ("No bootloader selected");
  103.             ret = add (ret, "warning_level", `error);
  104.         // warning text in the summary rixhtext
  105.             ret = add (ret, "warning",
  106.                _("No boot loader is selected for installation. Your system might not be bootable."));
  107.         }
  108.     if (! BootCommon::BootloaderInstallable ())
  109.     {
  110.         ret = $[
  111.         "warning_level" : `error,
  112.         // error in the proposal
  113.         "warning" : _("Because of the partitioning, the bootloader cannot be installed properly"),
  114.         ];
  115.     }
  116.     else if (Bootloader::getLoaderType () == "ppc")
  117.     {
  118.         if (Arch::board_chrp ())
  119.         {
  120.             if (BootCommon::globals["activate"]:"false" == "false")
  121.         {
  122.             ret = (map<string,any>)
  123.               union(ret,
  124.                 $[
  125.                   "warning_level" : `error,
  126.                   "warning" :
  127.                   _("The selected boot path will not be activated for your installation. Your system may not be bootable."),
  128.             ]);
  129.         }
  130.         }
  131.         if (Arch::board_iseries()) {
  132.           // FIXME: handle consistency test for iseries configuration
  133.           // currently: none
  134.           y2debug("No consistency check implemented for iSeries boot configuration");
  135.         }
  136.         else {
  137.             // FIXME: better eliminate use of loader_device in the
  138.             // future, no one knows what it is for
  139.             if ( BootCommon::loader_device == "" ) {
  140.                 ret = (map<string,any>)union (ret, $[
  141.                     "warning_level" : `blocker,
  142.                     "warning" :
  143.                         ret["warning"]:"" +
  144.                         _("Configure a valid boot loader location before continuing.<br>
  145. In case that no selection can be made it may be necessary to create a PReP Boot partition."),
  146.                     ]
  147.                 );
  148.             }
  149.         }
  150.     }
  151.  
  152.     // cache the values
  153.     Bootloader::cached_settings = Bootloader::Export();
  154.     Bootloader::cached_settings_base_data_change_time = Storage::GetTargetChangeTime();
  155.     Bootloader::cached_proposal = ret;
  156.     }
  157.     // This is a request to start some dialog and interact with the user to set
  158.     // up the Bootloader setting. Called when the user presses the link to set
  159.     // up the Bootloader.
  160.     else if ( func == "AskUser" )
  161.     {
  162.     boolean has_next = param["has_next"]:false;
  163.  
  164.     map settings = Bootloader::Export ();
  165.     // don't ask for abort confirm if nothing was changed (#29496)
  166.     BootCommon::changed = false;
  167.     symbol result = BootloaderAutoSequence ();
  168.     // set to true, simply because must be saved during installation
  169.     BootCommon::changed = true;
  170.     if (result != `next)
  171.         Bootloader::Import ((map<string,any>)settings);
  172.     else
  173.         Bootloader::proposed_cfg_changed = true;
  174.  
  175.     // Fill return map
  176.     ret = $[ "workflow_sequence" : result ];
  177.     }
  178.     // This describes the "active" parts of the Bootloader proposal section.
  179.     else if ( func == "Description" )
  180.     {
  181.     // Fill return map.
  182.     //
  183.     // Static values do just nicely here, no need to call a function.
  184.  
  185.     ret =
  186.         $[
  187.         // proposal part - bootloader label
  188.           "rich_text_title"    :    _("Booting"),
  189.         // menubutton entry
  190.           "menu_title"    :    _("&Booting"),
  191.           "id"        :    "bootloader_stuff"
  192.         ];
  193.     }
  194.     // Before the system is installed there is no place to write to yet. This
  195.     // code is not called. The bootloader will be installed later during
  196.     // inst_finish.
  197.     else if (func == "Write")
  198.     {
  199.     boolean succ = Bootloader::Write ();
  200.     ret =
  201.         $[
  202.         "success"    :    succ
  203.         ];
  204.     }
  205.  
  206.     return ret;
  207. }
  208.