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 / clients / files_auto.ycp < prev    next >
Text File  |  2006-11-29  |  8KB  |  358 lines

  1. /**
  2.  * File:    clients/autoinst_files.ycp
  3.  * Package:    Configuration of XXpkgXX
  4.  * Summary:    Client for autoinstallation
  5.  * Authors:    Anas Nashif <nashif@suse.de>
  6.  *
  7.  * $Id: files_auto.ycp 21874 2005-02-23 14:45:45Z nashif $
  8.  *
  9.  * This is a client for autoinstallation. It takes its arguments,
  10.  * goes through the configuration and return the setting.
  11.  * Does not do any changes to the configuration.
  12.  */
  13.  
  14. /**
  15.  * @param function to execute
  16.  * @param list of file settings
  17.  * @return map edited settings, Summary or boolean on success depending on called function
  18.  * @example map mm = $[ "FAIL_DELAY" : "77" ];
  19.  * @example map ret = WFM::CallFunction ("autoinst_files", [ "Summary", mm ]);
  20.  */
  21.  
  22. {
  23.  
  24. textdomain "autoinst";
  25.  
  26. y2milestone("----------------------------------------");
  27. y2milestone("Files auto started");
  28.  
  29. import "AutoinstFile";
  30. import "Wizard";
  31. import "Popup";
  32. import "Label";
  33.  
  34.  
  35. /**
  36.  * Add or edit a file
  37.  */
  38. define void AddEditFile(string fileName, string source, string permissions, string owner)
  39.     ``{
  40.  
  41.         list newFiles = [];
  42.         boolean modified = false;
  43.         AutoinstFile::Files   = maplist (map file , AutoinstFile::Files, ``{
  44.                 // Edit
  45.                 if (file["file_path"]:"" == fileName)
  46.                 {
  47.                 map oldFile = $[];
  48.                 oldFile=add(oldFile,"file_path", fileName);
  49.                 oldFile=add(oldFile,"file_contents", source);
  50.                 oldFile=add(oldFile,"file_permissions", permissions);
  51.                 oldFile=add(oldFile,"file_owner", owner);
  52.                 modified = true;
  53.                 return oldFile;
  54.                 }
  55.                 else {
  56.                 return file;
  57.                 }
  58.                 });
  59.  
  60.         if (!modified)
  61.         {
  62.             map file = $[];
  63.             file=add(file,"file_path", fileName);
  64.             file=add(file,"file_contents", source);
  65.             file=add(file,"file_permissions", permissions);
  66.             file=add(file,"file_owner", owner);
  67.             AutoinstFile::Files = add (  AutoinstFile::Files, file);
  68.         }
  69.         return;
  70.     }
  71.  
  72.  
  73.  
  74. /**
  75.  * delete a file from a list
  76.  * @param file name
  77.  * @return modified list of files
  78.  */
  79. define list<map>  deleteFile(string fileName)
  80.     ``{
  81.         list<map> new =  filter(map s , AutoinstFile::Files, ``(s["file_path"]:"" != fileName));
  82.         return  (new);
  83.     }
  84.  
  85.  
  86. /**
  87.  * Dialog for adding a file
  88.  *
  89.  */
  90. define symbol addFileDialog( symbol mode , string name)
  91.     ``{
  92.         map file = $[];
  93.         if (mode == `edit)
  94.         {
  95.             list filtered_files = filter(map s, AutoinstFile::Files,``((s["file_path"]:""  == name)));
  96.             if (size(filtered_files)>0)
  97.             {
  98.                 file = filtered_files[0]:$[];
  99.             }
  100.         }
  101.  
  102.         // help 1/2
  103.         string help =  _("<p>Using this dialog, copy the contents of the file and specify the final
  104. path on the installed system. YaST2 will copy this file to the specified location.</p>");
  105.  
  106.         // help 2/2
  107.         help = help + _("<p>To protect copied files, set the owner and the permissions of the files.
  108. Set the owner using the syntax <i>userid:groupid</i>.  Permissions can be a symbolic
  109. representation of changes to make or an octal  number  representing  the bit pattern for the
  110. new permissions.</p>"); 
  111.  
  112.         string title = _("Configuration File Editor");
  113.  
  114.         term contents=
  115.             `VBox(
  116.                     `HBox(
  117.                         `TextEntry(`id(`filename), _("&File Path"), file["file_path"]:""),
  118.                         `HStretch(),
  119.                         `Empty()
  120.                         ),
  121.                     `HBox(
  122.                         `TextEntry(`id(`owner), _("&Owner"), file["file_owner"]:""),
  123.                         `HStretch(),
  124.                         `TextEntry(`id(`perm), _("&Permissions"), file["file_permissions"]:"")
  125.                         ),
  126.                     `VSpacing(1),
  127.                     `HBox(
  128.                         `MultiLineEdit(`id(`source), _("File So&urce"), file["file_contents"]:"")
  129.                         ),
  130.                     `VSpacing(1),
  131.                     `HBox(
  132.                         `PushButton(`id(`loadsource), _("&Load new contents"))
  133.                         )
  134.                  );
  135.  
  136.  
  137.         Wizard::SetContents(title,
  138.                 contents, help, true, true);
  139.  
  140.         Wizard::SetNextButton(`next, Label::SaveButton() );
  141.         if (mode == `edit)
  142.         {
  143.             UI::ChangeWidget(`id(`filename), `Enabled, false);
  144.         }
  145.  
  146.         any ret = nil;
  147.         repeat {
  148.             ret = (symbol) UI::UserInput();
  149.             if (ret == `next)
  150.             {
  151.                 string fileName = (string)UI::QueryWidget(`id(`filename), `Value);
  152.                 string permissions = (string)UI::QueryWidget(`id(`perm), `Value);
  153.                 string owner = (string)UI::QueryWidget(`id(`owner), `Value);
  154.                 string source = (string)UI::QueryWidget(`id(`source), `Value);
  155.  
  156.                 if ( source == "" || fileName == "")
  157.                 {
  158.                     Popup::Message(_("Provide at least the file
  159. name and the contents of the file.
  160. "));
  161.                     ret = `again;
  162.                     continue;
  163.                 }
  164.                 else
  165.                 {
  166.                     AddEditFile( fileName,source, permissions, owner);
  167.                 }
  168.             }
  169.             else if (ret == `loadsource)
  170.             {
  171.                 string filename = UI::AskForExistingFile( "", "*", _("Select a file to load.") );
  172.                 if (filename != "")
  173.                 {
  174.                     string source = (string) SCR::Read(.target.string, filename);
  175.                     UI::ChangeWidget(`id(`source), `Value, source);
  176.                     continue;
  177.                 }
  178.             }
  179.  
  180.         } until (ret == `next || ret == `back );
  181.         Wizard::SetNextButton(`next, Label::FinishButton() );
  182.         return (symbol) ret;
  183.     }
  184.  
  185.  
  186.  
  187.  
  188. /**
  189.  * Summary of configuration
  190.  */
  191. define term dialog_contents() ``{
  192.  
  193.     list allfiles = maplist(map s, AutoinstFile::Files,
  194.             ``{
  195.             return (`item(`id(s["file_path"]:"Unknown"),  s["file_path"]:"Unknown" , s["file_owner"]:"", s["file_permissions"]:""));
  196.             });
  197.     term contents =
  198.         `VBox(
  199.                 `Left(
  200.                     `Label(_("Available Files"))
  201.                     ),
  202.                 `Table( `id(`table), `opt(`notify),
  203.                     `header(_("File Path"), _("Owner"), _("Permissions")),
  204.                     allfiles
  205.  
  206.                     ),
  207.                 `HBox(
  208.                     `PushButton(`id(`new),  Label::NewButton()),
  209.                     `PushButton(`id(`edit), Label::EditButton()),
  210.                     `PushButton(`id(`delete), Label::DeleteButton())
  211.                     )
  212.              );
  213.     return contents;
  214. }
  215.  
  216.  
  217. define symbol CustomFileDialog ()``{
  218.  
  219.     string title = _("Add Complete Configuration Files");
  220.  
  221.     string help = _("<p>For many applications and services, you might have prepared
  222. a configuration file that should be copied in a complete form to a location in the
  223. installed system. For example, this is the case if you are installing a web server
  224. and have an httpd.conf configuration file prepared.</p>");
  225.  
  226.     Wizard::SetContents(title,
  227.             dialog_contents(), help, true, true);
  228.  
  229.     Wizard::SetNextButton(`next, Label::FinishButton() );
  230.     Wizard::HideAbortButton();
  231.     string select_msg = _("Select a file from the table first.");
  232.     any ret = nil;
  233.     repeat {
  234.         ret = (symbol) UI::UserInput();
  235.  
  236.         if (ret == `new)
  237.         {
  238.             addFileDialog((symbol)ret , "" );
  239.         }
  240.         else if (ret == `edit)
  241.         {
  242.             string name = (string)UI::QueryWidget(`id(`table), `CurrentItem);
  243.             if (name != nil)
  244.             {
  245.                 addFileDialog((symbol)ret , name  );
  246.             }
  247.             else
  248.             {
  249.                 Popup::Message(select_msg);
  250.                 continue;
  251.             }
  252.  
  253.         }
  254.         else if (ret == `delete)
  255.         {
  256.             string name = (string)UI::QueryWidget(`id(`table), `CurrentItem);
  257.             if (name != nil)
  258.             {
  259.                 AutoinstFile::Files = deleteFile(name);
  260.             }
  261.             else
  262.             {
  263.                 Popup::Message(select_msg);
  264.                 continue;
  265.             }
  266.         }
  267.         Wizard::SetContents(title,
  268.                 dialog_contents(), help, true, true);
  269.  
  270.  
  271.     } until (ret == `back || ret == `next );
  272.  
  273.     return (symbol) ret;
  274. }
  275.  
  276.  
  277. any ret = nil;
  278. string func = "";
  279. list param = [];
  280.  
  281. /* Check arguments */
  282. if(size(WFM::Args()) > 0 && is(WFM::Args(0), string))
  283. {
  284.     func = (string) WFM::Args(0);
  285.     if(size(WFM::Args()) > 1 && is(WFM::Args(1), list))
  286.     param = (list) WFM::Args(1);
  287. }
  288.  
  289.  
  290. y2debug("func=%1", func);
  291. y2debug("param=%1", param);
  292.  
  293.  
  294.  
  295. /* Import Data*/
  296. if(func == "Import") {
  297.     ret = AutoinstFile::Import((list<map>)param);
  298.     if (ret == nil)
  299.     {
  300.         y2error ("Parameter to 'Import' is probably wrong, should be list of maps");
  301.         ret = false;
  302.     }
  303. }
  304. /* Create a  summary*/
  305. else if(func == "Summary") {
  306.     ret = AutoinstFile::Summary();
  307.     if (ret == nil)
  308.     {
  309.         y2error ("Parameter to 'Import' is probably wrong, should be list of maps");
  310.         ret = false;
  311.     }
  312. }
  313. /* Reset configuration */
  314. else if (func == "Reset") {
  315.     AutoinstFile::Import([]);
  316.     ret = [];
  317. }
  318. /* Change configuration (run AutoSequence) */
  319. else if (func == "Change") {
  320.     Wizard::CreateDialog();
  321.     Wizard::SetDesktopIcon("autoyast2");
  322.     ret = CustomFileDialog();
  323.     Wizard::CloseDialog();
  324. }
  325. else if (func == "Packages") {
  326.     ret = $[];
  327. }
  328. /* Return actual state */
  329. else if (func == "Export") {
  330.     ret = AutoinstFile::Export();
  331. }
  332. /* Write givven settings */
  333. else if (func == "Write") {
  334.     ret = AutoinstFile::Write();
  335. }
  336. else if (func == "GetModified")
  337. {
  338.     ret = AutoinstFile::GetModified();
  339. }
  340. else if (func == "SetModified")
  341. {
  342.     AutoinstFile::SetModified();
  343. }
  344. /* Unknown function */
  345. else {
  346.     y2error("Unknown function: %1", func);
  347.     ret = false;
  348. }
  349.  
  350. y2debug("ret=%1", ret);
  351. y2milestone("Files auto finished");
  352. y2milestone("----------------------------------------");
  353.  
  354. return ret;
  355.  
  356. /* EOF */
  357. }
  358.