r2946 - renderSearchResults(): discard detection of L2 addresses, it is now a sub...
authorDenis Ovsienko <infrastation@yandex.ru>
Tue, 14 Jul 2009 21:51:09 +0000 (21:51 +0000)
committerDenis Ovsienko <infrastation@yandex.ru>
Tue, 14 Jul 2009 21:51:09 +0000 (21:51 +0000)
 - searchByl2address(): sayonara
 - getPortRsvSearchResults(): rename to getPortSearchResults(), also look in "l2address", when argument qualifies
 - l2addressForDatabase(): also consider RE_L2_WWN_COLON, RE_L2_WWN_HYPHEN, RE_L2_WWN_SOLID regexps

ChangeLog
inc/config.php
inc/database.php
inc/functions.php
inc/interface.php

index 42b516fe91fcef0c5bb43da21a0c91442831c2e5..7214d33f588af6ec0e3ecae54da2b1964e338acc 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -6,6 +6,7 @@
        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)
index f0e5b06ac0463ce08a77ff283b49a31e7b1ddc43..fec0824d988b465de1ac5ebfcc5055becbf4b83a 100644 (file)
@@ -20,8 +20,10 @@ define ('AUTOTAGNAME_REGEXP', '^\$[[:alnum:]]([\. _~-]?[[:alnum:]])*$');
 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');
 
index 670e34421895fa55eee84b7c1ee42c842c95ce6e..2319d7bf34b8cf48f6207725f77053ed61a0a892 100644 (file)
@@ -1417,23 +1417,6 @@ function unbindIpFromObject ($ip='', $object_id=0)
        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
@@ -1628,10 +1611,10 @@ function getObjectSearchResults ($what)
                $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)
        {
@@ -1688,8 +1671,8 @@ function getStickerSearchResults ($what, $exactness = 0)
        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
        (
@@ -1704,7 +1687,23 @@ function getPortRsvSearchResults ($what)
        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;
 }
index 3b94d66934998c2d9c55b38c12fa9077d085e3e4..895e5dc50223d5bbd9a892479f517adad1393198 100644 (file)
@@ -536,27 +536,25 @@ function markupObjectProblems (&$rackData)
                        }
 }
 
-// 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;
        }
@@ -567,7 +565,7 @@ function l2addressFromDatabase ($string)
        switch (strlen ($string))
        {
                case 12: // Ethernet
-               case 16: // FireWire
+               case 16: // FireWire/Fibre Channel
                        $ret = implode (':', str_split ($string, 2));
                        break;
                default:
index 1e656b44fdb0d17cac4cb33d6051a3b3f266cabc..01b0e04e0278b4a52d4551a0b32976a86dc345f8 100644 (file)
@@ -2714,31 +2714,7 @@ function renderSearchResults ()
                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))
@@ -2826,11 +2802,6 @@ function renderSearchResults ()
                $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)
@@ -2913,15 +2884,15 @@ function renderSearchResults ()
                                                        }
                                                        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
                                                                        }