button to fix non-canonical port names (#827)
authorAlexey Andriyanov <alan@al-an.info>
Mon, 10 Feb 2014 09:25:31 +0000 (13:25 +0400)
committerAlexey Andriyanov <alan@al-an.info>
Mon, 10 Feb 2014 09:25:31 +0000 (13:25 +0400)
shortenPortName: a caching wrapper around detectDeviceBreed and shortenIfName
renderObjectPortRow: highlight port name with yellow if it's name is not canonical
renderPortsForObject: idem, display rename link
renameObjectPorts: new ophandler

ChangeLog
wwwroot/inc/functions.php
wwwroot/inc/interface-lib.php
wwwroot/inc/interface.php
wwwroot/inc/navigation.php
wwwroot/inc/ophandlers.php
wwwroot/pix/tango-view-refresh-16x16.png [new file with mode: 0644]

index 361d585cf98a7878f136c043211506e224e9567f..cde9219caf2406ed840edad69b2581d93e6c3daf 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -24,6 +24,7 @@
        update: use suggest-menu for tag assignment
        update: show tag trace in tag title
        update: spare IPv6 prefixes are limited to nibble boundary (#959)
        update: use suggest-menu for tag assignment
        update: show tag trace in tag title
        update: spare IPv6 prefixes are limited to nibble boundary (#959)
+       update: button to fix non-canonical port names (#827)
        new feature: add IPv4 natting for all protocols (#971) by Tim Wilkes/Mark Wilkinson
        new feature: display point-to-point peers when using new 'Point-to-point' IP allocation type
 0.20.6 2013-11-29
        new feature: add IPv4 natting for all protocols (#971) by Tim Wilkes/Mark Wilkinson
        new feature: display point-to-point peers when using new 'Point-to-point' IP allocation type
 0.20.6 2013-11-29
index 927c173769b52f9e3e193ae10ba435a5c6f6e068..96ead366634e12220f05088baf9a5d03c073f9ac 100644 (file)
@@ -6115,6 +6115,16 @@ function compileExpression ($code, $do_cache_lookup = TRUE)
        return $ret;
 }
 
        return $ret;
 }
 
+// a caching wrapper around detectDeviceBreed and shortenIfName
+function shortenPortName ($if_name, $object_id)
+{
+       static $breed_cache = array();
+       if (! array_key_exists($object_id, $breed_cache))
+               $breed_cache[$object_id] = detectDeviceBreed ($object_id);
+       $breed = $breed_cache[$object_id];
+       return $breed == '' ? $if_name : shortenIfName ($if_name, $breed);
+}
+
 // returns an array of IP ranges of size $dst_mask > $netinfo['mask'], or array ($netinfo)
 function splitNetworkByMask ($netinfo, $dst_mask)
 {
 // returns an array of IP ranges of size $dst_mask > $netinfo['mask'], or array ($netinfo)
 function splitNetworkByMask ($netinfo, $dst_mask)
 {
index 4d0ac53e5cda39f210431a6899cca50e0c884afd..b172ab381c0f25bac897516fff2c4c7f7f3c231f 100644 (file)
@@ -114,6 +114,9 @@ $image['COMMIT gray']['height'] = 32;
 $image['RECALC']['path'] = 'pix/tango-view-refresh-32x32.png';
 $image['RECALC']['width'] = 32;
 $image['RECALC']['height'] = 32;
 $image['RECALC']['path'] = 'pix/tango-view-refresh-32x32.png';
 $image['RECALC']['width'] = 32;
 $image['RECALC']['height'] = 32;
+$image['recalc']['path'] = 'pix/tango-view-refresh-16x16.png';
+$image['recalc']['width'] = 16;
+$image['recalc']['height'] = 16;
 $image['clear']['path'] = 'pix/tango-edit-clear.png';
 $image['clear']['width'] = 16;
 $image['clear']['height'] = 16;
 $image['clear']['path'] = 'pix/tango-edit-clear.png';
 $image['clear']['width'] = 16;
 $image['clear']['height'] = 16;
index 3fb9371f50f769384a556e9111826aa4c190a25d..5a32a239867db99ed59fdba47e41580ab277e79f 100644 (file)
@@ -1311,11 +1311,15 @@ function renderRackProblems ($rack_id)
 
 function renderObjectPortRow ($port, $is_highlighted)
 {
 
 function renderObjectPortRow ($port, $is_highlighted)
 {
+       // highlight port name with yellow if it's name is not canonical
+       $canon_pn = shortenPortName ($port['name'], $port['object_id']);
+       $name_class = $canon_pn == $port['name'] ? '' : 'trwarning';
+
        echo '<tr';
        if ($is_highlighted)
                echo ' class=highlight';
        $a_class = isEthernetPort ($port) ? 'port-menu' : '';
        echo '<tr';
        if ($is_highlighted)
                echo ' class=highlight';
        $a_class = isEthernetPort ($port) ? 'port-menu' : '';
-       echo "><td class='tdleft' NOWRAP><a name='port-${port['id']}' class='interactive-portname nolink $a_class'>${port['name']}</a></td>";
+       echo "><td class='tdleft $name_class' NOWRAP><a name='port-${port['id']}' class='interactive-portname nolink $a_class'>${port['name']}</a></td>";
        echo "<td class=tdleft>${port['label']}</td>";
        echo "<td class=tdleft>" . formatPortIIFOIF ($port) . "</td><td class=tdleft><tt>${port['l2address']}</tt></td>";
        if ($port['remote_object_id'])
        echo "<td class=tdleft>${port['label']}</td>";
        echo "<td class=tdleft>" . formatPortIIFOIF ($port) . "</td><td class=tdleft><tt>${port['l2address']}</tt></td>";
        if ($port['remote_object_id'])
@@ -1652,6 +1656,14 @@ function renderPortsForObject ($object_id)
        // clear ports link
        echo getOpLink (array ('op'=>'deleteAll'), 'Clear port list', 'clear', '', 'need-confirmation');
 
        // clear ports link
        echo getOpLink (array ('op'=>'deleteAll'), 'Clear port list', 'clear', '', 'need-confirmation');
 
+       // rename ports link
+       $n_ports_to_rename = 0;
+       foreach ($object['ports'] as $port)
+               if ($port['name'] != shortenPortName ($port['name'], $object['id']))
+                       $n_ports_to_rename++;
+       if ($n_ports_to_rename)
+               echo '<p>' . getOpLink (array ('op'=>'renameAll'), "Auto-rename $n_ports_to_rename ports", 'recalc', 'Use RackTables naming convention for this device type') . '</p>';
+
        if (isset ($_REQUEST['hl_port_id']))
        {
                assertUIntArg ('hl_port_id');
        if (isset ($_REQUEST['hl_port_id']))
        {
                assertUIntArg ('hl_port_id');
@@ -1661,13 +1673,17 @@ function renderPortsForObject ($object_id)
        switchportInfoJS ($object_id); // load JS code to make portnames interactive
        foreach ($object['ports'] as $port)
        {
        switchportInfoJS ($object_id); // load JS code to make portnames interactive
        foreach ($object['ports'] as $port)
        {
+               // highlight port name with yellow if it's name is not canonical
+               $canon_pn = shortenPortName ($port['name'], $port['object_id']);
+               $name_class = $canon_pn == $port['name'] ? '' : 'trwarning';
+
                $tr_class = isset ($hl_port_id) && $hl_port_id == $port['id'] ? 'class="highlight"' : '';
                printOpFormIntro ('editPort', array ('port_id' => $port['id']));
                echo "<tr $tr_class><td><a name='port-${port['id']}' href='".makeHrefProcess(array('op'=>'delPort', 'port_id'=>$port['id']))."'>";
                printImageHREF ('delete', 'Unlink and Delete this port');
                echo "</a></td>\n";
                $a_class = isEthernetPort ($port) ? 'port-menu' : '';
                $tr_class = isset ($hl_port_id) && $hl_port_id == $port['id'] ? 'class="highlight"' : '';
                printOpFormIntro ('editPort', array ('port_id' => $port['id']));
                echo "<tr $tr_class><td><a name='port-${port['id']}' href='".makeHrefProcess(array('op'=>'delPort', 'port_id'=>$port['id']))."'>";
                printImageHREF ('delete', 'Unlink and Delete this port');
                echo "</a></td>\n";
                $a_class = isEthernetPort ($port) ? 'port-menu' : '';
-               echo "<td class='tdleft' NOWRAP><input type=text name=name class='interactive-portname $a_class' value='${port['name']}' size=8></td>";
+               echo "<td class='tdleft $name_class' NOWRAP><input type=text name=name class='interactive-portname $a_class' value='${port['name']}' size=8></td>";
                echo "<td><input type=text name=label value='${port['label']}'></td>";
                echo '<td>';
                if ($port['iif_id'] != 1)
                echo "<td><input type=text name=label value='${port['label']}'></td>";
                echo '<td>';
                if ($port['iif_id'] != 1)
index 4592a7dfc99c6117a8af40cf64a417aadb09671f..1a1b23bf247af8913f89d584c564cfdb585b6334 100644 (file)
@@ -229,6 +229,7 @@ $ophandler['object']['ports']['addBulkPorts'] = 'addBulkPorts';
 $ophandler['object']['ports']['useup'] = 'tableHandler';
 $ophandler['object']['ports']['delPort'] = 'tableHandler';
 $ophandler['object']['ports']['deleteAll'] = 'tableHandler';
 $ophandler['object']['ports']['useup'] = 'tableHandler';
 $ophandler['object']['ports']['delPort'] = 'tableHandler';
 $ophandler['object']['ports']['deleteAll'] = 'tableHandler';
+$ophandler['object']['ports']['renameAll'] = 'renameObjectPorts';
 $ophandler['object']['ports']['unlinkPort'] = 'unlinkPort';
 $ophandler['object']['ip']['upd'] = 'updIPAllocation';
 $ophandler['object']['ip']['add'] = 'addIPAllocation';
 $ophandler['object']['ports']['unlinkPort'] = 'unlinkPort';
 $ophandler['object']['ip']['upd'] = 'updIPAllocation';
 $ophandler['object']['ip']['add'] = 'addIPAllocation';
index 375b07bfaaa4db780ef1c3495fcc587bd67b8bfd..1d8fa5c76d82bb780e0544ce7041b0c45cdcf1c3 100644 (file)
@@ -3515,4 +3515,23 @@ function editUserProperties ()
        showFuncMessage (__FUNCTION__, 'OK', array($user['user_name']));
 }
 
        showFuncMessage (__FUNCTION__, 'OK', array($user['user_name']));
 }
 
+function renameObjectPorts()
+{
+       $object_id = getBypassValue();
+       $n = 0;
+       foreach (getObjectPortsAndLinks ($object_id) as $port)
+       {
+               $canon_pn = shortenPortName ($port['name'], $port['object_id']);
+               if ($canon_pn != $port['name'])
+               {
+                       commitUpdatePort ($object_id, $port['id'], $canon_pn, $port['oif_id'], $port['label'], $port['l2address'], $port['reservation_comment']);
+                       $n++;
+               }
+       }
+       if ($n)
+               showSuccess ("Renamed $n ports");
+       else
+               showNotice ("Nothing renamed");
+}
+
 ?>
 ?>
diff --git a/wwwroot/pix/tango-view-refresh-16x16.png b/wwwroot/pix/tango-view-refresh-16x16.png
new file mode 100644 (file)
index 0000000..cf70ceb
Binary files /dev/null and b/wwwroot/pix/tango-view-refresh-16x16.png differ