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 / update / rootpart.ycp
Text File  |  2006-11-29  |  8KB  |  305 lines

  1. /**
  2.  * Module:    include/installation/rootpart.ycp
  3.  *
  4.  * Authors:    Stefan Schubert <schubi@suse.de>
  5.  *        Arvin Schnell <arvin@suse.de>
  6.  *              Jiri Srain <jsrain@suse.cz>
  7.  *
  8.  * Purpose:    Select root partition for update or booting.
  9.  *        RootPart::rootPartitions must be filled before
  10.  *        calling this module.
  11.  */
  12. {
  13. textdomain "update";
  14.  
  15. import "Wizard";
  16. import "Popup";
  17. import "Label";
  18. import "RootPart";
  19. import "GetInstArgs";
  20. import "Report";
  21. import "Update";
  22.  
  23. // Returns boolean whether partition can be
  24. // a Linux 'root' file system
  25. boolean CanBeLinuxRootFS (symbol partition_fs) {
  26.     if (partition_fs == nil) {
  27.     y2error("partition_fs not defined!");
  28.     return false;
  29.     }
  30.  
  31.     // possible_root_fs contains list of supported FSs
  32.     return contains (RootPart::possible_root_fs, partition_fs);
  33. }
  34.  
  35. list <term> make_partition_list (boolean withall) {
  36.     list<term> part_list = [];
  37.     foreach (string partition, map i, RootPart::rootPartitions, {
  38.         // see https://bugzilla.novell.com/attachment.cgi?id=96783&action=view
  39.  
  40.         if (i[`valid]:false || withall)
  41.         {
  42.         // `ext2, `jfs, ...
  43.         symbol part_fs = (symbol) i[`fs]:nil;
  44.         string part_fs_name = tostring (part_fs);
  45.         if (part_fs_name != nil && regexpmatch (part_fs_name, "^`(.*)$")) {
  46.             part_fs_name = regexpsub (part_fs_name, "^`(.*)$", "\\1");
  47.         }
  48.  
  49.         string system = i[`name]:"error";
  50.         // unknown system
  51.         if (system == "unknown") {
  52.             if (part_fs != nil) {
  53.             if (CanBeLinuxRootFS (part_fs)) {
  54.                 // Table item (unknown system)
  55.                 system = _("Unknown Linux");
  56.             } else {
  57.                 // Table item (unknown system)
  58.                 system = _("Unknown or Non-Linux");
  59.             }
  60.             } else {
  61.             // Table item (unknown system [neither openSUSE 11.1 nor SLES 14 nor ...])
  62.             if (system == "unknown") system = _("Unknown");
  63.             }
  64.         }
  65.  
  66.         string arch = i[`arch]:"error";
  67.         // Table item (unknown architecture)
  68.         if (arch == "unknown") arch = _("Unknown");
  69.  
  70.         // fist, use the name of file system (with short name for Linux)
  71.         // then the file system short name
  72.         // then "Unknown"
  73.         string fs = "";
  74.  
  75.         // is a linux fs, can be a root fs, has a fs name
  76.         if (part_fs != nil && i[`fstype]:nil != nil && CanBeLinuxRootFS (part_fs) && part_fs_name != nil) {
  77.             fs = sformat(
  78.             _("%1 (%2)"),
  79.             i[`fstype]:"", part_fs_name
  80.             );
  81.         } else {
  82.             fs = i[`fstype]:i[`fs]:"";
  83.         }
  84.         // Table item (unknown file system)
  85.         if (fs == "") fs = _("Unknown");
  86.         
  87.         string label = i[`label]:"";
  88.  
  89.         part_list = add (part_list,
  90.             `item (`id (partition),
  91.             system, partition, arch, fs, label
  92.             )
  93.         );
  94.         }
  95.     });
  96.     return part_list;
  97. }
  98.  
  99. // This dialog comes in three different flavors: `update_dialog,
  100. // `update_popup and `boot_popup, `update_dialog_proposal
  101. symbol RootPartitionDialog (symbol flavor) {
  102.  
  103.     list<term> partition_list = make_partition_list (
  104.     RootPart::showAllPartitions);
  105.  
  106.  
  107.     string title = "";
  108.     string label = "";
  109.     string help_text = "";
  110.  
  111.     if (flavor == `boot_popup)
  112.     {
  113.     // label for selection of root partition (for boot)
  114.     label = _("Partition or System to Boot:");
  115.  
  116.     // help text for root partition dialog (for boot)
  117.     help_text = _("<p>
  118. Select the partition or system to boot.
  119. </p>
  120. ");
  121.     }
  122.     else
  123.     {
  124.     // label for selection of root partition (for update)
  125.     label = _("Partition or System to Update:");
  126.  
  127.     // help text for root partition dialog (for update)
  128.     help_text = _("<p>
  129. Select the partition or system to update.
  130. </p>
  131. ");
  132.  
  133.     if (flavor == `update_dialog || flavor == `update_dialog_proposal)
  134.     {
  135.         // headline for dialog "Select for update"
  136.         title = _("Select for Update");
  137.     }
  138.     }
  139.  
  140.     // help text for root partition dialog (general part)
  141.     help_text = help_text + _("<p>
  142. <b>Show All Partitions</b> expands the list to a
  143. general overview of your system's partitions.
  144. </p>
  145. ");
  146.  
  147.     term contents = `HBox (
  148.     `HSpacing (2),
  149.     `VBox (
  150.         `VSpacing (1),
  151.         `HSpacing( 40 ),    // force minimum width
  152.         `Left (`Label (label)),
  153.         `Table (`id (`partition),
  154.         `opt(`hstretch),
  155.              // table header
  156.         `header (
  157.             _("System"),
  158.             // table header item
  159.             _("Partition"),
  160.             // table header item
  161.             _("Architecture"),
  162.             // table header item
  163.             _("File System"),
  164.             // table header item
  165.             _("Label")
  166.         ),
  167.         partition_list),
  168.         `Left(`CheckBox(`id(`showall), `opt(`notify),
  169.         // check box
  170.         _("&Show All Partitions"), false)),
  171.         `VSpacing (1)
  172.     ),
  173.     `HSpacing (2)
  174.     );
  175.  
  176.  
  177.     if (flavor == `update_dialog)
  178.     {
  179.     Wizard::SetContents (title, contents, help_text, true, true);
  180.     }
  181.     else if (flavor == `update_dialog_proposal)
  182.     {
  183.     Wizard::CreateDialog ();
  184.     Wizard::SetContentsButtons (title, contents, help_text,
  185.         Label::BackButton (), Label::AcceptButton ());
  186.     }
  187.     else
  188.     {
  189.     term buttons = `PushButton (`id(`next), `opt(`default), Label::OKButton());
  190.  
  191.     if (flavor == `boot_popup)
  192.     {
  193.         buttons = `HBox (
  194.                  // pushbutton to (rightaway) boot the system selected above
  195.                  `HWeight( 1, `PushButton(`id(`next), `opt(`default), _("&Boot")) ),
  196.                  `HSpacing( 1 ),
  197.                  `HWeight( 1, `PushButton(`id(`cancel), Label::CancelButton() ) )
  198.                  );
  199.     }
  200.  
  201.     term full = `HBox (
  202.                `VSpacing( 16 ),        // force dialog height
  203.                `VBox(
  204.                  `HSpacing( 30 ),    // force help text width
  205.                  `RichText( help_text )
  206.                  ),
  207.                `HSpacing( 3 ),
  208.                `VBox(
  209.                  `VSpacing( 1 ),
  210.                  contents,
  211.                  buttons
  212.                  ),
  213.                `HSpacing( 3 )
  214.                );
  215.  
  216.     UI::OpenDialog (full);
  217.     }
  218.  
  219.  
  220.     if (size (RootPart::selectedRootPartition) > 0)
  221.     UI::ChangeWidget (`id(`partition), `CurrentItem, RootPart::selectedRootPartition);
  222.  
  223.     UI::ChangeWidget(`id(`showall), `Value, RootPart::showAllPartitions);
  224.  
  225.  
  226.     any ret = nil;
  227.  
  228.     while (true)
  229.     {
  230.     if (flavor == `update_dialog || flavor == `update_dialog_proposal)
  231.         ret = Wizard::UserInput ();
  232.     else
  233.         ret = UI::UserInput ();
  234.  
  235.     if (ret == `abort && Popup::ConfirmAbort (`painless))
  236.         break;
  237.  
  238.     if (ret == `showall)
  239.     {
  240.         string tmp = (string) UI::QueryWidget (`id(`partition), `CurrentItem);
  241.         partition_list = make_partition_list ((boolean) UI::QueryWidget (`id(`showall), `Value));
  242.         UI::ChangeWidget (`id(`partition), `Items, partition_list);
  243.         if (tmp != nil)
  244.         UI::ChangeWidget (`id(`partition), `CurrentItem, tmp);
  245.         continue;
  246.     }
  247.     if ((flavor == `update_dialog || flavor == `update_popup
  248.         || flavor == `update_dialog_proposal)
  249.         && ret == `next)
  250.     {
  251.         string selected = (string) UI::QueryWidget (`id(`partition), `CurrentItem);
  252.         map freshman = RootPart::rootPartitions[selected]:$[];
  253.         boolean cont = true;
  254.         y2milestone ("Selected root partition: %1 %2",
  255.         selected, freshman);
  256.         if (freshman[`name]:"unknown" == "unknown")
  257.         {
  258.         cont = Popup::ContinueCancel (
  259. // continue-cancel popup
  260. _("No installed system that can be upgraded with this product was found
  261. on the selected partition."));
  262.         }
  263.         else if (freshman[`arch]:"" != RootPart::GetDistroArch ())
  264.         {
  265.         cont = Popup::ContinueCancel (
  266. // continue-cancel popup
  267. _("The architecture of the system installed in the selected partition
  268. is different than the one of this product."));
  269.  
  270.         }
  271.         if (! cont)
  272.         ret = nil;
  273.     }
  274.     if (ret == `next)
  275.     {
  276.         RootPart::selectedRootPartition = (string) UI::QueryWidget (`id(`partition), `CurrentItem);
  277.         RootPart::showAllPartitions = (boolean) UI::QueryWidget (`id(`showall), `Value);
  278.  
  279.         if (flavor == `update_dialog)
  280.         {
  281.         RootPart::targetOk = RootPart::mount_target ();
  282.  
  283.         if (!RootPart::targetOk)
  284.         {
  285.             // error report
  286.             Report::Error (_("Failed to mount target system"));
  287.             Update::Detach ();
  288.             RootPart::UnmountPartitions (false);
  289.             continue;
  290.         }
  291.         }
  292.         break;
  293.     }
  294.     if (ret == `cancel || ret == `back || ret == `next)
  295.         break;
  296.     }
  297.  
  298.     if (flavor != `update_dialog)
  299.     UI::CloseDialog ();
  300.  
  301.     return (symbol)ret;
  302. }
  303.  
  304. } // EOF
  305.