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

  1. /*
  2.  * view_anymsg.ycp
  3.  *
  4.  * small script for easy /var/log/* and /proc/* viewing
  5.  *
  6.  * Author: Klaus Kaempf <kkaempf@suse.de>
  7.  *
  8.  * $Id: view_anymsg.ycp 25377 2005-09-06 07:56:23Z jsuchome $
  9.  *
  10.  * Reads a \n separated list of filenames from
  11.  * /var/lib/YaST2/filenames
  12.  * Lines starting with "#" are ignored (comments)
  13.  * A line starting with "*" is taken as the default filename, the "*" is stripped
  14.  *
  15.  * All files are listed in an editable combo box, where the user can
  16.  * easily switch between files and even add a new file
  17.  *
  18.  * At finish, the list of filenames is written back to
  19.  * /var/lib/YaST2/filenames
  20.  * adapting the default line (starting with "*") accordingly.
  21.  *
  22.  * The default is either given as WFM::Args(0) or is the file last viewed.
  23.  */
  24.  
  25. {
  26.     textdomain "repair";
  27.  
  28.     import "Directory";
  29.     import "FileUtils";
  30.     import "Label";
  31.  
  32.     string vardir = Directory::vardir;
  33.  
  34.     // Check if the filename list is present
  35.     if (!FileUtils::Exists (vardir + "/filenames"))
  36.     {
  37.         SCR::Execute(.target.bash, "/bin/cp " + Directory::ydatadir + "/filenames " + vardir + "/filenames");
  38.     }
  39.  
  40.     // get filename list
  41.     string filenames = (string) SCR::Read(.target.string, vardir + "/filenames");
  42.     if ((filenames == nil)
  43.     || (size (filenames) <= 0))
  44.     {
  45.     filenames = "/var/log/boot.msg\n/var/log/messages\n";
  46.     }
  47.  
  48.     // convert \n separated string to ycp list.
  49.  
  50.     list<string> all_files = splitstring (filenames, "\n");
  51.  
  52.     boolean set_default = false;
  53.     list<term> combo_files = [];
  54.  
  55.     // check if default given as argument
  56.  
  57.     string filename = "";
  58.     if ((size(WFM::Args()) > 0)
  59.     && is(WFM::Args(0), string))
  60.     {
  61.     filename = (string)WFM::Args(0);
  62.     if (filename != "")
  63.     {
  64.         combo_files = [ `item(`id(filename), filename, true) ];
  65.         set_default = true;
  66.     }
  67.     }
  68.  
  69.  
  70.     // build up ComboBox
  71.  
  72.     foreach (string name, all_files,
  73.     {
  74.     // empty lines or lines starting with "#" are ignored
  75.     if (name != ""
  76.         && substring (name, 0, 1) != "#")
  77.     {
  78.         // the default is either given via WFM::Args() -> filename != ""
  79.         // or by a filename starting with "*"
  80.         if (substring (name, 0, 1) == "*")
  81.         {
  82.         name = substring (name, 1);    // strip leading "*"
  83.         if (name != filename)        // do not add it twice
  84.         {
  85.             combo_files =
  86.             add (combo_files,`item (`id(name),name, !set_default));
  87.         }
  88.         if (!set_default)
  89.         {
  90.             if (filename == "")
  91.             filename = name;
  92.             set_default = true;
  93.         }
  94.         }
  95.         else if (name != filename)        // do not add it twice
  96.         {
  97.         combo_files = add (combo_files, `item(`id(name), name));
  98.         }
  99.     }
  100.     });
  101.  
  102.     if (!set_default
  103.     && (filename != ""))
  104.     {
  105.     all_files = add (all_files, "*" + filename);
  106.     combo_files = add (combo_files, `item(`id(filename), filename));
  107.     }
  108.  
  109.     // set up dialogue
  110.  
  111.     UI::OpenDialog( `opt(`decorated, `defaultsize ),
  112.               `VBox(
  113.                 `HSpacing( 70 ),    // force width
  114.                 `HBox (`HSpacing (1.0), `ComboBox (`id(`custom_file), `opt(`editable, `notify, `hstretch), "", combo_files), `HStretch()),
  115.                 `VSpacing( 0.3 ),
  116.                 `VWeight( 1,
  117.                       `HBox(
  118.                         `VSpacing( 18 ),    // force height
  119.                         `HSpacing( 0.7 ),
  120.                         `LogView( `id(`log ),
  121.                               "",
  122.                               3,    // height
  123.                               0 ),    // number of lines to show
  124.                         `HSpacing( 0.7 )
  125.                         )
  126.                       ),
  127.                 `VSpacing( 0.3 ),
  128.                 `PushButton( `id(`ok), Label::OKButton() ),
  129.                 `VSpacing( 0.3 )
  130.                 )
  131.               );
  132.  
  133.  
  134.     string file_contents = "";
  135.     boolean go_on = true;
  136.  
  137.     // wait until user clicks "OK"
  138.     // check if ComboBox selected and change view accordingly
  139.  
  140.     while (go_on)
  141.     {
  142.     // read file contents
  143.     file_contents = (string)SCR::Read (.target.string, filename);
  144.  
  145.     // Fill the LogView with file contents
  146.     UI::ChangeWidget( `id(`log ), `Value, file_contents );
  147.  
  148.     string heading = sformat( _("System Log (%1)"), filename );
  149.     UI::ChangeWidget( `id(`log ), `Label, heading);
  150.  
  151.     // wait for user input
  152.  
  153.     symbol ret = (symbol)UI::UserInput();
  154.  
  155.     // clicked "OK" -> exit
  156.  
  157.     if (ret == `ok)
  158.     {
  159.         go_on = false;
  160.     }
  161.     else if (ret == `cancel)        // close window
  162.     {
  163.         UI::CloseDialog();
  164.         return true;
  165.     }
  166.     else if (ret == `custom_file)
  167.     {
  168.         // adapt to combo box settings
  169.  
  170.         string new_file = (string)UI::QueryWidget(`id(`custom_file), `Value);
  171.         if (new_file != nil)
  172.         {
  173.         filename = new_file;
  174.         }
  175.     }
  176.     else
  177.     {
  178.         y2milestone ("bad UserInput (%1)", ret);
  179.     }
  180.     }
  181.  
  182.     // write new list of filenames
  183.  
  184.     list<string> new_files = [];
  185.     set_default = false;
  186.  
  187.     // re-build list to get new default correct
  188.     foreach (string file, all_files,
  189.     {
  190.     if (substring (file, 0, 1) == "*")
  191.     {
  192.         string old_default = substring (file, 1);  // strip leading "*"
  193.         if (old_default == filename)    // default unchanged
  194.         {
  195.         new_files = add (new_files, file);
  196.         set_default = true;
  197.         }
  198.         else                // new default
  199.         {
  200.         new_files = add (new_files, old_default);
  201.         }
  202.     }
  203.     else if (file != "")
  204.     {
  205.         if (file == filename)        // mark new default
  206.         {
  207.         new_files = add (new_files, "*" + filename);
  208.         set_default = true;
  209.         }
  210.         else
  211.         {
  212.         new_files = add (new_files, file);
  213.         }
  214.     }
  215.     });
  216.     // if we don't have a default by now, it wasn't in the list before
  217.     // so add it here.
  218.  
  219.     if (!set_default
  220.     && (filename != ""))
  221.     {
  222.     new_files = add (new_files, "*" + filename);
  223.     }
  224.  
  225.     new_files = toset (new_files);
  226.  
  227.     // convert ycp list back to \n separated string
  228.  
  229.     filenames = mergestring (new_files, "\n") + "\n";
  230.  
  231.     SCR::Write(.target.string, vardir + "/filenames", filenames);
  232.  
  233.     UI::CloseDialog();
  234.  
  235.     return true;
  236. }
  237.