Revert 9 commits specific to patch panels
authorDenis Ovsienko <infrastation@yandex.ru>
Mon, 18 Nov 2013 11:54:21 +0000 (15:54 +0400)
committerDenis Ovsienko <infrastation@yandex.ru>
Mon, 18 Nov 2013 11:54:21 +0000 (15:54 +0400)
This reverts the following commits (no conflicts):

6071555
cf54c36
bfce8a3
2381357
d884661
f129eb6
a4b6536
68dc69c
597896f

ChangeLog
wwwroot/inc/database.php
wwwroot/inc/functions.php
wwwroot/inc/interface-lib.php
wwwroot/inc/interface.php
wwwroot/inc/popup.php
wwwroot/inc/upgrade.php

index 721a95f07868f3c15c644a65e14af6005ae35ac6..7dbb38add550f7a8a23ccf5c1bf9cd76a3f8eeca 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -17,7 +17,6 @@
        bugfix: blade objects with problems should be colored red (#1071) by Mark Wilkinson
        update: display friendlier message when attempting to NAT non-existent IP (#963)
        update: support of Huawei CE5800 series switch
-       update: port type can now be changed even if port is linked
        update: mgmt link on FQDN (telnet, ssh, rdp) now supports any protocol (MGMT_PROTOS config var)
        update: replace CodePress highlighter with CodeMirror (by Mark Jazmik)
        update: display links to newly created rows & locations (#883)
index a99f52df0973cb361ba232fa05442ad724ef2bc2..e31f6b8d51c18f9ece621149ffaaf1a09898cf3e 100644 (file)
@@ -837,10 +837,9 @@ SELECT
        Link.cable AS cableid,
        IF(Link.porta = Port.id, Link.portb, Link.porta) AS remote_id,
        rp.name AS remote_name,
-       rp.iif_id AS remote_iif_id,
-       rp.type AS remote_oif_id,
        rp.object_id AS remote_object_id,
        ro.name AS remote_object_name,
+       Dictionary.dict_value AS remote_object_type,
        (SELECT COUNT(*) FROM PortLog WHERE PortLog.port_id = rp.id) AS log_count,
        PortLog.user,
        UNIX_TIMESTAMP(PortLog.date) AS time
@@ -850,55 +849,54 @@ FROM
        LEFT JOIN Link ON Port.id = Link.porta OR Port.id = Link.portb
        LEFT JOIN Port AS rp ON (IF(Link.porta = Port.id, Link.portb, Link.porta)) = rp.id
        LEFT JOIN Object AS ro ON rp.object_id = ro.id
+       LEFT JOIN Dictionary ON ro.objtype_id = Dictionary.dict_key
        LEFT JOIN PortLog ON PortLog.id = (SELECT id FROM PortLog WHERE PortLog.port_id = rp.id ORDER BY date DESC LIMIT 1)
 WHERE
        $sql_where_clause
-ORDER BY Port.id
 END;
 
        $result = usePreparedSelectBlade ($query, $query_params);
+       $id = 0;
        $ret = array();
-       $last_id = NULL;
        while ($row = $result->fetch (PDO::FETCH_ASSOC))
        {
-               // create a temporary array containing link info
-               $link_details = array
-               (
-                       'link_id' => $row['link_id'],
-                       'cableid' => $row['cableid'],
-                       'remote_id' => $row['remote_id'],
-                       'remote_name' => $row['remote_name'],
-                       'remote_iif_id' => $row['remote_iif_id'],
-                       'remote_oif_id' => $row['remote_oif_id'],
-                       'remote_object_id' => $row['remote_object_id'],
-                       'remote_object_name' => $row['remote_object_name'],
-               );
-               $log_details = array
-               (
-                       'user' => $row['user'],
-                       'time' => $row['time'],
-               );
+               $row['l2address'] = l2addressFromDatabase ($row['l2address']);
 
-               // see if this row represents an actual port or just an additional link
-               if ($row['id'] !== $last_id)
+               // last changed log
+               $row['last_log'] = array();
+               if ($row['log_count'])
                {
-                       $portinfo = array_sub ($row, $link_details + $log_details);
-                       $portinfo['l2address'] = l2addressFromDatabase ($row['l2address']);
-                       $portinfo['linked'] = isset ($row['remote_id']) ? 1 : 0;
-                       $portinfo['links'] = array();
-                       $portinfo['last_log'] = $row['log_count'] ? $log_details : array();
-                       // To maintain compatibility with 802.1Q, LLDP and some other functions,
-                       // append details of the first link to the main array.
-                       // The same info will exist in the $links sub-array, used in other ways.
-                       if (isset ($row['remote_id']))
-                               $portinfo = $portinfo + $link_details;
-
-                       $ret[$portinfo['id']] = $portinfo;
+                       $row['last_log']['user'] = $row['user'];
+                       $row['last_log']['time'] = $row['time'];
                }
+               unset ($row['user'], $row['time']);
+
+               // create a temporary array containing link info
+               $row['linked'] = 0;
+               $link_details = array();
                if (isset ($row['remote_id']))
-                       array_push ($ret[$row['id']]['links'], $link_details);
+               {
+                       $row['linked'] = 1;
+                       $remote_object_name = empty($row['remote_object_name']) ? '['.$row['remote_object_type'].']' : $row['remote_object_name'];
+                       $link_details = array
+                       (
+                               'link_id' => $row['link_id'],
+                               'cableid' => $row['cableid'],
+                               'remote_id' => $row['remote_id'],
+                               'remote_name' => $row['remote_name'],
+                               'remote_object_id' => $row['remote_object_id'],
+                               'remote_object_name' => $remote_object_name,
+                       );
+                       $link_details['last_log'] = $row['last_log'];
+               }
+               unset ($row['cableid'], $row['remote_id'], $row['remote_name'], $row['remote_object_id'], $row['remote_object_name']);
 
-               $last_id = $row['id'];
+               // see if this row represents an actual port or just an additional link
+               if ($row['id'] != $id)
+                       $ret[$row['id']] = $row;
+               if (count ($link_details))
+                       $ret[$row['id']]['links'][] = $link_details;
+               $id = $row['id'];
        }
        return $ret;
 }
@@ -4717,38 +4715,16 @@ function getPortInterfaceCompat()
 
 // Return a set of options for a plain SELECT. These options include the current
 // OIF of the given port and all OIFs of its permanent IIF.
-// If given port is already linked once, return only types compatible with the remote port's type 
 function getExistingPortTypeOptions ($port_id)
 {
-       $portinfo = getPortInfo ($port_id);
-       if ($portinfo['linked'])
-       {
-               // there are multiple links, calculating compatibility is too costly
-               if (count ($portinfo['links']) > 1)
-                       return NULL;
-
-               // there is a single link
-               $result = usePreparedSelectBlade
-               (
-                       'SELECT DISTINCT oif_id, dict_value AS oif_name ' .
-                       'FROM PortInterfaceCompat INNER JOIN Dictionary ON oif_id = dict_key ' .
-                       'LEFT JOIN PortCompat pc1 ON oif_id = pc1.type1 AND pc1.type2 = ? ' .
-                       'LEFT JOIN PortCompat pc2 ON oif_id = pc1.type2 AND pc2.type1 = ? ' .
-                       'WHERE iif_id = ? ' .
-                       'AND (pc1.type1 IS NOT NULL OR pc2.type2 IS NOT NULL) ' .
-                       'ORDER BY oif_name',
-                       array ($portinfo['links'][0]['remote_oif_id'], $portinfo['links'][0]['remote_oif_id'], $portinfo['links'][0]['remote_iif_id'])
-               );
-       }
-       else
-               $result = usePreparedSelectBlade
-               (
-                       'SELECT oif_id, dict_value AS oif_name ' .
-                       'FROM PortInterfaceCompat INNER JOIN Dictionary ON oif_id = dict_key ' .
-                       'WHERE iif_id = (SELECT iif_id FROM Port WHERE id = ?) ' .
-                       'ORDER BY oif_name',
-                       array ($port_id)
-               );
+       $result = usePreparedSelectBlade
+       (
+               'SELECT oif_id, dict_value AS oif_name ' .
+               'FROM PortInterfaceCompat INNER JOIN Dictionary ON oif_id = dict_key ' .
+               'WHERE iif_id = (SELECT iif_id FROM Port WHERE id = ?) ' .
+               'ORDER BY oif_name',
+               array ($port_id)
+       );
        return reduceSubarraysToColumn (reindexByID ($result->fetchAll (PDO::FETCH_ASSOC), 'oif_id'), 'oif_name');
 }
 
index b62ca4443b9b7be305d0b38fff5035f5d54e2e0c..c2ccc80bb32e0f2737e7c3f08c0ac9d30f5c6780 100644 (file)
@@ -4576,17 +4576,14 @@ function formatPort ($port_info, $a_class = '')
 // function returns a HTML-formatted link to remote port, connected to the specified port
 function formatLinkedPort ($port_info, $a_class = '')
 {
-       if (! $link_info = array_first ($port_info['links']))
-               return formatPort ($port_info, $a_class);
-       else
-               return formatPortLink
-               (
-                       $link_info['remote_object_id'],
-                       $link_info['remote_object_name'],
-                       $link_info['remote_id'],
-                       $link_info['remote_name'],
-                       $a_class
-               );
+       return formatPortLink
+       (
+               $port_info['remote_object_id'],
+               $port_info['remote_object_name'],
+               $port_info['remote_id'],
+               $port_info['remote_name'],
+               $a_class
+       );
 }
 
 function compareDecomposedPortNames ($porta, $portb)
index 220670cfd0aaccfdd28599b70974503280f22fab..eb11f441fac35465f87e2048c4495cd911f5890b 100644 (file)
@@ -916,29 +916,6 @@ function getOpLink ($params, $title,  $img_name = '', $comment = '', $class = ''
        return $ret;
 }
 
-function getPopupLink ($helper, $params, $window_name = '', $img_name = '', $title = '', $comment = '', $class = '')
-{
-       $popup_args = 'height=700, width=700, location=no, menubar=no, resizable=yes, scrollbars=yes, status=no, titlebar=no, toolbar=no';
-       $ret = '<a href="#"';
-       $class = trim ($class);
-       if (! empty ($class))
-               $ret .= ' class="' . htmlspecialchars ($class, ENT_QUOTES) . '"';
-       if (! empty ($comment))
-               $ret .= 'title="' . htmlspecialchars ($comment, ENT_QUOTES) . '"';
-       $href = makeHrefForHelper ($helper, $params);
-       $ret .= " onclick=\"window.open('$href', '$window_name', '$popup_args'); return false\">";
-
-       if (! empty ($img_name))
-       {
-               $ret .= getImageHREF ($img_name, $comment);
-               if (! empty ($title))
-                       $ret .= ' ';
-       }
-       $ret .= $title;
-       $ret .= '</a>';
-       return $ret;
-}
-
 function renderProgressBar ($percentage = 0, $theme = '', $inline = FALSE)
 {
        echo getProgressBar ($percentage, $theme, $inline);
@@ -991,25 +968,19 @@ function getRenderedIPPortPair ($ip, $port = NULL)
 // appropriate, and some extra hidden inputs, if requested.
 // Use special encoding for upload forms
 function printOpFormIntro ($opname, $extra = array(), $upload = FALSE)
-{
-       echo getOpFormIntro ($opname, $extra, $upload);
-}
-
-function getOpFormIntro ($opname, $extra = array(), $upload = FALSE)
 {
        global $pageno, $tabno, $page;
-       $ret = '';
 
-       $ret = "<form method=post id=${opname} name=${opname} action='?module=redirect&page=${pageno}&tab=${tabno}&op=${opname}'";
+       echo "<form method=post id=${opname} name=${opname} action='?module=redirect&page=${pageno}&tab=${tabno}&op=${opname}'";
        if ($upload)
-               $ret .= " enctype='multipart/form-data'";
-       $ret .= ">";
+               echo " enctype='multipart/form-data'";
+       echo ">";
        fillBypassValues ($pageno, $extra);
        foreach ($extra as $inputname => $inputvalue)
-               $ret .= sprintf ('<input type=hidden name="%s" value="%s">', htmlspecialchars ($inputname, ENT_QUOTES), htmlspecialchars ($inputvalue, ENT_QUOTES));
-       return $ret;
+               printf ('<input type=hidden name="%s" value="%s">', htmlspecialchars ($inputname, ENT_QUOTES), htmlspecialchars ($inputvalue, ENT_QUOTES));
 }
 
+
 // Display hrefs for all of a file's parents. If scissors are requested,
 // prepend cutting button to each of them.
 function serializeFileLinks ($links, $scissors = FALSE)
index 7da59894c7592e7633f524f773aa07f603939947..4363373045c778dceeaf09fa5a98fb9ec815fc89 100644 (file)
@@ -967,8 +967,14 @@ function renderEditObjectForm()
                }
                echo "<tr><td>&nbsp;</td>";
                echo "<th class=tdright>Select container:</th><td class=tdleft>";
-               echo getPopupLink ('objlist', array ('object_id' => $object_id), 'findlink', 'attach', 'Select a container');
-               echo "</td></tr>\n";
+               echo "<span";
+               $helper_args = array ('object_id' => $object_id);
+               $popup_args = 'height=700, width=400, location=no, menubar=no, '.
+                       'resizable=yes, scrollbars=yes, status=no, titlebar=no, toolbar=no';
+               echo " onclick='window.open(\"" . makeHrefForHelper ('objlist', $helper_args);
+               echo "\",\"findlink\",\"${popup_args}\");'>";
+               printImageHREF ('attach', 'Select a container');
+               echo "</span></td></tr>\n";
        }
        // optional attributes
        $i = 0;
@@ -1189,29 +1195,51 @@ function renderRackProblems ($rack_id)
 
 function renderObjectPortRow ($port, $is_highlighted)
 {
-       $tr_class = $is_highlighted ? 'class=highlight' : '';
-       echo "<tr $tr_class>";
+       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='ancor interactive-portname nolink $a_class'>${port['name']}</a></td>";
+       echo "><td class='tdleft' NOWRAP><a name='port-${port['id']}' class='ancor 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['linked'])
-               echo implode ('', formatPortReservation ($port)) . '<td></td>';
-       else
-       {
+       $links = array ();
+       if ($port['linked'] == 1)
+       {
+               $links = $port['links'];
+               echo '<td class=tdleft>'.formatLoggedSpan ($links[0]['last_log'], formatPortLink ($links[0]['remote_object_id'], $links[0]['remote_object_name'], $links[0]['remote_id'], NULL)).'</td>';
+               echo '<td class=tdleft>'.formatLoggedSpan ($links[0]['last_log'], $links[0]['remote_name'], 'underline').'&nbsp;';
+               $helper_args = array ('port' => $port['id']);
+               $popup_args = 'height=700, width=700, location=no, menubar=no, resizable=yes, scrollbars=yes, status=no, titlebar=no, toolbar=no';
+               echo "<span onclick='window.open(\"" . makeHrefForHelper ('traceroute', $helper_args);
+               echo "\",\"findlink\",\"${popup_args}\");'>";
+               printImageHREF ('find', 'Trace this port');
+               echo '</span></td>';
                $editable = permitted ('object', 'ports', 'editPort')? 'editable' : '';
-               $sep = '';
-               foreach ($port['links'] as $linkinfo)
+               echo "<td class=tdleft><span class='rsvtext $editable id-".$links[0]['link_id']." op-upd-reservation-cable'>".$links[0]['cableid'].'</span></td>';
+               // display other links, if any
+               if (count ($links) > 1)
                {
-                       $trace_link = ($sep == '') ? '&nbsp;' . getPopupLink ('traceroute', array ('port' => $port['id']), 'findlink', 'find', '', 'Trace this port') : '';
-                       echo $sep;
-                       $sep = "</tr>\n<tr $tr_class><td colspan=4></td>";
-                       echo '<td class=tdleft>'.formatLoggedSpan ($port['last_log'], formatPortLink ($linkinfo['remote_object_id'], $linkinfo['remote_object_name'], $linkinfo['remote_id'], NULL)).'</td>';
-                       echo '<td class=tdleft>'.formatLoggedSpan ($port['last_log'], $linkinfo['remote_name'], 'underline').$trace_link.'</td>';
-                       echo "<td class=tdleft><span class='rsvtext $editable id-".$linkinfo['link_id']." op-upd-reservation-cable'>".$linkinfo['cableid'].'</span></td>';
+                       // finish off the current row
+                       echo "</tr>\n";
+
+                       // place each link on a new row
+                       for ($i=1; $i<count($links); $i++) {
+                               echo '<tr';
+                               if ($is_highlighted)
+                                       echo ' class=highlight';
+                               echo "><td class=tdleft colspan=4>&nbsp;</td>";
+                               echo '<td class=tdleft>'.formatLoggedSpan ($links[$i]['last_log'], formatPortLink ($links[$i]['remote_object_id'], $links[$i]['remote_object_name'], $links[$i]['remote_id'], NULL)).'</td>';
+                               echo '<td class=tdleft>'.formatLoggedSpan ($links[$i]['last_log'], $links[$i]['remote_name'], 'underline').'</td>';
+                               $editable = permitted ('object', 'ports', 'editPort')? 'editable' : '';
+                               echo "<td class=tdleft><span class='rsvtext $editable id-".$links[$i]['link_id']." op-upd-reservation-cable'>".$links[$i]['cableid']."</span></td></tr>\n";
+                       }
                }
        }
-       echo "</tr>\n";
+       else
+               echo implode ('', formatPortReservation ($port)) . '<td></td>';
+       // if there are 1 or fewer links, we need to conclude the row (otherwise it would have been done already)
+       if (count ($links) <= 1)
+               echo "</tr>\n";
 }
 
 function renderObject ($object_id)
@@ -1320,7 +1348,13 @@ function renderObject ($object_id)
                        $hl_port_id = $_REQUEST['hl_port_id'];
                        addAutoScrollScript ("port-$hl_port_id");
                }
-               echo getPopupLink ('traceroute', array ('object_id' => $object_id), 'findlink', 'find', 'Trace all port links');
+               $helper_args = array ('object_id' => $object_id);
+               $popup_args = 'height=700, width=700, location=no, menubar=no, resizable=yes, scrollbars=yes, status=no, titlebar=no, toolbar=no';
+               echo "<a href='javascript:;' ";
+               echo "onclick='window.open(\"" . makeHrefForHelper ('traceroute', $helper_args);
+               echo "\",\"findlink\",\"${popup_args}\");'>";
+               printImageHREF ('find', 'Trace all port links');
+               echo 'Trace all ports</a>';
                echo "<table border=0 cellspacing=0 cellpadding='5' align='center' class='widetable'>";
                echo '<tr><th class=tdleft>Local name</th><th class=tdleft>Visible label</th>';
                echo '<th class=tdleft>Interface</th><th class=tdleft>L2 address</th>';
@@ -1525,19 +1559,29 @@ function renderPortsForObject ($object_id)
        }
 
        // clear ports link
