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 / repair / bootloader_routines.ycp next >
Text File  |  2006-11-29  |  4KB  |  156 lines

  1. /**
  2.  * functions used for checkning GRUB configuration
  3.  * originaly from bootloader/src/grub/misc.ycp, yast2-bootloader now
  4.  * doesn't provide this API
  5.  *
  6.  * Author: Jiri Suchomel <jsuchome@suse.cz>
  7.  *
  8.  * $Id$
  9.  */
  10. {
  11.     import "BootCommon";
  12.  
  13.     map<string,string> device_map    = $[];
  14.  
  15.  
  16.  
  17.     global define void readDeviceMap () {
  18.  
  19.     BootCommon::InitializeLibrary (true, "grub");
  20.     BootCommon::ReadFiles ();
  21.     device_map    = BootCommon::GetDeviceMap ();
  22.     y2debug ("device map: %1", device_map);
  23.     }
  24.  
  25.  
  26.     /**
  27.       * translate grub device (hd0) to UNIX device /dev/hda
  28.       * @param o_dev string grub device
  29.       * @return string UNIX device
  30.       */
  31.     global define string grubDev2unixDev (string o_dev) {
  32.  
  33.     string ret    = "";
  34.     foreach (string k, string v, device_map, {
  35.         y2debug ("key: %1, val: %2, o_dev: %3", k, v, o_dev);
  36.         if (v == o_dev)
  37.         {
  38.         ret    = k;
  39.         }
  40.     });
  41.     return ret;
  42.     }
  43.  
  44.     /**
  45.       * parse /etc/grub file from other file
  46.       * @param file string contents of grub.conf file
  47.       * @return map of settings
  48.       */
  49.     global define map<string,string> parseGrubConf (string file) {
  50.  
  51.     if (file == "" || file == nil)
  52.         return $[];
  53.  
  54.     if (size (device_map) == 0)
  55.         readDeviceMap ();
  56.  
  57.     list<string> lines = splitstring (file, "\n");
  58.     lines = filter (string l, lines, ``(l != ""));
  59.     map<string,string> settings = $[];
  60.     list<string> devices = [];
  61.     string root = "";
  62.     foreach (string l, lines, ``{
  63.         list<string> entries = splitstring (l, " ");
  64.         entries = filter (string e, entries, ``(e != ""));
  65.         if (entries[0]:"" == "root")
  66.             root = entries[1]:"";
  67.         else if (entries[0]:"" == "install")
  68.         {
  69.             integer shift = 0;
  70.         integer shift1 = 1 + shift;
  71.             string tmp = entries[shift1]:"";
  72.             while (substring (tmp, 0, 2) == "--")
  73.             {
  74.             string prefix = settings["prefix"]:"";
  75.             prefix = prefix + " " + tmp;
  76.                 settings = add (settings, "prefix", prefix);
  77.                 shift = shift + 1;
  78.             shift1 = 1 + shift;
  79.                 tmp = entries[shift1]:"";
  80.             }
  81.             settings = add (settings, "stage1", tmp);
  82.         integer shift2 = 2 + shift;
  83.             tmp = entries[shift2]:"";
  84.             if ("d" == tmp)
  85.             {
  86.                 settings = add (settings, "discswitch", "d");
  87.                 shift = shift + 1;
  88.             integer shift2 = 2 + shift;
  89.                 tmp = entries[shift2]:"";
  90.             }
  91.         devices = add (devices, tmp);
  92.             settings = add (settings, "device", grubDev2unixDev (tmp));
  93.         integer shift3 = 3 + shift;
  94.             tmp = entries[shift3]:"";
  95.             settings = add (settings, "stage2", tmp);
  96.         integer shift4 = 4 + shift;
  97.             tmp = entries[shift4]:"";
  98.             settings = add (settings, "addr", tmp);
  99.         integer shift5 = 5 + shift;
  100.             tmp = entries[shift5]:"";
  101.             if (substring (tmp, 0, 1) == "/")
  102.                 tmp = sformat ("%1%2", root, tmp);
  103.             settings = add (settings, "menu", tmp);
  104.         settings = add (settings, "command", "install");
  105.         }
  106.         else if (entries[0]:"" == "setup")
  107.         {
  108.             integer shift = 0;
  109.         integer shift1 = 1 + shift;
  110.             string tmp = entries[shift1]:"";
  111.             while (substring (tmp, 0, 2) == "--")
  112.             {
  113.             string prefix = settings["prefix"]:"";
  114.             prefix = prefix + " " + tmp;
  115.                 settings = add (settings, "prefix", prefix);
  116.                 shift = shift + 1;
  117.             shift1 = 1 + shift;
  118.                 tmp = entries[shift1]:"";
  119.             }
  120.             settings = add (settings, "device", tmp);
  121.         settings = add (settings, "command", "setup");
  122.         }
  123.         settings = add (settings, "root", root);
  124.     });
  125.     return settings;
  126.     }
  127.  
  128.     global list<string> GetSpecialOptions () {
  129.        list<string> special = [];
  130.        string bl = BootCommon::getLoaderType (false);
  131.        if (bl != "grub")
  132.        {
  133.            special = [ "change-rules", "type", "reset", "normal", "hidden",
  134.                "disk", "heads", "inaccessible", "cylinders", "bios",
  135.                "sectors", "change", "set", "partition", "deactivate",
  136.                "partition", "automatic", "map-drive", "to",
  137.            ];
  138.        }
  139.        if (bl != "ppc")
  140.        {
  141.            special = add (special, "activate");
  142.        }
  143.        return special;
  144.     }
  145.  
  146.     /**
  147.       * return true if given option is special
  148.       * @param opt option name
  149.       * @return boolean special/not
  150.       */
  151.     global define boolean isSpecial(string opt) {
  152.        list<string> special = GetSpecialOptions ();
  153.        return (contains (special, opt));
  154.     }
  155. }
  156.