enable multi-port offline changes to 802.1Q ports
authorDenis Ovsienko <infrastation@yandex.ru>
Sun, 4 Nov 2012 23:00:02 +0000 (03:00 +0400)
committerDenis Ovsienko <infrastation@yandex.ru>
Sun, 4 Nov 2012 23:00:02 +0000 (03:00 +0400)
* renderObject8021QSync(): rewrite to use SELECT instead of TABLE, so that
  the user can add/remove multiple ports with one submit
* renderObject8021QSyncPorts(): update to match the new prototype
* create8021QPortConfig(): dismiss
* destroy8021QPortConfig(): dismiss
* update8021QPortList(): process multiple "enable" and "disable" requests
  at once

ChangeLog
wwwroot/inc/interface.php
wwwroot/inc/navigation.php
wwwroot/inc/ophandlers.php

index 9c005e8e04513f6cc3fdbb73a7e98821042a643e..6d1eae370441b3c4a0e2fcc4337e9137d8213b05 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -7,6 +7,7 @@
        update: SLB: ability to specify multiple RS ports
        update: remove old gateways code, including Live VLANs
        update: allow linking more than one VLAN from same domain per a network
+       update: make 802.1Q port list offline management multi-port (#653)
        new feature: abstract tags, which cannot be assigned (#577)
        new feature: added support for munin graphs (#406) by Michael Holm
 0.20.1 2012-10-04
index 05110af2944aed604ac4ffebdcd16176c6f4e190..25ec1aca9dbdc53d8deb99fa7aeb051e02cceaff 100644 (file)
@@ -7492,7 +7492,7 @@ function renderObject8021QSync ($object_id)
        if (considerConfiguredConstraint ($object, '8021Q_EXTSYNC_LISTSRC'))
        {
                startPortlet ('add/remove 802.1Q ports');
-               renderObject8021QSyncPorts ($object, $C, $D);
+               renderObject8021QSyncPorts ($object, $D);
                finishPortlet();
        }
        echo '</td><td class=pcright>';
@@ -7750,36 +7750,33 @@ END
        echo '</form>';
 }
 
-function renderObject8021QSyncPorts ($object, $C, $D)
-{
-       $allports = array();
-       foreach ($object['ports'] as $port)
-               if (isEthernetPort ($port))
-                       $allports[$port['name']]['ifstr'] = formatPortIIFOIF ($port);
-       foreach ($D as $portname => $portconfig)
-               $allports[$portname]['vlanstr'] = formatVLANPackDiff ($C[$portname], $portconfig);
-       $allports = sortPortList ($allports);
+function renderObject8021QSyncPorts ($object, $D)
+{
+       $allethports = array();
+       foreach (array_filter ($object['ports'], 'isEthernetPort') as $port)
+               $allethports[$port['name']] = formatPortIIFOIF ($port);
+       $enabled = array();
+       # OPTIONSs for existing 802.1Q ports
+       foreach (sortPortList ($D) as $portname => $portconfig)
+               $enabled["disable ${portname}"] = "${portname} ("
+                       . (array_key_exists ($portname, $allethports) ? $allethports[$portname] : 'N/A')
+                       . ') ' . serializeVLANPack ($portconfig);
+       # OPTIONs for potential 802.1Q ports
+       $disabled = array();
+       foreach (sortPortList ($allethports) as $portname => $iifoif)
+               if (! array_key_exists ("disable ${portname}", $enabled))
+                       $disabled["enable ${portname}"] = "${portname} (${iifoif})";
+       printOpFormIntro ('updPortList');
        echo '<table cellspacing=0 cellpadding=5 align=center class=widetable>';
-       foreach ($allports as $portname => $port)
-       {
-               echo "<tr valign=top class=trbusy><td class=tdleft>${portname}</td><td class=tdleft>";
-               echo array_key_exists ('ifstr', $port) ? $port['ifstr'] : '&nbsp;';
-               echo '</td><td class=tdleft>';
-               echo array_key_exists ('vlanstr', $port) ? $port['vlanstr'] : '&nbsp;';
-               echo '</td><td>';
-               if (array_key_exists ('vlanstr', $port))
-               {
-                       echo '<a href="' . makeHrefProcess (array ('op' => 'delPort', 'portname' => $portname)) . '">';
-                       echo getImageHREF ('delete', 'delete 802.1Q configuration for this port') . '</a>';
-               }
-               else
-               {
-                       echo '<a href="' . makeHrefProcess (array ('op' => 'addPort', 'portname' => $portname)) . '">';
-                       echo getImageHREF ('add', 'add 802.1Q configuration for this port') . '</a>';
-               }
-               echo '</td></tr>';
-       }
-       echo '</table>';
+       echo '<tr><td>';
+       printNiftySelect
+       (
+               array ('select ports to disable 802.1Q' => $enabled, 'select ports to enable 802.1Q' => $disabled),
+               array ('name' => 'ports[]', 'multiple' => 1, 'size' => getConfigVar ('MAXSELSIZE'))
+       );
+       echo '</td></tr>';
+       echo '<tr><td>' . getImageHREF ('RECALC', 'process changes', TRUE) . '</td></tr>';
+       echo '</table></form>';
 }
 
 function renderVSTListEditor()
index 152752ac1b18757a538d23721b6fbdaae0f43165..72bf67319118b2257f0b961beb80d4ecde7895b1 100644 (file)
@@ -247,8 +247,7 @@ $ophandler['object']['8021qports']['exec8021QRecalc'] = 'process8021QRecalcReque
 $ophandler['object']['8021qsync']['exec8021QPull'] = 'process8021QSyncRequest';
 $ophandler['object']['8021qsync']['exec8021QPush'] = 'process8021QSyncRequest';
 $ophandler['object']['8021qsync']['resolve8021QConflicts'] = 'resolve8021QConflicts';
-$ophandler['object']['8021qsync']['addPort'] = 'create8021QPortConfig';
-$ophandler['object']['8021qsync']['delPort'] = 'destroy8021QPortConfig';
+$ophandler['object']['8021qsync']['updPortList'] = 'update8021QPortList';
 $ophandler['object']['cacti']['add'] = 'tableHandler';
 $ophandler['object']['cacti']['del'] = 'tableHandler';
 $ophandler['object']['munin']['add'] = 'tableHandler';
index 41838e45f9c1784a26b3256a4ee3834f8f06fc95..7f68831819ff52697646227376741e47b4611268 100644 (file)
@@ -2619,28 +2619,35 @@ function resolve8021QConflicts ()
        return showFuncMessage (__FUNCTION__, 'OK', array ($ndone));
 }
 
-$msgcode['create8021QPortConfig']['OK'] = 48;
-function create8021QPortConfig()
+function update8021QPortList()
 {
+       genericAssertion ('ports', 'array');
+       $enabled = $disabled = 0;
        global $sic;
-       genericAssertion ('portname', 'string');
        $default_port = array
        (
                'mode' => 'access',
                'allowed' => array (VLAN_DFL_ID),
                'native' => VLAN_DFL_ID,
        );
-       add8021QPort (getBypassValue(), $sic['portname'], $default_port);
-       showFuncMessage (__FUNCTION__, 'OK');
-}
-
-$msgcode['destroy8021QPortConfig']['OK'] = 49;
-function destroy8021QPortConfig()
-{
-       global $sic;
-       genericAssertion ('portname', 'string');
-       del8021QPort (getBypassValue(), $sic['portname']);
-       showFuncMessage (__FUNCTION__, 'OK');
+       foreach ($sic['ports'] as $line)
+               if (preg_match ('/^enable (.+)$/', $line, $m))
+               {
+                       add8021QPort (getBypassValue(), $m[1], $default_port);
+                       $enabled++;
+               }
+               elseif (preg_match ('/^disable (.+)$/', $line, $m))
+               {
+                       del8021QPort (getBypassValue(), $m[1]);
+                       $disabled++;
+               }
+               else
+                       throw new InvalidRequestArgException ('ports[]', $line, 'malformed array item');
+       # $enabled + $disabled > 0
+       if ($enabled)
+               showSuccess ("enabled 802.1Q for ${enabled} port(s)");
+       if ($disabled)
+               showSuccess ("disabled 802.1Q for ${disabled} port(s)");
 }
 
 $msgcode['cloneVST']['OK'] = 48;