r2190 - initial unified tree hacks
authorDenis Ovsienko <infrastation@yandex.ru>
Sun, 31 Aug 2008 11:25:24 +0000 (11:25 +0000)
committerDenis Ovsienko <infrastation@yandex.ru>
Sun, 31 Aug 2008 11:25:24 +0000 (11:25 +0000)
inc/database.php
inc/functions.php
inc/interface.php
pix/verge.png [new file with mode: 0644]

index 5e358f1..f188983 100644 (file)
@@ -1092,6 +1092,7 @@ function getIPv4NetworkInfo ($id = 0)
        $ret['mask_bin_inv'] = binInvMaskFromDec ($ret['mask']);
        $ret['db_first'] = sprintf ('%u', 0x00000000 + $ret['ip_bin'] & $ret['mask_bin']);
        $ret['db_last'] = sprintf ('%u', 0x00000000 + $ret['ip_bin'] | ($ret['mask_bin_inv']));
+       $ret['parent_id'] = getIPv4AddressNetworkId ($ret['ip'], $ret['mask']);
        return $ret;
 }
 
@@ -1139,6 +1140,31 @@ function bindIpToObject ($ip = '', $object_id = 0, $name = '', $type = '')
        return $result ? '' : (__FUNCTION__ . '(): useInsertBlade() failed');
 }
 
+function getIPv4NetworkList ($tagfilter = array(), $tfmode = 'any')
+{
+       $whereclause = getWhereClause ($tagfilter);
+       $query =
+               "select distinct id ".
+               "from IPRanges left join TagStorage on id = target_id and target_realm = 'ipv4net' " .
+               "where true ${whereclause} order by ip";
+       $result = useSelectBlade ($query, __FUNCTION__);
+       $ret = array();
+       while ($row = $result->fetch (PDO::FETCH_ASSOC))
+               $ret[$row['id']] = NULL;
+       unset ($result);
+       $keys = array_keys ($ret);
+       foreach ($keys as $netid)
+       {
+               $ret[$netid] = getIPv4NetworkInfo ($netid);
+               if ($ret[$netid]['parent_id'] and !in_array ($ret[$netid]['parent_id'], $keys))
+               {
+                       $ret[$netid]['real_parent_id'] = $ret[$netid]['parent_id'];
+                       $ret[$netid]['parent_id'] = NULL;
+               }
+       }
+       return $ret;
+}
+
 function getAddressspaceList ($tagfilter = array(), $tfmode = 'any')
 {
        $whereclause = getWhereClause ($tagfilter);
@@ -1171,11 +1197,14 @@ function getAddressspaceList ($tagfilter = array(), $tfmode = 'any')
 }
 
 // Return the id of the smallest IPv4 network containing the given IPv4 address