-       echo getOpLink (array ('op'=>'deleteAll'), 'Clear port list', 'clear', 'Delete all existing ports', 'need-confirmation');
+       echo "<a href='".
+               makeHrefProcess(array ('op'=>'deleteAll')).
+               "' onclick=\"javascript:return confirm('Are you sure you want to delete all existing ports?')\">" . getImageHREF ('clear', 'Clear port list') . " Clear port list</a>";
 
        // link patch panels link
        if ($object['objtype_id'] == 9)
        {
-               echo '<span style="margin-left: 2em">';
-               echo getPopupLink ('patchpanellist', array ('object_id' => $object_id), 'findlink', 'plug', 'Link to another patch panel');
-               echo '</span>';
+               $helper_args = array ('object_id' => $object_id);
+               $popup_args = 'height=700, width=400, location=no, menubar=no, resizable=yes, scrollbars=yes, status=no, titlebar=no, toolbar=no';
+               echo "&nbsp;&nbsp;&nbsp;&nbsp;<a href='javascript:;' ";
+               echo "onclick='window.open(\"" . makeHrefForHelper ('patchpanellist', $helper_args);
+               echo "\",\"findlink\",\"${popup_args}\");'>";
+               printImageHREF ('plug', 'Link to another patch panel');
+               echo 'Link to another patch panel</a>';
        }
 
