r3268 another portion of work on VLANs
authorDenis Ovsienko <infrastation@yandex.ru>
Tue, 16 Feb 2010 18:10:12 +0000 (18:10 +0000)
committerDenis Ovsienko <infrastation@yandex.ru>
Tue, 16 Feb 2010 18:10:12 +0000 (18:10 +0000)
- schema changes
- VLANs now can be linked to IPv4 networks

inc/database.php
inc/functions.php
inc/interface.php
inc/navigation.php
inc/ophandlers.php
install/init-structure.sql

index 1e45810..1f7df78 100644 (file)
@@ -3562,7 +3562,7 @@ function getVLANDomainList ()
 function getVLANDomainInfo ($vdom_id)
 {
        global $dbxlink;
-       $query = $dbxlink->prepare ('SELECT id, enable_all_vlans, description FROM VLANDomain WHERE id = ?');
+       $query = $dbxlink->prepare ('SELECT id, description FROM VLANDomain WHERE id = ?');
        $result = $query->execute (array ($vdom_id));
        if ($row = $query->fetch (PDO::FETCH_ASSOC))
        {
@@ -3669,4 +3669,48 @@ function getNativeVLANsForObjectPorts ($object_id)
        return $ret;
 }
 
+function getVLANInfo ($vlan_ck)
+{
+       list ($vdom_id, $vlan_id) = decodeVLANCK ($vlan_ck);
+       global $dbxlink;
+       $query = 'SELECT domain_id, vlan_id, vlan_type, vlan_descr, ' .
+               '(SELECT description FROM VLANDomain WHERE id = domain_id) AS domain_descr ' .
+               'FROM VLANDescription WHERE domain_id = ? AND vlan_id = ?';
+       $prepared = $dbxlink->prepare ($query);
+       $prepared->execute (array ($vdom_id, $vlan_id));
+       if (NULL == ($ret = $prepared->fetch (PDO::FETCH_ASSOC)))
+               return NULL; // throw what ?
+       unset ($prepared);
+       $query = 'SELECT ipv4net_id FROM VLANIPv4 WHERE domain_id = ? AND vlan_id = ?';
+       $prepared = $dbxlink->prepare ($query);
+       $prepared->execute (array ($vdom_id, $vlan_id));
+       $ret['ipv4nets'] = array();
+       while ($row = $prepared->fetch (PDO::FETCH_ASSOC))
+               $ret['ipv4nets'][] = $row['ipv4net_id'];
+       return $ret;
+}
+
+function commitSupplementVLANIPv4 ($vlan_ck, $ipv4net_id)
+{
+       list ($vdom_id, $vlan_id) = decodeVLANCK ($vlan_ck);
+       return usePreparedInsertBlade
+       (
+               'VLANIPv4',
+               array
+               (
+                       'domain_id' => $vdom_id,
+                       'vlan_id' => $vlan_id,
+                       'ipv4net_id' => $ipv4net_id,
+               )
+       );
+}
+
+function commitReduceVLANIPv4 ($vlan_ck, $ipv4net_id)
+{
+       list ($vdom_id, $vlan_id) = decodeVLANCK ($vlan_ck);
+       global $dbxlink;
+       $query = $dbxlink->prepare ('DELETE FROM VLANIPv4 WHERE domain_id = ? AND vlan_id = ? AND ipv4net_id = ?');
+       return $query->execute (array ($vdom_id, $vlan_id, $ipv4net_id));
+}
+
 ?>
index 50f6530..8a15760 100644 (file)
@@ -2232,9 +2232,6 @@ function getVLANDomain ($vdid)
 {
        $ret = getVLANDomainInfo ($vdid);
        $ret['vlanlist'] = array();
-       if ($ret['enable_all_vlans'] == 'yes')
-               for ($i = VLAN_MIN_ID; $i <= VLAN_MAX_ID; $i++)
-                       $ret['vlanlist'][$i] = sprintf ('VLAN%04u', $i);
        foreach (getDomainVLANs ($vdid) as $vlan_id => $vlan_descr)
                $ret['vlanlist'][$vlan_id] = $vlan_descr;
        $ret['switchlist'] = getVLANDomainSwitches ($vdid);
@@ -2257,4 +2254,14 @@ function serialiseVLANPack ($native_vid = VLAN_DFL_ID, $allowed_vids = array())
        return strlen ($ret) ? $ret : '&nbsp;';
 }
 
+// Decode VLAN compound key (which is a string formatted DOMAINID-VLANID) and
+// return the numbers as an array of two.
+function decodeVLANCK ($string)
+{
+       $matches = array();
+       if (1 != preg_match ('/^([[:digit:]]+)-([[:digit:]]+)$/', $string, $matches))
+               throw new InvalidArgException ('VLAN compound key', $string);
+       return array ($matches[1], $matches[2]);
+}
+
 ?>
index c8585e8..ebd5f44 100644 (file)
@@ -6173,11 +6173,36 @@ function dynamic_title_decoder ($path_position)
                        );
                }
        case 'vlandomain':
