r3291 buildRedirectURL(): accept one more arg to pass to buildWideRedirectURL()
authorDenis Ovsienko <infrastation@yandex.ru>
Thu, 25 Feb 2010 15:19:53 +0000 (15:19 +0000)
committerDenis Ovsienko <infrastation@yandex.ru>
Thu, 25 Feb 2010 15:19:53 +0000 (15:19 +0000)
usePreparedDeleteBlade(): discard LIMIT, change returned value to { FALSE, 0, 1, ... N }
destroyVLANDomain(): adjust accordingly
setAllowedVLANs(): add some meaningful code
setNativeVLAN(): new function
commitSaveAllowedVLANs(): new function
commitSaveNativeVLAN(): new function
renderPortNativeVLAN(): one more input argument for VLAN ID decoding
renderObjectVLANPorts(): fix forms; don't implicitly assume VLAN1 as default

inc/database.php
inc/interface.php
inc/navigation.php
inc/ophandlers.php

index f66dc8e875104e872aba90b8f9d3058777b1abe8..d54c3cc19ccb835674da38a58c9a763a9b9494a5 100644 (file)
@@ -2238,14 +2238,14 @@ function useDeleteBlade ($tablename, $keyname, $keyvalue)
        return 1 === $dbxlink->exec ("delete from ${tablename} where ${keyname}=${keyvalue} limit 1");
 }
 
-// prepared version of above
+// Prepared version of above, but note the difference in returned value.
 function usePreparedDeleteBlade ($tablename, $keyname, $keyvalue)
 {
        global $dbxlink;
-       $prepared = $dbxlink->prepare ("DELETE FROM ${tablename} WHERE ${keyname} = ? LIMIT 1");
+       $prepared = $dbxlink->prepare ("DELETE FROM ${tablename} WHERE ${keyname} = ?");
        if (!$prepared->execute (array ($keyvalue)))
                return FALSE;
-       return $prepared->rowCount() == 1;
+       return $prepared->rowCount(); // FALSE !== 0
 }
 
 function useSelectBlade ($query)
@@ -3670,6 +3670,26 @@ function getAllowedVLANsForObjectPorts ($object_id)
        return $ret;
 }
 
+function commitSaveAllowedVLANs ($port_id, $vlan_id_list)
+{
+       global $dbxlink;
+       $dbxlink->beginTransaction();
+       // the below cascades down to PortNativeVLAN
+       if (FALSE === usePreparedDeleteBlade ('PortAllowedVLAN', 'port_id', $port_id))
+       {
+               $dbxlink->rollBack();
+               return FALSE;
+       }
+       foreach ($vlan_id_list as $vlan_id)
+               if (!usePreparedInsertBlade ('PortAllowedVLAN', array ('port_id' => $port_id, 'vlan_id' => $vlan_id)))
+               {
+                       $dbxlink->rollBack();
+                       return FALSE;
+               }
+       $dbxlink->commit();
+       return TRUE;
+}
+
 function getNativeVLANsForObjectPorts ($object_id)
 {
        global $dbxlink;
@@ -3684,6 +3704,25 @@ function getNativeVLANsForObjectPorts ($object_id)
        return $ret;
 }
 
+// When the new native VLAN ID is 0, only delete the old row (if it exists).
+function commitSaveNativeVLAN ($port_id, $vlan_id = 0)
+{
+       global $dbxlink;
+       $dbxlink->beginTransaction();
+       if (FALSE === usePreparedDeleteBlade ('PortNativeVLAN', 'port_id', $port_id))
+       {
+               $dbxlink->rollBack();
+               return FALSE;
+       }
+       if ($vlan_id and !usePreparedInsertBlade ('PortNativeVLAN', array ('port_id' => $port_id, 'vlan_id' => $vlan_id)))
+       {
+               $dbxlink->rollBack();
+               return FALSE;
+       }
+       $dbxlink->commit();
+       return TRUE;
+}
+
 function getVLANInfo ($vlan_ck)
 {
        list ($vdom_id, $vlan_id) = decodeVLANCK ($vlan_ck);
index d5916b25d722633ad116d4be7605655e07d24524..138740608a98e292c418f56b7daabc52f163955f 100644 (file)
@@ -6660,8 +6660,9 @@ function renderObjectVLANPorts ($object_id)
                renderPortNativeVLAN
                (
                        $port_id,
+                       $objectdomain,
                        array_key_exists ($port_id, $allowed) ? $allowed[$port_id] : array(),
-                       array_key_exists ($port_id, $native) ? $native[$port_id] : VLAN_DFL_ID
+                       array_key_exists ($port_id, $native) ? $native[$port_id] : 0
                );
                finishPortlet();
                echo '</td></tr></table>';
@@ -6686,7 +6687,7 @@ function renderPortAllowedVLANs ($port_id, $vdom, $preselect)
                }
                echo "<tr><td colspan=2 class=${class}>";
                echo "<label><input type=checkbox name='vlan_id[]' value='${vlan_id}'${selected}> ";
