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

  1. /**
  2.  * File:    OSRDirect.ycp
  3.  * Module:    repair
  4.  * Summary:    Dialog and Execute of direct repair function.
  5.  *              Repair Tool Box
  6.  * Authors:    Johannes Buchhold <jbuch@suse.de>
  7.  *
  8.  * $Id: OSRDirect.ycp 23769 2005-06-21 12:18:10Z jsuchome $
  9.  *
  10.  */
  11.  
  12. {
  13.     module "OSRDirect";
  14.     textdomain "repair";
  15.  
  16.     import "HTML";
  17.     import "Stage";
  18.     import "Storage";
  19.  
  20.     import "OSRCommon";
  21.     import "OSRSystem";
  22.     import "OSRFstab";
  23.     import "OSRFsck";
  24.  
  25.     /**
  26.      * Max entries for button layout.
  27.      * If more the max_d.. than use RichText layout.
  28.      */
  29.     integer max_direct_push_buttons = 3;
  30.  
  31.     /**
  32.      * Contains the data and the keys of all direct repair mehtods. 
  33.      */
  34.     map direct_methods = $[];
  35.  
  36.     /**
  37.      * Mounted root partition.
  38.      */
  39.     global string mounted_root_partition = "";
  40.  
  41.     /**
  42.      * Reset the module settings.
  43.      * Don`t reset direct_methods.
  44.      */
  45.     global define void Reset()``{
  46.  
  47.     // The name of the current direct repair method.
  48.     OSRCommon::current_direct_name    = "";
  49.     mounted_root_partition        = "";
  50.  
  51.     // change the root environment for the scr to /
  52.     OSRSystem::SetOrgRoot();
  53.     }
  54.  
  55.     /**
  56.      * Add a new entry to the direct_methods map.
  57.      * Used in OSR module at the initial sequence.
  58.      * @param new_entries A list that describe the new direct repair entries.
  59.      */
  60.     global define void AddEntries(list new_entries, string client ) ``{
  61.  
  62.     foreach (map p, (list<map<string,any> >)new_entries, ``{
  63.         if (!( !Stage::initial () && p["initial_only"]:false ))
  64.         {
  65.         p["client"] = client;
  66.         direct_methods[p["name"]:""] =  p;
  67.         }
  68.     });
  69.     }
  70.  
  71.     /**
  72.      * Return a automatically generated menu for all
  73.      * direct repair methods.
  74.      */
  75.     global define term OptionMenu()``{
  76.  
  77.     list<term> menu_button_items = [];
  78.     term direct_items         = `VBox (
  79.         // header (options with buttons will follow)
  80.         `VSpacing(1), `Left(`Label(_("Repair Tools"))));
  81.  
  82.     // layout with buttons
  83.     if (size (direct_methods) <= max_direct_push_buttons)
  84.     {
  85.         foreach (string key, map<string,any> data, (map<string,map<string,any> >)direct_methods , ``{
  86.         direct_items = add (direct_items, `HBox (
  87.             `HSpacing(1),
  88.             `HWeight (40, `Left (`PushButton (`id(key),`opt(`hstretch),
  89.             data["button_text"]:"" ))
  90.             ),
  91.             `HSpacing(2),
  92.             `HWeight (60, `Left (`Label (data["description"]:""))),
  93.             `HSpacing(1)
  94.         ));
  95.         });
  96.         direct_items = `HSquash (direct_items );
  97.     }
  98.     // layout with a RichText field.
  99.     else
  100.     {
  101.         string text = "";
  102.         foreach (string key, map<string,any> data, (map<string,map<string,any> >)direct_methods , ``{
  103.  
  104.         string item = "";
  105.         if (UI::HasSpecialWidget(`DownloadProgress))
  106.         {
  107.             item = "<tr><th width=30 colspan=2> %1 </th><th></th></tr>"
  108.             +  "<tr> <td width=30>  </th> <td width=370>%2</th></tr>"
  109.             +  "<tr><td>  </th><td></th></tr>";
  110.         }
  111.         else
  112.         {
  113.             item = "<li>%1 </li> <li>%2 </li> <li> </li><br>";
  114.         }
  115.         data["description"] = mergestring (
  116.             splitstring (data["description"]:"", "\n"), " ");
  117.  
  118.         y2milestone("key %1", key);
  119.         text = text  + sformat (item, HTML::Link (
  120.             HTML::Bold (HTML::Colorize (data["button_text"]:"","blue")),
  121.             key),
  122.             data["description"]:"");
  123.  
  124.         menu_button_items = add (menu_button_items,
  125.             `item (`id(key), data["button_text"]:""));
  126.         });
  127.         if (UI::HasSpecialWidget(`DownloadProgress))
  128.         {
  129.         direct_items = add (direct_items,
  130.             `RichText(`id(`options),sformat("<table>%1</table>",text)));
  131.         }
  132.         else
  133.         {
  134.         direct_items = add (direct_items,`RichText(`id(`options),text));
  135.         }
  136.  
  137.         direct_items = add (direct_items,
  138.         // menubutton label
  139.         `MenuButton( _("Re&pair Tools..."), menu_button_items));
  140.  
  141.         direct_items = add (direct_items, `VSpacing(0.2));
  142.     }
  143.  
  144.     // return the build dialog
  145.     return direct_items;
  146.     }
  147.  
  148.  
  149.     /**
  150.      * Eval the selected direct repair method.
  151.      */
  152.     global define symbol EvalDirectMethod (string method )``{
  153.  
  154.     // reset settings
  155.     Reset();
  156.  
  157.     // set current direct repair method data
  158.     OSRCommon::current_direct_name    = method;
  159.     OSRCommon::current_module_name    = "";
  160.     map method_data            = direct_methods[method]:$[];
  161.     symbol ret            = `error;
  162.  
  163.     y2debug ("--------- method_data: %1", method_data);
  164.  
  165.     // eval current direct repair method
  166.     if (method_data != $[] && method_data != nil )
  167.     {
  168.         // prepare executing direct method
  169.         UI::OpenDialog (
  170.         // wait popup
  171.         `Label(_("Reading system settings...")));
  172.  
  173.         OSRFstab::Reset();
  174.         OSRFsck::LoadAllFsModules();
  175.         Storage::ReReadTargetMap();
  176.         OSRFstab::UmountAllFrom(OSRSystem::TargetRoot());
  177.         OSRSystem::SetOrgRoot();
  178.  
  179.         // mount target system if needed
  180.         list<map> mounted  = [];
  181.         if (method_data["initial_root"]:false )
  182.         {
  183.         // get list with root device name
  184.         mounted     = OSRFstab::RootDev( OSRSystem::TargetRoot() );
  185.         if (mounted == nil || mounted == [] )
  186.         {
  187.             y2error("Eval direct method: no valid target root system found.");
  188.             UI::CloseDialog();
  189.             return `error;
  190.         }
  191.         mounted_root_partition = mounted[0,"partition"]:"";
  192.         mounted = (list<map>) union ( mounted,
  193.             OSRFstab::MountAll( OSRSystem::TargetRoot()));
  194.         }
  195.  
  196.         UI::CloseDialog();
  197.         UI::BusyCursor();
  198.  
  199.         symbol () f = method_data["method"]:OSRCommon::SymbolError;
  200.         ret = f ();
  201.  
  202.         OSRSystem::SetOrgRoot();
  203.  
  204.         mounted = (list<map>) union ([
  205.         $[
  206.             "partition" : "usbfs",
  207.             "mountpoint" : OSRSystem::TargetRoot() + "/proc/bus/usb",
  208.             "status" : true  ],
  209.         $[
  210.             "partition" : "proc",
  211.             "mountpoint" : OSRSystem::TargetRoot() + "/proc",
  212.             "status" : true  ]
  213.         ], mounted );
  214.  
  215.         if (mounted != [] && mounted != nil )
  216.         {
  217.         OSRFstab::UmountAll (
  218.             filter(map p, mounted, ``( p["status"]:false == true )));
  219.         }
  220.     }
  221.  
  222.     // reset settings
  223.     Reset();
  224.     return ret;
  225.     }
  226. }//EOF
  227.