-               $dominfo = getVLANDomainInfo ($_REQUEST['vdom_id']);
+               global $pageno;
+               switch ($pageno)
+               {
+               case 'vlandomain':
+                       $vdom_id = $_REQUEST['vdom_id'];
+                       break;
+               case 'vlan':
+                       list ($vdom_id, $dummy) = decodeVLANCK ($_REQUEST['vlan_ck']);
+                       break;
+               default:
+                       return array
+                       (
+                               'name' => __FUNCTION__ . '() failure',
+                               'params' => array()
+                       );
+                       
+               }
+               $dominfo = getVLANDomainInfo ($vdom_id);
                return array
                (
                        'name' => $dominfo['description'],
-                       'params' => array ('vdom_id' => $_REQUEST['vdom_id'])
+                       'params' => array ('vdom_id' => $vdom_id)
+               );
+       case 'vlan':
+               list ($vdom_id, $vlan_id) = decodeVLANCK ($_REQUEST['vlan_ck']);
+               $allvlans = getDomainVLANs ($vdom_id);
+               return array
+               (
+                       'name' => $allvlans[$vlan_id]['vlan_descr'],
+                       'params' => array ('vlan_ck' => "${vdom_id}-${vlan_id}")
                );
        default:
                return array
@@ -6425,7 +6450,9 @@ function renderVLANDomain ($vdom_id)
                echo '<tr><th>VLAN ID</th><th>propagation</th><th>description</th></tr>';
                foreach ($myvlans as $vlan_id => $vlan_info)
                {
-                       echo "<tr class=row_${order}><td class=tdright><tt>${vlan_id}</tt></td>";
+                       echo "<tr class=row_${order}><td class=tdright><a href='";
+                       echo makeHref (array ('page' => 'vlan', 'vlan_ck' => "${vdom_id}-${vlan_id}"));
+                       echo "'>${vlan_id}</a></td>";
                        echo '<td>' . $vtdecoder[$vlan_info['vlan_type']] . '</td>';
                        echo "<td class=tdleft>${vlan_info['vlan_descr']}</td></tr>";
                        $order = $nextorder[$order];
@@ -6668,4 +6695,74 @@ function renderPortNativeVLAN ($port_id, $allowed, $native)
        echo '</td></tr></table>';
 }
 