-       echo '<span style="margin-left: 2em">';
-       echo getPopupLink ('traceroute', array ('object_id' => $object_id), 'findlink', 'find', 'Trace all port links');
-       echo '</span>';
+       $helper_args = array ('object_id' => $object_id);
+       $popup_args = 'height=700, width=700, location=no, menubar=no, resizable=yes, scrollbars=yes, status=no, titlebar=no, toolbar=no';
+       echo "&nbsp;&nbsp;&nbsp;&nbsp;<a href='javascript:;' ";
+       echo "onclick='window.open(\"" . makeHrefForHelper ('traceroute', $helper_args);
+       echo "\",\"findlink\",\"${popup_args}\");'>";
+       printImageHREF ('find', 'Trace all port links');
+       echo 'Trace all ports</a>';
 
        echo "<table border=0 cellspacing=0 cellpadding='5' align='center' class='widetable'>\n";
        echo "<tr><th>&nbsp;</th><th class=tdleft>Local name</th><th class=tdleft>Visible label</th><th class=tdleft>Interface</th><th class=tdleft>L2 address</th>";
@@ -1554,53 +1598,90 @@ function renderPortsForObject ($object_id)
        switchportInfoJS ($object_id); // load JS code to make portnames interactive
        foreach ($object['ports'] as $port)
        {
+               $links = array ();
                $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' NOWRAP><input type=text name='port-${port['id']}' class='interactive-portname $a_class' value='${port['name']}' size=8></td>";
                echo "<td><input type=text name=label value='${port['label']}'></td>";
-               echo '<td class=tdleft>';
-               if (count ($port['links']) <= 1)
+               if ($port['linked'] == 0)
                {
+                       echo '<td>';
                        if ($port['iif_id'] != 1)
                                echo '<label>' . $port['iif_name'] . ' ';
                        printSelect (getExistingPortTypeOptions ($port['id']), array ('name' => 'port_type_id'), $port['oif_id']);
                        if ($port['iif_id'] != 1)
                                echo '</label>';
+                       echo '</td>';
                }
                else
                {
-                       echo "<input type=hidden name=port_type_id value='${port['oif_id']}'>";
-                       echo formatPortIIFOIF ($port);
+                       echo "<input type=hidden name=port_type_id value='${port['oif_id']}'><td class=tdleft>";
+                       echo formatPortIIFOIF ($port) . '</td>';
                }
-               echo '</td>';
                // 18 is enough to fit 6-byte MAC address in its longest form,
                // while 24 should be Ok for WWN
                echo "<td><input type=text name=l2address value='${port['l2address']}' size=18 maxlength=24></td>\n";
-               if ($port['linked'])
-               {
-                       $sep = '';
-                       foreach ($port['links'] as $linkinfo)
+               if ($port['linked'] == 1)
+               {
+                       $links = $port['links'];
+                       echo "<input type=hidden name=reservation_comment value=''>";
+                       echo "<input type=hidden name=link_id value='".$links[0]['link_id']."'>";
+                       echo '<td class=tdleft>'.formatLoggedSpan ($port['last_log'], formatPortLink ($links[0]['remote_object_id'], $links[0]['remote_object_name'], $links[0]['remote_id'], NULL)).'</td>';
+                       echo '<td class=tdleft>'.formatLoggedSpan ($port['last_log'], $links[0]['remote_name'], 'underline').'&nbsp;';
+                       $helper_args = array ('port' => $port['id']);
+                       $popup_args = 'height=700, width=700, location=no, menubar=no, resizable=yes, scrollbars=yes, status=no, titlebar=no, toolbar=no';
+                       echo "<span onclick='window.open(\"" . makeHrefForHelper ('traceroute', $helper_args);
+                       echo "\",\"findlink\",\"${popup_args}\");'>";
+                       printImageHREF ('find', 'Trace this port');
+                       echo '</span></td>';
+
+                       echo "<td><input type=text name=cable value='".$links[0]['cableid']."'></td>";
+                       echo '<td class=tdcenter><span';
+                       $helper_args = array ('port' => $port['id'], 'in_rack' => 'on');
+                       $popup_args = 'height=700, width=400, location=no, menubar=no, resizable=yes, scrollbars=yes, status=no, titlebar=no, toolbar=no';
+                       echo " onclick='window.open(\"" . makeHrefForHelper ('portlist', $helper_args);
+                       echo "\",\"findlink\",\"${popup_args}\");'>";
+                       printImageHREF ('plug', 'Link this port');
+                       echo "</span>&nbsp;<a href='".
+                               makeHrefProcess(array(
+                                       'op'=>'unlinkPort',
+                                       'link_id'=>$links[0]['link_id'],
+                                       'object_id'=>$object_id)).
+                               "'>";
+                       printImageHREF ('cut', 'Unlink this port');
+                       echo '</a></td>';
+                       // display other links, if any
+                       if (count($links) > 1)
                        {
-                               $trace_link = ($sep == '') ? '&nbsp;' . getPopupLink ('traceroute', array ('port' => $port['id']), 'findlink', 'find', '', 'Trace this port') : '';
-                               echo $sep;
-                               $sep = '<td>' . getImageHREF ('save', 'Save changes', TRUE) . "</td></form></tr>\n";
-                               $sep .= getOpFormIntro ('editPort', array ('port_id' => $port['id'], 'name' => $port['name'], 'link_id' => $linkinfo['link_id']));
-                               $sep .= "<tr $tr_class><td colspan=4>&nbsp;</td><td class=tdleft>";
-
-                               echo "<input type=hidden name=reservation_comment value=''>";
-                               echo "<input type=hidden name=link_id value='".$linkinfo['link_id']."'>";
-                               echo '<td class=tdleft>'.formatLoggedSpan ($port['last_log'], formatPortLink ($linkinfo['remote_object_id'], $linkinfo['remote_object_name'], $linkinfo['remote_id'], NULL)).'</td>';
-                               echo '<td class=tdleft>'.formatLoggedSpan ($port['last_log'], $linkinfo['remote_name'], 'underline').$trace_link.'</td>';
-                               echo "<td><input type=text name=cable value='".$linkinfo['cableid']."'></td>";
-                               echo '<td class=tdcenter>';
-                               echo getPopupLink ('portlist', array ('port' => $port['id'], 'in_rack' => 'on'), 'findlink', 'plug', '', 'Link this port');
-                               echo '<span style="margin-left: 2em">';
-                               echo getOpLink (array ('op'=>'unlinkPort', 'link_id'=>$linkinfo['link_id'], 'object_id'=>$object_id), '', 'cut', 'Unlink this port');
-                               echo '</span></td>';
+                               // finish off the current row
+                               echo '<td>';
+                               printImageHREF ('save', 'Save changes', TRUE);
+                               echo "</td></form></tr>\n";
+
+                               // place each link on a new row
+                               for ($i=1; $i<count($links); $i++)
+                               {
+                                       printOpFormIntro ('editPort', array ('port_id' => $port['id']));
+                                       echo "<input type=hidden name=name value='".$links[$i]['remote_name']."'>";
+                                       echo "<input type=hidden name=link_id value='".$links[$i]['link_id']."'>";
+                                       echo "<tr $tr_class><td colspan=5>&nbsp;</td><td class=tdleft>";
+                                       echo formatLoggedSpan ($links[$i]['last_log'], formatPortLink ($links[$i]['remote_object_id'], $links[$i]['remote_object_name'], $links[$i]['remote_id'], NULL));
+                                       echo '</td><td class=tdleft>'.formatLoggedSpan ($links[$i]['last_log'], $links[$i]['remote_name'], 'underline').'</td>';
+                                       echo "<td><input type=text name=cable value='".$links[$i]['cableid']."'></td><td class=tdcenter><a href='".
+                                               makeHrefProcess(array(
+                                                       'op'=>'unlinkPort',
+                                                       'link_id'=>$links[$i]['link_id'],
+                                                       'object_id'=>$object_id)).
+                                               "'>";
+                                       printImageHREF ('cut', 'Unlink this port');
+                                       echo '</a></td><td>';
+                                       printImageHREF ('save', 'Save changes', TRUE);
+                                       echo "</td></form></tr>\n";
+                               }
                        }
                }
                elseif (strlen ($port['reservation_comment']))
@@ -1628,10 +1709,13 @@ function renderPortsForObject ($object_id)
                        printImageHREF ('plug', 'Link this port');
                        echo "</span>&nbsp;<input type=text name=reservation_comment></td>\n";
                }
-
-               echo '<td>';
-               printImageHREF ('save', 'Save changes', TRUE);
-               echo "</td></form></tr>\n";
+               // if there are 1 or fewer links, we need to conclude the row (otherwise it would have been done already)
+               if (count($links) <= 1)
+               {
+                       echo '<td>';
+                       printImageHREF ('save', 'Save changes', TRUE);
+                       echo "</td></form></tr>\n";
+               }
        }
        if (getConfigVar ('ADDNEW_AT_TOP') != 'yes')
                printNewItemTR ($prefs);
