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 b03d279..9f5f5bc 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 f188983..474a603 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 b4cc1d9..071ea8d 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 37b673e..33f25aa 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) . ')');