r2197 - initial spare networks code
authorDenis Ovsienko <infrastation@yandex.ru>
Fri, 5 Sep 2008 16:11:47 +0000 (16:11 +0000)
committerDenis Ovsienko <infrastation@yandex.ru>
Fri, 5 Sep 2008 16:11:47 +0000 (16:11 +0000)
inc/functions.php
inc/interface.php

index c714dfa..b4cc1d9 100644 (file)
@@ -1433,4 +1433,86 @@ function sortTree (&$tree, $sortfunc = '')
                $self ($tree[$tagid]['kids'], $sortfunc);
 }
 
+function iptree_fill (&$netdata)
+{
+       if (!isset ($netdata['kids']) or empty ($netdata['kids']))
+               return;
+       // If we relly have nested prefixes, they must fit into the tree.
+       $worktree = array
+       (
+               'ip_bin' => $netdata['ip_bin'],
+               'mask' => $netdata['mask']
+       );
+       foreach ($netdata['kids'] as $pfx)
+               iptree_embed ($worktree, $pfx);
+       $netdata['kids'] = iptree_construct ($worktree);
+       $netdata['kidc'] = count ($netdata['kids']);
+}
+
+function iptree_construct ($node)
+{
+       $self = __FUNCTION__;
+
+       if (!isset ($node['right']))
+       {
+               if (!isset ($node['ip']))
+               {
+                       $node['ip'] = long2ip ($node['ip_bin']);
+                       $node['kids'] = array();
+                       $node['name'] = '';
+               }
+               return array ($node);
+       }
+       else
+               return array_merge ($self ($node['left']), $self ($node['right']));
+}
+
+function iptree_embed (&$node, $pfx)
+{
+       $self = __FUNCTION__;
+
+       // hit?
+       if ($node['ip_bin'] == $pfx['ip_bin'] and $node['mask'] == $pfx['mask'])
+       {
+               $node = $pfx;
+               return;
+       }
+       if ($node['mask'] == $pfx['mask'])
+       {
+               showError ('Internal error, the recurring loop lost control', __FUNCTION__);
+               die;
+       }
+
+       // split?
+       if (!isset ($node['right']))
+       {
+               $node['right']['mask'] = $node['left']['mask'] = $node['mask'] + 1;
+               $node['left']['ip_bin'] = $node['ip_bin'];
+               $node['right']['ip_bin'] = $node['ip_bin'] + binInvMaskFromDec ($node['mask'] + 1) + 1;
+       }
+
+       // repeat!
+       if (($node['left']['ip_bin'] & binMaskFromDec ($node['left']['mask'])) == ($pfx['ip_bin'] & binMaskFromDec ($node['left']['mask'])))
+               $self ($node['left'], $pfx);
+       elseif (($node['right']['ip_bin'] & binMaskFromDec ($node['right']['mask'])) == ($pfx['ip_bin'] & binMaskFromDec ($node['left']['mask'])))
+               $self ($node['right'], $pfx);
+       else
+       {
+               showError ('Internal error, cannot decide between left and right', __FUNCTION__);
+               die;
+       }
+}
+
+function treeApplyFunc (&$tree, $func)
+{
+       if (empty ($func))
+               return;
+       $self = __FUNCTION__;
+       foreach (array_keys ($tree) as $key)
+       {
+               $func ($tree[$key]);
+               $self ($tree[$key]['kids'], $func);
+       }
+}
+
 ?>
index 8b6d9f9..538d45e 100644 (file)
@@ -2003,26 +2003,41 @@ function renderRackspaceHistory ()
        
 }
 
