--- shellcommands/inc/shellcommand_item.class.php Fri May 23 02:39:53 2014 +++ shellcommands/inc/shellcommand_item.class.php Sat May 24 03:04:47 2014 @@ -528,31 +528,49 @@ $currentlyResolvedLink = str_replace('[DOMAIN]', '', $currentlyResolvedLink); // Clean [DOMAIN] tag } if (strstr($commandLink, '[IP]') || strstr($commandLink, '[MAC]')) { // Handle "IP" and "MAC" tags - /* Fetches network ports */ + $handledTags = array( + // TAG => rowset key + '[IP]' => 'ip', + '[MAC]' => 'mac', + ); + + // Fetches every IP (glpi_ipaddresses) and MAC of any network ports (glpi_networkports) of given item: + //Note: As of GLPI 0.84 it returns both IPv4 and IPv6 under the same "ip" key. Usually convenient but can bother some commands + //Internet Protocol version could be filtered using `glpi_ipaddresses`.`version` $networkportsRowset = $DB->query( - 'SELECT - `id`, - `name`, - `ip`, - `mac` - FROM `glpi_networkports` - WHERE - `items_id` = ' . $item->getID() . ' - AND `itemtype` = \'' . mysql_real_escape_string(get_class($item)) . '\' - ORDER BY `logical_number`'); - $networkportsResolvedLinks = array(); - while ($networkportRow = $DB->fetch_array($networkportsRowset)) { // For each network port found + 'SELECT DISTINCT + `glpi_networkports`.`name` AS "name", + `glpi_networkports`.`mac` AS "mac", + `glpi_ipaddresses`.`name` AS "ip" + FROM + `glpi_networkports` + JOIN `glpi_networknames` + ON (`glpi_networknames`.`itemtype` = \'NetworkPort\' AND `glpi_networknames`.`items_id` = `glpi_networkports`.`id`) + JOIN `glpi_ipaddresses` + ON (`glpi_ipaddresses`.`itemtype` = \'NetworkName\' AND `glpi_ipaddresses`.`items_id` = `glpi_networknames`.`id`) + WHERE + `glpi_networkports`.`items_id` = ' . $item->getID() . ' + AND `glpi_networkports`.`itemtype` = \'' . $DB->escape(get_class($item)) . '\' + AND `glpi_networkports`.`is_deleted` = 0 + AND `glpi_networknames`.`is_deleted` = 0 + AND `glpi_ipaddresses`.`is_deleted` = 0 + ORDER + BY `glpi_networkports`.`logical_number` ASC'); + + while ($networkportRow = $DB->fetch_assoc($networkportsRowset)) { // For each found network port $currentlyResolvedNetworkport = $currentlyResolvedLink; - if (strstr($commandLink, '[IP]') && array_key_exists('ip', $networkportRow) && !empty($networkportRow['ip'])) { // If "IP" tag and networkport has IP - $currentlyResolvedNetworkport = str_replace('[IP]', $networkportRow['ip'], $currentlyResolvedNetworkport); - } - - if (strstr($commandLink, '[MAC]') && array_key_exists('mac', $networkportRow) && !empty($networkportRow['mac'])) { // If "MAC" tag and networkport has MAC - $currentlyResolvedNetworkport = str_replace('[MAC]', $networkportRow['mac'], $currentlyResolvedNetworkport); + foreach ($handledTags as $currentHandledTag => $currentHandledRowsetKey) { // For each handled tags + if (strstr($commandLink, $currentHandledTag)) { // Tag in $commandLink? + if (array_key_exists($currentHandledRowsetKey, $networkportRow) && !empty($networkportRow[$currentHandledRowsetKey])) { // Matching key found in row + $currentlyResolvedValue = $networkportRow[$currentHandledRowsetKey]; + } else { + $currentlyResolvedValue = ''; // To clean this unmatched tag + } + $currentlyResolvedNetworkport = str_replace($currentHandledTag, $currentlyResolvedValue, $currentlyResolvedNetworkport); + } } - $currentlyResolvedNetworkport = str_replace('[IP]', '', $currentlyResolvedNetworkport); // Clean [IP] tag - $currentlyResolvedNetworkport = str_replace('[MAC]', '', $currentlyResolvedNetworkport); // Clean [MAC] tag - if (!empty($currentlyResolvedNetworkport)) { + + if (!empty($currentlyResolvedNetworkport)) { // If something was resolved if ($fetchItemName) { $resolvedLinks[] = array($networkportRow['name'] => $currentlyResolvedNetworkport); } else { @@ -560,21 +578,14 @@ } } } - /* /Fetches network ports */ - - if (strstr($commandLink, '[IP]')) { // Handle "IP" tag - if ($item instanceof NetworkEquipment) { // Add internal IP of this network equipment - $currentlyResolvedLink = str_replace('[IP]', $item->getField('ip'), $currentlyResolvedLink); - } - $currentlyResolvedLink = str_replace('[IP]', '', $currentlyResolvedLink); // Clean [IP] tag - } - - if (strstr($commandLink, '[MAC]')) { // Handle "MAC" tag - if ($item instanceof NetworkEquipment) { // Add internal MAC of this network equipment - $currentlyResolvedLink = str_replace('[MAC]', $item->getField('mac'), $currentlyResolvedLink); + + /* Remove/clean tags */ + foreach (array_keys($handledTags) as $currentHandledTag) { // For each handled tags + if (strstr($commandLink, $currentHandledTag)) { // Tag in $commandLink? + $currentlyResolvedLink = str_replace($currentHandledTag, '', $currentlyResolvedLink); // Clean } - $currentlyResolvedLink = str_replace('[MAC]', '', $currentlyResolvedLink); // Clean [MAC] tag } + /* /Remove/clean tags */ } if (!empty($currentlyResolvedLink)) { if ($fetchItemName) { --- shellcommands/inc/webservice.class.php Fri May 23 02:39:53 2014 +++ shellcommands/inc/webservice.class.php Fri May 23 18:34:33 2014 @@ -153,7 +153,7 @@ $target_names = (array) $params['target_name']; foreach ($target_names as $currentTargetName) { $target = new $params['target_type'](); - if ($found = $target->find('`name` LIKE \'%' . mysql_real_escape_string($currentTargetName) . '%\'')) { + if ($found = $target->find('`name` LIKE \'%' . $DB->escape($currentTargetName) . '%\'')) { $targetIds = array_merge($targetIds, array_keys($found)); } else { $invalidTargets[] = $currentTargetName;