<?php 
/** 
 * This file contains the SysCmd class. 
 *  
 * PHP Version 5.3 
 *  
 * @category System 
 * @package  SysCmd 
 * @author   Gonzalo Chumillas <[email protected]> 
 * @license  https://raw.github.com/soloproyectos/core/master/LICENSE BSD 2-Clause License 
 * @link     https://github.com/soloproyectos/core 
 */ 
namespace com\soloproyectos\common\sys\cmd; 
use com\soloproyectos\common\sys\cmd\exception\SysCmdException; 
 
/** 
 * Class SysCmd. 
 *  
 * This function is used to executes and compose command lines. 
 *  
 * @category System 
 * @package  SysCmd 
 * @author   Gonzalo Chumillas <[email protected]> 
 * @license  https://raw.github.com/soloproyectos/core/master/LICENSE BSD 2-Clause License 
 * @link     https://github.com/soloproyectos/core 
 */ 
class SysCmd 
{ 
    /** 
     * List of arguments. 
     * @var array of SysCmdArgument objects 
     */ 
    protected $args; 
     
    /** 
     * Command. 
     * @var string 
     */ 
    protected $command; 
     
    /** 
     * Constructor. 
     *  
     * @param string $command Command line 
     */ 
    public function __construct($command) 
    { 
        $this->args = array(); 
        $this->command = $command; 
    } 
     
    /** 
     * Appends a flag name. 
     *  
     * <p>Example 1:</p> 
     * <pre>// list detailed files 
     * $cmd = new SysCmd("ls"); 
     * $cmd->appendFlag("al"); 
     * echo $cmd->toString();  // prints "ls -al" 
     * </pre> 
     *  
     * <p>Example 2:</p> 
     * <pre>// example 2 
     * $cmd = new SysCmd("find ."); 
     * $cmd->appendFlag("type", "f"); 
     * echo $cmd->toString(); // prints "find . -type f" 
     * </pre> 
     *  
     * @param string $name  Flag name 
     * @param string $value A value (default is "") 
     *  
     * @return SysCmdArgument 
     */ 
    public function appendFlag($name, $value = "") 
    { 
        $arg = new SysCmdArgument(); 
        $arg->setName($name); 
        $arg->setValue($value); 
        array_push($this->args, $arg); 
        return $arg; 
    } 
     
    /** 
     * Appends a single argument. 
     *  
     * <p>Example:</p> 
     * <pre>// list detailed files under my_dir 
     * $cmd = new SysCmd("ls"); 
     * $cmd->appendFlag("al"); 
     * $cmd->appendArg("my_dir"); 
     * echo $cmd->toString(); // prints "ls -al my_dir" 
     * </pre> 
     *  
     * @param string|SysCmdArgument $value A value 
     * @param string                $name  Argument name (default is "") 
     *  
     * @return SysCmdArgument 
     */ 
    public function appendArg($value, $name = "") 
    { 
        $arg = null; 
         
        if (!$value instanceof SysCmdArgument) { 
            $arg = new SysCmdArgument(); 
            $arg->setValue($value); 
            $arg->setName($name); 
        } else { 
            $arg = $value; 
        } 
         
        array_push($this->args, $arg); 
        return $arg; 
    } 
     
    /** 
     * Appends a list of arguments. 
     *  
     * <p>Example:</p> 
     * <pre>// converts mkv to avi 
     * $cmd = new SysCmd("ffmpeg"); 
     * $cmd->appendFlag("i", "input.mkv"); 
     * $cmd->appendArgList("-f avi -c:v mpeg4 -b:v 4000k -c:a libmp3lame -b:a 320k"); 
     * $cmd->appendArg("output.avi"); 
     * $cmd->toString(); 
     *  
     * // the above command prints: 
     * // ffmpeg -i input.mkv -f avi -c:v mpeg4 -b:v 4000k \ 
     * // -c:a libmp3lame -b:a 320k output.avi 
     * </pre> 
     *  
     * @param string $arguments List of arguments 
     *  
     * @return void 
     */ 
    public function appendArgList($arguments) 
    { 
        $arguments = trim($arguments); 
         
        if (strlen($arguments) > 0) { 
            $p = new SysCmdArgumentsParser($arguments); 
            if (!$args = $p->parse()) { 
                throw new CmdException("Invalid arguments"); 
            } 
             
            // appends arguments 
            foreach ($args as $arg) { 
                array_push($this->args, $arg); 
            } 
        } 
    } 
     
    /** 
     * Executes a command. 
     *  
     * This function executes a command and returns the output. 
     *  
     * @return string 
     */ 
    public function exec() 
    { 
        return SysCmdHelper::exec($this->toString()); 
    } 
     
    /** 
     * Executes a command in background. 
     *  
     * This function executes a command in background and returns the PID. 
     *  
     * @param string $outputFile Output file (default is "/dev/null") 
     *  
     * @return int 
     */ 
    public function execBg($outputFile = "/dev/null") 
    { 
        return SysCmdHelper::execBg($this->toString(), $outputFile); 
    } 
     
    /** 
     * Is the process running? 
     *  
     * @return boolean 
     */ 
    public function isRunning() 
    { 
        return SysCmdHelper::isRunning($this->pid); 
    } 
     
    /** 
     * Gets the string representation of the instance. 
     *  
     * @return string 
     */ 
    public function toString() 
    { 
        $ret = SysCmdHelper::escapeCmd($this->command); 
         
        foreach ($this->args as $arg) { 
            $ret .= " " . $arg->toString(); 
        } 
         
        return $ret; 
    } 
} 
 
 |