update: show appropriate message, if a record cannot be found
update: add Cisco dictionary entry for WS-CBS3030-DEL. closes ticket 225 (by jthurman)
update: add OS, router, fibre switch dictionary entries for ticket 238 (by Aaron)
+ update: allow variations of FC WWN as an L2 address (by killsystem)
bugfix: do not produce PHP warning on LivePTR tab
bugfix: wrong port type set for WS-C2950-24. closes ticket 229 (by jthurman)
bugfix: improved IOS detection and fixed a logic error. closes ticket 232 (by jthurman)
define ('RE_L2_IFCFG', '/^[0-9a-f][0-9a-f]?:[0-9a-f][0-9a-f]?:[0-9a-f][0-9a-f]?:[0-9a-f][0-9a-f]?:[0-9a-f][0-9a-f]?:[0-9a-f][0-9a-f]?$/i');
define ('RE_L2_CISCO', '/^[0-9a-f][0-9a-f][0-9a-f][0-9a-f].[0-9a-f][0-9a-f][0-9a-f][0-9a-f].[0-9a-f][0-9a-f][0-9a-f][0-9a-f]$/i');
define ('RE_L2_SOLID', '/^[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]$/i');
-define ('RE_L2_FDRYSTP', '/^[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]$/i');
define ('RE_L2_IPCFG', '/^[0-9a-f][0-9a-f]-[0-9a-f][0-9a-f]-[0-9a-f][0-9a-f]-[0-9a-f][0-9a-f]-[0-9a-f][0-9a-f]-[0-9a-f][0-9a-f]$/i');
+define ('RE_L2_WWN_COLON', '/^[0-9a-f][0-9a-f]?:[0-9a-f][0-9a-f]?:[0-9a-f][0-9a-f]?:[0-9a-f][0-9a-f]?:[0-9a-f][0-9a-f]?:[0-9a-f][0-9a-f]?:[0-9a-f][0-9a-f]?:[0-9a-f][0-9a-f]$/i');
+define ('RE_L2_WWN_HYPHEN', '/^[0-9a-f][0-9a-f]-[0-9a-f][0-9a-f]-[0-9a-f][0-9a-f]-[0-9a-f][0-9a-f]-[0-9a-f][0-9a-f]-[0-9a-f][0-9a-f]-[0-9a-f][0-9a-f]-[0-9a-f][0-9a-f]$/i');
+define ('RE_L2_WWN_SOLID', '/^[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]$/i');
define ('RE_IP4_ADDR', '/^[0-9][0-9]?[0-9]?\.[0-9]?[0-9]?[0-9]?\.[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?$/i');
define ('RE_IP4_NET', '/^[0-9][0-9]?[0-9]?\.[0-9]?[0-9]?[0-9]?\.[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?\/[0-9][0-9]?$/i');
return '';
}
-function searchByl2address ($port_l2address)
-{
- if (NULL === ($db_l2address = l2addressForDatabase ($port_l2address)))
- return NULL; // Don't complain, other searches may return own data.
- $query = "select object_id, Port.id as port_id from RackObject as ro inner join Port on ro.id = Port.object_id " .
- "where l2address = '${db_l2address}'";
- $result = useSelectBlade ($query, __FUNCTION__);
- $rows = $result->fetchAll (PDO::FETCH_ASSOC);
- $result->closeCursor();
- if (count ($rows) == 0) // No results.
- return NULL;
- if (count ($rows) == 1) // Target found.
- return $rows[0];
- showError ('More than one results was found. This is probably a broken unique key.', __FUNCTION__);
- return NULL;
-}
-
function getIPv4PrefixSearchResult ($terms)
{
$byname = getSearchResultByField
$ret[$objRecord['id']]['id'] = $objRecord['id'];
$ret[$objRecord['id']]['by_sticker'] = $objRecord['by_sticker'];
}
- foreach (getPortRsvSearchResults ($what) as $objRecord)
+ foreach (getPortSearchResults ($what) as $objRecord)
{
$ret[$objRecord['id']]['id'] = $objRecord['id'];
- $ret[$objRecord['id']]['by_portrsv'] = $objRecord['by_portrsv'];
+ $ret[$objRecord['id']]['by_port'] = $objRecord['by_port'];
}
foreach (getObjectAttrsSearchResults ($what) as $objRecord)
{
return $ret;
}
-// search in port "reservation comment" column
-function getPortRsvSearchResults ($what)
+// search in port "reservation comment" and "L2 address" columns
+function getPortSearchResults ($what)
{
$ports = getSearchResultByField
(
foreach ($ports as $port)
{
$ret[$port['object_id']]['id'] = $port['object_id'];
- $ret[$port['object_id']]['by_portrsv'][] = $port['id'];
+ $ret[$port['object_id']]['by_port'][] = $port['id'];
+ }
+ if (NULL === ($db_l2address = l2addressForDatabase ($what)))
+ return $ret;
+ $ports = getSearchResultByField
+ (
+ 'Port',
+ array ('object_id', 'id'),
+ 'l2address',
+ $db_l2address,
+ 'object_id',
+ 2
+ );
+ foreach ($ports as $port)
+ {
+ $ret[$port['object_id']]['id'] = $port['object_id'];
+ $ret[$port['object_id']]['by_port'][] = $port['id'];
}
return $ret;
}
}
}
-// This function removes all colons and dots from a string.
+// Return a uniformly (010203040506 or 0102030405060708) formatted address, if it is present
+// in the provided string, an empty string for an empty string or NULL for error.
function l2addressForDatabase ($string)
{
$string = strtoupper ($string);
switch (TRUE)
{
- case ($string == '' or preg_match (RE_L2_SOLID, $string)):
+ case ($string == '' or preg_match (RE_L2_SOLID, $string) or preg_match (RE_L2_WWN_SOLID, $string)):
return $string;
- case (preg_match (RE_L2_IFCFG, $string)):
- $pieces = explode (':', $string);
- // This workaround is for SunOS ifconfig.
- foreach ($pieces as &$byte)
- if (strlen ($byte) == 1)
- $byte = '0' . $byte;
- // And this workaround is for PHP.
- unset ($byte);
- return implode ('', $pieces);
+ case (preg_match (RE_L2_IFCFG, $string) or preg_match (RE_L2_WWN_COLON, $string)):
+ // reformat output of SunOS ifconfig
+ $ret = '';
+ foreach (explode (':', $string) as $byte)
+ $ret .= (strlen ($byte) == 1 ? '0' : '') . $byte;
+ return $ret;
case (preg_match (RE_L2_CISCO, $string)):
- return implode ('', explode ('.', $string));
- case (preg_match (RE_L2_IPCFG, $string)):
- return implode ('', explode ('-', $string));
+ return str_replace ('.', '', $string);
+ case (preg_match (RE_L2_IPCFG, $string) or preg_match (RE_L2_WWN_HYPHEN, $string)):
+ return str_replace ('-', '', $string);
default:
return NULL;
}
switch (strlen ($string))
{
case 12: // Ethernet
- case 16: // FireWire
+ case 16: // FireWire/Fibre Channel
$ret = implode (':', str_split ($string, 2));
break;
default:
return;
}
$nhits = 0;
- // If we search for L2 address, we can either find one or find none.
- if
- (
- preg_match (RE_L2_IFCFG, $terms) or
- preg_match (RE_L2_SOLID, $terms) or
- preg_match (RE_L2_CISCO, $terms) or
- preg_match (RE_L2_IPCFG, $terms) or
- // Foundry STP bridge ID: bridge priotity + port MAC address. Cut off first 4 chars and look for MAC address.
- preg_match (RE_L2_FDRYSTP, $terms)
- )
- // Search for L2 address.
- {
- $terms = str_replace ('.', '', $terms);
- $terms = str_replace (':', '', $terms);
- $terms = str_replace ('-', '', $terms);
- $terms = substr ($terms, -12);
- $result = searchByl2address ($terms);
- if ($result !== NULL)
- {
- $nhits++;
- $lasthit = 'port';
- $summary['port'][] = $result;
- }
- }
- elseif (preg_match (RE_IP4_ADDR, $terms))
+ if (preg_match (RE_IP4_ADDR, $terms))
// Search for IPv4 address.
{
if (NULL !== getIPv4AddressNetworkId ($terms))
$record = current ($summary[$lasthit]);
switch ($lasthit)
{
- case 'port':
- echo "<script language='Javascript'>document.location='${root}?page=object";
- echo "&hl_port_id=" . $record['port_id'];
- echo "&object_id=" . $record['object_id'] . "';//</script>";
- break;
case 'ipv4addressbydq':
$parentnet = getIPv4AddressNetworkId ($record);
if ($parentnet !== NULL)
}
echo '</table>';
}
- if (isset ($obj['by_portrsv']))
+ if (isset ($obj['by_port']))
{
echo '<table>';
$ports = getObjectPortsAndLinks ($obj['id']);
- foreach ($obj['by_portrsv'] as $port_id)
+ foreach ($obj['by_port'] as $port_id)
foreach ($ports as $port)
if ($port['id'] == $port_id)
{
- echo "<tr><td>port ${port['name']} (${port['type']}):</td>";
+ echo "<tr><td>port ${port['name']} (${port['type']} ${port['l2address']}):</td>";
echo "<td class=tdleft>${port['reservation_comment']}</td></tr>";
break; // next reason
}