-function renderIPv4SpaceRecords ($tree, $itemc, $level = 0, &$tagcache = array())
+function renderIPv4SpaceRecords ($tree, $todo, $level = 0, &$tagcache = array())
 {
        $self = __FUNCTION__;
-       $c = 1;
+       $doing = 1;
        foreach ($tree as $item)
        {
-               $netdata = getIPv4Network ($item['id']);
-               $total = ($netdata['ip_bin'] | $netdata['mask_bin_inv']) - ($netdata['ip_bin'] & $netdata['mask_bin']) + 1;
-               $used = count ($netdata['addrlist']);
-               echo "<tr valign=top>";
-               $verge = ($c == $itemc ? 'L' : 'M') . ($item['kidc'] ? 'M' : 'T');
-               printIPv4NetInfoTDs ($netdata, 'tdleft', $level, $verge);
-               echo "<td class=tdcenter>";
-               renderProgressBar ($used/$total);
-               echo "<br><small>${used}/${total}</small></td>";
-               if (getConfigVar ('EXT_IPV4_VIEW') == 'yes')
-                       printRoutersTD (findRouters ($netdata['addrlist']), $tagcache);
-               echo "</tr>";
-               $self ($item['kids'], $item['kidc'], $level + 1, $tagcache);
-               $c++;
+               if (isset ($item['id']))
+               {
+                       $netdata = getIPv4Network ($item['id']);
+                       $total = ($netdata['ip_bin'] | $netdata['mask_bin_inv']) - ($netdata['ip_bin'] & $netdata['mask_bin']) + 1;
+                       $used = count ($netdata['addrlist']);
+                       echo "<tr valign=top>";
+                       $verge = ($doing == $todo ? 'L' : 'M') . ($item['kidc'] ? 'M' : 'T');
+                       printIPv4NetInfoTDs ($netdata, 'tdleft', $level, $verge);
+                       echo "<td class=tdcenter>";
+                       renderProgressBar ($used/$total);
+                       echo "<br><small>${used}/${total}</small></td>";
+                       if (getConfigVar ('EXT_IPV4_VIEW') == 'yes')
+                               printRoutersTD (findRouters ($netdata['addrlist']), $tagcache);
+                       echo "</tr>";
+                       $self ($item['kids'], $item['kidc'], $level + 1, $tagcache);
+               }
+               else
+               {
+                       $used = 0;
+                       $total = binInvMaskFromDec ($item['mask']) + 1;
+                       echo "<tr valign=top>";
+                       $verge = ($doing == $todo ? 'L' : 'M') . 'T';
+                       printIPv4NetInfoTDs ($item, 'tdleft', $level, $verge);
+                       echo "<td class=tdcenter>";
+                       renderProgressBar ($used/$total);
+                       echo "<br><small>${used}/${total}</small></td>";
+                       echo "<td>&nbsp;</td></tr>";
+               }
+               $doing++;
        }
 }
 
@@ -2031,6 +2046,7 @@ function renderIPv4Space ()
        $tagfilter = getTagFilter();
        $tree = treeFromList (getIPv4NetworkList ($tagfilter, getTFMode()), getConfigVar ('TREE_THRESHOLD'));
        sortTree ($tree, 'IPv4NetworkCmp');
+       treeApplyFunc ($tree, 'iptree_fill');
 
        echo "<table border=0 class=objectview>\n";
        echo "<tr><td class=pcleft>";
@@ -5281,14 +5297,18 @@ function printRoutersTD ($rlist, &$tagcache = array())
 function printIPv4NetInfoTDs ($netinfo, $tdclass = 'tdleft', $indent = 0, $verge = 'spacer')
 {
        global $root;
-       $tags = loadIPv4PrefixTags ($netinfo['id']);
+       $tags = isset ($netinfo['id']) ? loadIPv4PrefixTags ($netinfo['id']) : array();
        echo "<td class='${tdclass}'>";
        for ($i = 0; $i < $indent - 1; $i++)
                printImageHREF ('spacer');
        if ($indent)
                printImageHREF ($verge);
-       echo "<a href='${root}?page=iprange&id=${netinfo['id']}'>${netinfo['ip']}/${netinfo['mask']}</a></td>";
-       echo "<td class='${tdclass}'>" . niftyString ($netinfo['name']);
+       if (isset ($netinfo['id']))
+               echo "<a href='${root}?page=iprange&id=${netinfo['id']}'>";
+       echo "${netinfo['ip']}/${netinfo['mask']}";
+       if (isset ($netinfo['id']))
+               echo '</a>';
+       echo "</td><td class='${tdclass}'>" . niftyString ($netinfo['name']);
        if (count ($tags))
                echo '<br><small>' . serializeTags ($tags, "${root}?page=ipv4space&tab=default&") . '</small>';
        echo "</td>";