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 / include / bootloader / ppc / iseries.ycp < prev    next >
Text File  |  2006-11-29  |  8KB  |  320 lines

  1. /**
  2.  * File:
  3.  *      bootloader/ppc/iSeries.ycp
  4.  *
  5.  * Module:
  6.  *      Bootloader installation and configuration
  7.  *
  8.  * Summary:
  9.  *      include containing specific functions for iSeries configuration
  10.  *      and installation
  11.  *
  12.  * Authors:
  13.  *      Jiri Srain <jsrain@suse.cz>
  14.  *
  15.  * $Id: iseries.ycp 31047 2006-05-19 10:24:31Z odabrunz $
  16.  *
  17.  */
  18.  
  19. {
  20.     textdomain "bootloader";
  21.  
  22.     import "Kernel";
  23.     import "Installation";
  24.     import "Mode";
  25.  
  26.     import "BootCommon";
  27.  
  28.     include "bootloader/ppc/misc.ycp";
  29.     include "bootloader/routines/popups.ycp";
  30.  
  31.  
  32. // misc. functions
  33.  
  34.     /**
  35.       * Get the type of target (just a simple heuristic)
  36.       * @param target bootloader target
  37.       * @return symbol `slot, `prep, `file or `unknown
  38.       */
  39.     global define symbol iSeriesTarget2Type (string target) ``{
  40.     // one big letter means slot
  41.     if (size (target) == 1 && target == toupper (target))
  42.     {
  43.         return `slot;
  44.     }
  45.     // /dev/ at the beginning means device, hopefully PReP partition
  46.     else if (substring (target, 0, 5) == "/dev/")
  47.     {
  48.         return `prep;
  49.     }
  50.     // files should begin with the absolute path
  51.     else if (substring (target, 0, 1) == "/")
  52.     {
  53.         return `file;
  54.     }
  55.     // didn't realize what it is -> unknown
  56.     return `unknown;
  57.     }
  58.  
  59.     /**
  60.       * Assign the Boot::activate variable
  61.       */
  62.     global define void iSeriesAssignDevice () ``{
  63.     if ( !  ( iseries_write_prepboot ||
  64.         iseries_write_slot_b   ||
  65.         iseries_write_slot_a   ||
  66.         iseries_write_streamfile ) )
  67.     {
  68.         BootCommon::activate = false;
  69.     }
  70.     else
  71.     {
  72.         BootCommon::activate = true;
  73.     }
  74.      }
  75.  
  76.  
  77. // general functions
  78.  
  79.     /**
  80.       * Propose bootloader settings
  81.       * @param initial boolean true if doing initial proposal
  82.       */
  83.     global define void iSeriesPropose (boolean initial) ``{
  84.     if (BootCommon::was_proposed)
  85.     {
  86.         return;
  87.     }
  88.  
  89.     iseries_write_slot_a = true;
  90.     iseries_write_slot_b = true;
  91.     iseries_write_prepboot = true;
  92.     iseries_write_streamfile = true;
  93.     if ( ! (size (prep_boot_partitions) > 0))
  94.     {
  95.         iseries_write_prepboot = false;
  96.     }
  97.     }
  98.  
  99.     /**
  100.       * Read the board-type-specific settings
  101.       * @return boolean true on success
  102.       */
  103.     global define boolean iSeriesRead () ``{
  104.     prep_boot_partition = "";
  105.     iseries_streamfile = "";
  106.     iseries_write_slot_b = false;
  107.     iseries_write_prepboot = false;
  108.     iseries_write_streamfile = false;
  109.     foreach (string key, string value, BootCommon::globals, ``{
  110.         if (key == "boot")
  111.         {
  112.         string target = value;
  113.         symbol type = iSeriesTarget2Type (target);
  114.         if (type == `slot)
  115.         {
  116.             if (target == "A")
  117.             iseries_write_slot_a = true;
  118.             else if (target == "B")
  119.             iseries_write_slot_b = true;
  120.         }
  121.         else if (type == `prep)
  122.         {
  123.             iseries_write_prepboot = true;
  124.             if (prep_boot_partition == "")
  125.             {
  126.             prep_boot_partition = target;
  127.             }
  128.         }
  129.         else if (type == `file)
  130.         {
  131.             iseries_write_streamfile = true;
  132.             if (iseries_streamfile == "")
  133.             {
  134.             iseries_streamfile = target;
  135.             }
  136.         }
  137.         }
  138.     });
  139.     iSeriesAssignDevice ();
  140.     return true;
  141.     }
  142.  
  143.     /**
  144.       * Update the board-type-specific settings
  145.       * @return boolean true on success
  146.       */
  147.     global define boolean iSeriesUpdate () ``{
  148.     prep_boot_partition = BootCommon::UpdateDevice (prep_boot_partition);
  149.     return true;
  150.     }
  151.  
  152.     /**
  153.       * Save the board-type-specific settings
  154.       * @return boolean true on success
  155.       */
  156.     global define boolean iSeriesSave () ``{
  157.     BootCommon::globals = filter (string key, string value, BootCommon::globals, ``(
  158.         key != "boot"
  159.     ));
  160.     if (iseries_write_slot_b)
  161.     {
  162.         BootCommon::globals["boot"] = "B";
  163.     }
  164.     if (iseries_write_prepboot)
  165.     {
  166.         BootCommon::globals["boot"] = prep_boot_partition;
  167.     }
  168.     if (iseries_write_streamfile)
  169.     {
  170.         BootCommon::globals["boot"] = iseries_streamfile;
  171.     }
  172.     return true;
  173.     }
  174.  
  175.     /**
  176.       * retuen the board-type-specific part of summary
  177.       * @return a list of summary strings
  178.       */
  179.     global define list<string> iSeriesSummary () ``{
  180.     list<string> ret = [];
  181.     if ( iseries_write_streamfile )
  182.     {
  183.         ret = add (ret, sformat (
  184.         // summary part, %1 is filename
  185.         _("A stream file will be written to %1. Copy this file to OS400 side and boot with *STMF."),
  186.         iseries_streamfile));
  187.     }
  188.  
  189.     if ( iseries_write_prepboot )
  190.     {
  191.         ret = add (ret, sformat(
  192.         // summary part, %1 is filename
  193.         _("The kernel will be written to %1. Use *NWSSTG on OS400 side."),
  194.         prep_boot_partition));
  195.     }
  196.  
  197.     if ( iseries_write_slot_b )
  198.     {
  199.         // summary part
  200.         ret = add (ret, _("The kernel will be written to slot B."));
  201.     }
  202.  
  203.     if ( iseries_write_slot_a )
  204.     {
  205.         // summary part
  206.         ret = add (ret, ("A rescue kernel will be written to slot A."));
  207.     }
  208.  
  209.     if ( iseries_write_slot_a || iseries_write_slot_b )
  210.     {
  211.         // summarry part
  212.         ret = add (ret, _("This will take a while..."));
  213.     }
  214.     if ( BootCommon::activate == false )
  215.     {
  216.         // summary part
  217.         ret = [
  218.         _("No boot configuration. Configure booting manually.")
  219.         ];
  220.     }
  221.     if (! (iseries_write_prepboot || iseries_write_slot_b
  222.         || iseries_write_slot_a || iseries_write_streamfile))
  223.     {
  224.         // summary part
  225.         ret = [ _("No boot option selected.") ];
  226.     }
  227.     y2milestone("prep_boot_partitions %1", prep_boot_partitions);
  228.     return ret;
  229.     }
  230.  
  231.     /**
  232.       * Helper function that executes a command with the shell, appending
  233.       * stdout and stderr to a logfile. On error, it writes log entries to the
  234.       * yast2 log.
  235.       * @param command string command to execute
  236.       * @param logfile string logfile for the commands output
  237.       * @return boolean true on success
  238.       */
  239.     global define boolean iSeriesExecute (string command, string logfile) ``{
  240.     command = command + " >>" + logfile + " 2>&1";
  241.     integer command_ret = (integer)SCR::Execute (.target.bash, command);
  242.     if (command_ret != 0) {
  243.         y2error ("Execution of command failed: %1, error code: %2", command, command_ret);
  244.         string log = (string)SCR::Read (.target.string, logfile);
  245.         y2error ("stderr and stdout of the command: %1", log);
  246.         return false;
  247.     }
  248.     return true;
  249.     }
  250.  
  251.     /**
  252.       * Install the board-type-specific part of bootloader
  253.       * @return boolean true on success
  254.       */
  255.     global define boolean iSeriesWrite () ``{
  256.     if (! BootCommon::activate)
  257.         return true;
  258.  
  259.     // during installation (fresh or update), always install the ISERIES64
  260.     // file into slot A as a "rescue system"
  261.     if (Stage::initial ())
  262.     {
  263.         string command = "";
  264.         string my_log = "/var/log/YaST2/y2log_bootloader_iseries_slot_a";
  265.  
  266.         string src_filename
  267.         = Pkg::SourceProvideFile(base_source, 1, "/ISERIES64");
  268.  
  269.         if (base_source == -1 || src_filename == nil) {
  270.         y2milestone ("Cannot write rescue kernel to slot A, base source not found");
  271.         return false;
  272.         }
  273.  
  274.         string rescue_bootbinary = (string)SCR::Read (.target.tmpdir)
  275.         + "/rescue_bootbinary";
  276.         string tg_rescue_bootbinary
  277.            = Installation::destdir + rescue_bootbinary;
  278.         y2milestone ("Copying %1 to %2",
  279.         src_filename, tg_rescue_bootbinary);
  280.         WFM::Execute (.local.bash, sformat ("/bin/cp %1 %2",
  281.         src_filename, tg_rescue_bootbinary));
  282.  
  283.         y2milestone("start writing rescue kernel to slot A ...");
  284.         command = "time dd if=" + rescue_bootbinary
  285.         + " of=/proc/iSeries/mf/A/vmlinux bs=64k";
  286.         if (! iSeriesExecute (command, my_log))
  287.         return false;
  288.  
  289.         if (! iSeriesExecute (
  290.         "dd if=/dev/zero of=/proc/iSeries/mf/A/cmdline bs=255 count=1",
  291.         my_log))
  292.         return false;
  293.  
  294.         // NOTE: on SLES10, the "root=" parameter is not handled by the
  295.         // initrd in the ISERIES64 file. The initrd just boots up to a
  296.         // shell.
  297.         SCR::Execute (.target.bash,
  298.         "echo -en 'start_shell manual=1\\0' > /proc/iSeries/mf/A/cmdline");
  299.         y2milestone("done writing rescue kernel to slot A.");
  300.     }
  301.  
  302.     return true;
  303.     }
  304.  
  305.     /**
  306.       * Initialize attributes of the board type
  307.       */
  308.     global define void iSeriesInit () ``{
  309.     y2milestone ("Initializing iSeries attributes");
  310.     prep_only_active = true;
  311.     prep_only_iseries_vd = true;
  312.     prep_only_primary = true;
  313.     prep_same_disk_as_root = false;
  314.     table_items = [ "__iseries_location" ];
  315.     }
  316.  
  317.  
  318.  
  319. } // EOF
  320.