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 / partitioning / lvm_ui_lib.ycp < prev    next >
Text File  |  2006-11-29  |  15KB  |  511 lines

  1. /**
  2.  * File:
  3.  *   lvm_ui_lib.ycp
  4.  *
  5.  * Module: 
  6.  *    configuration of lvm: lib for the user interface
  7.  *
  8.  * Summary:
  9.  *
  10.  * Authors:
  11.  *   mike <mike@suse.de>
  12.  *
  13.  *
  14.  * $Id: lvm_ui_lib.ycp 26548 2005-12-15 16:37:09Z fehr $
  15.  *
  16.  */
  17.  
  18.  
  19. {
  20.  
  21. textdomain "storage";
  22.  
  23. #include "partitioning/signatures.ycp";
  24.  
  25. ////////////////////////////////////////////////////////////////////
  26. ////////////////////////////////////////////////////////////////////
  27. //                             Helptext  defines                  //
  28. ////////////////////////////////////////////////////////////////////
  29. ////////////////////////////////////////////////////////////////////
  30.  
  31.  
  32. //////////////////////////////////////////////////////////////////////
  33. // helptext for dialog createEditLogicaVolume
  34. //////////////////////////////////////////////////////////////////////
  35.  
  36. define string getCreateEditLogicaVolumeHelptext()
  37.     ``{
  38.     string help_text = "cstein";
  39.     return( help_text );
  40.     };
  41.  
  42. //////////////////////////////////////////////////////////////////////
  43. // helptext for logical volume
  44. //////////////////////////////////////////////////////////////////////
  45.  
  46. define string getLvHelptext()
  47.     ``{
  48.     string help_text = "";
  49.  
  50.     // helptext LVM partitioning. 
  51.     help_text =  _("<p>Here, create the logical 
  52. volumes used to store your data.</p>
  53. ");
  54.  
  55.     // helptext LVM partitioning. 
  56.     help_text = help_text + _("<p>
  57. Logical volumes are
  58. usable almost everywhere normal <b>disk partitions</b> can be used.
  59. You can create file systems on logical volumes and use them, for example, as swap 
  60. or as raw partitions for databases.</p>
  61. ");
  62.  
  63.     // helptext LVM partitioning. 
  64.    help_text = help_text + _("<p>
  65. If there is still unallocated
  66. physical storage in a volume group and you use <b>reiserfs</b> as your file system,
  67. extend a logical volume and the underlying file system while it
  68. is <b>mounted</b> and in <b>use</b>.</p>
  69. ");
  70.  
  71.     // helptext LVM partitioning. 
  72.     help_text = help_text + _("<p>
  73. The logical volumes need to be large enough
  74. to hold all the files to install now, but you do not necessarily need to
  75. allocate all your physical storage now. The file systems can be increased 
  76. later while your system is in use.
  77. </p>
  78. ");
  79.  
  80.     return( help_text );
  81.     };
  82.  
  83.  
  84.  
  85. //////////////////////////////////////////////////////////////////////
  86. // helptext for physical volume
  87. //////////////////////////////////////////////////////////////////////
  88.  
  89. define string getPvHelptext()
  90.     ``{
  91.     string help_text = "";
  92.  
  93.  // helptext LVM partitioning. 
  94.     help_text =  _("<p><b>Add partitions</b> (called physical volumes) to your volume group.</p>");
  95.  
  96.     // helptext LVM partitioning. 
  97.     help_text = help_text + _("<p>
  98. The volume group forms the <b>storage pool</b> from which your logical volumes,
  99. like virtual partitions, are allocated.</p>
  100. ");
  101.  
  102.     // helptext LVM partitioning. 
  103.     help_text = help_text + _("<p>
  104. Under normal circumstances, there is no need to have more than one volume 
  105. group. If you need more than one volume group for special reasons,
  106. create them here. Each volume group must have at least one partition 
  107. that belongs to that volume group.</p>
  108. ");
  109.  
  110.     // helptext LVM partitioning. 
  111.     help_text = help_text + _("<p>
  112. Each physical volume belongs <b>to exactly one</b> volume group. Assign all
  113. partitions to use with Linux LVM to volume groups.</p>
  114. ");
  115.  
  116.     // helptext LVM partitioning. 
  117.     help_text = help_text + _("<p>
  118. Additionally, it is possible to remove volume groups 
  119. when they do not contain any logical volumes.</p>
  120. ");
  121.  
  122.     return( help_text );
  123.     };
  124.     
  125.  
  126.  
  127. //////////////////////////////////////////////////////////////////////
  128. // helptext for lvm module in the installed system
  129. //////////////////////////////////////////////////////////////////////
  130.  
  131. define string getLvmHelptext()
  132.     ``{
  133.      string help_text = "";
  134.  
  135.      // helptext LVM partitioning. 
  136.      help_text =  _("<p>With this tool, manage or create logical volumes.
  137. </p>
  138. ");
  139.  
  140.      // helptext LVM partitioning. 
  141.      help_text = help_text + _("<ol><li>
  142. First, create a volume group, if you have not done this already.
  143. </li>
  144. ");
  145.  
  146.      // helptext LVM partitioning. 
  147.      help_text = help_text + _("<li>
  148. In the next step, add <b>physical volumes</b> (see paragraph below).
  149. </li>
  150. ");
  151.  
  152.      // helptext LVM partitioning. 
  153.      help_text = help_text + _("<li>
  154. In the last step, create <b>logical volumes</b> (see paragraph below).
  155. </li></ol><br>
  156. ");
  157.  
  158.      // helptext LVM partitioning. 
  159.      help_text = help_text + _("<p>
  160. <b>Physical Volumes:</b></p>");
  161.      help_text = help_text + getPvHelptext();
  162.      // helptext LVM partitioning. 
  163.      help_text = help_text + _("<p>
  164. <b>Logical Volumes:</b></p>");
  165.      help_text = help_text + getLvHelptext();
  166.  
  167.      return( help_text );
  168.      };
  169.  
  170.     
  171.  
  172. /////////////////////////////////////////////////////////////////////
  173. /////////////////////////////////////////////////////////////////////
  174. //                                  DIALOG  defines                //
  175. /////////////////////////////////////////////////////////////////////
  176. /////////////////////////////////////////////////////////////////////
  177.  
  178. //----------------------------------------------------
  179. // give bar widget if possible
  180.     
  181. define term get_bargraph_or_compatible( string avail_vg_size )
  182.     ``{
  183.     if( UI::HasSpecialWidget( `BarGraph ))
  184.     {
  185.     return( `HBox(
  186.         // label text
  187.         `Label(_("Available size:")),
  188.         `HSpacing(0.5),
  189.         `BarGraph( `id(`vg_size), `opt(`hstretch),
  190.                    [ 0, 10 ], [ "", ""])
  191.         // `Label( `opt( `outputField), avail_vg_size )
  192.         ));
  193.     }
  194.     else
  195.     {
  196.     return( `HBox(
  197.             // label text
  198.             `Bottom(`Left(`Label(_("Available Size:")))),
  199.             `Bottom(`Left(`Label( `id(`vg_size),
  200.                       `opt( `hstretch, `outputField), avail_vg_size ))),
  201.             `HWeight(1,`HStretch())
  202.             // `Label( `opt( `outputField), avail_vg_size )
  203.              ));
  204.     }
  205.     };
  206.         
  207. //----------------------------------------------------
  208. // give table for step 2: create volume group, add phys. volumes (pv)
  209.     
  210. define term get_pv_table_content( list table_list )
  211.     ``{
  212.     return( `VBox(
  213.         `Table(`id(`pv_table), `opt(`notify),
  214.                // header text
  215.                `header(_("  Device  "), `Right(_("  Size  ")), `Center(_("  Type  ")), `Center(_(" Volume Group "))),
  216.             table_list
  217.             ),
  218.             // button text
  219.                `HBox( `PushButton(`id(`pv_add), _("&Add Volume")),
  220.                   // button text
  221.                   `PushButton(`id(`pv_delete), _("&Remove Volume"))
  222.                  ),
  223.                `VSpacing(0.5)
  224.                )
  225.           );
  226.     };
  227.  
  228.        
  229. //----------------------------------------------------
  230. // give table for step 3: add/delete logical volumes (lv)
  231.    
  232. define term get_lv_table_content( list table_list, boolean view_all_mnts )
  233.     ``{
  234.     return( `VBox(
  235.           `Table(`id(`lv_table), `opt(`notify),
  236.              // table column headings
  237.              `header(`Left(_("Device  ")), `Center(_(" Mount   ")),
  238.                   // table column heading Vol.Grp = Volume Group
  239.                  `Center(_(" Vol. Grp.")),
  240.                  // table column headings
  241.                  `Right(_("Size")), `Center(_(" Type ")) ),
  242.              table_list
  243.              ),
  244.           `Left(`CheckBox( `id(`viewmnt),
  245.                    `opt(`notify),
  246.                    // button text
  247.                    _("&View all mount points, not just the current volume group"),
  248.                    view_all_mnts )),
  249.           `VSpacing(0.2),
  250.              // button text
  251.           `HBox( `PushButton(`id(`lv_add),   _("A&dd")),
  252.              // button text
  253.              `PushButton(`id(`lv_edit),  _("&Edit")),
  254.              // button text
  255.              `PushButton(`id(`lv_delete), _("&Remove"))
  256.              ),
  257.           `VSpacing(0.5)
  258.           )
  259.       );
  260.     };
  261.  
  262.  
  263.     
  264. //////////////////////////////////////////////////////////////////////
  265. // give main page for configuration - X11 version 
  266. //////////////////////////////////////////////////////////////////////
  267.  
  268. define term get_config_content( list pv_table_list, list lv_table_list,
  269.                     list vg_list, string phys_vg_size,
  270.                     string avail_vg_size, boolean view_all_mnts )
  271.     ``{
  272.     return(  `HBox( `HSpacing(0.5),
  273.             `VBox(
  274.               `VSquash(`HBox( 
  275.                      `Left(`ReplacePoint( `id(`rvg ),
  276.                                   `ComboBox(`id(`vg),
  277.                                     `opt(`notify),
  278.                                     // label text
  279.                                     _("V&olume Group Name"),
  280.                                     vg_list ))),
  281.                      `HSpacing(2),
  282.                      // button text
  283.                      `Left(`Bottom(`PushButton( `id(`vg_add_vg), _("A&dd group")))),
  284.                      `HSpacing(0.5),
  285.                      // button text
  286.                      `Left(`Bottom(`PushButton( `id(`vg_remove_vg), _("Remove &group")))),
  287.                      `HWeight(1,`HStretch())
  288.                      )),
  289.               `VSpacing(1),
  290.               // label text
  291.               `Frame(_("Edit the current volume group:"),
  292.                  `HBox( 
  293.                     `HWeight( 50,
  294.                        `VBox(
  295.                          `VSpacing(0.7),
  296.                           // label text
  297.                          `Heading(_("Physical volumes")),
  298.                          `VSpacing(0.7),
  299.                          `HBox(
  300.                            // label text
  301.                            `Label(_("Physical volume size:")),
  302.                            `Label( `id(`pv_size), `opt(`outputField), phys_vg_size )
  303.                            ),
  304.                          `VSpacing(0.5),
  305.                          get_pv_table_content( pv_table_list )
  306.                          )),
  307.                     `HWeight( 50,
  308.                        `VBox(
  309.                          `VSpacing(0.5),
  310.                          // label text
  311.                          `Heading(_("Logical volumes")),
  312.                          `VSpacing(0.5),
  313.                          get_bargraph_or_compatible( avail_vg_size ),
  314.                          `VSpacing(0.2),
  315.                          get_lv_table_content( lv_table_list, view_all_mnts )
  316.                          ))
  317.                        )
  318.                   )
  319.               ),
  320.             `HSpacing(0.5)
  321.             )
  322.           );
  323.     };
  324.  
  325.  
  326.     
  327.     //////////////////////////////////////////////////////////////////////
  328.     // give main page for step 2: create volume group, add phys. volumes (pv)
  329.     //////////////////////////////////////////////////////////////////////
  330.  
  331. define term get_pv_content( list table_list, list vg_list, string vg_size_str )
  332.     ``{
  333.     // button text
  334.     string lvm_mp_button = _("LVM Multipath detection");
  335.     return(  `HBox(`HSpacing(2.5),
  336.            `VBox(
  337.                `VSpacing(0.1),
  338.                `VWeight(11, `HBox( 
  339.                `Left(`ReplacePoint(`id(`rvg), `ComboBox(`id(`vg),
  340.                                `opt(`notify), 
  341.                            // button text
  342.                            _("Volume &Group:"), vg_list ))),
  343.                `HSpacing(0.5),
  344.                // label text
  345.                `Left(`Label(_("Size:"))),
  346.                `Left(`Label( `id(`pv_size), 
  347.                              `opt( `hstretch, `outputField), 
  348.                      vg_size_str )),
  349.                `HWeight(1,`HStretch()),
  350.                `VCenter(`Right(`VBox(
  351.                    `Top(`PushButton( `id(`vg_remove_vg), 
  352.                                      `opt(`hstretch), 
  353.                          // button text
  354.                          _("Remove &group"))),
  355.                    `Bottom(`PushButton( `id(`vg_add_vg), 
  356.                                         `opt(`hstretch), 
  357.                             // button text
  358.                             _("A&dd group"))))))
  359.                 )),
  360.                `VSpacing(0.2),
  361.                `VWeight(50, get_pv_table_content( table_list ))
  362.             ),
  363.             `HSpacing(2)
  364.           )
  365.       );
  366.     };
  367.  
  368.                                
  369.     
  370.     //////////////////////////////////////////////////////////////////////
  371.     // give main page for step 3: add/delete logical volumes (lv)
  372.     //////////////////////////////////////////////////////////////////////
  373.     
  374. define term get_lv_content( list table_list, list vg_list, string avail_size,
  375.                             boolean view_all_mnts )
  376.     ``{
  377.     if ( UI::HasSpecialWidget( `BarGraph ))
  378.     {
  379.     return( `HBox(`HSpacing(2.5),
  380.               `VBox(`VSpacing(0.5),
  381.                 `VSquash(`HBox(
  382.                        `ReplacePoint( `id(`rvg ),
  383.                               `ComboBox(`id(`vg),
  384.                                     `opt(`notify),
  385.                                     // Label of Combobox    
  386.                                    _("V&olume Group Name"),
  387.                                    vg_list )),
  388.  
  389.                        `HSpacing(0.5),
  390.                        `BarGraph( `id(`vg_size), `opt(`hstretch),
  391.                               [ 0, 10 ], [ "", ""])
  392.                        )),
  393.                 `VSpacing(0.5),
  394.                 get_lv_table_content( table_list, view_all_mnts )
  395.                 ),
  396.               `HSpacing(2)
  397.              )
  398.           );
  399.     }
  400.     else
  401.     {
  402.     return( `HBox(`HSpacing(2.5),
  403.               `VBox(`VSpacing(0.5),
  404.                 `VSquash(`HBox(
  405.                        `Left(`ReplacePoint( `id(`rvg ),
  406.                               `ComboBox(`id(`vg),
  407.                                     `opt(`notify),
  408.                                     // Label of Combobox    
  409.                                    _("V&olume Group Name"),
  410.                                    vg_list ))),
  411.  
  412.                        `HSpacing(0.5),
  413.                         // label text
  414.                        `Bottom(`Left(`Label(_("Available Size:")))),
  415.                        `Bottom(`Left(`Label( `id(`vg_size),
  416.                                  `opt( `hstretch, `outputField), avail_size ))),
  417.                        `HWeight(1,`HStretch())
  418.                        
  419.                        )),
  420.                 `VSpacing(0.5),
  421.                 get_lv_table_content( table_list, view_all_mnts )
  422.                 ),
  423.               `HSpacing(2)
  424.               )
  425.           );
  426.     }
  427.     };
  428.  
  429.  
  430.             
  431. /////////////////////////////////////////////////////////////////////
  432. /////////////////////////////////////////////////////////////////////
  433. //                                     Help defines                //
  434. /////////////////////////////////////////////////////////////////////
  435. /////////////////////////////////////////////////////////////////////
  436.  
  437.     
  438.     
  439.     
  440. //////////////////////////////////////////////////////////////////////
  441. // checks if pesize is valid   8K to 521M in power of 2
  442. //
  443. // 8 is 8k
  444. // 16K == 16k == 16KB == 16kb
  445.  
  446. // --------------------------------------------------------------------
  447. // Check if the string is a number 
  448. // Returns true or false
  449. // ---------------------------------------------------------------------
  450. //
  451.  
  452. define boolean icheck_pesize( string input )
  453.     ``{
  454.     return( pesize_str_to_byte( input ) > 0 );
  455.     };
  456.  
  457.  
  458. //////////////////////////////////////////////////////////////////////
  459. // checks if vgname is a valid device name : todo: do it better 
  460.  
  461. define boolean icheck_devname( string name )
  462.     ``{
  463.     if ( size( name ) == 0 ) return( false );
  464.    
  465.     return( ( findfirstof( name, " ;/`'┤!,\"%#" ) == nil ) );
  466.     }
  467.  
  468.  
  469. //////////////////////////////////////////////////////////////////////
  470. // checks if vgname is a valid device name : todo: do it better
  471. define boolean icheck_volume_name( string vgname )
  472.     ``{
  473.     return( icheck_devname( vgname ));
  474.     }
  475.  
  476. //////////////////////////////////////////////////////////////////////
  477. // checks if vgname is a valid device name : equivalent to validate_name
  478. // in lvm2 source
  479.     
  480. define boolean icheck_vgname( string vgname )
  481.     ``{
  482.  
  483.     if (size (vgname) == 0 || size (vgname) > 128)
  484.     return false;
  485.  
  486.     if (substring (vgname, 0, 1) == "-")
  487.     return false;
  488.  
  489.     string allowed_chars = "0123456789" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
  490.     "abcdefghijklmnopqrstuvwxyz" + "._-+";
  491.  
  492.     if (findfirstnotof (vgname, allowed_chars) != nil)
  493.     return false;
  494.  
  495.     return true;
  496.     }
  497.  
  498.  
  499. //////////////////////////////////////////////////////////////////////
  500. // show a new list of volume groups
  501. //////////////////////////////////////////////////////////////////////
  502.  
  503. define void new_vg_list( list vg_list )
  504.     ``{
  505.     UI::ReplaceWidget(`id(`rvg), `ComboBox(`id(`vg), `opt(`notify),
  506.               // label text
  507.               _("V&olume Group"), vg_list ) );
  508.     };
  509.  
  510. }
  511.