@@ -1653,8 +1737,8 @@ function renderPortsForObject ($object_id)
                echo "</td></tr></form>";
                echo "</table><br>\n";
        }
-       finishPortlet();
-
+       if (getConfigVar('ENABLE_MULTIPORT_FORM') == 'yes')
+               finishPortlet();
        if (getConfigVar('ENABLE_MULTIPORT_FORM') != 'yes')
                return;
 
@@ -3159,7 +3243,10 @@ function renderNATv4ForObject ($object_id)
 
                echo "</select>:<input type='text' name='localport' size='4' tabindex=2></td>";
                echo "<td><input type='text' name='remoteip' id='remoteip' size='10' tabindex=3>";
-               echo getPopupLink ('inet4list', array(), 'findobjectip', 'find', 'Find object');
+               echo "<a href='javascript:;' onclick='window.open(\"" . makeHrefForHelper ('inet4list');
+               echo "\", \"findobjectip\", \"height=700, width=400, location=no, menubar=no, resizable=yes, scrollbars=no, status=no, titlebar=no, toolbar=no\");'>";
+               printImageHREF ('find', 'Find object');
+               echo "</a>";
                echo ":<input type='text' name='remoteport' size='4' tabindex=4></td><td></td>";
                echo "<td colspan=1><input type='text' name='description' size='20' tabindex=5></td><td>";
                printImageHREF ('add', 'Add new NAT rule', TRUE, 6);
