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 / clients / inst_kickoff.ycp < prev    next >
Text File  |  2006-11-29  |  12KB  |  402 lines

  1. /**
  2.  * Module:    inst_kickoff.ycp
  3.  *
  4.  * Authors:    Arvin Schnell <arvin@suse.de>
  5.  *
  6.  * Purpose:    Do various tasks before starting with installation of rpms.
  7.  *
  8.  */
  9.  
  10. {
  11.     textdomain "packager";
  12.  
  13.     import "Mode";
  14.     import "Stage";
  15.     import "Linuxrc";
  16.     import "Installation";
  17.     import "Update";
  18.     import "Popup";
  19.     import "Directory";
  20.     import "ModuleLoading";
  21.     import "Bootloader";
  22.     import "DirInstall";
  23.     import "Initrd";
  24.     import "Kernel";
  25.     import "Arch";
  26.     import "FileUtils";
  27.     import "String";
  28.  
  29. void AcpiToInitrd () {
  30.     if (! (Arch::i386 () || Arch::x86_64 () || Arch::ia64 ()))
  31.     return;
  32.     foreach (string m, ["processor", "thermal", "fan"], {
  33.     Initrd::AddModule (m, "");
  34.     });
  35. }
  36.  
  37.  
  38.     /**
  39.      *  Write a fake mtab to the target system since some %post scripts might
  40.      *  need it.
  41.      */
  42.     define void fake_mtab () ``{
  43.  
  44.     string tmpdir = (string) SCR::Read (.target.tmpdir);
  45.  
  46.     string mtabname = "/etc/mtab";
  47.     string mtab = (string) WFM::Read(.local.string, mtabname);
  48.  
  49.     SCR::Write(.target.string, tmpdir + "/mtab", mtab);
  50.     SCR::Execute (.target.bash, "/bin/cat "
  51.               + "'" + String::Quote (tmpdir + "/mtab") + "'"
  52.               + " | /bin/sed \"s: " + Installation::destdir
  53.               + "/: /:\"| /bin/sed \"s: " + Installation::destdir
  54.               + ": /:\" "
  55.               + "> '" + String::Quote (Installation::destdir) + "'" + mtabname);
  56.  
  57.     }
  58.  
  59.  
  60.     /**
  61.      *  Remove some old junk.
  62.      */
  63.     define void remove_stuff () ``{
  64.  
  65.     // remove old junk, script is in yast2-update
  66.     SCR::Execute (.target.bash, Directory::ybindir + "/remove_junk " +
  67.               "'" + String::Quote (Installation::destdir) + "'");
  68.  
  69.     // possibly remove /usr/share/info/dir
  70.     if (!Pkg::TargetFileHasOwner ("/usr/share/info/dir"))
  71.     {
  72.         SCR::Execute (.target.remove, Installation::destdir + "/usr/share/info/dir");
  73.     }
  74.  
  75.     }
  76.  
  77.  
  78.     /**
  79.      *  Handle the backup.
  80.      */
  81.     define void backup_stuff () ``{
  82.  
  83.     if (Update::backup_modified)
  84.     {
  85.         Pkg::CreateBackups (true);
  86.         Pkg::SetBackupPath (Update::backup_path);
  87.         SCR::Write (.target.string, Installation::destdir + "/var/lib/YaST2/backup_path",
  88.             Update::backup_path);
  89.     }
  90.     else
  91.     {
  92.         Pkg::CreateBackups (false);
  93.         SCR::Execute (.target.remove, Installation::destdir + "/var/lib/YaST2/backup_path");
  94.     }
  95.  
  96.     if (Update::remove_old_backups)
  97.     {
  98.         SCR::Execute (.target.bash, "cd '" + String::Quote (Installation::destdir) + "'; " +
  99.                 "/bin/rm -f " + Update::backup_path + "/*-*-*.tar.{gz,bz2}");
  100.     }
  101.  
  102.     if (true)
  103.     {
  104.         string date = timestring ("%Y%m%d", time(), false);
  105.  
  106.         y2milestone ("backup of " + Directory::logdir);
  107.  
  108.         string filename = "";
  109.         integer num = 0;
  110.  
  111.         while (num < 42)
  112.         {
  113.         filename = Update::backup_path + "/YaST2-" + date + "-" +
  114.             sformat ("%1", num) + ".tar.gz";
  115.         if (SCR::Read (.target.size, Installation::destdir + filename) == -1)
  116.             break;
  117.         num = num + 1;
  118.         }
  119.  
  120.         if (SCR::Execute (.target.bash, "cd '" + String::Quote (Installation::destdir) + "'; " +
  121.                   "/bin/tar czf ." + filename + " " + "var/log/YaST2") != 0)
  122.         {
  123.         y2error ("backup of %1 to %2 failed", Directory::logdir, filename);
  124.         // an error popup
  125.         Popup::Error (sformat (_("Backup of %1 failed. See %2 for details."),
  126.                        Directory::logdir, Directory::logdir + "/y2log"));
  127.         }
  128.         else
  129.         {
  130.         SCR::Execute (.target.bash, "cd '" + String::Quote (Installation::destdir) + "'; " +
  131.                       "/bin/rm -rf var/log/YaST2/*");
  132.         }
  133.     }
  134.  
  135.     if (Update::backup_sysconfig)
  136.     {
  137.         string date = timestring ("%Y%m%d", time(), false);
  138.  
  139.         if (SCR::Read (.target.size, Installation::destdir + "/etc/sysconfig") > 0)
  140.         {
  141.         y2milestone ("backup of /etc/sysconfig");
  142.  
  143.         string filename = "";
  144.         integer num = 0;
  145.  
  146.         while (num < 42)
  147.         {
  148.             filename = Update::backup_path + "/etc.sysconfig-" + date + "-" +
  149.             sformat ("%1", num) + ".tar.gz";
  150.             if (SCR::Read (.target.size, Installation::destdir + filename) == -1)
  151.             break;
  152.             num = num + 1;
  153.         }
  154.  
  155.         if (SCR::Execute (.target.bash, "cd '" + String::Quote (Installation::destdir) + "'; " +
  156.                   "/bin/tar czf ." + filename + " " + "etc/sysconfig") != 0)
  157.         {
  158.             y2error ("backup of %1 to %2 failed", "/etc/sysconfig", filename);
  159.             // an error popup
  160.             Popup::Error (sformat (_("Backup of %1 failed. See %2 for details."),
  161.                        "/etc/sysconfig", Directory::logdir + "/y2log"));
  162.         }
  163.         }
  164.         else if (SCR::Read (.target.size, Installation::destdir + "/etc/rc.config") > 0 &&
  165.              SCR::Read (.target.size, Installation::destdir + "/etc/rc.config.d") > 0)
  166.         {
  167.         y2milestone ("backup of /etc/rc.config.d");
  168.  
  169.         string filename = "";
  170.         integer num = 0;
  171.  
  172.         while (num < 42)
  173.         {
  174.             filename = Update::backup_path + "/etc.rc.config-" + date + "-" +
  175.             sformat ("%1", num) + ".tar.gz";
  176.             if (SCR::Read (.target.size, Installation::destdir + filename) == -1)
  177.             break;
  178.             num = num + 1;
  179.         }
  180.  
  181.         if (SCR::Execute (.target.bash, "cd '" + String::Quote (Installation::destdir) + "'; " +
  182.                   "/bin/tar czf ." + filename + " " +
  183.                   "etc/rc.config etc/rc.config.d") != 0)
  184.         {
  185.             y2error ("backup of %1 to %2 failed", "/etc/rc.config", filename);
  186.             // an error popup
  187.             Popup::Error (sformat (_("Backup of %1 failed. See %2 for details."),
  188.                        "/etc/rc.config", Directory::logdir + "/y2log"));
  189.         }
  190.         }
  191.     }
  192.     }
  193.  
  194.  
  195.     /**
  196.      *  Update and convert inittab.
  197.      */
  198.     define void update_inittab () ``{
  199.  
  200.     // /etc/inittab will be overridden by package aaa_base. So we will
  201.     // have to save the run-level
  202.     // The runlevel-values have been changed since version 7.0; So we
  203.     // have to handle older version in a special case.
  204.  
  205.     string idfile = (string) SCR::Read(.target.tmpdir) + "/idline";
  206.     if (SCR::Execute (.target.bash, "/bin/grep ^id: " +
  207.              "'" + String::Quote (Installation::destdir) + "/etc/inittab" + "'" +
  208.              " >" + idfile) == 0)
  209.     {
  210.         // idline = "id:X:initdefault:"
  211.  
  212.         string idline = (string) SCR::Read(.target.string, idfile);
  213.  
  214.         // idsplit = "id", "X", "initdefault", ""
  215.         list idsplit = splitstring (idline, ":");
  216.  
  217.         integer initdefault = -1;
  218.         if (size (idsplit) > 2)
  219.         {
  220.         initdefault = tointeger (idsplit[1]:"3");
  221.         }
  222.  
  223.         y2milestone ("run-level %1 found", initdefault);
  224.  
  225.         if (Update::installedVersion["name"]:"" == "SuSE Linux")
  226.         {
  227.         integer oldmajor = Update::installedVersion["major"]:-1;
  228.         integer oldminor = Update::installedVersion["minor"]:-1;
  229.  
  230.         if (oldmajor >= 0 && oldminor >= 0)
  231.         {
  232.             if ((oldmajor < 7) || (oldmajor == 7 && oldminor == 0))
  233.             {
  234.             // position == old, value == new
  235.             list new_levels = [ 0, 0, 3, 5, 4, 4 ];    // 0->0, 1->0, 2->3, 3->5, 4->4, 5->4
  236.             initdefault = new_levels[initdefault]:5;
  237.             }
  238.         }
  239.         }
  240.  
  241.         Update::last_runlevel = initdefault;        // evaluated in inst_finish
  242.     }
  243.     }
  244.  
  245.     /**
  246.      * Create /etc/mdadm.conf if it does not exist and it's needed
  247.      * bugs: #169710 and #146304
  248.      */
  249.     void createmdadm () {
  250.     string mdamd_configfile = Installation::destdir + "/etc/mdadm.conf";
  251.     // File exists, no need to create it
  252.     if (FileUtils::Exists(mdamd_configfile)) {
  253.         y2milestone("File /etc/mdadm.conf exists, skipping creation...");
  254.         return;
  255.     }
  256.  
  257.     // get the current raid configuration
  258.     map out = (map) SCR::Execute (.target.bash_output,
  259.         "chroot '" + String::Quote (Installation::destdir) + "' " +
  260.         "mdadm -Ds");
  261.     if (out["exit"]:-1 != 0) {
  262.         y2error ("Error occurred while getting raid configuration: %1", out);
  263.         return;
  264.     }
  265.     // There's no current raid configuration, no reason to create that file, bug #169710
  266.     if (out["stdout"]:"" == "") {
  267.         y2milestone("No raid is currently configured, skipping file creation...");
  268.         return;
  269.     }
  270.         
  271.     // File format defined in bug #146304
  272.     string mdadm_content = "DEV partitions\n" +
  273.         out["stdout"]:"" + "\n";
  274.  
  275.     y2milestone ("/etc/mdadm.conf doesn't exist, creating it");
  276.     if (! (boolean) SCR::Write (.target.string, mdamd_configfile, mdadm_content)) {
  277.         y2error ("Error occurred while creating /etc/mdadm.conf with content '%1'", mdadm_content);
  278.     }
  279.     }
  280.  
  281.     /**
  282.      *  Load all network modules.  The package sysconfig requires this during
  283.      *  update.
  284.      */
  285.     define void load_network_modules ()
  286.     {
  287.     list <map> cards = (list <map>) SCR::Read (.probe.netcard);
  288.  
  289.     foreach (map card, cards,
  290.     {
  291.         list <map> drivers = card["drivers"]:[];
  292.  
  293.         boolean one_active = false;
  294.  
  295.         foreach (map driver, drivers,
  296.         {
  297.         if (driver["active"]:false)
  298.             one_active = true;
  299.         });
  300.  
  301.         if (!one_active)
  302.         {
  303.         string name = drivers[0, "modules", 0, 0]:"";
  304.         if (name != "")
  305.             ModuleLoading::Load (name, "", "Linux", "",
  306.                      Linuxrc::manual (), true);
  307.         }
  308.     });
  309.     }
  310.  
  311.  
  312.     if (!Mode::update ())
  313.     {
  314.     // make some directories
  315.     SCR::Execute(.target.mkdir, Installation::destdir + "/etc");
  316.     SCR::Execute(.target.mkdir, Installation::destdir + Directory::logdir);
  317.  
  318.     // hack 'pre-req' cyclic dependency between bash, aaa_base, and perl
  319.         if (DirInstall::installing_into_dir)
  320.         {
  321.             string template_dir= "/var/adm/fillup-templates";
  322.             // hack 'pre-req' cyclic dependency between bash, aaa_base, and perl
  323.             SCR::Execute(.target.bash, "/bin/cp " + template_dir + "/passwd.aaa_base " +
  324.             "'" + String::Quote (Installation::destdir) + "/etc/passwd" + "'");
  325.             SCR::Execute(.target.bash, "/bin/cp " + template_dir + "/group.aaa_base " +
  326.                     "'" + String::Quote (Installation::destdir) + "/etc/group" + "'");
  327.             SCR::Execute(.target.bash, "/bin/cp " + template_dir + "/shadow.aaa_base " +
  328.                     "'" + String::Quote (Installation::destdir) + "/etc/shadow" + "'");
  329.         } else
  330.         {
  331.         SCR::Execute(.target.bash, "/bin/cp /etc/passwd " +
  332.             "'" + String::Quote (Installation::destdir) + "/etc" + "'");
  333.         SCR::Execute(.target.bash, "/bin/cp /etc/group " +
  334.             "'" + String::Quote (Installation::destdir) + "/etc" + "'");
  335.         }
  336.  
  337.     // fake mtab
  338.     fake_mtab ();
  339.     AcpiToInitrd ();
  340.     }
  341.     else
  342.     {
  343.         if (Stage::normal())
  344.         {
  345.             import "Kernel";
  346.             string kernel = Kernel::ComputePackage ();
  347.             Kernel::SetInformAboutKernelChange(Pkg::IsSelected (kernel));
  348.  
  349.             SCR::Execute (.target.mkdir, Installation::destdir + Update::backup_path);
  350.             backup_stuff ();
  351.         createmdadm();
  352.         }
  353.         else 
  354.         {
  355.         // disable all sources at the target
  356.         Pkg::TargetDisableSources();
  357.  
  358.             // make some directories
  359.             SCR::Execute (.target.mkdir, Installation::destdir + Directory::logdir);
  360.             SCR::Execute (.target.mkdir, Installation::destdir + Update::backup_path);
  361.  
  362.             // backup some stuff
  363.             backup_stuff ();
  364.  
  365.             // remove some stuff
  366.             // do not remove when updating running system (#49608)
  367.             remove_stuff ();
  368.  
  369.             // set update mode to yes
  370.             SCR::Write(.target.string, Installation::destdir + "/var/lib/YaST2/update_mode", "YES");
  371.             SCR::Execute (.target.remove, Installation::destdir + "/var/lib/YaST/update.inf");
  372.  
  373.             // check passwd and group of target
  374.             SCR::Execute (.target.bash, "/usr/lib/YaST2/bin/update_users_groups " +
  375.                     "'" + String::Quote (Installation::destdir) + "'");
  376.  
  377.             // update inittab
  378.             update_inittab ();
  379.  
  380.         // create /etc/mdadm.conf if it does not exist
  381.         createmdadm();
  382.  
  383.             // load all network modules
  384.             load_network_modules ();
  385.  
  386.             // perform actions needed by various bootloaders before packages
  387.             // get updated
  388.             Bootloader::PreUpdate ();
  389.         }
  390.     AcpiToInitrd ();
  391.     }
  392.  
  393.     if (Stage::initial ())
  394.     {
  395.     // see bug 20627 for original purpose of this line,
  396.     // bug 172149 why it was moved here
  397.     SCR::Execute (.target.bash, "/bin/echo \"/etc/nothing\" >/proc/sys/kernel/modprobe");
  398.     }
  399.  
  400.     return `next;
  401. }
  402.