+function renderVLANInfo ()
+{
+       $vlan = getVLANInfo ($_REQUEST['vlan_ck']);
+       echo '<table border=0 class=objectview cellspacing=0 cellpadding=0>';
+       echo "<tr><td colspan=2 align=center><h1>${mydomain['description']}</h1></td></tr>";
+       echo "<tr><td class=pcleft width='50%'>";
+       startPortlet ('summary');
+       echo "<table border=0 cellspacing=0 cellpadding=3 width='100%'>";
+       echo "<tr><th width='50%' class=tdright>Domain:</th><td class=tdleft>${vlan['domain_descr']}</td></tr>";
+       echo "<tr><th width='50%' class=tdright>VLAN ID:</th><td class=tdleft>${vlan['vlan_id']}</td></tr>";
+       if (strlen ($vlan['vlan_descr']))
+               echo "<tr><th width='50%' class=tdright>Description:</th><td class=tdleft>${vlan['vlan_descr']}</td></tr>";
+       echo "<tr><th width='50%' class=tdright>Propagation:</th><td class=tdleft>${vlan['vlan_prop']}</td></tr>";
+       echo '</table>';
+       finishPortlet();
+       echo '</td><td class=pcright>';
+       startPortlet ('IPv4 networks');
+       if (!count ($vlan['ipv4nets']))
+               echo '(none)';
+       else
+       {
+               echo '<table cellspacing=0 cellpadding=5 align=center class=widetable>';
+               foreach ($vlan['ipv4nets'] as $netid)
+               {
+                       echo '<tr><td>';
+                       renderCell (spotEntity ('ipv4net', $netid));
+                       echo '</td></tr>';
+               }
+               echo '</table>';
+       }
+       finishPortlet();
+       echo '</td></tr></table>';
+
+}
+
+function renderVLANIPv4 ()
+{
+       function printNewItemTR ($twitlist = array())
+       {
+               $options = array();
+               foreach (listCells ('ipv4net') as $netinfo)
+                       if (!in_array ($netinfo['id'], $twitlist))
+                               $options[$netinfo['id']] = $netinfo['ip'] . '/' . $netinfo['mask'] . ' ' . $netinfo['name'];
+               printOpFormIntro ('bind');
+               echo '<tr><td>';
+               printSelect ($options, array ('name' => 'id'));
+               echo '</td><td>';
+               printImageHREF ('ATTACH', 'bind', TRUE);
+               echo '</td></tr></form>';
+       }
+       $vlan = getVLANInfo ($_REQUEST['vlan_ck']);
+       echo '<table cellspacing=0 cellpadding=5 align=center class=widetable>';
+       echo '<tr><th>network</th><th>&nbsp;</th></tr>';
+       if (getConfigVar ('ADDNEW_AT_TOP') == 'yes')
+               printNewItemTR ($vlan['ipv4nets']);
+       foreach ($vlan['ipv4nets'] as $netid)
+       {
+               echo '<tr><td>';
+               renderCell (spotEntity ('ipv4net', $netid));
+               echo '</td><td><a href="';
+               echo makeHrefProcess (array ('op' => 'unbind', 'id' => $netid, 'vlan_ck' => $_REQUEST['vlan_ck']));
+               echo '">';
+               printImageHREF ('CUT', 'unbind');
+               echo '</a></td></tr>';
+       }
+       if (getConfigVar ('ADDNEW_AT_TOP') != 'yes')
+               printNewItemTR ($vlan['ipv4nets']);
+       echo '</table>';
+}
+
 ?>
index d06dfc3..572c2e1 100644 (file)
@@ -167,6 +167,7 @@ $tab['ipv4net']['properties'] = 'Properties';
 $tab['ipv4net']['liveptr'] = 'Live PTR';
 $tab['ipv4net']['tags'] = 'Tags';
 $tab['ipv4net']['files'] = 'Files';
+$tab['ipv4net']['vlan'] = '[VLAN]';
 $tabhandler['ipv4net']['default'] = 'renderIPv4Network';
 $tabhandler['ipv4net']['properties'] = 'renderIPv4NetworkProperties';
 $tabhandler['ipv4net']['liveptr'] = 'renderLivePTR';
@@ -179,6 +180,8 @@ $ophandler['ipv4net']['tags']['saveTags'] = 'saveEntityTags';
 $ophandler['ipv4net']['files']['addFile'] = 'addFileToEntity';
 $ophandler['ipv4net']['files']['linkFile'] = 'linkFileToEntity';
 $ophandler['ipv4net']['files']['unlinkFile'] = 'unlinkFile';
+$ophandler['ipv4net']['vlan']['bind'] = 'bindVLANtoIPv4';
+$ophandler['ipv4net']['vlan']['unbind'] = 'unbindVLANfromIPv4';
 
 $page['ipaddress']['parent'] = 'ipv4net';
 $page['ipaddress']['bypass'] = 'ip';