-// or NULL, if nothing was found.
-function getIPv4AddressNetworkId ($dottedquad)
+// or NULL, if nothing was found. When finding the covering network for
+// another network, it is important to filter out matched records with longer
+// masks (they aren't going to be the right pick).
+function getIPv4AddressNetworkId ($dottedquad, $masklen = 32)
 {
        $query = 'select id from IPRanges where ' .
                "inet_aton('${dottedquad}') & (4294967295 >> (32 - mask)) << (32 - mask) = ip " .
+               "and mask < ${masklen} " .
                'order by mask desc limit 1';
        $result = useSelectBlade ($query, __FUNCTION__);
        if ($row = $result->fetch (PDO::FETCH_ASSOC))
@@ -2950,7 +2979,7 @@ function createIPv4Prefix ($range = '', $name = '', $is_bcast = FALSE, $taglist
        }
        $binmask = binMaskFromDec($maskL);
        $ipL = $ipL & $binmask;
-
+/*
        $query =
                "select ".
                "id, INET_NTOA(ip) as dottedquad, mask, name ".
@@ -2967,6 +2996,7 @@ function createIPv4Prefix ($range = '', $name = '', $is_bcast = FALSE, $taglist
        }
        $result->closeCursor();
        unset ($result);
+*/
        $result = useInsertBlade
        (
                'IPRanges',
index c2c1186..6365915 100644 (file)
@@ -779,11 +779,17 @@ function attachChildTag (&$tree, $parent_id, $child_id, $child_info)
        return FALSE;
 }
 
-// Build a tree from the tag list and return it.
 function getTagTree ()
 {
        global $taglist;
-       $mytaglist = $taglist;
+       return treeFromList ($taglist);
+}
+
+// Build a tree from the item list and return it. Input and output data is
+// indexed by item id (nested items in output are recursively stored in 'kids'
+// key, which is in turn indexed by id.
+function treeFromList ($mytaglist)
+{
        $ret = array();
        while (count ($mytaglist) > 0)
        {
index 491774f..dfecd0f 100644 (file)
@@ -93,6 +93,10 @@ $image['find']['height'] = 16;
 $image['spacer']['path'] = 'pix/pixel.png';
 $image['spacer']['width'] = 16;
 $image['spacer']['height'] = 16;
+$image['verge']['path'] = 'pix/pixel.png';
+//$image['verge']['path'] = 'pix/verge.png';
+$image['verge']['width'] = 16;
+$image['verge']['height'] = 16;
 $image['next']['path'] = 'pix/tango-go-next.png';
 $image['next']['width'] = 32;
 $image['next']['height'] = 32;
@@ -1985,6 +1989,26 @@ function renderRackspaceHistory ()
        
 }
 
+function renderIPv4SpaceRecords ($tree, $level = 0, &$tagcache = array())
+{
+       $self = __FUNCTION__;
+       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>";
+               printIPv4NetInfoTDs ($netdata, 'tdleft', $level);
+               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'], $level + 1, $tagcache);
+       }
+}
+
 function renderIPv4Space ()
 {
        global $root, $pageno;
@@ -1993,28 +2017,14 @@ function renderIPv4Space ()
        echo "<tr><td class=pcleft>";
 
        $tagfilter = getTagFilter();
-       $addrspaceList = getAddressspaceList ($tagfilter, getTFMode());
-       $tagcache = array();
+       $addrspaceList = treeFromList (getIPv4NetworkList ($tagfilter, getTFMode()));
        startPortlet ('networks (' . count ($addrspaceList) . ')');
        echo "<table class='widetable' border=0 cellpadding=5 cellspacing=0 align='center'>\n";
        echo "<tr><th>prefix</th><th>name/tags</th><th>%% used</th>";
        if (getConfigVar ('EXT_IPV4_VIEW') == 'yes')
                echo "<th>routed by</th>";
        echo "</tr>\n";
-       foreach ($addrspaceList as $iprange)
-       {
-               $netdata = getIPv4Network ($iprange['id']);
-               $total = ($netdata['ip_bin'] | $netdata['mask_bin_inv']) - ($netdata['ip_bin'] & $netdata['mask_bin']) + 1;
-               $used = count ($netdata['addrlist']);
-               echo "<tr valign=top>";
-               printIPv4NetInfoTDs ($netdata);
-               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>";
-       }
+       renderIPv4SpaceRecords ($addrspaceList);
        echo "</table>\n";
        finishPortlet();
        echo '</td><td class=pcright>';
@@ -4653,8 +4663,10 @@ function renderTagRowForViewer ($taginfo, $level = 0)
 {
        echo '<tr><td align=left>';
        echo '<div title="id = ' . $taginfo['id'] . '">';
-       for ($i = 0; $i < $level; $i++)
+       for ($i = 0; $i < $level - 1; $i++)
                printImageHREF ('spacer');
+       if ($level)
+               printImageHREF ('verge');
        echo $taginfo['tag'] . '</div>';
        echo "</td></tr>\n";
        foreach ($taginfo['kids'] as $kid)
@@ -4666,8 +4678,10 @@ function renderTagRowForCloud ($taginfo, $realm, $level = 0)
 {
        global $root;
        echo '<tr><td align=left>';
-       for ($i = 0; $i < $level; $i++)
+       for ($i = 0; $i < $level - 1; $i++)
                printImageHREF ('spacer');
+       if ($level)
+               printImageHREF ('verge');
        echo "<a href='${root}?page=objgroup&group_id=0&tagfilter[]=${taginfo['id']}'>";
        echo $taginfo['tag'] . '</a>';
        if (isset ($taginfo['refcnt'][$realm]))
@@ -5251,11 +5265,16 @@ function printRoutersTD ($rlist, &$tagcache = array())
 }
 
 // Same as for routers, but produce two TD cells to lay the content out better.
-function printIPv4NetInfoTDs ($netinfo, $tdclass = 'tdleft')
+function printIPv4NetInfoTDs ($netinfo, $tdclass = 'tdleft', $indent = 0)
 {
        global $root;
        $tags = loadIPv4PrefixTags ($netinfo['id']);
-       echo "<td class='${tdclass}'><a href='${root}?page=iprange&id=${netinfo['id']}'>${netinfo['ip']}/${netinfo['mask']}</a></td>";
+       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 (count ($tags))
                echo '<br><small>' . serializeTags ($tags, "${root}?page=ipv4space&tab=default&") . '</small>';
diff --git a/pix/verge.png b/pix/verge.png
new file mode 100644 (file)
index 0000000..d9279bc
Binary files /dev/null and b/pix/verge.png differ