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

  1. /**
  2.  * File:
  3.  *      include/bootloader/ppc/misc.ycp
  4.  *
  5.  * Module:
  6.  *      Bootloader installation and configuration
  7.  *
  8.  * Summary:
  9.  *      Miscelaneous functions for configuring and installing PPC bootloader
  10.  *
  11.  * Authors:
  12.  *      Jiri Srain <jsrain@suse.cz>
  13.  *
  14.  * $Id: misc.ycp 30005 2006-04-11 18:56:59Z odabrunz $
  15.  *
  16.  */
  17.  
  18. {
  19.  
  20.     textdomain "bootloader";
  21.  
  22.     import "Storage";
  23.     import "BootCommon";
  24.     import "Arch";
  25.  
  26.     /**
  27.       * Update list of 41 PReP boot partitions
  28.       * @return boolean true if list changed, false otherwise
  29.       */
  30.     global define boolean updatePrepBootPartitions () ``{
  31.     y2milestone ("Detecting PReP partitions: prep_only_active: %1, prep_only_iseries_vd: %2, prep_only_primary: %3", prep_only_active, prep_only_iseries_vd, prep_only_primary);
  32.     map<string,map> targetMap = (map<string,map>)Storage::GetTargetMap ();
  33.     y2milestone ("TargetMap: %1", targetMap);
  34.     list old_prep_boot_partitions = prep_boot_partitions;
  35.     list old_install_prep_boot_partitions = install_prep_boot_partitions;
  36.     prep_boot_partitions = [];
  37.     install_prep_boot_partitions = [];
  38.     y2milestone("old prep_boot_partitions %1", old_prep_boot_partitions);
  39.  
  40.     foreach (string dname, map ddata, targetMap, ``{
  41.         list<map> partitions = ddata["partitions"]:[];
  42.         y2milestone ("Partitions: %1", partitions);
  43.         partitions = filter (map p, partitions, ``(
  44.         (! p["delete"]:false)
  45.         && is (p["fsid"]:nil, integer)
  46.         // both partition types 0x41 and FAT16 can be handled by PPC lilo
  47.         && (p["fsid"]:nil == 65 ||  p["fsid"]:nil == 6)
  48.         && !contains( [`lvm, `evms, `sw_raid], p["type"]:`primary )
  49.         ));
  50.         y2milestone ("Filtered existing partitions: %1", partitions);
  51. // don't check it here, just activate the partition instead
  52. /*        if (prep_only_active)
  53.         {
  54.         partitions = filter (map p, partitions, ``(
  55.             p["boot"]:false
  56.         ));
  57.         }*/
  58.         // prep_only_iseries_vd means: use only partitions on /dev/iseries/vd*
  59.         if (prep_only_iseries_vd)
  60.         {
  61.         partitions = filter (map p, partitions, ``(
  62.             regexpmatch (p["device"]:"", "\/dev\/iseries\/vd.*")
  63.         ));
  64.         }
  65.         if (prep_only_primary)
  66.         {
  67.         partitions = filter (map p, partitions, ``(
  68.             p["type"]:`primary == `primary
  69.         ));
  70.         }
  71.         y2milestone ("Finally filtered partitions: %1", partitions);
  72.         prep_boot_partitions = (list<string>)merge (prep_boot_partitions,
  73.         (list<string>)maplist (map p, partitions, ``(
  74.             p["device"]:""
  75.         ))
  76.         );
  77.         partitions = filter (map p, partitions, ``(
  78.         p["prep_install"]:false
  79.         ));
  80.         y2milestone ("Finally filtered recommended partitions: %1",
  81.         partitions);
  82.         install_prep_boot_partitions = (list<string>)merge (
  83.         install_prep_boot_partitions,
  84.         (list<string>) maplist(map p, partitions, ``(
  85.             p["device"]:""
  86.         ))
  87.         );
  88.     });
  89.     prep_boot_partitions = filter (string p, prep_boot_partitions, ``(
  90.         p != ""
  91.     ));
  92.     prep_boot_partitions = sort (prep_boot_partitions);
  93.     y2milestone ("Detected PReP partitions: %1", prep_boot_partitions);
  94.     y2milestone ("Proposed PReP partitions: %1",
  95.         install_prep_boot_partitions);
  96.  
  97.     if (old_prep_boot_partitions == prep_boot_partitions
  98.         && old_install_prep_boot_partitions == install_prep_boot_partitions)
  99.     {
  100.         y2milestone ("PReP Partitions unchanged");
  101.         return false;
  102.     }
  103.     else
  104.     {
  105.         y2milestone ("PReP Partitions changed");
  106.         return true;
  107.     }
  108.     }
  109.  
  110.     /**
  111.       * Select PReP boot partition to propose
  112.       * Changes internal variables.
  113.       */
  114.     global define void choosePrepBootPartition () ``{
  115.     y2milestone ("Resetting selected PReP boot partition");
  116.     list<string> root_disks = [];
  117.     if (Storage::CheckForLvmRootFs ())
  118.     {
  119.         map<string,map> tm = Storage::GetTargetMap ();
  120.         string vg = "";
  121.         foreach (string dev, map info, tm, {
  122.         if (info["type"]:`CT_UNKNOWN==`CT_LVM)
  123.         {
  124.             list<map> volumes = info["partitions"]:[];
  125.             foreach (map v, volumes, {
  126.             if (v["mount"]:"" == "/")
  127.             {
  128.                 vg = info["name"]:"";
  129.                 y2milestone ("Volume group of root FS: %1", vg);
  130.             }
  131.             });
  132.         }
  133.         });
  134.         foreach (string dev, map info, tm, {
  135.         list<map> partitions = info["partitions"]:[];
  136.         foreach (map p, partitions, {
  137.             if (p["used_by"]:"" == vg)
  138.             {
  139.             root_disks = add (root_disks, dev);
  140.             }
  141.         });
  142.         });
  143.         y2milestone ("Disks holding LVM with root fs: %1", root_disks);
  144.     }
  145.     else
  146.     {
  147.         root_disks = [
  148.         Storage::GetDiskPartition(BootCommon::RootPartitionDevice)["disk"]:""
  149.         ];
  150.     }
  151.  
  152.     prep_boot_partition = "";
  153.     // First take the partitions that Storage:: hinted us to take, then
  154.     // consider the other prep_boot_partitions
  155.     prep_boot_partitions = (list<string>)merge (
  156.         install_prep_boot_partitions,
  157.         prep_boot_partitions);
  158.     // in the combined list, look for "usable" partitions:
  159.     //    - if we require the boot partition to be on the same disk as
  160.     //      the root partition ("prep_same_disk_as_root"), select the
  161.     //      first prep partition from that disk
  162.     //    - otherwise take the first prep partition in the list
  163.     foreach (string partition, prep_boot_partitions, ``{
  164.         if (prep_boot_partition == "")
  165.         {
  166.         boolean usable = true;
  167.         if (prep_same_disk_as_root)
  168.         {
  169.             map part_split = Storage::GetDiskPartition (partition);
  170.             string part_disk = part_split["disk"]:"";
  171.             if (! contains (root_disks, part_disk))
  172.             usable = false;
  173.         }
  174.         if (usable)
  175.             prep_boot_partition = partition;
  176.         }
  177.     });
  178.  
  179.     // For CHRP lilo can handle PReP partition on other disks now
  180.     // If all above fails, take the first one then ...
  181.     if ( (prep_boot_partition == "") && (getBoardType () == "chrp") )
  182.     {
  183.         prep_boot_partition = prep_boot_partitions[0]:"";
  184.     }
  185.  
  186.     y2milestone ("Selected PReP boot partition: %1", prep_boot_partition);
  187.     BootCommon::activate = (prep_boot_partition != "");
  188.     y2milestone ("Install bootloader: %1", BootCommon::activate);
  189.     }
  190.  
  191.     map<string,string> board_type_names = $[
  192.     "iseries" : "iSeries",
  193.     "prep" : "PReP",
  194.     "chrp" : "CHRP",
  195.     // part of summary
  196.     "mac_new" : _("New World Power Macintosh"),
  197.     // part of summary
  198.     "mac_old" : _("Old World Power Macintosh"),
  199.     // part of summary
  200.     "unknown" : _("Unknown"),
  201.     ];
  202.  
  203.     /**
  204.       * Get name of the currently used board
  205.       * @return string the name of the board
  206.       */
  207.     global define string getNameOfCurrentBoard () ``{
  208.     return board_type_names[getBoardType ()]:_("Unknown");
  209. /*    if ( getBoardType () == "iseries" )
  210.     {
  211.         // part of summary
  212.         return "iSeries";
  213.     }
  214.     else if ( getBoardType () == "prep" )
  215.     {
  216.         // part of summary
  217.         return "PReP";
  218.     }
  219.     else if ( getBoardType () == "chrp" )
  220.     {
  221.         // part of summary
  222.         return "CHRP";
  223.     }
  224.     else if ( getBoardType () == "mac_new" )
  225.     {
  226.         // part of summary
  227.         return _("New World Power Macintosh");
  228.     }
  229.     else if ( getBoardType () == "mac_old" )
  230.     {
  231.         // part of summary
  232.         return _("Old World Power Macintosh");
  233.     }
  234.     // part of summary
  235.     return _("Unknown");*/
  236.     }
  237.  
  238.  
  239. }
  240.