-               echo "<tt>${vlan_id}</tt> <i>(${vlan_info['vlan_descr']})</i></label></td></tr>";
+               echo formatVLANName ($vlan_info) . "</label></td></tr>";
        }
        echo '<tr><td class=tdleft>';
        printImageHREF ('SAVE', 'Save changes', TRUE);
@@ -6695,14 +6696,14 @@ function renderPortAllowedVLANs ($port_id, $vdom, $preselect)
                printImageHREF ('CLEAR gray');
        else
        {
-               printOpFormIntro ('setAllowedVLANs', array ('port_id' => $port_id, 'vlan_id[]' => VLAN_DFL_ID));
-               printImageHREF ('CLEAR', 'Reset all tags', TRUE);
+               printOpFormIntro ('setAllowedVLANs', array ('port_id' => $port_id));
+               printImageHREF ('CLEAR', 'Unassign all VLANs', TRUE);
                echo '</form>';
        }
        echo '</td></tr></table>';
 }
 
-function renderPortNativeVLAN ($port_id, $allowed, $native)
+function renderPortNativeVLAN ($port_id, $vdom, $allowed = array(), $native = 0)
 {
        printOpFormIntro ('setNativeVLAN', array ('port_id' => $port_id));
        echo '<table border=0 cellspacing=0 cellpadding=3 align=center>';
@@ -6719,17 +6720,17 @@ function renderPortNativeVLAN ($port_id, $allowed, $native)
                        $class = 'tagbox';
                }
                echo "<tr><td colspan=2 class=${class}>";
-               echo "<label><input type=radio name='vlan_id[]' value='${vlan_id}'${selected}> ";
-               echo "<tt>${vlan_id}</tt> <i>(FIXME)</i></label></td></tr>";
+               echo "<label><input type=radio name='vlan_id' value='${vlan_id}'${selected}> ";
+               echo formatVLANName ($vdom['vlanlist'][$vlan_id]) . "</label></td></tr>";
        }
        echo '<tr><td class=tdleft>';
        printImageHREF ('SAVE', 'Save changes', TRUE);
        echo "</form></td><td class=tdright>";
-       if ($native == VLAN_DFL_ID)
+       if (!$native)
                printImageHREF ('CLEAR gray');
        else
        {
-               printOpFormIntro ('setNativeVLAN', array ('port_id' => $port_id, 'vlan_id' => VLAN_DFL_ID));
+               printOpFormIntro ('setNativeVLAN', array ('port_id' => $port_id, 'vlan_id' => 0));
                printImageHREF ('CLEAR', 'Reset native VLAN', TRUE);
                echo '</form>';
        }
index 0e22710f0a87d7fb5f1c7a306fc40a599b0dbee3..2ded6c8ee38479e10d7b1e5f562b4a8ff34dec21 100644 (file)
@@ -148,6 +148,7 @@ $ophandler['object']['snmpportfinder']['querySNMPData'] = 'querySNMPData';
 $ophandler['object']['vlanconfig']['bind'] = 'addVLANSwitchBinding';
 $ophandler['object']['vlanconfig']['unbind'] = 'delVLANSwitchBinding';
 $ophandler['object']['vlanports']['setAllowedVLANs'] = 'setAllowedVLANs';
