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 / routines / i386.ycp < prev    next >
Text File  |  2006-11-29  |  5KB  |  203 lines

  1. /**
  2.  * File:
  3.  *      include/bootloader/routines/i386.ycp
  4.  *
  5.  * Module:
  6.  *      Bootloader installation and configuration
  7.  *
  8.  * Summary:
  9.  *      Functions for i386 architecture
  10.  *
  11.  * Authors:
  12.  *      Jiri Srain <jsrain@suse.cz>
  13.  *
  14.  * $Id: i386.ycp 34177 2006-11-08 17:16:21Z odabrunz $
  15.  *
  16.  */
  17. {
  18.  
  19. textdomain "bootloader";
  20.  
  21. // general MBR reading cache
  22.  
  23. /**
  24.  * The last disk that was checked for the sequence
  25.  */
  26. string _old_mbr_disk = nil;
  27.  
  28. /**
  29.  * Contents of the last read MBR
  30.  */
  31. string _old_mbr = nil;
  32.  
  33. // info about ThinkPad
  34.  
  35. /**
  36.  * Does MBR contain special thinkpadd stuff?
  37.  */
  38. boolean _thinkpad_mbr = nil;
  39.  
  40. /**
  41.  * The last disk that was checked for the sequence
  42.  */
  43. string _old_thinkpad_disk = nil;
  44.  
  45. // Info about keeping MBR contents
  46.  
  47. /**
  48.  * Keep the MBR contents?
  49.  */
  50. boolean _keep_mbr = nil;
  51.  
  52. /**
  53.  * Sequence specific for IBM ThinkPad laptops, see bug 86762
  54.  */
  55. string thinkpad_seq = "50e46124108ae0e461241038e074f8e2f458c332edb80103ba8000cd13c3be05068a04240cc0e802c3";
  56.  
  57. /**
  58.  * Get the contents of the MBR of a disk
  59.  * @param disk string the disk to be checked
  60.  * @return strign the contents of the MBR of the disk in hexa form
  61.  */
  62. string GetMBRContents (string disk) {
  63.     if (_old_mbr == nil || disk != _old_mbr_disk)
  64.     {
  65.     _old_mbr_disk = disk;
  66.     map out = (map)SCR::Execute (.target.bash_output, sformat (
  67.         "dd if=%1 bs=512 count=1 | od -v -t x1 -", disk));
  68.     if (out["exit"]:0 != 0)
  69.     {
  70.         y2error ("Reading MBR contents failed");
  71.         return nil;
  72.     }
  73.     string mbr = out["stdout"]:"";
  74.     list<string> mbrl = splitstring (mbr, "\n");
  75.     mbrl = maplist (string s, mbrl, {
  76.         list<string> l = splitstring (s, " ");
  77.         l[0] = "";
  78.         return mergestring (l, "");
  79.     });
  80.     mbr = mergestring (mbrl, "");
  81.     y2debug ("MBR contents: %1", mbr);
  82.     _old_mbr = mbr;
  83.     }
  84.     return _old_mbr;
  85. }
  86.  
  87. /**
  88.  * Does MBR of the disk contain special IBM ThinkPad stuff?
  89.  * @param disk string the disk to be checked
  90.  * @return boolean true if it is MBR
  91.  */
  92. global boolean ThinkPadMBR (string disk) {
  93.     if (_thinkpad_mbr == nil || disk != _old_thinkpad_disk)
  94.     {
  95.     _old_thinkpad_disk = disk;
  96.     string mbr = GetMBRContents (disk);
  97.     _thinkpad_mbr = issubstring (mbr, thinkpad_seq);
  98.     }
  99.     y2milestone ("MBR of %1 contains ThinkPad sequence: %2",
  100.     disk, _thinkpad_mbr);
  101.     return _thinkpad_mbr;
  102.  
  103. }
  104.  
  105. /**
  106.  * Keep the MBR contents on the specified disk? Check whether the contents
  107.  * should be kept because ot contains vendor-specific data
  108.  * @param disk string the disk to be checked
  109.  * @return boolean true to keep the contents
  110.  */
  111. global boolean KeepMBR (string disk) {
  112.     if (ThinkPadMBR (disk))
  113.     return true;
  114.     return false;
  115. }
  116.  
  117. /**
  118.  * Add the partition holding firmware to bootloader?
  119.  * @param disk string the disk to be checked
  120.  * @return boolean true if firmware partition is to be added
  121.  */
  122. global boolean AddFirmwareToBootloader (string disk) {
  123.     return ! ThinkPadMBR (disk);
  124. }
  125.  
  126. /**
  127.  * Display bootloader summary
  128.  * @return a list of summary lines
  129.  */
  130. global list<string> i386Summary () {
  131.     list<string> ret = Summary ();
  132.     string order_sum = DiskOrderSummary ();
  133.     if (order_sum != nil)
  134.     ret = add (ret, order_sum);
  135.     return ret;
  136. }
  137.  
  138. /**
  139.  * Propose the boot loader location for i386 (and similar) platform
  140.  */
  141. global void i386LocationProposal () {
  142.     if (! was_proposed)
  143.     {
  144.     DetectDisks ();
  145.     del_parts = getPartitionList (`deleted);
  146.     // check whether edd is loaded; if not: load it
  147.     string lsmod_command = "lsmod | grep edd";
  148.     y2milestone ("Running command %1", lsmod_command);
  149.     map lsmod_out = (map)SCR::Execute (.target.bash_output, lsmod_command);
  150.     y2milestone ("Command output: %1", lsmod_out);
  151.     boolean edd_loaded = lsmod_out["exit"]:0 == 0;
  152.     if (! edd_loaded)
  153.     {
  154.         string command = "/sbin/modprobe edd";
  155.         y2milestone ("Loading EDD module, running %1", command);
  156.         map out = (map)SCR::Execute (.target.bash_output, command);
  157.         y2milestone ("Command output: %1", out);
  158.     }
  159.     }
  160.  
  161.     // refresh device map
  162.     if (device_mapping == nil
  163.     || size (device_mapping) == 0)
  164.     {
  165.     ProposeDeviceMap ();
  166.     }
  167.     boolean disks_changed = RefreshDisks();
  168.     if (disks_changed && ! Mode::autoinst ())
  169.     {
  170.     if (askLocationResetPopup (loader_device))
  171.     {
  172.         selected_location = nil;
  173.         loader_device = nil;
  174.         DetectDisks ();
  175.     }
  176.     }
  177. }
  178.  
  179. /**
  180.  * Do updates of MBR after the bootloader is installed
  181.  * @return boolean true on success
  182.  */
  183. global boolean PostUpdateMBR () {
  184.     boolean ret = true;
  185.     if (ThinkPadMBR (mbrDisk))
  186.     {
  187.     if (loader_device != mbrDisk)
  188.     {
  189.         string command = sformat
  190.         ("/usr/lib/YaST2/bin/tp_mbr %1", mbrDisk);
  191.         y2milestone ("Running command %1", command);
  192.         map out = (map)SCR::Execute (.target.bash_output, command);
  193.         integer exit = out["exit"]:0;
  194.         y2milestone ("Command output: %1", out);
  195.         ret = ret && (0 == exit);
  196.     }
  197.     }
  198.  
  199.     return ret;
  200. }
  201.  
  202. } // EOF
  203.