summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 3cf2707)
raw | patch | inline | side by side (parent: 3cf2707)
author | hickert <hickert@594d385d-05f5-0310-b6e9-bd551577e9d8> | |
Wed, 8 Sep 2010 14:37:11 +0000 (14:37 +0000) | ||
committer | hickert <hickert@594d385d-05f5-0310-b6e9-bd551577e9d8> | |
Wed, 8 Sep 2010 14:37:11 +0000 (14:37 +0000) |
-Added errorString parameter to be able to receive errors we ran into.
-Added displayErrors parameter, to be able to disable msg_dialogs calls.
git-svn-id: https://oss.gonicus.de/repositories/gosa/trunk@19567 594d385d-05f5-0310-b6e9-bd551577e9d8
-Added displayErrors parameter, to be able to disable msg_dialogs calls.
git-svn-id: https://oss.gonicus.de/repositories/gosa/trunk@19567 594d385d-05f5-0310-b6e9-bd551577e9d8
gosa-core/include/class_plugin.inc | patch | blob | history |
index de01808bedc097f23a12566389995ae7c347321c..05a3eeafc2852ff3e0a7c60f1916256156f7f481 100644 (file)
* Replaces placeholder by class values of this plugin instance.
* @param Allows to a add special replacements.
*/
- static function callHook($plugin, $cmd, $addAttrs= array(), &$returnOutput = array(), &$returnCode = NULL)
+ static function callHook($plugin, $cmd, $addAttrs= array(), &$returnOutput = array(),
+ &$returnCode = NULL, &$errorOutput, $displayErrors = TRUE)
{
- global $config;
- $command = $config->configRegistry->getPropertyValue(get_class($plugin),$cmd);
-
- if (empty($command)){
- $returnCode = 0; // Simulate a return code to tell the caller that everythin is fine.
- }else{
+ global $config;
+ $command = $config->configRegistry->getPropertyValue(get_class($plugin),$cmd);
- // Walk trough attributes list and add the plugins attributes.
- foreach ($plugin->attributes as $attr){
- if (!is_array($plugin->$attr)){
- $addAttrs[$attr] = $plugin->$attr;
- }
- }
- $ui = get_userinfo();
- $addAttrs['callerDN']=$ui->dn;
- $addAttrs['dn']=$plugin->dn;
- $addAttrs['location']=$config->current['NAME'];
-
- // Sort attributes by length, ensures correct replacement
- $tmp = array();
- foreach($addAttrs as $name => $value){
- $tmp[$name] = strlen($name);
- }
- arsort($tmp);
+ $returnCode = 0; // Simulate a return code to tell the caller that everythin is fine.
+ $returnOutput = array();
+ $arr = array();
- // Now replace the placeholder
- foreach ($tmp as $name => $len){
- $value = $addAttrs[$name];
- $command= str_replace("%$name", "$value", $command);
- }
+ if (!empty($command)){
- // If there are still some %.. in our command, try to fill these with some other class vars
- if(preg_match("/%/",$command)){
- $attrs = get_object_vars($plugin);
- foreach($attrs as $name => $value){
- if(is_array($value)){
- $s = "";
- foreach($value as $val){
- if(is_string($val) || is_int($val) || is_float($val) || is_bool($val)){
- $s .= '"'.$val.'",';
+ // Walk trough attributes list and add the plugins attributes.
+ foreach ($plugin->attributes as $attr){
+ if (!is_array($plugin->$attr)){
+ $addAttrs[$attr] = $plugin->$attr;
}
- }
- $value = '['.trim($s,',').']';
}
- if(!is_string($value) && !is_int($value) && !is_float($value) && !is_bool($value)){
- continue;
+ $ui = get_userinfo();
+ $addAttrs['callerDN']=$ui->dn;
+ $addAttrs['dn']=$plugin->dn;
+ $addAttrs['location']=$config->current['NAME'];
+
+ // Sort attributes by length, ensures correct replacement
+ $tmp = array();
+ foreach($addAttrs as $name => $value){
+ $tmp[$name] = strlen($name);
+ }
+ arsort($tmp);
+
+ // Now replace the placeholder
+ foreach ($tmp as $name => $len){
+ $value = $addAttrs[$name];
+ $command= str_replace("%$name", "$value", $command);
+ }
+
+ // If there are still some %.. in our command, try to fill these with some other class vars
+ if(preg_match("/%/",$command)){
+ $attrs = get_object_vars($plugin);
+ foreach($attrs as $name => $value){
+ if(is_array($value)){
+ $s = "";
+ foreach($value as $val){
+ if(is_string($val) || is_int($val) || is_float($val) || is_bool($val)){
+ $s .= '"'.$val.'",';
+ }
+ }
+ $value = '['.trim($s,',').']';
+ }
+ if(!is_string($value) && !is_int($value) && !is_float($value) && !is_bool($value)){
+ continue;
+ }
+ $command= preg_replace("/%$name/", escapeshellarg($value), $command);
+ }
}
- $command= preg_replace("/%$name/", escapeshellarg($value), $command);
- }
- }
- if (check_command($command)){
+ if (check_command($command)){
- @DEBUG (DEBUG_SHELL, __LINE__, __FUNCTION__, __FILE__,$command,"Execute");
- exec($command, $arr, $returnCode);
- $returnOutput = $arr;
+ // Create list of process pipes
+ $descriptorspec = array(
+ 0 => array("pipe", "r"), // stdin
+ 1 => array("pipe", "w"), // stdout
+ 2 => array("pipe", "w")); // stderr
- if($returnCode != 0){
- $str = implode("\n",$arr);
- @DEBUG (DEBUG_SHELL, __LINE__, __FUNCTION__, __FILE__, $command, "Execution failed code: ".$returnCode);
- $message= msgPool::cmdexecfailed($cmd,$command, get_class($plugin));
- msg_dialog::display(_("Error"), $message, ERROR_DIALOG);
- }elseif(is_array($arr)){
- $str = implode("\n",$arr);
- @DEBUG (DEBUG_SHELL, __LINE__, __FUNCTION__, __FILE__, $command, "Result: ".$str);
- }
- } else {
- $message= msgPool::cmdinvalid($cmd,$command, get_class($plugin));
- msg_dialog::display(_("Error"), $message, ERROR_DIALOG);
+ // Try to open the process
+ @DEBUG (DEBUG_SHELL, __LINE__, __FUNCTION__, __FILE__,$command,"Execute");
+ $process = proc_open($command, $descriptorspec, $pipes);
+ if (is_resource($process)) {
+
+ // Write the password to stdin
+ // fwrite($pipes[0], $pwd);
+ fclose($pipes[0]);
+
+ // Get results from stdout and stderr
+ $arr = stream_get_contents($pipes[1]);
+ $err = stream_get_contents($pipes[2]);
+ fclose($pipes[1]);
+
+ // Close the process and check its return value
+ $returnCode = proc_close($process);
+ $returnOutput = preg_split("/\n/", $arr,0,PREG_SPLIT_NO_EMPTY);
+ $errorOutput = preg_split("/\n/",$err,0,PREG_SPLIT_NO_EMPTY);
+ }
+
+ if($returnCode != 0){
+ @DEBUG (DEBUG_SHELL, __LINE__, __FUNCTION__, __FILE__, $command, "Execution failed code: ".$returnCode);
+ @DEBUG (DEBUG_SHELL, __LINE__, __FUNCTION__, __FILE__, $command, "Result: ".$err);
+ if($displayErrors){
+ $message= msgPool::cmdexecfailed($cmd,$command, get_class($plugin));
+ msg_dialog::display(_("Error"), $message, ERROR_DIALOG);
+ }
+ }elseif(is_array($arr)){
+ @DEBUG (DEBUG_SHELL, __LINE__, __FUNCTION__, __FILE__, $command, "Result: ".$arr);
+ }
+ } elseif($displayErrors) {
+ $message= msgPool::cmdinvalid($cmd,$command, get_class($plugin));
+ msg_dialog::display(_("Error"), $message, ERROR_DIALOG);
+ }
}
- }
}
}