@@ -8497,8 +8584,6 @@ function switchportInfoJS($object_id)
                )
                        $allowed_ops[] = $prefix;
 
-       $allowed_ops[] = 'trace';
-
        // make JS array with allowed items
        $list = '';
        foreach ($allowed_ops as $item)
index b29d9e70308d0e42f9777570094cc6ef9df73bd9..1b20ae30bf38c0d87ba0e605432b572728b901d2 100644 (file)
@@ -622,7 +622,7 @@ function renderPopupTraceRoute ()
        }
 
        $graph = new Image_GraphViz(NULL, NULL, $title);
-       $graph->addAttributes(array ('label' => $title, 'labelloc' => 't', 'rankdir' => 'BT'));
+       $graph->addAttributes(array ('label' => $title, 'labelloc' => 't'));
 
        // add a cluster to the graph for each unique object
        $objects = array ();
index a606ca2fe7cb6acd3dbeaa3b318bf93f659e33b1..2097f3758dba0a826426c1546956c51523bae7ec 100644 (file)
@@ -68,6 +68,10 @@ ENDOFTEXT
 ,
 
        '0.20.0' => <<<ENDOFTEXT
+WARNING: This release have too many internal changes, some of them were waiting more than a year
+to be released. So this release is considered "BETA" and is recommended only to curiuos users,
+who agree to sacrifice the stability to the progress.
+
 Racks and Rows are now stored in the database as Objects.  The RackObject table
 was renamed to Object.  SQL views were created to ease the migration of custom
 reports and scripts.
