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 / modules / Initrd.ycp < prev    next >
Text File  |  2006-11-29  |  12KB  |  443 lines

  1. /**
  2.  * File:
  3.  *      modules/Initrd.ycp
  4.  *
  5.  * Module:
  6.  *      Bootloader installation and configuration
  7.  *
  8.  * Summary:
  9.  *      functions for initial ramdisk setup and creation
  10.  *
  11.  * Authors:
  12.  *      Jiri Srain <jsrain@suse.cz>
  13.  *
  14.  * $Id: Initrd.ycp 33164 2006-09-27 08:42:24Z jsrain $
  15.  *
  16.  */
  17. {
  18.     module "Initrd";
  19.  
  20.     import "Arch";
  21.     import "Label";
  22.     import "Misc";
  23.     import "Mode";
  24.     import "Report";
  25.     import "Stage";
  26.     import "Directory";
  27.  
  28.     textdomain "base";
  29.  
  30. // module variables
  31.  
  32.     /**
  33.       * List of modules for Initrd
  34.       */
  35.     list<string> modules = [];
  36.     /**
  37.       * For each of modules - true if should be inserted to initrd, false
  38.       * otherwise. Used to keep order from first-stage installation
  39.       */
  40.     map<string,boolean> modules_to_store = $[];
  41.     /**
  42.       * List of modules that were in sysconfig file when reading settings
  43.       */
  44.     list<string> read_modules = [];
  45.     /**
  46.       * map of settings for modules for being contained in initrd
  47.       */
  48.     map<string, any> modules_settings = $[];
  49.     /**
  50.       * true if settings were changed and initrd needs to be rebuilt,
  51.       * false otherwise
  52.       */
  53.     global boolean changed = false;
  54.     /**
  55.       * true if settings were already read, flase otherwise
  56.       */
  57.     boolean was_read = false;
  58.     /**
  59.       * parametr for mkinitrd because of splash screen
  60.       * used for choosing right size of splash
  61.       */
  62.     string splash = "";
  63.     /**
  64.       * List of modules which should be not added/removed to/from initrd
  65.       */
  66.     list<string> modules_to_skip = nil;
  67.  
  68.     /**
  69.       * List of fallback vga modes to be used when hwinfo --framebuffer
  70.       * doesn't return any value
  71.       */
  72.     list<map> known_modes = [
  73.     $["color":8,  "height":200, "mode":816, "width":320],
  74.     $["color":16, "height":200, "mode":782, "width":320],
  75.     $["color":24, "height":200, "mode":783, "width":320],
  76.     $["color":8,  "height":240, "mode":820, "width":320],
  77.     $["color":16, "height":240, "mode":821, "width":320],
  78.     $["color":24, "height":240, "mode":822, "width":320],
  79.     $["color":8,  "height":400, "mode":817, "width":320],
  80.     $["color":16, "height":400, "mode":818, "width":320],
  81.     $["color":24, "height":400, "mode":819, "width":320],
  82.     $["color":8,  "height":400, "mode":768, "width":640],
  83.     $["color":16, "height":400, "mode":829, "width":640],
  84.     $["color":24, "height":400, "mode":830, "width":640],
  85.     $["color":8,  "height":480, "mode":769, "width":640],
  86.     $["color":16, "height":480, "mode":785, "width":640],
  87.     $["color":24, "height":480, "mode":786, "width":640],
  88.     $["color":8,  "height":600, "mode":771, "width":800],
  89.     $["color":16, "height":600, "mode":788, "width":800],
  90.     $["color":24, "height":600, "mode":789, "width":800],
  91.     $["color":8,  "height":768, "mode":773, "width":1024],
  92.     $["color":16, "height":768, "mode":791, "width":1024],
  93.     $["color":24, "height":768, "mode":792, "width":1024],
  94.     $["color":8,  "height":1024, "mode":775, "width":1280],
  95.     $["color":16, "height":1024, "mode":794, "width":1280],
  96.     $["color":24, "height":1024, "mode":795, "width":1280],
  97.     $["color":8,  "height":1200, "mode":837, "width":1600],
  98.     $["color":16, "height":1200, "mode":838, "width":1600]
  99.     ];
  100.  
  101. // module functions
  102.  
  103.     /**
  104.      * Get the list of modules which don't belong to initrd
  105.      * Initialize the list if was not initialized before according to the
  106.      * architecture
  107.      * @return a list of modules
  108.      */
  109.     global list<string> getModulesToSkip () {
  110.     if (modules_to_skip == nil)
  111.     {
  112.         // usb and cdrom modules dont belong to initrd,
  113.         // they're loaded by hotplug
  114.         modules_to_skip = [
  115.         "input",
  116.         "hid",
  117.         "usbhid",
  118.         "keybdev",
  119.         "mousedev",
  120.         "cdrom",
  121.         "ide-cd",
  122.         "sr_mod",
  123.         "xfs_support",
  124.         "xfs_dmapi",
  125.         "ide-scsi",
  126.         ];
  127.         // some other modules don't belong to initrd on PPC
  128.         if (Arch::ppc ())
  129.         {
  130.         list ppc_modules_to_skip = [
  131.             "reiserfs",
  132.             "ext3",
  133.             "jbd",
  134.         ];
  135.         modules_to_skip = (list<string>)
  136.             merge (modules_to_skip, ppc_modules_to_skip);
  137.         }
  138.     }
  139.     return modules_to_skip;
  140.     }
  141.  
  142.     /**
  143.       * reset settings to empty list of modules
  144.       */
  145.     global define void Reset () ``{
  146.     y2milestone ("Reseting initrd settings");
  147.     was_read = false;
  148.     changed = false;
  149.     modules = [];
  150.     modules_to_store = $[];
  151.     read_modules = [];
  152.     modules_settings = $[];
  153.     }
  154.  
  155.     /**
  156.       * read seettings from sysconfig
  157.       * @return true on success
  158.       */
  159.     global define boolean Read () ``{
  160.     Reset ();
  161.     was_read = true;
  162.     if (Stage::initial () && ! Mode::update ()) // nothing to read
  163.     {
  164.         return true;
  165.     }
  166.  
  167.     // test for missing files - probably an error - should never occur
  168.     if (SCR::Read (.target.size, "/etc/sysconfig/kernel") == -1)
  169.     {
  170.         y2error ("sysconfig/kernel not found");
  171.         return false;
  172.     }
  173.  
  174.     string s_modnames = (string) SCR::Read (.sysconfig.kernel.INITRD_MODULES);
  175.     if (s_modnames == nil)
  176.         s_modnames = "";
  177.     modules = splitstring (s_modnames, " ");
  178.     modules = filter (string m, modules, { return m != "";});
  179.     foreach (string m, modules, {
  180.         modules_settings [m] = $[];
  181.         modules_to_store[m] = true;
  182.     });
  183.     read_modules = modules;
  184.     return true;
  185.     }
  186.  
  187.     /**
  188.       * List modules included in initrd
  189.       * @return list of strings with modulenames
  190.       */
  191.     global define list<string> ListModules () ``{
  192.     if (! (was_read || Mode::config ()))
  193.         Read ();
  194.     return filter (string m, modules, {
  195.         return modules_to_store[m]:false;
  196.     });
  197.     }
  198.  
  199.     /**
  200.       * add module to ramdisk
  201.       * @param modname name of module
  202.       * @param modargs arguments to be passes to module
  203.       */
  204.     global define void AddModule (string modname, string modargs) ``{
  205.     if (Stage::initial () && size (modules) == 0)
  206.     {
  207.         string tmp_mods = (string)
  208.         SCR::Read (.etc.install_inf.InitrdModules);
  209.         if (tmp_mods != nil && tmp_mods != "")
  210.         {
  211.         modules = splitstring( tmp_mods, " " );
  212.         }
  213.         was_read = true;
  214.     }
  215.     else if (! (was_read || Mode::config ()))
  216.     {
  217.         Read ();
  218.     }
  219.     if ((!contains (ListModules (), modname))
  220.         || ((modname == "aic7xxx")
  221.         && !contains ( ListModules (), "aic7xxx_old"))
  222.         || ((modname == "aic7xxx_old")
  223.         && !contains ( ListModules (), "aic7xxx")))
  224.         {
  225.             if ( ! contains (getModulesToSkip (), modname))
  226.         {
  227.         changed = true;
  228.         modules_to_store[modname] = true;
  229.         modules_settings [modname] = Misc::SplitOptions (modargs, $[]);
  230.         if (! contains (modules, modname))
  231.         {
  232.             modules = add (modules, modname);
  233.             y2milestone ("Module %1 added to initrd, now contains %2",
  234.             modname, ListModules ());
  235.         }
  236.         else
  237.         {
  238.             y2milestone ("Module %1 from initial list added to initrd, now contains %2",
  239.             modname, ListModules ());
  240.         }
  241.         }
  242.         else
  243.         {
  244.         y2milestone ("Module %1 is in list of modules not to insert to initrd", modname);
  245.         }
  246.         }
  247.     else
  248.     {
  249.         y2milestone ("Module %1 already present in initrd", modname);
  250.     }
  251.         return;
  252.     }
  253.  
  254.     /**
  255.       * Export settigs to variable
  256.       * @return map of initrd settings
  257.       */
  258.     global define map Export () ``{
  259.     if (! (was_read || Mode::config ()))
  260.         Read ();
  261.     return $[
  262.         "list" : filter (string m, modules, {
  263.         return modules_to_store[m]:false;
  264.         }),
  265.         "settings" : modules_settings,
  266.     ];
  267.     }
  268.  
  269.     /**
  270.       * import settings of initrd
  271.       * @param settings map of initrd settings
  272.       */
  273.     global define void Import (map settings) ``{
  274.     if (! Mode::config ())
  275.         Read (); // to set modules that were read
  276.              // and not add them to the list
  277.     modules = settings["list"]:[];
  278.     modules_settings = settings["settings"]:$[];
  279.     foreach (string m, modules, {
  280.         modules_to_store[m] = true;
  281.     });
  282.     was_read = true;
  283.     changed = true;
  284.     }
  285.  
  286.     /**
  287.       * remove module from list of initrd modules
  288.       * @param modname string name of module to remove
  289.       */
  290.     global define void RemoveModule (string modname) ``{
  291.     if (! (was_read || Mode::config ()))
  292.         Read ();
  293.     modules = filter (string k, modules, { return k != modname; });
  294.     modules_settings = filter (string k, any v, modules_settings, { return k != modname; });
  295.     changed = true;
  296.     }
  297.  
  298.     /**
  299.       * Update read settings to new version of configuration files
  300.       */
  301.     global define void Update () ``{
  302.     // add other required changes here
  303.     modules = filter (string m, modules,
  304.         { return (! contains (getModulesToSkip (), m)); });
  305.     modules_settings = filter (string k, any v, modules_settings,
  306.         { return (! contains (getModulesToSkip (), k)); });
  307.     changed = true;
  308.     }
  309.  
  310.     /**
  311.       * Display error popup with log
  312.       * FIXME this is copy-paste from ../routines/popups.ycp
  313.       * @param header string error header
  314.       * @param log string logfile contents
  315.       */
  316.     global define void errorWithLogPopup (string header, string log) ``{
  317.     if (log == nil)
  318.         log = "";
  319.     term text = `RichText( `opt(`plainText), log );
  320.     UI::OpenDialog(`opt ( `decorated ),
  321.         `VBox (`HSpacing(75),
  322.         // heading
  323.         `Heading(header),
  324.         text,     // e.g. `Richtext()
  325.         `PushButton( `id(`ok_help), `opt(`default), Label::OKButton() )
  326.         )
  327.     );
  328.  
  329.     UI::SetFocus(`id(`ok_help) );
  330.     any r = UI::UserInput();
  331.     UI::CloseDialog();
  332.     }
  333.  
  334.  
  335.     /**
  336.       * write settings to sysconfig, rebuild initrd images
  337.       * @return true on success
  338.       */
  339.     global define boolean Write () ``{
  340.     if (! (was_read || Mode::config ()))
  341.         Read ();
  342.     if (Mode::update ())
  343.         Update ();
  344.     y2milestone ("Initrd::Write called, changed: %1, list: %2", changed,
  345.         ListModules ());
  346.     // check whether it is neccessary to write initrd
  347.     if ((! changed) && (Mode::normal ()))
  348.         return true;
  349.  
  350.     boolean modules_written = false;
  351.  
  352.     foreach (string modname, any optmap, modules_settings, ``{
  353.         if (!is (optmap, map)) continue;
  354.         if (size ((map)optmap) > 0)
  355.         {
  356.         // write options to /etc/modules.conf
  357.         path p = add (.modules.options, modname);
  358.         SCR::Write (p, (map)optmap);
  359.         modules_written = true;
  360.         }
  361.     });
  362.  
  363.     if (modules_written)
  364.     {
  365.         SCR::Write (.modules, nil);
  366.     }
  367.  
  368.     // check modules that could be added during module's run (bug 26717)
  369.     if (SCR::Read (.target.size, "/etc/sysconfig/kernel") != -1)
  370.     {
  371.         string s_modnames = (string) SCR::Read (.sysconfig.kernel.INITRD_MODULES);
  372.         if (s_modnames == nil)
  373.         s_modnames = "";
  374.         list<string> s_modules = splitstring (s_modnames, " ");
  375.         s_modules = filter (string m, s_modules, ``(
  376.         ! contains (read_modules, m)));
  377.         s_modules = filter (string m, s_modules, ``(
  378.         ! contains (modules, m)));
  379.         y2milestone (
  380.         "Modules %1 were added to initrd not using Initrd module",
  381.         s_modules);
  382.         foreach (string m, s_modules, ``{
  383.         AddModule (m, "");
  384.         });
  385.     }
  386.  
  387.     // save sysconfig
  388.         SCR::Execute (.target.bash,
  389.         "/usr/bin/touch /etc/sysconfig/bootloader");
  390.     string mods = mergestring (ListModules (), " ");
  391.     y2milestone ("Writing modules %1", mods);
  392.     SCR::Write (.sysconfig.kernel.INITRD_MODULES, mods);
  393.     SCR::Write (.sysconfig.kernel, nil);
  394.     // recreate initrd
  395.     string param = "";
  396.     if (splash != "" && splash != nil)
  397.         param = sformat ("-s %1", splash);
  398.     if ( SCR::Execute (.target.bash, sformat ("/sbin/mkinitrd %1 >> \
  399. %2 2>&1", param, Directory::logdir + "/y2logmkinitrd")) != 0 )
  400.     {
  401.         string log = (string) SCR::Read (.target.string, Directory::logdir +
  402.                          "/y2logmkinitrd");
  403.         // error report
  404.         errorWithLogPopup (_("An error occurred during initrd creation."),
  405.         log);
  406.     }
  407.     changed = false;
  408.     return true;
  409.     }
  410.  
  411. global list<map> VgaModes () {
  412.     list<map> all_modes = (list<map>) SCR::Read (.probe.framebuffer);
  413.     if (all_modes == nil || size (all_modes) == 0)
  414.     {
  415.     y2warning ("Probing VGA modes failed, using fallback list");
  416.     all_modes = known_modes;
  417.     }
  418.     return all_modes;
  419. }
  420.  
  421.     /**
  422.       * Set the -s parameter of mkinitrd
  423.       * @param vga string the vga kernel parameter
  424.       */
  425.     global define void setSplash (string vga) ``{
  426.     if (! Arch::s390 ())
  427.     {
  428.         changed = true;
  429.         integer mode = tointeger (vga);
  430.         list<map> all_modes = VgaModes ();
  431.         foreach (map m, all_modes, ``{
  432.         if (m["mode"]:0 == mode
  433.             && m["height"]:0 != 0 && m["width"]:0 != 0)
  434.         {
  435.             splash = sformat ("%2x%1", m["height"]:0, m["width"]:0);
  436.             y2milestone ("Setting splash resolution to %1", splash);
  437.         }
  438.         });
  439.     }
  440.     }
  441.  
  442. } // end of module
  443.