/**
  * Launch a command
  * 
  * @param array $values
  * 
  * @return void
  */
 static function lauchCommand($values)
 {
     global $CFG_GLPI;
     if (!empty($values['itemtype']) && !empty($values['itemID'])) {
         $item = getItemForItemtype($values['itemtype']);
         $item->getFromDB($values['itemID']);
         $shellcommands_item = new PluginShellcommandsShellcommand_Item();
         $shellcommands = new PluginShellcommandsShellcommand();
         $commandgroups = new PluginShellcommandsCommandGroup();
         $commandgroups_item = new PluginShellcommandsCommandGroup_Item();
         $commandgroups_items = $commandgroups_item->find("`plugin_shellcommands_commandgroups_id`=" . $values['id'], "`rank`");
         echo "<div class='center'>";
         echo "<table class='tab_cadre_fixe shellcommands_result_line'>";
         echo "<tr class='tab_bg_1'>";
         echo "<th colspan='4'>" . __('Result details') . "</th>";
         echo "</tr>";
         // First : test ping
         $error = 1;
         $commandgroups->getFromDB($values['id']);
         if (!empty($commandgroups->fields['check_commands_id'])) {
             $targetParam = PluginShellcommandsShellcommand_Item::resolveLinkOfCommand($commandgroups->fields['check_commands_id'], $item);
             // Exec command on each targets : stop on first success
             if ($targetParam !== false) {
                 foreach ($targetParam as $target) {
                     list($error, $execPing) = PluginShellcommandsShellcommand_Item::execCommand($commandgroups->fields['check_commands_id'], $target);
                     if (!$error) {
                         break;
                     }
                 }
             }
         }
         // If Ping ok execute group commands
         if (!$error) {
             echo "<tr class='tab_bg_1 shellcommands_result_line'>";
             echo "<td class='center' colspan='2'>" . __($item->getType()) . ' : ' . $item->getLink() . "</td>";
             echo "<td class='center'><div class='shellcommands_result_ok'>UP</div></td>";
             echo "<td>";
             echo __('Host UP', 'shellcommands');
             echo "</td>";
             echo "</tr>";
             if (!empty($commandgroups_items)) {
                 foreach ($commandgroups_items as $val) {
                     if (!$shellcommands_item->getFromDBbyShellCommandsAndItem($val['plugin_shellcommands_shellcommands_id'], $values['itemtype'])) {
                         continue;
                     }
                     $shellcommands->getFromDB($val['plugin_shellcommands_shellcommands_id']);
                     $targetParam = PluginShellcommandsShellcommand_Item::resolveLinkOfCommand($val['plugin_shellcommands_shellcommands_id'], $item);
                     // Exec command on each targets : stop on first success
                     if ($targetParam !== false) {
                         foreach ($targetParam as $target) {
                             list($error, $message) = PluginShellcommandsShellcommand_Item::execCommand($shellcommands->getID(), $target);
                             if (!$error) {
                                 break;
                             }
                         }
                     }
                     PluginShellcommandsShellcommand::displayCommandResult($shellcommands, $target, $message, $error);
                 }
             }
         } else {
             echo "<tr class='tab_bg_1 shellcommands_result_line'>";
             echo "<td class='center' colspan='2'>" . __($item->getType()) . ' : ' . $item->getLink() . "</td>";
             echo "<td class='center'><div class='shellcommands_result_ko'>DOWN</div></td>";
             echo "<td>";
             echo __('Host DOWN', 'shellcommands');
             echo "</td>";
             echo "</tr>";
         }
         echo "</table>";
         echo "</div>";
     }
 }
 /**
  * Method to run shellcommands by webservice
  * 
  * @param array $params       Options
  * @param string $protocol    Communication protocol used
  * 
  * @return array or error value
  */
 static function methodRun($params, $protocol)
 {
     global $DB;
     if (isset($params['help'])) {
         return array('command_id' => 'integer,optional,multiple', 'command_name' => 'string,optional,multiple', 'target_type' => 'string,mandatory', 'target_id' => 'integer,optional,multiple', 'target_name' => 'string,optional', 'help' => 'bool,optional');
     }
     if (!Session::getLoginUserID()) {
         return PluginWebservicesMethodCommon::Error($protocol, WEBSERVICES_ERROR_NOTAUTHENTICATED);
     }
     $executionOutputs = array();
     $invalidCommands = array();
     $invalidTargets = array();
     /** Parameters check **/
     if ((!isset($params['command_id']) || empty($params['command_id'])) && (!isset($params['command_name']) || empty($params['command_name']))) {
         return PluginWebservicesMethodCommon::Error($protocol, WEBSERVICES_ERROR_MISSINGPARAMETER, '', 'one among "command_id" and "command_name"');
     }
     //Post-relation: Either Shellcommand ID or name is given
     if (!isset($params['target_type']) || empty($params['target_type']) || (!isset($params['target_id']) || empty($params['target_id'])) && (!isset($params['target_name']) || empty($params['target_name']))) {
         return PluginWebservicesMethodCommon::Error($protocol, WEBSERVICES_ERROR_MISSINGPARAMETER, '', 'must specify "target_type" and one among "target_id" and "target_name"');
     }
     //Post-relation: Either Target ID or name is given
     $possibleTargetTypes = PluginShellcommandsShellcommand_Item::getClasses(true);
     if (!in_array($params['target_type'], $possibleTargetTypes) || !class_exists($params['target_type'])) {
         return PluginWebservicesMethodCommon::Error($protocol, WEBSERVICES_ERROR_BADPARAMETER, '', '"target_type" is "' . $params['target_type'] . '" must be one of: ' . implode(', ', $possibleTargetTypes) . '');
     }
     //Post-relation: Given target type ($params['target_type']) is valid
     /** /Parameters check **/
     /** Command determination **/
     $commandIds = array();
     if (isset($params['command_id']) && !empty($params['command_id'])) {
         // ID(s) given
         $commandIds = (array) $params['command_id'];
     } else {
         // Name(s) given
         $command_names = (array) $params['command_name'];
         foreach ($command_names as $currentCommandName) {
             $command = new PluginShellcommandsShellcommand();
             if ($command->getFromDBbyName($currentCommandName)) {
                 $commandIds[] = $command->fields['id'];
             } else {
                 $invalidCommands[] = $currentCommandName;
             }
         }
     }
     //Post-relation: $commandIds is an array containing either provided or found (via given name) shellcommand IDs
     /** /Command determination **/
     /** Target determination **/
     $targetIds = array();
     if (isset($params['target_id']) && !empty($params['target_id'])) {
         // ID(s) given
         $targetIds = (array) $params['target_id'];
     } else {
         // Name(s) given
         $target_names = (array) $params['target_name'];
         foreach ($target_names as $currentTargetName) {
             $target = new $params['target_type']();
             if ($found = $target->find("`name` LIKE '" . $DB->escape($currentTargetName) . "'")) {
                 $targetIds = array_merge($targetIds, array_keys($found));
             } else {
                 $invalidTargets[] = $currentTargetName;
             }
         }
     }
     //Post-relation: $targetIds is an array containing either provided or found (via given name) targets IDs (of type $params['target_type'])
     /** /Target determination **/
     $commandIds = array_unique($commandIds);
     $targetIds = array_unique($targetIds);
     foreach ($targetIds as $currentTargetId) {
         $item = new $params['target_type']();
         $targetFound = $item->getFromDB($currentTargetId);
         if (!$targetFound) {
             $invalidTargets[] = $currentTargetId;
         }
         foreach ($commandIds as $currentCommandId) {
             $targetParams = PluginShellcommandsShellcommand_Item::resolveLinkOfCommand($currentCommandId, $item);
             if ($targetParams !== false) {
                 foreach ((array) $targetParams as $currentTargetParam) {
                     list($error, $executionOutput) = PluginShellcommandsShellcommand_Item::execCommand($currentCommandId, $currentTargetParam);
                     $executionOutputs[] = trim($executionOutput);
                 }
             } else {
                 $invalidCommands[] = $currentCommandId;
             }
         }
     }
     return array('callResults' => implode(PHP_EOL, $executionOutputs), 'invalidCommands' => $invalidCommands, 'invalidTargets' => $invalidTargets);
 }
 /**
  * Custom fonction to process shellcommand massive action
  **/
 function doMassiveAction(MassiveAction $ma, array $ids)
 {
     if (!empty($ids)) {
         $input = $ma->getInput();
         $itemtype = $ma->getItemType(false);
         $commands_id = $input['command'];
         switch ($ma->getAction()) {
             case 'generate':
                 $shellcommands_item = new PluginShellcommandsShellcommand_Item();
                 $shellcommands = new PluginShellcommandsShellcommand();
                 $item = getItemForItemtype($itemtype);
                 echo "<div class='center'>";
                 echo "<table class='tab_cadre_fixe center'>";
                 echo "<tr class='tab_bg_1'>";
                 echo "<th colspan='4'>" . PluginShellcommandsShellcommand::getTypeName(2) . "</th>";
                 echo "</tr>";
                 foreach ($ids as $key => $items_id) {
                     if (!$shellcommands_item->getFromDBbyShellCommandsAndItem($commands_id, $itemtype)) {
                         continue;
                     }
                     $shellcommands->getFromDB($commands_id);
                     $item->getFromDB($items_id);
                     $targetParam = PluginShellcommandsShellcommand_Item::resolveLinkOfCommand($shellcommands->getID(), $item);
                     // Exec command on each targets : stop on first success
                     $selectedTarget = null;
                     if ($targetParam !== false) {
                         foreach ($targetParam as $target) {
                             list($error, $message) = PluginShellcommandsShellcommand_Item::execCommand($shellcommands->getID(), $target);
                             if (!$error) {
                                 $selectedTarget = $target;
                                 break;
                             }
                         }
                     }
                     echo "<tr class='tab_bg_1 shellcommands_result_line'>";
                     echo "<td class='center' colspan='4'>" . __($item->getType()) . ' : ' . $item->getLink() . " - " . $selectedTarget . "</td>";
                     echo "</tr>";
                     PluginShellcommandsShellcommand::displayCommandResult($shellcommands, $selectedTarget, $message, $error);
                 }
                 echo "</table>";
                 echo "</div>";
                 break;
         }
     }
 }