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

  1. /**
  2.  *  File:
  3.  *    OSRExecute.ycp
  4.  *
  5.  *  Module:
  6.  *    YaST Repair
  7.  *  Summary:
  8.  *
  9.  *  Author:
  10.  *    Johannes Buchhold <jbuch@suse.de>
  11.  *
  12.  * $Id: OSRExecute.ycp 20450 2004-12-01 11:55:31Z jsuchome $
  13.  */
  14. {
  15.   module "OSRExecute";
  16.  
  17.   import "Mode";
  18.  
  19.   import "OSRCommon";
  20.   import "OSRLogFile";
  21.   import "OSRProgress";
  22.  
  23.   textdomain "repair";
  24.  
  25.   global integer result      = 0;
  26.   global string  stdout      = "";
  27.   global string  stderr      = "";
  28.   map result_map         = $[];
  29.  
  30.   define boolean exec(path environment, string commandline )``{
  31.  
  32.       if ( environment == .local.bash || environment == .local.bash_output )
  33.       {
  34.       result_map  = (map) WFM::Execute(.local.bash_output, commandline );
  35.       }
  36.       else if ( environment == .target.bash || environment == .target.bash_output )
  37.       {
  38.       result_map  = (map) SCR::Execute(.target.bash_output, commandline);
  39.       }
  40.       else
  41.       {
  42.       y2error("OSRExecute::CommandOutput ERROR: wrong environment \"%1\", has to be .local.bash_output or .target.bash_output", environment);
  43.       return false;
  44.       }
  45.       result      = result_map[ "exit"   ]:-1;
  46.       stdout      = result_map[ "stdout" ]:"";
  47.       stderr      = result_map[ "stderr" ]:"";
  48.       return true;
  49.   }
  50.  
  51.   global define void Reset()``{
  52.       result      = 0;
  53.       stdout      = "";
  54.       stderr      = "";
  55.       result_map  = $[];
  56.   }
  57.  
  58.   define void debugResult()``{
  59.  
  60.       if ( result == 0 )
  61.       {
  62.       y2debug("OSRExecute::CommandOutput: command succeeded: %1", result);
  63.       }
  64.       else if ( result == 126 )
  65.       {
  66.       y2debug("OSRExecute::CommandOutput: command found but not executable: %1", result);
  67.       }
  68.       else if ( result == 127 )
  69.       {
  70.       y2debug("OSRExecute::CommandOutput: command not found: %1", result);
  71.       }
  72.       else if ( result >= 128 )
  73.       {
  74.       y2debug("OSRExecute::CommandOutput: command terminates with fatal sign N (N=%1-128): %1", result);
  75.       }
  76.       else
  77.       {
  78.       y2debug("OSRExecute::CommandOutput: command terminates with error code %1", result);
  79.       }
  80.   }
  81.  
  82.  
  83.   global define void DemoExecute( integer local_result, string local_stdout, string local_stderr ) ``{
  84.       result = local_result;
  85.       stdout = local_stdout;
  86.       stderr = local_stderr;
  87.   }
  88.  
  89.  
  90.   /**
  91.    *  Executes the given commandline in a bash and writes all
  92.    *  execution-information to the standard log file. This function returns all
  93.    *  output from the commandline in a result map. Use these functions instead
  94.    *  of directly calling the SCR or WFM agents
  95.    *    (e.g. SCR::Execute(.target.bash_output, "rpm -q lilo") resp.
  96.    *     WFM::(.local.bash_output, "rpm -q -r /mnt lilo"))
  97.    *  to be sure to support logging correctly.
  98.    *
  99.    *  API function.
  100.    *
  101.    *  @param environment The environment-path, has to be .local.bash_output or
  102.    *         .target.bash_output (or .local.bash resp. .target.bash)
  103.    *  @param string commandline The commandline.
  104.    */
  105.   global define boolean CommandOutput(path environment, string commandline) ``{
  106.  
  107.       Reset();
  108.       if ( Mode::test () )
  109.       commandline = "/bin/echo " +
  110.         mergestring(splitstring(commandline, ";"), " ");
  111.  
  112.       // accept also .local.bash and .target.bash as parameter
  113.       if ( ! exec( environment, commandline ) ) return false;
  114.  
  115.       OSRLogFile::Add (
  116.     sformat("Command: %1\nstdout: %2\nstderr: %3\nexit: %4\n",
  117.         commandline, stdout, stderr, result));
  118.  
  119.       debugResult();
  120.       return ( result == 0);
  121.   };
  122.  
  123.   /**
  124.    *  Executes the given commandline in a bash and writes all
  125.    *  execution-information to the specified logfile. Use these functions
  126.    *  instead of directly calling the SCR or WFM agents
  127.    *     (e.g. SCR::Execute(.target.bash, "rpm -q lilo") resp.
  128.    *      WFM::(.local.bash, "rpm -q -r /mnt lilo"))
  129.    *  to be sure to support logging correctly.
  130.    *
  131.    *  API function.
  132.    *
  133.    *  @param path environment The environment-path,
  134.    *    has to be .local.bash or .target.bash
  135.    *  @param string commandline The commandline.
  136.    *  @param string progress_file The path of the progress file.
  137.    *  @return boolean Success
  138.    *  @example
  139.    *    OSRExecute::CommandProgress (.local.bash, "rpm -qi -r /mnt/ lilo",
  140.    *        "/tmp/progress_file");
  141.    *
  142.    *   $ cat /tmp/osr.log
  143.    *   *** /bin/rpm -qi lilo ***
  144.    *   Name      : lilo         Relocations: (not relocateable)
  145.    *   Version   : 21.6              Vendor: SuSE GmbH, Nuernberg, Germany
  146.    *   [...]
  147.    *   SuSE series: a
  148.    *   *** exit code: 0 ***
  149.    */
  150.   global define boolean CommandProgress(path environment, string commandline,
  151.                     string progress_file ) ``{
  152.  
  153.       Reset();
  154.  
  155.       // in test/demo-mode set "echo" in front of every commandline and delete
  156.       // all ";" from the commandline
  157.       if (Mode::test () )
  158.       {
  159.       commandline = "/bin/echo " +
  160.         mergestring (splitstring(commandline, ";"), " ");
  161.       }
  162.       else if (UI::WidgetExists(`id(`module_progress_bar )))
  163.        OSRProgress::SetLabel(`module_progress_bar, commandline );
  164.  
  165.       // only use the module progress bar if a filename was specified and the
  166.       // UI interpreter supports the DownloadProgressWidget
  167.       if ((progress_file != "") && progress_file != nil
  168.       && progress_file != OSRLogFile::GetTmpDir()
  169.       && progress_file != OSRLogFile::GetTmpDir()+"/"
  170.       )
  171.       {
  172.       // write the specified command line to the log file and execute the
  173.       // command, write all output to the specified progress file
  174.       commandline = sformat("%1 >> %2 2>> %2", commandline, progress_file );
  175.  
  176.  
  177.       if ( ! exec( environment, commandline ) ) return false;
  178.  
  179.       // get the output from the progress file to write it to the log file
  180.       string output_string = (string)WFM::Read(.local.string,progress_file);
  181.  
  182.       OSRLogFile::Add (
  183.         sformat("Command: %1\nProgress file: %2\noutput: %3\nexit: %4\n",
  184.         commandline, progress_file, output_string, result));
  185.       }
  186.       else
  187.       {
  188.       // no progress file specified
  189.       if(  progress_file == OSRLogFile::GetTmpDir() || 
  190.            progress_file == OSRLogFile::GetTmpDir()+"/" )
  191.       {
  192.           progress_file = OSRLogFile::GetTmpDir()+"/default";
  193.       }
  194.       commandline = sformat("%1 >> %2 2>> %2", commandline, progress_file );
  195.  
  196.       if ( ! exec( environment, commandline ) ) return false;
  197.  
  198.       OSRLogFile::Add (
  199.         sformat("Command: %1\nstdout: %2\nstderr: %3\nexit: %4\n",
  200.         commandline, stdout, stderr, result));
  201.       }
  202.  
  203.       debugResult();
  204.       return ( result == 0);
  205.   };
  206.  
  207.   global define string OutputFile()``{
  208.       if( OSRCommon::current_module_name != "" )
  209.       {
  210.       return OSRLogFile::GetTmpDir()+"/"+ OSRCommon::current_module_name;
  211.       }
  212.       else if ( OSRCommon::current_direct_name != "" )
  213.       {
  214.       return OSRLogFile::GetTmpDir()+"/"+ OSRCommon::current_direct_name;
  215.       }
  216.       return OSRLogFile::GetTmpDir()+"/"+ "osr_default";
  217.   }
  218.  
  219.   /**
  220.    *  Wrapper to CommandProgress, with the use of current log file
  221.    */
  222.   global define boolean Command(path environment, string commandline) ``{
  223.  
  224.       return CommandProgress(environment, commandline, OutputFile() );
  225.   };
  226.  
  227. }
  228.