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 / loop.ycp < prev    next >
Text File  |  2006-11-29  |  9KB  |  334 lines

  1. /**
  2.  * File:
  3.  *   loop.ycp
  4.  *
  5.  * Module:
  6.  *   Configuration loop file setup
  7.  *
  8.  * Summary:
  9.  *   Functions for configuration of loop file setup
  10.  *
  11.  * Authors:
  12.  *   Thomas Fehr <fehr@suse.de>
  13.  *
  14.  * $Id: loop.ycp 32189 2006-08-07 11:21:35Z fehr $
  15.  *
  16.  */
  17.  
  18. {
  19.  
  20.   textdomain "storage";
  21.  
  22.   import "Wizard";
  23.   import "Storage";
  24.   import "FileSystems";
  25.   import "Partitions";
  26.   import "Label";
  27.   
  28.   include "partitioning/partition_defines.ycp";
  29.   include "partitioning/custom_part_dialogs.ycp";
  30.   include "partitioning/custom_part_lib.ycp";
  31.  
  32. /**
  33.  * LoopDlgHelp
  34.  * @return string
  35.  */
  36. define string LoopDlgHelp( string pb, string cb, string sb )
  37.     ``{
  38.     // help text richtext format
  39.     // %1 is replaced by description text for file pathname
  40.     string helptext = sformat( _("
  41. <p><b>%1:</b><br>This must be an absolute path to the file
  42. containing the data for the encrypted loop device to set up.</p>
  43. "), pb );
  44.  
  45.     // help text richtext format, continued
  46.     // %1 is replaced by description text for create button
  47.     helptext = helptext + sformat( _("
  48. <p><b>%1:</b><br>If this is checked, the file will be 
  49. created with the size given in the next field. <b>NOTE:</b> If the 
  50. file already exists, all data in it is lost.</p>
  51. "), cb );
  52.  
  53.     // help text richtext format, continued
  54.     // %1 is replaced by description text for file size
  55.     helptext = helptext + sformat( _("
  56. <p><b>%1:</b><br>This is the size of the loop file.
  57. The file system to create in the encrypted loop device will have 
  58. this size.</p>
  59. "), sb );
  60.  
  61.     // help text richtext format, continued
  62.     helptext = helptext + _("
  63. <p><b>NOTE:</b>During installation, there cannot be any consistency
  64. checks about file size and path names because the file system is not 
  65. accessible. It will be created at the end of installation. Be 
  66. careful about the size and path name you provide.</p>
  67. ");
  68.  
  69.     return helptext;
  70.     };
  71.  
  72.  
  73. /**
  74.  *  LoopExpertDlg dialog
  75.  *  edit loop options
  76.  */
  77. define map<string,any> LoopExpertDlg( boolean edit, map<string,any> part, map<symbol,map> file_systems )
  78.     ``{
  79.     string caption = "";
  80.     if( edit )
  81.     {
  82.     // heading text
  83.     caption = sformat( _("Edit Loop Device Setup of %1"), 
  84.                        part["fpath"]:"" );
  85.     }
  86.     else
  87.     {
  88.     // heading text
  89.     caption = _("Create New Loop Device Setup");
  90.     }
  91.  
  92.     // label text
  93.     string pb = _("P&ath Name of File");
  94.     // label text
  95.     string cb = _("C&reate Loop File");
  96.     // label text
  97.     string sb = _("Si&ze of Loop File");
  98.  
  99.     term contents = `VBox( `HSpacing( 60 ),
  100.                            `HBox( `HSpacing(2), 
  101.                       LoopOptionsDlg(pb,cb,sb), 
  102.                   `HSpacing(20)
  103.                 ),
  104.                `VSpacing(1),
  105.                `HBox( FormatDlg( part, file_systems ),
  106.                       `HSpacing(2),
  107.                   `Top(`ReplacePoint( `id(`mount_dlg_rp), 
  108.                               MountDlg( part, [] )))
  109.                 )
  110.              );
  111.  
  112.     contents = `VBox(
  113.              `Heading(caption),
  114.              `VSpacing(1),
  115.              `VStretch(),
  116.              contents,
  117.              `VSpacing(1),
  118.              `VStretch(),
  119.              `HBox(
  120.                `PushButton(`id(`ok), `opt(`default), 
  121.                        Label::OKButton()  ),
  122.                `PushButton(`id(`cancel), Label::CancelButton() )
  123.             ));
  124.  
  125.  
  126.  
  127.     /////////////////////////////////////////////////////////////
  128.     // Open main dialog for Raid
  129.     /////////////////////////////////////////////////////////////
  130.     string ht = LoopDlgHelp( deletechars(pb,"&"),
  131.                              deletechars(cb,"&"),
  132.                              deletechars(sb,"&"));
  133.     UI::OpenDialog( `opt(`decorated ),
  134.             `HBox( `HWeight(30,`RichText(ht)),
  135.                `HStretch(),
  136.                `HSpacing(1),
  137.                `HWeight(70, contents ),
  138.                `HSpacing(1),
  139.                `HStretch()
  140.              ));
  141.  
  142.     ////////////////////////////////////////////////////////////////
  143.     // configure main dialog for the first call
  144.     string lsize = ByteToHumanStringWithZero(part["size_k"]:0*1024);
  145.  
  146.     UI::ChangeWidget( `id(`loop_path), `Value, part["fpath"]:"" );
  147.     UI::ChangeWidget( `id(`loop_path), `ValidChars, 
  148.                       FileSystems::nchars + "-._:/" );
  149.     UI::ChangeWidget( `id(`loop_create), `Value, part["create_file"]:false );
  150.     UI::ChangeWidget( `id(`loop_size), `Value, lsize );
  151.     UI::ChangeWidget( `id(`loop_size), `Enabled, part["create_file"]:false );
  152.     UI::ChangeWidget( `id(`crypt_fs), `Enabled, true );
  153.  
  154.     map<string,any> retval = eval(part);
  155.     symbol ret = `ok;
  156.  
  157.     retval = HandlePartWidgetChanges( true, ret, file_systems, part, retval );
  158.  
  159.     repeat
  160.     {
  161.     ret = (symbol)UI::UserInput();
  162.     y2milestone( "LoopExpertDlg %1", ret);
  163.  
  164.     ////////////////////////////////////////////////////////////
  165.     if( ret != `cancel )
  166.         {
  167.         retval = HandlePartWidgetChanges( false, ret, file_systems, part, 
  168.                                           retval );
  169.         }
  170.  
  171.     if( ret == `loop_create )
  172.         {
  173.         retval["create_file"] = UI::QueryWidget( `id(`loop_create), `Value );
  174.         UI::ChangeWidget( `id(`loop_size), `Enabled, 
  175.                   retval["create_file"]:false );
  176.         if( retval["create_file"]:false )
  177.         {
  178.         retval["format"] = true;
  179.         UI::ChangeWidget( `id(`format), `Value, true );
  180.         }
  181.         }
  182.  
  183.     if( ret == `ok )
  184.         {
  185.         retval["fpath"] = UI::QueryWidget(`id(`loop_path), `Value);
  186.         retval["create_file"] = UI::QueryWidget(`id(`loop_create), `Value);
  187.  
  188.         lsize = (string)UI::QueryWidget(`id(`loop_size), `Value);
  189.         integer nsize = kmgt_str_to_byte( lsize );
  190.         retval["size_k"] = nsize/1024;
  191.         y2milestone( "LoopExpertDlg size:%1 num:%2", lsize, nsize );
  192.         y2milestone( "LoopExpertDlg retval:%1", retval );
  193.         if( !check_max_size( nsize, 0 ) )
  194.         {
  195.         ret = `again;
  196.         continue;
  197.         }
  198.         if( size(retval["fpath"]:"")==0 || 
  199.             substring( retval["fpath"]:" ", 0, 1)!="/" )
  200.         {
  201.         // popup text
  202.         Popup::Error( sformat(_("The file name \"%1\" is invalid.
  203. Use an absolute path name.
  204. "), retval["fpath"]:" " ));
  205.         ret = `again;
  206.         continue;
  207.         }
  208.         if( !retval["create_file"]:false )
  209.         {
  210.         integer s = 0;
  211.         s = (integer)SCR::Read( .target.size, retval["fpath"]:"" );
  212.         y2milestone( "loop file size:%1", s );
  213.  
  214.         if( Mode::normal () )
  215.             {
  216.             if( s<0 )
  217.             {
  218.             // popup text
  219.             Popup::Error( sformat(_("The file name \"%1\" does not exist
  220. and the flag for create is off. Either use an existing file or activate
  221. the create flag."), retval["fpath"]:" " ));
  222.             ret = `again;
  223.             continue;
  224.             }
  225.             else
  226.             retval["size_k"] = s/1024;
  227.             }
  228.         }
  229.             
  230.  
  231.         if( !retval["format"]:false && retval["create_file"]:false )
  232.         {
  233.         // popup text
  234.         Popup::Error( _("You chose to create the crypt file, but did not specify 
  235. that it should be formatted. This does not make sense. 
  236.  
  237. Also check the format option.
  238. "));
  239.         ret = `again;
  240.         continue;
  241.         }
  242.  
  243.         map ret_mp = CheckOkMount( part["device"]:"", part, retval );
  244.         retval = ret_mp["map"]:$[];
  245.         y2milestone( "LoopExpertDlg ret_mp %1 part %2", ret_mp, part );
  246.         if( !ret_mp["ok"]:false )
  247.            {
  248.             if( ret_mp["field"]:`none != `none )
  249.             UI::SetFocus(`id( ret_mp["field"]:`none ));
  250.         ret = `again;
  251.         continue;
  252.            }
  253.  
  254.         if( size(retval["mount"]:"")==0 )
  255.         {
  256.         // popup text
  257.         Popup::Error( _("Provide a mount point."));
  258.         ret = `again;
  259.         continue;
  260.         }
  261.  
  262.         ret_mp = CheckDeviceFinalOk( retval );
  263.         if( !ret_mp["ok"]:false )
  264.         {
  265.         ret = `again;
  266.         }
  267.         else
  268.         {
  269.         retval = ret_mp["map"]:$[];
  270.         }
  271.         }
  272.         } until( ret == `ok || ret == `cancel || ret == `next ||
  273.          ret == `back || ret == `abort );
  274.  
  275.     retval["symbol"] = ret;
  276.     y2milestone( "LoopExpertDlg ret:%1 retval=%2", ret, retval );
  277.     UI::CloseDialog();
  278.     return retval;
  279.     }
  280.  
  281.  
  282. /**
  283.  * LoopSetup dialog
  284.  *
  285.  * Provide dialog for settings of loop device related parameters
  286.  */
  287. define symbol LoopSetup( boolean edit )
  288.     ``{
  289.     string id = Storage::GetWizardKey();
  290.     string key = "/dev/loop";
  291.     y2milestone( "LoopSetup edit %1 id %2", edit, id );
  292.     map<string,any> part = $[];
  293.     map<string,map> tg = Storage::GetTargetMap();
  294.     if( edit )
  295.     {
  296.     part = Storage::GetPartition( tg, id );
  297.     }
  298.     else
  299.     {
  300.     part["device"] = Storage::GetLoopDevice();
  301.     part["type"] = `loop;
  302.     part["format"] = true;
  303.     part["enc_type"] = `twofish;
  304.     part["size_k"] = 50*1024;
  305.     part["used_fs"] = `ext3;
  306.     }
  307.     y2milestone( "LoopSetup part %1", part );
  308.  
  309.     part = LoopExpertDlg( edit, part, (map <symbol, map>)
  310.                           filter( any k, map e, 
  311.                       FileSystems::GetAllFileSystems(false, false),
  312.                   ``(e[`crypt]:false)));
  313.  
  314.     symbol ret = part["symbol"]:`next;
  315.     // remove symbol key from data
  316.     part = filter( string key, any value, part, ``( key != "symbol" ));
  317.  
  318.     if( ret == `ok )
  319.     {
  320.     Storage::UpdateLoop( part["device"]:"", part["fpath"]:"", 
  321.                  part["create_file"]:false,
  322.                  part["size_k"]:0 );
  323.     Storage::ChangeVolumeProperties( part );
  324.     }
  325.     else if( !edit )
  326.     {
  327.     Storage::DeleteDevice( "/dev/loop", part["device"]:"" );
  328.     }
  329.     y2milestone( "LoopSetup  ret = %1", ret );
  330.     return  ret;
  331.     }
  332.  
  333. }
  334.