home *** CD-ROM | disk | FTP | other *** search
/ PC World 2001 August / PCWorld_2001-08_cd.bin / Komunikace / phptriad / phptriadsetup2-11.exe / php / pear / CMD.php < prev    next >
PHP Script  |  2001-02-12  |  9KB  |  287 lines

  1. <?php
  2. //
  3. // +----------------------------------------------------------------------+
  4. // | PHP version 4.0                                                      |
  5. // +----------------------------------------------------------------------+
  6. // | Copyright (c) 1997-2001 The PHP Group                                |
  7. // +----------------------------------------------------------------------+
  8. // | This source file is subject to version 2.02 of the PHP license,      |
  9. // | that is bundled with this package in the file LICENSE, and is        |
  10. // | available at through the world-wide-web at                           |
  11. // | http://www.php.net/license/2_02.txt.                                 |
  12. // | If you did not receive a copy of the PHP license and are unable to   |
  13. // | obtain it through the world-wide-web, please send a note to          |
  14. // | license@php.net so we can mail you a copy immediately.               |
  15. // +----------------------------------------------------------------------+
  16. // | Authors: Anders Johannsen <anders@johannsen.com>                     |
  17. // |                                                                      |
  18. // +----------------------------------------------------------------------+
  19. //
  20. define('CMD_RCSID', '$Id: CMD.php,v 1.2 2001/02/12 00:38:28 aj Exp $');
  21.  
  22. /**
  23.  * The Cmd:: class implements an abstraction for various ways 
  24.  * of executing commands (directly using the backtick operator,
  25.  * as a background task after the script has terminated using
  26.  * register_shutdown_function() or as a detached process using nohup).
  27.  *
  28.  * @author  Anders Johannsen <anders@johannsen.com>
  29.  * @version $Revision: 1.2 $
  30.  **/
  31.  
  32. require_once 'PEAR.php';
  33.  
  34.  
  35. class Cmd extends PEAR
  36. {
  37.     var $arrSetting     = array();
  38.     var $arrConstant    = array();
  39.     var $arrCommand     = array();
  40.         
  41.     /**
  42.      * Class constructor
  43.      * 
  44.      * Defines all necessary constants and sets defaults
  45.      * 
  46.      * @author Anders Johannsen <anders@johannsen.com>
  47.      *
  48.      * @access public
  49.      * 
  50.      **/
  51.         
  52.     function Cmd ()
  53.     {
  54.         // Defining constants
  55.         $this->arrConstant  = array ("CMD_SEQUENCE",
  56.                                      "CMD_SHUTDOWN",
  57.                                      "CMD_SHELL",
  58.                                      "CMD_OUTPUT",
  59.                                      "CMD_NOHUP",
  60.                                      "CMD_VERBOSE"
  61.                                      );
  62.                 
  63.         foreach ($this->arrConstant as $key => $value) {
  64.             if (!defined($value)) {
  65.                 define($value, $key);
  66.             }
  67.         }
  68.                 
  69.         // Setting default values
  70.         $this->arrSetting[CMD_SEQUENCE]     = true; 
  71.         $this->arrSetting[CMD_SHUTDOWN]     = false; 
  72.         $this->arrSetting[CMD_OUTPUT]       = false; 
  73.         $this->arrSetting[CMD_NOHUP]        = false; 
  74.         $this->arrSetting[CMD_VERBOSE]      = false; 
  75.                 
  76.         $arrShell = array ("sh", "bash", "zsh", "tcsh", "csh", "ash", "sash", "esh", "ksh");
  77.                                    
  78.         foreach ($arrShell as $shell) {
  79.             if ($this->arrSetting[CMD_SHELL] = $this->which($shell)) {
  80.                 break;
  81.             } 
  82.         }
  83.                 
  84.         if (empty($this->arrSetting[CMD_SHELL])) {
  85.             $this->raiseError("No shell found");
  86.         }
  87.     }
  88.         
  89.     /**
  90.      * Sets any option
  91.      * 
  92.      * The options are currently:
  93.      * CMD_SHUTDOWN : Execute commands via a shutdown function 
  94.      * CMD_SHELL    : Path to shell
  95.      * CMD_OUTPUT   : Output stdout from process
  96.      * CMD_NOHUP    : Use nohup to detach process
  97.      * CMD_VERBOSE  : Print errors to stdout
  98.      *
  99.      * @param $option is a constant, which corresponds to the
  100.      * option that should be changed
  101.      *
  102.      * @param $setting is the value of the option currently
  103.      * being toggled.
  104.      *
  105.      * @return bool true if succes, else false
  106.      *
  107.      * @access public
  108.      * 
  109.      * @author Anders Johannsen <anders@johannsen.com>
  110.      * 
  111.      **/
  112.         
  113.     function setOption ($option, $setting)
  114.     {
  115.         if (empty($this->arrConstant[$option])) {
  116.             $this->raiseError("No such option: $option");
  117.             return false;
  118.         }
  119.     
  120.                 
  121.         switch ($option) {
  122.         case CMD_OUTPUT:
  123.         case CMD_SHUTDOWN:
  124.         case CMD_VERBOSE:
  125.         case CMD_SEQUENCE:
  126.             $this->arrSetting[$option] = $setting;
  127.             return true;
  128.             break;
  129.             
  130.         case CMD_SHELL:
  131.             if (is_executable($setting)) {
  132.                 $this->arrSetting[$option] = $setting;
  133.                 return true;
  134.             } else {
  135.                 $this->raiseError("No such shell: $setting");
  136.                 return false;
  137.             }
  138.             break;
  139.             
  140.                     
  141.         case CMD_NOHUP:
  142.             if  (empty($setting)) {
  143.                 $this->arrSetting[$option] = false;
  144.                 
  145.             } else if ($location = $this->which("nohup")) {
  146.                 $this->arrSetting[$option] = true;
  147.                 
  148.             } else {
  149.                 $this->raiseError("Nohup was not found on your system");
  150.                 return false;
  151.             }
  152.             break;
  153.             
  154.         }
  155.     }
  156.     
  157.     /**
  158.      * Add command for execution
  159.      *
  160.      * @param $command accepts both arrays and regular strings
  161.      *
  162.      * @return bool true if succes, else false
  163.      *
  164.      * @access public
  165.      * 
  166.      * @author Anders Johannsen <anders@johannsen.com>
  167.      *
  168.      **/
  169.         
  170.     function command($command) 
  171.     {
  172.         if (is_array($command)) {
  173.             foreach ($command as $key => $value) {
  174.                 $this->arrCommand[] = $value;
  175.             }
  176.             return true;
  177.  
  178.         } else if (is_string($command)) {
  179.             $this->arrCommand[] = $command;
  180.             return true;
  181.         }
  182.                 
  183.         $this->raiseError("Argument not valid");
  184.         return false;
  185.     }
  186.         
  187.     /**
  188.      * Executes the code according to given options
  189.      *
  190.      * @return bool true if succes, else false
  191.      *
  192.      * @access public
  193.      * 
  194.      * @author Anders Johannsen <anders@johannsen.com>
  195.      *
  196.      **/
  197.         
  198.     function exec() 
  199.     {
  200.         // Warning about impossible mix of options
  201.         if (!empty($this->arrSetting[CMD_OUTPUT])) {
  202.             if (!empty($this->arrSetting[CMD_SHUTDOWN]) || !empty($this->arrSetting[CMD_NOHUP])) {
  203.                 $this->raiseError("Error: Commands executed via shutdown functions or nohup cannot return output");
  204.                 return false;
  205.             }
  206.         }
  207.                 
  208.         // Building command
  209.         $strCommand = implode(";", $this->arrCommand);
  210.                 
  211.         $strExec    = "echo '$strCommand' | ".$this->arrSetting[CMD_SHELL];
  212.                 
  213.         if (empty($this->arrSetting[CMD_OUTPUT])) {
  214.             $strExec = $strExec . ' > /dev/null';
  215.         }
  216.                 
  217.         if (!empty($this->arrSetting[CMD_NOHUP])) {
  218.             $strExec = 'nohup ' . $strExec;
  219.         }
  220.                 
  221.         // Executing 
  222.         if (!empty($this->arrSetting[CMD_SHUTDOWN])) {
  223.             $line = "system(\"$strExec\");";
  224.             $function = create_function('', $line);
  225.             register_shutdown_function($function);
  226.             return true;
  227.         } else {
  228.             return `$strExec`;
  229.         }
  230.     }
  231.  
  232.     /**
  233.      * Errorhandler. If option CMD_VERBOSE is true,
  234.      * the error is printed to stdout, otherwise it 
  235.      * is avaliable in lastError
  236.      *
  237.      * @return bool always returns true 
  238.      *
  239.      * @access private
  240.      * 
  241.      * @author Anders Johannsen <anders@johannsen.com>
  242.      **/
  243.         
  244.     function raiseError($strError) 
  245.     {
  246.         if (!empty($this->arrSetting[CMD_VERBOSE])) {
  247.             echo $strError;
  248.         } else {
  249.             $this->lastError = $strError;
  250.         }
  251.         
  252.         return true;
  253.     }
  254.         
  255.     /**
  256.      * Functionality similiar to unix 'which'. Searches the path
  257.      * for the specified program. 
  258.      *
  259.      * @param $cmd name of the executable to search for 
  260.      *
  261.      * @return string returns the full path if found,
  262.      * false if not
  263.      *
  264.      * @access private
  265.      * 
  266.      * @author Anders Johannsen <anders@johannsen.com>
  267.      **/
  268.         
  269.     function which($cmd) 
  270.     {
  271.         global $HTTP_ENV_VARS;
  272.                 
  273.         $arrPath = explode(":", $HTTP_ENV_VARS['PATH']);
  274.             
  275.         foreach ($arrPath as $path) {
  276.             $location = $path . "/" . $cmd;
  277.                             
  278.             if (is_executable($location)) {
  279.                 return $location;
  280.             }
  281.         }
  282.         return false;
  283.     }   
  284. }
  285.     
  286. ?>
  287.