@@ -483,4 +486,14 @@ $ophandler['vlandomain']['vlanlist']['add'] = 'addVLANDescription';
 $ophandler['vlandomain']['vlanlist']['del'] = 'delVLANDescription';
 $ophandler['vlandomain']['vlanlist']['upd'] = 'updVLANDescription';
 
+$page['vlan']['parent'] = 'vlandomain';
+$page['vlan']['bypass'] = 'vlan_ck';
+$page['vlan']['bypass_type'] = 'string';
+$tab['vlan']['default'] = 'View';
+$tab['vlan']['ipv4'] = 'IPv4';
+$tabhandler['vlan']['default'] = 'renderVLANInfo';
+$tabhandler['vlan']['ipv4'] = 'renderVLANIPv4';
+$ophandler['vlan']['ipv4']['bind'] = 'bindVLANtoIPv4';
+$ophandler['vlan']['ipv4']['unbind'] = 'unbindVLANfromIPv4';
+
 ?>
index 83f3282..a3e1982 100644 (file)
@@ -2170,4 +2170,24 @@ function saveAllowedVLANs ()
        $vlan_id_list = isset ($_REQUEST['vlan_id']) ? $_REQUEST['vlan_id'] : array();
 }
 
+$msgcode['bindVLANtoIPv4']['OK'] = 48;
+$msgcode['bindVLANtoIPv4']['ERR'] = 110;
+function bindVLANtoIPv4 ()
+{
+       assertUIntArg ('id'); // network id
+       global $sic;
+       $result = commitSupplementVLANIPv4 ($sic['vlan_ck'], $sic['id']);
+       return buildRedirectURL (__FUNCTION__, $result ? 'OK' : 'ERR');
+}
+
+$msgcode['unbindVLANfromIPv4']['OK'] = 49;
+$msgcode['unbindVLANfromIPv4']['ERR'] = 111;
+function unbindVLANfromIPv4 ()
+{
+       assertUIntArg ('id'); // network id
+       global $sic;
+       $result = commitReduceVLANIPv4 ($sic['vlan_ck'], $sic['id']);
+       return buildRedirectURL (__FUNCTION__, $result ? 'OK' : 'ERR');
+}
+
 ?>
index 525148c..796c22c 100644 (file)
@@ -362,7 +362,6 @@ CREATE TABLE `VLANDomain` (
   `last_pull` timestamp NOT NULL default '0000-00-00 00:00:00',
   `last_push` timestamp NOT NULL default '0000-00-00 00:00:00',
   `allow_pull` enum('yes','no') NOT NULL default 'no',
-  `enable_all_vlans` enum('yes','no') NOT NULL default 'no',
   PRIMARY KEY  (`id`),
   UNIQUE KEY `description` (`description`)
 ) ENGINE=InnoDB;
@@ -388,6 +387,16 @@ CREATE TABLE `VLANDescription` (
   CONSTRAINT `VLANDescription-FK-vlan_id` FOREIGN KEY (`vlan_id`) REFERENCES `VLANValidID` (`vlan_id`)
 ) ENGINE=InnoDB;
 
+CREATE TABLE `VLANIPv4` (
+  `domain_id` int(10) unsigned NOT NULL,
+  `vlan_id` int(10) unsigned NOT NULL,
+  `ipv4net_id` int(10) unsigned NOT NULL,
+  UNIQUE KEY `ipv4net_id` (`ipv4net_id`),
+  KEY `VLANIPv4-FK-compound` (`domain_id`,`vlan_id`),
+  CONSTRAINT `VLANIPv4-FK-compound` FOREIGN KEY (`domain_id`, `vlan_id`) REFERENCES `VLANDescription` (`domain_id`, `vlan_id`) ON DELETE CASCADE,
+  CONSTRAINT `VLANIPv4-FK-ipv4net_id` FOREIGN KEY (`ipv4net_id`) REFERENCES `IPv4Network` (`id`) ON DELETE CASCADE
+) ENGINE=InnoDB;
+
 CREATE TABLE `VLANSwitch` (
   `object_id` int(10) unsigned NOT NULL,
   `domain_id` int(10) unsigned NOT NULL,