@@ -1360,12 +1364,6 @@ CREATE TABLE `VSEnabledPorts` (
                        $query[] = "ALTER TABLE `Link` ADD UNIQUE KEY `porta-portb-unique` (`porta`,`portb`), ADD KEY `porta` (`porta`), ADD KEY `portb` (`portb`)";
                        $query[] = "ALTER TABLE `Link` ADD CONSTRAINT `Link-FK-a` FOREIGN KEY (`porta`) REFERENCES `Port` (`id`) ON DELETE CASCADE, ADD CONSTRAINT `Link-FK-b` FOREIGN KEY (`portb`) REFERENCES `Port` (`id`) ON DELETE CASCADE";
                        $query[] = "ALTER TABLE `Link` ADD COLUMN `id` int(10) unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT FIRST";
-                       // For the UNIQUE key to work, portb needs to be > porta
-                       $result = $dbxlink->query ('SELECT porta, portb FROM `Link` WHERE porta > portb');
-                       $links = $result->fetchAll (PDO::FETCH_ASSOC);
-                       unset ($result);
-                       foreach ($links as $link)
-                               $query[] = "UPDATE `Link` SET `porta`=${link['portb']}, `portb`=${link['porta']} WHERE `porta`=${link['porta']} AND `portb`=${link['portb']}";
                        $query[] = "
 CREATE TRIGGER `checkLinkBeforeInsert` BEFORE INSERT ON `Link`
   FOR EACH ROW