r2199 - switch to getAddressspaceList() and discard getAddressspaceList()
authorDenis Ovsienko <infrastation@yandex.ru>
Mon, 8 Sep 2008 15:36:51 +0000 (15:36 +0000)
committerDenis Ovsienko <infrastation@yandex.ru>
Mon, 8 Sep 2008 15:36:51 +0000 (15:36 +0000)
 - introduce scanIPv4Spans() and countOwnIPv4Addresses() to go on with IPv4 crunching

README
inc/database.php
inc/functions.php
inc/interface.php

diff --git a/README b/README
index b03d2798201c5128d49f0e4c4c67b9fe289493cd..9f5f5bcbe69b1fbd81164b725ca6983d97917ba2 100644 (file)
--- a/README
+++ b/README
@@ -143,3 +143,6 @@ This release fixes a missing UNIQUE KEY in a table. The upgrade script may
 find it necessary first to transform some records. Because of this it is
 normal to see several "update TagStorage ... Duplicate entry" failed queries
 during the upgrade.
+
+In addition, RackTables requires two more PHP extensions, which are often already
+present on most systems. These are BC Math and zlib.
index f1889832714f062630dad403adf36bdbe18d096f..474a60309a47427db11096f12df1b2110a442416 100644 (file)
@@ -1071,6 +1071,16 @@ function scanIPv4Space ($i32_first, $i32_last)
        return $ret;
 }
 
+// a wrapper for the above
+function scanIPv4Spans ($spanlist)
+{
+       $ret = array();
+       foreach ($spanlist as $span)
+               foreach (scanIPv4Space ($span['u32_first'], $span['u32_last']) as $key => $val)
+                       $ret[$key] = $val;
+       return $ret;
+}
+
 // Return summary data about an IPv4 prefix, if it exists, or NULL otherwise.
 function getIPv4NetworkInfo ($id = 0)
 {
@@ -1165,37 +1175,6 @@ function getIPv4NetworkList ($tagfilter = array(), $tfmode = 'any')
        return $ret;
 }
 
-function getAddressspaceList ($tagfilter = array(), $tfmode = 'any')
-{
-       $whereclause = getWhereClause ($tagfilter);
-       $query =
-               "select distinct ".
-               "id as IPRanges_id, ".
-               "INET_NTOA(ip) as IPRanges_ip, ".
-               "mask as IPRanges_mask, ".
-               "name as IPRanges_name ".
-               "from IPRanges left join TagStorage on IPRanges.id = TagStorage.target_id and target_realm = 'ipv4net' " .
-               "where true ${whereclause} " .
-               " order by ip";
-       $result = useSelectBlade ($query, __FUNCTION__);
-       $ret=array();
-       $count=0;
-       while ($row = $result->fetch (PDO::FETCH_ASSOC))
-       {
-               $ret[$count]['id'] = $row['IPRanges_id'];
-               $ret[$count]['ip'] = $row['IPRanges_ip'];
-               $ret[$count]['ip_bin'] = ip2long($row['IPRanges_ip']);
-               $ret[$count]['name'] = $row['IPRanges_name'];
-               $ret[$count]['mask'] = $row['IPRanges_mask'];
-               $ret[$count]['mask_bin'] = binMaskFromDec($row['IPRanges_mask']);
-               $ret[$count]['mask_bin_inv'] = binInvMaskFromDec($row['IPRanges_mask']);
-               $count++;
-       }
-       $result->closeCursor();
-       return $ret;
-
-}
-
 // Return the id of the smallest IPv4 network containing the given IPv4 address
 // or NULL, if nothing was found. When finding the covering network for
 // another network, it is important to filter out matched records with longer
@@ -2979,24 +2958,6 @@ function createIPv4Prefix ($range = '', $name = '', $is_bcast = FALSE, $taglist
        }
        $binmask = binMaskFromDec($maskL);
        $ipL = $ipL & $binmask;
-/*
-       $query =
-               "select ".
-               "id, INET_NTOA(ip) as dottedquad, mask, name ".
-               "from IPRanges";
-
-       $result = useSelectBlade ($query, __FUNCTION__);
-
-       while ($row = $result->fetch (PDO::FETCH_ASSOC))
-       {
-               $otherip = ip2long ($row['dottedquad']);
-               $othermask = binMaskFromDec ($row['mask']);
-               if (($otherip & $othermask) == ($ipL & $othermask) or ($otherip & $binmask) == ($ipL & $binmask))
-                       return "This subnet intersects with ${row['dottedquad']}/${row['mask']}";
-       }
-       $result->closeCursor();
-       unset ($result);
-*/
        $result = useInsertBlade
        (
                'IPRanges',
index b4cc1d909618cf4f2b0f24ffbb32dd6a2ae141c0..071ea8db236e256853d0578262ba877f3d1a6c04 100644 (file)
@@ -1515,4 +1515,21 @@ function treeApplyFunc (&$tree, $func)
        }
 }
 
+
+// Find node's own addresses. These are all addresses, which belong to the current prefix
+// exclusively.
+function countOwnIPv4Addresses (&$ipv4node)
+{
+       if (empty ($ipv4node['kids']))
+               $ipv4node['addrc'] = count (scanIPv4Space ($ipv4node['db_first'], $ipv4node['db_last']));
+       else
+       {
+               $toscan = array();
+               foreach ($ipv4node['kids'] as $nested)
+                       if (!isset ($nested['id'])) // spare
+                               $toscan[] = array ('u32_first' => $nested['db_first'], 'u32_last' => $nested['db_last']);
+               $ipv4node['addrc'] = count (scanIPv4Spans ($toscan));
+       }
+}
+
 ?>
index 37b673eaaad976de7ef5c7513e6a4ba4797af4ee..33f25aaebc4cda0e8c150454b2fb3bc4a95f9791 100644 (file)
@@ -2172,7 +2172,7 @@ function renderIPv4SpaceEditor ()
        echo "</form></table><br><br>\n";
        finishPortlet();
 
-       $addrspaceList = getAddressspaceList();
+       $addrspaceList = getIPv4NetworkList();
        if (count ($addrspaceList))
        {
                startPortlet ('Manage existing (' . count ($addrspaceList) . ')');