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

  1. /**
  2.  * Module:        PackageInstallation.ycp
  3.  *
  4.  * Authors:        Gabriele Strattner <gs@suse.de>
  5.  *
  6.  */
  7.  
  8. {
  9.     module "PackageInstallation";
  10.     textdomain "packager";
  11.  
  12.     import "Mode";
  13.     import "Installation";
  14.     import "Directory";
  15.     import "Packages";
  16.     import "SlideShow";
  17.  
  18.     import "Label";
  19.  
  20.  
  21.  
  22.     global define any FakePackager( list<list> packages, string inst_source,
  23.                     boolean deleting );
  24.  
  25.  
  26.     /**
  27.      *  Show a dialog with either the list of failed packages (string a) or
  28.      *  the complete log (string b).
  29.      */
  30.     define void ShowFailedPackages (string a, string b)
  31.     {
  32.     term rbuttons = `RadioButtonGroup (
  33.                        `VBox (
  34.                           `Left(`RadioButton(`id(`a), `opt(`notify),
  35.                                      // button label
  36.                                      _("&Show Failed Packages List"), true)),
  37.                           `Left(`RadioButton(`id(`b), `opt(`notify),
  38.                                      // button label
  39.                                      _("&Show Full Log"), false))
  40.                           )
  41.                        );
  42.  
  43.     UI::OpenDialog (
  44.             `opt(`decorated),
  45.             `VBox(
  46.                   `HSpacing(40),
  47.                   // dialog headline
  48.                   `Left(`Heading(_("Installation of Some Packages Failed"))),
  49.                   rbuttons,
  50.                   `RichText(`id(`text),
  51.                     `opt(`plainText),
  52.                     a),
  53.                   `PushButton (`id(`ok), `opt(`default, `key_F10),
  54.                        Label::OKButton ())
  55.                   )
  56.             );
  57.  
  58.     while (true)
  59.     {
  60.         symbol ret = (symbol) UI::UserInput ();
  61.  
  62.         if (ret == `a || ret == `b)
  63.         {
  64.         UI::ChangeWidget (`id(`text), `Value, (boolean) UI::QueryWidget (`id(`a), `Value) ? a : b);
  65.         continue;
  66.         }
  67.  
  68.         if (ret == `ok)
  69.         break;
  70.     }
  71.  
  72.     UI::CloseDialog ();
  73.     }
  74.  
  75.  
  76.     /**
  77.      *  commitPackages marked for deletion or installation
  78.      *    Return: [ int successful, list failed, list remaining, list srcremaining ]
  79.      *
  80.      **/
  81.     global define list CommitPackages (integer media_number,
  82.                        integer packages_installed)
  83.     {
  84.     y2milestone("CommitPackages called: media nr. %1, packages %2", media_number, packages_installed);
  85.  
  86.     if ( Mode::test () )
  87.     {
  88.         FakePackager( [],
  89.             "suse",
  90.             false );        // not deleting packages
  91.         return [];
  92.     }
  93.     // install packages from this media
  94.  
  95.     y2milestone ("CommitPackages (%1,%2): Pkg::TargetGetDU() %3",
  96.              media_number, packages_installed, Pkg::TargetGetDU());
  97.  
  98.     list <integer> sources = Pkg::SourceGetCurrent (false);
  99.     integer source_id = sources[0]:0;
  100.  
  101.     if (source_id != 0)
  102.     {
  103.         map source_data = Pkg::SourceGeneralData (source_id);
  104.         if (source_data != nil)
  105.         {
  106.         string url = source_data["url"]:"cd:///";
  107.         if (substring (url, 0, 3) == "dvd")
  108.             SlideShow::SetMediaType ("DVD");
  109.         }
  110.     }
  111.  
  112.     SlideShow::InitPkgData(false);
  113.  
  114.     // structure: [ ["source_name", id] ]
  115.     list< list > src_list = Pkg::PkgMediaNames();
  116.  
  117.     // get ID of the first source
  118.     integer first_source = src_list[0,1]:1;
  119.  
  120.     y2milestone("ID of the first source: %1", first_source);
  121.  
  122.     if (media_number == 0)
  123.     {
  124.         SlideShow::SetCurrentCdNo (first_source, 1);
  125.     }
  126.     else
  127.     {
  128.         SlideShow::SetCurrentCdNo (first_source, media_number);
  129.     }
  130.     SlideShow::UpdateAllCdProgress ();
  131.     SlideShow::StartTimer();
  132.  
  133.     boolean do_commit = true;
  134.     if (media_number != 0)
  135.     {
  136.         list<map<string,any> > pkgs = Pkg::ResolvableProperties ("", `package, "");
  137.         pkgs = filter (map<string,any> p, pkgs, {
  138.         return p["status"]:nil == `selected;
  139.         });
  140.         do_commit = size (pkgs) > 0;
  141.     }
  142.  
  143.     list commit_result = [];
  144.     if (do_commit)
  145.     {
  146.         // returns [ int successful, list failed, list remaining, list srcremaining ]
  147.         y2milestone ("Calling PkgCommit (%1)", media_number);
  148.         commit_result = Pkg::PkgCommit (media_number);
  149.  
  150.         SlideShow::StopTimer();
  151.  
  152.         if (commit_result == nil)
  153.         {
  154.         y2error ("Bad media number %1", media_number);
  155.         return [];
  156.         }
  157.     }
  158.     else
  159.     {
  160.         y2milestone ("No package from media %1 left for installation", media_number);
  161.     }
  162.  
  163.     // see if installation of some packages failed
  164.     list<string> errpacks = (list<string>) (commit_result[1]:[]);
  165.     if (size (errpacks) > 0)
  166.     {
  167.         string full_log = (string) SCR::Read (.target.string, Installation::destdir +
  168.                           Directory::logdir + "/y2logRPM");
  169.         ShowFailedPackages (mergestring (errpacks, "\n"), full_log);
  170.         list<string> old_failed_packs = [];
  171.         if ((integer)SCR::Read (.target.size,
  172.         "/var/lib/YaST2/failed_packages") > 0)
  173.         {
  174.         old_failed_packs = (list<string>)
  175.             SCR::Read (.target.ycp, "/var/lib/YaST2/failed_packages");
  176.         }
  177.         SCR::Write (.target.ycp, "/var/lib/YaST2/failed_packages",
  178.         merge (old_failed_packs, errpacks));
  179.     }
  180.  
  181.     return commit_result;
  182.     };
  183.  
  184.  
  185.     //
  186.     // Fake progress bars for Mode::test ()
  187.     //
  188.     // NOTE: This is currently completely broken.
  189.     // -- sh 2003-12-15
  190.     //
  191.     global define any FakePackager( list<list> packages, string inst_source,
  192.                     boolean deleting )
  193.     {
  194.     integer disk_usage = 20;
  195.     integer disk_capacity = 10000;
  196.     any ret = nil;
  197.     integer number = 0;
  198.  
  199.     y2debug( "FakePackager - handling %1 packages", size( packages ) );
  200.  
  201.     foreach( list pac, packages, {
  202.         //y2debug( "Fake installing %1 from %2", select(pac,0), inst_source );
  203.  
  204.         string pkg_name    = pac[0]:"";
  205.  
  206.         integer pkg_size    = 42*1024;
  207.         integer bytes_installed = 0;
  208.  
  209.         if ( pkg_size < 0 )
  210.         {
  211.         // pkginfo doesn't know anything about the kernel RPM, so its
  212.         // size can't be obtained, e.g. pkg_size is -1. To make up for
  213.         // this, let's assume a negative starting size to keep things
  214.         // going for a while (this is test_mode only, anyway).
  215.         bytes_installed = -857 * 1024;
  216.         }
  217.  
  218.         while  ( bytes_installed < pkg_size && ret != `cancel && ret != `diskfull )
  219.         {
  220.         integer percent = ( 100 * bytes_installed ) / pkg_size;
  221.         //    if ( deleting )
  222.         //    {
  223.         //        // Handle deleting packages
  224.         //    }
  225.         //    else
  226.         //    {
  227.         //        // Handle installing packages
  228.         //    }
  229.         sleep ( 300 ); // millisec
  230.         bytes_installed = bytes_installed + 300 * 1024;
  231.         }
  232.         disk_usage = disk_usage+1;
  233.         number = number+1;
  234.  
  235.     } );
  236.  
  237.     if    ( ret == `cancel || ret == `abort )    ret = `cancel;
  238.     else if ( ret == `diskfull )            ret = `diskfull;
  239.     else                        ret = `ok;
  240.  
  241.     y2debug( "FakePackager returning with %1", ret );
  242.     return ret;
  243.     }
  244.  
  245. }
  246.