+$ophandler['object']['vlanports']['setNativeVLAN'] = 'setNativeVLAN';
 $delayauth['object']['livevlans']['setPortVLAN'] = TRUE;
 
 $page['ipv4space']['title'] = 'IPv4 space';
index 4c9d102acd33adbd252dd02223d7e553b10f101b..95b5db73680bca30ff845b7cdef6e109b937a9a1 100644 (file)
@@ -38,14 +38,14 @@ function buildWideRedirectURL ($log, $nextpage = NULL, $nexttab = NULL, $moreArg
        return $url;
 }
 
-function buildRedirectURL ($callfunc, $status, $args = array(), $nextpage = NULL, $nexttab = NULL)
+function buildRedirectURL ($callfunc, $status, $log_args = array(), $nextpage = NULL, $nexttab = NULL, $url_args = array())
 {
        global $pageno, $tabno, $msgcode;
        if ($nextpage === NULL)
                $nextpage = $pageno;
        if ($nexttab === NULL)
                $nexttab = $tabno;
-       return buildWideRedirectURL (oneLiner ($msgcode[$callfunc][$status], $args), $nextpage, $nexttab);
+       return buildWideRedirectURL (oneLiner ($msgcode[$callfunc][$status], $log_args), $nextpage, $nexttab, $url_args);
 }
 
 $msgcode['addPortForwarding']['OK'] = 2;
@@ -2151,7 +2151,7 @@ function destroyVLANDomain ()
 {
        assertUIntArg ('vdom_id');
        global $sic;
-       $result = usePreparedDeleteBlade ('VLANDomain', 'id', $sic['vdom_id']);
+       $result = FALSE !== usePreparedDeleteBlade ('VLANDomain', 'id', $sic['vdom_id']);
        return buildRedirectURL (__FUNCTION__, $result ? 'OK' : 'ERR');
 }
 
@@ -2166,10 +2166,34 @@ function updateVLANDomain ()
        return buildRedirectURL (__FUNCTION__, $result ? 'OK' : 'ERR');
 }
 
+$msgcode['setAllowedVLANs']['OK'] = 17;
+$msgcode['setAllowedVLANs']['ERR1'] = 160;
+$msgcode['setAllowedVLANs']['ERR2'] = 109;
 function setAllowedVLANs ()
 {
        assertUIntArg ('port_id');
-       $vlan_id_list = isset ($_REQUEST['vlan_id']) ? $_REQUEST['vlan_id'] : array();
+       global $sic;
+       $portinfo = getPortInfo ($sic['port_id']);
+       if ($portinfo['object_id'] != $sic['object_id'])
+               return buildRedirectURL (__FUNCTION__, 'ERR1');
+       $vlan_id_list = isset ($sic['vlan_id']) ? $sic['vlan_id'] : array();
+       $result = commitSaveAllowedVLANs ($sic['port_id'], $vlan_id_list);
+       return buildRedirectURL (__FUNCTION__, $result ? 'OK' : 'ERR2', array(), NULL, NULL, array ('port_id' => $sic['port_id']));
+}
+
+$msgcode['setNativeVLAN']['OK'] = 43;
+$msgcode['setNativeVLAN']['ERR1'] = 160;
+$msgcode['setNativeVLAN']['ERR2'] = 109;
+function setNativeVLAN ()
+{
+       assertUIntArg ('port_id');
+       global $sic;
+       $vlan_id = isset ($sic['vlan_id']) ? $sic['vlan_id'] : 0; // 0 means "reset"
+       $portinfo = getPortInfo ($sic['port_id']);
+       if ($portinfo['object_id'] != $sic['object_id'])
+               return buildRedirectURL (__FUNCTION__, 'ERR1');
+       $result = commitSaveNativeVLAN ($sic['port_id'], $vlan_id);
+       return buildRedirectURL (__FUNCTION__, $result ? 'OK' : 'ERR2', array(), NULL, NULL, array ('port_id' => $sic['port_id']));
 }
 
 $msgcode['bindVLANtoIPv4']['OK'] = 48;