r4862 update: ability to delete IP prefixes from within its properties tab
authorAlexey Andriyanov <alan@al-an.info>
Fri, 9 Dec 2011 12:32:15 +0000 (12:32 +0000)
committerAlexey Andriyanov <alan@al-an.info>
Fri, 9 Dec 2011 12:32:15 +0000 (12:32 +0000)
update: adding and deleting forms of IP prefixes are separated

delIPv4Prefix: made using of isIPNetworkEmpty
delIPv6Prefix: idem
navigation.php: new tab ipv[46]space-manage, ops (add|del)IPv[46]Prefix renamed to add|del
renderIPv4SpaceEditor: splitted into renderIPv4SpaceEditor and renderIPNewNetForm
renderIPv6SpaceEditor: idem
renderEditVlan: made using new function getOpLink
getOpLink: new interface-lib function to render an operation html-link with icon
isIPNetworkEmpty: new function to check if network does not contain meaningful allocations

ChangeLog
wwwroot/inc/functions.php
wwwroot/inc/interface-lib.php
wwwroot/inc/interface.php
wwwroot/inc/navigation.php
wwwroot/inc/ophandlers.php

index af5031a..bee5c2d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -11,6 +11,8 @@
        update: LiveCDP, LiveLLDP: more accurate default interface type detection, ability to overwrite the transceiver set on port, checkboxes are set by default
        update: ability to remove 802.1q VLAN from every port it belongs to in order to delete this VLAN
        update: API: you can selectively override the default static content by specifying the $local_staticdir global var
+       update: ability to delete IP prefixes from within its properties tab
+       update: adding and deleting forms of IP prefixes are separated
        new feature: you can obtain who has made tag assignment, object's ports or IPv4 address changes by hovering cursor on these entities
        new feature: adjustable quick links at the top of the page
 0.19.11
@@ -18,6 +20,8 @@
        bugfix: SNMP did not work for Netgear
        bugfix: Cacti integration improvements (#466)
        bugfix: Could not delete objects' log entries
+       update: ability to delete IP prefixes from within its properties tab
+       update: adding and deleting forms of IP prefixes are separated
 0.19.10 2011-10-17
        bugfix: LivePorts MAC address lister was broken with Huawei S5300 V100R006
        bugfix: SNMP sync was broken when one of default attributes was removed from certain object type
index e69ca85..e9894db 100644 (file)
@@ -4896,4 +4896,42 @@ function getBinaryZeroes ($value)
        return $ret;
 }
 
+// returns TRUE if the network cell is allowed to be deleted, FALSE otherwise
+// $netinfo could be either ipv4net or ipv6net entity.
+// in case of returning FALSE, $netinfo['addrlist'] is set
+function isIPNetworkEmpty (&$netinfo)
+{
+       if (getConfigVar ('IPV4_JAYWALK') == 'yes')
+               return TRUE;
+       if (! isset ($netinfo['addrlist']))
+       {
+               if ($netinfo['realm'] == 'ipv4net')
+                       loadIPv4AddrList ($netinfo);
+               else
+                       loadIPv6AddrList ($netinfo);
+       }
+       $pure_array = ($netinfo['realm'] == 'ipv4net') ?
+               array ($netinfo['db_first'] => 'network', $netinfo['db_last'] => 'broadcast') :
+               array ($netinfo['db_first']->getBin() => 'Subnet-Router anycast');
+       $pure_auto = 0;
+       foreach ($pure_array as $ip => $comment)
+               if
+               (
+                       array_key_exists ($ip, $netinfo['addrlist']) and
+                       $netinfo['addrlist'][$ip]['name'] == $comment and
+                       $netinfo['addrlist'][$ip]['reserved'] == 'yes' and
+                       ! count ($netinfo['addrlist'][$ip]['allocs']) and
+                       (
+                               $netinfo['realm'] == 'ipv6net' or (
+                                       ! count ($netinfo['addrlist'][$ip]['outpf']) and
+                                       ! count ($netinfo['addrlist'][$ip]['inpf']) and
+                                       ! count ($netinfo['addrlist'][$ip]['rsplist']) and
+                                       ! count ($netinfo['addrlist'][$ip]['vslist'])
+                               )
+                       )
+               )
+                       $pure_auto++;
+       return (count ($netinfo['addrlist']) <= $pure_auto);
+}
+
 ?>
index 59058c6..91f991f 100644 (file)
@@ -702,4 +702,31 @@ function renderEntitySummary ($cell, $title, $values = array())
        finishPortlet();
 }
 
+function getOpLink ($params, $title,  $img_name = '', $comment = '', $class = '')
+{
+       if (isset ($params))
+               $ret = '<a href="' . makeHrefProcess ($params) . '"';
+       else
+       {
+               $ret = '<a href="#" onclick="return false;"';
+               $class .= ' noclick';
+       }
+       if (! empty ($comment))
+               $ret .= ' title="' . htmlspecialchars ($comment, ENT_QUOTES) . '"';
+       $class = trim ($class);
+       if (! empty ($class))
+               $ret .= ' class="' . htmlspecialchars ($class, ENT_QUOTES) . '"';
+       if (! empty ($comment))
+               $ret .= 'title="' . htmlspecialchars($comment, ENT_QUOTES) . '"';
+       $ret .= '>';
+       if (! empty ($img_name))
+       {
+               $ret .= getImageHREF ($img_name, $comment);
+               if (! empty ($title))
+                       $ret .= ' ';
+       }
+       $ret .= $title . '</a>';
+       return $ret;
+}
+
 ?>
index a17089b..1dd4302 100644 (file)
@@ -2305,48 +2305,10 @@ function renderIPv6Space ()
 
 function renderIPv4SpaceEditor ()
 {
-       // IPv4 validator
-       addJs ('js/live_validation.js');
-       $regexp = addslashes ('^(\d{1,3}\.){3}\d{1,3}/\d{1,2}$');
-       addJs (<<<END
-$(document).ready(function () {
-       document.add_new_range.range.setAttribute('match', '$regexp');
-       Validate.init();
-});
-END
-       , TRUE);
-
-       function printNewItemTR ()
+       $addrspaceList = listCells ('ipv4net');
+       startPortlet ('Manage existing (' . count ($addrspaceList) . ')');
+       if (count ($addrspaceList))
        {
-               startPortlet ('Add new');
-               echo '<table border=0 cellpadding=10 align=center>';
-               // This form requires a name, so JavaScript validator can find it.
-               // No printOpFormIntro() hence
-               echo "<form method=post name='add_new_range' action='".makeHrefProcess()."'>\n";
-               echo "<input type=hidden name=op value=addIPv4Prefix>\n";
-               // tags column
-               echo '<tr><td rowspan=5><h3>assign tags</h3>';
-               renderNewEntityTags ('ipv4net');
-               echo '</td>';
-               // inputs column
-               $prefix_value = empty ($_REQUEST['set-prefix']) ? '' : $_REQUEST['set-prefix'];
-               echo "<th class=tdright>prefix</th><td class=tdleft><input type=text name='range' size=18 class='live-validate' tabindex=10 value='${prefix_value}'></td>";
-               echo '<tr><th class=tdright>VLAN</th><td class=tdleft>';
-               echo getOptionTree ('vlan_ck', getAllVLANOptions(), array ('select_class' => 'vertical', 'tabindex' => 20)) . '</td></tr>';
-               echo "<tr><th class=tdright>name</th><td class=tdleft><input type=text name='name' size='20' tabindex=30></td></tr>";
-               echo '<tr><td class=tdright><input type=checkbox name="is_bcast" tabindex=40></td><th class=tdleft>reserve network and router addresses</th></tr>';
-               echo "<tr><td colspan=2>";
-               printImageHREF ('CREATE', 'Add a new network', TRUE, 50);
-               echo '</td></tr>';
-               echo "</form></table><br><br>\n";
-               finishPortlet();
-       }
-
-       if (getConfigVar ('ADDNEW_AT_TOP') == 'yes')
-               printNewItemTR();
-       if (count ($addrspaceList = listCells ('ipv4net')))
-       {
-               startPortlet ('Manage existing (' . count ($addrspaceList) . ')');
                echo "<table class='widetable' border=0 cellpadding=5 cellspacing=0 align='center'>\n";
                echo "<tr><th>&nbsp;</th><th>prefix</th><th>name</th><th>capacity</th></tr>";
                array_walk ($addrspaceList, 'amplifyCell');
@@ -2361,29 +2323,11 @@ END
                        $used = $netinfo['addrc'];
                        $maxdirect = $netinfo['addrt'];
                        $maxtotal = binInvMaskFromDec ($netinfo['mask']) + 1;
-                       $pure_auto = 0;
-                       foreach (array ($netinfo['db_first'] => 'network', $netinfo['db_last'] => 'broadcast') as $ip => $comment)
-                               if
-                               (
-                                       array_key_exists ($ip, $netinfo['addrlist']) and
-                                       $netinfo['addrlist'][$ip]['name'] == $comment and
-                                       $netinfo['addrlist'][$ip]['reserved'] == 'yes' and
-                                       ! count ($netinfo['addrlist'][$ip]['outpf']) and
-                                       ! count ($netinfo['addrlist'][$ip]['inpf']) and
-                                       ! count ($netinfo['addrlist'][$ip]['allocs']) and
-                                       ! count ($netinfo['addrlist'][$ip]['rsplist']) and
-                                       ! count ($netinfo['addrlist'][$ip]['vslist'])
-                               )
-                                       $pure_auto++;
                        echo "<tr valign=top><td>";
-                       if (count ($netinfo['addrlist']) > $pure_auto && getConfigVar ('IPV4_JAYWALK') == 'no')
+                       if (! isIPNetworkEmpty ($netinfo))
                                printImageHREF ('nodestroy', 'There are ' . count ($netinfo['addrlist']) . ' allocations inside');
                        else
-                       {
-                               echo "<a href='".makeHrefProcess(array('op'=>'delIPv4Prefix', 'id'=>$netinfo['id']))."'>";
-                               printImageHREF ('destroy', 'Delete this prefix');
-                               echo "</a>";
-                       }
+                               echo getOpLink (array   ('op' => 'del', 'id' => $netinfo['id']), '', 'destroy', 'Delete this prefix');
                        echo '</td><td class=tdleft><a href="' . makeHref (array ('page' => 'ipv4net', 'id' => $netinfo['id'])) . '">';
                        echo "${netinfo['ip']}/${netinfo['mask']}</a></td>";
                        echo '<td class=tdleft>' . niftyString ($netinfo['name']);
@@ -2397,54 +2341,14 @@ END
                echo "</table>";
                finishPortlet();
        }
-       if (getConfigVar ('ADDNEW_AT_TOP') != 'yes')
-               printNewItemTR();
 }
 
 function renderIPv6SpaceEditor ()
 {
-       // IPv6 validator
-       addJs ('js/live_validation.js');
-       $regexp = addslashes ('^[a-fA-F0-9:]*:[a-fA-F0-9:\.]*/\d{1,3}$');
-       addJs (<<<END
-$(document).ready(function () {
-       document.add_new_range.range.setAttribute('match', '$regexp');
-       Validate.init();
-});
-END
-       , TRUE);
-
-       function printNewItemTR ()
-       {
-               startPortlet ('Add new');
-               echo '<table border=0 cellpadding=10 align=center>';
-               // This form requires a name, so JavaScript validator can find it.
-               // No printOpFormIntro() hence
-               echo "<form method=post name='add_new_range' action='".makeHrefProcess()."'>\n";
-               echo "<input type=hidden name=op value=addIPv6Prefix>\n";
-               // tags column
-               echo '<tr><td rowspan=5><h3>assign tags</h3>';
-               renderNewEntityTags ('ipv4net');
-               echo '</td>';
-               // inputs column
-               $prefix_value = empty ($_REQUEST['set-prefix']) ? '' : $_REQUEST['set-prefix'];
-               echo "<th class=tdright>prefix</th><td class=tdleft><input type=text name='range' size=36 class='live-validate' tabindex=10 value='${prefix_value}'></td>";
-               echo '<tr><th class=tdright>VLAN</th><td class=tdleft>';
-               echo getOptionTree ('vlan_ck', getAllVLANOptions(), array ('select_class' => 'vertical', 'tabindex' => 20)) . '</td></tr>';
-               echo "<tr><th class=tdright>name</th><td class=tdleft><input type=text name='name' size='20' tabindex=30></td></tr>";
-               echo '<tr><td class=tdright><input type=checkbox name="is_connected" tabindex=40></td><th class=tdleft>reserve subnet-router anycast address</th></tr>';
-               echo "<tr><td colspan=2>";
-               printImageHREF ('CREATE', 'Add a new network', TRUE, 50);
-               echo '</td></tr>';
-               echo "</form></table><br><br>\n";
-               finishPortlet();
-       }
-
-       if (getConfigVar ('ADDNEW_AT_TOP') == 'yes')
-               printNewItemTR();
-       if (count ($addrspaceList = listCells ('ipv6net')))
+       $addrspaceList = listCells ('ipv6net');
+       startPortlet ('Manage existing (' . count ($addrspaceList) . ')');
+       if (count ($addrspaceList))
        {
-               startPortlet ('Manage existing (' . count ($addrspaceList) . ')');
                echo "<table class='widetable' border=0 cellpadding=5 cellspacing=0 align='center'>\n";
                echo "<tr><th>&nbsp;</th><th>prefix</th><th>name</th><th>capacity</th></tr>";
                array_walk ($addrspaceList, 'amplifyCell');
@@ -2457,14 +2361,10 @@ END
                        // now we have all subnets listed in netinfo
                        loadIPv6AddrList ($netinfo);
                        echo "<tr valign=top><td>";
-                       if (count ($netinfo['addrlist']) && getConfigVar ('IPV4_JAYWALK') == 'no')
+                       if (! isIPNetworkEmpty ($netinfo))
                                printImageHREF ('nodestroy', 'There are ' . count ($netinfo['addrlist']) . ' allocations inside');
                        else
-                       {
-                               echo "<a href='".makeHrefProcess (array ('op' => 'delIPv6Prefix', 'id' => $netinfo['id'])) . "'>";
-                               printImageHREF ('destroy', 'Delete this prefix');
-                               echo "</a>";
-                       }
+                               echo getOpLink (array   ('op' => 'del', 'id' => $netinfo['id']), '', 'destroy', 'Delete this prefix');
                        echo '</td><td class=tdleft><a href="' . makeHref (array ('page' => 'ipv6net', 'id' => $netinfo['id'])) . '">';
                        echo "${netinfo['ip']}/${netinfo['mask']}</a></td>";
                        echo '<td class=tdleft>' . niftyString ($netinfo['name']);
@@ -2477,8 +2377,55 @@ END
                echo "</table>";
                finishPortlet();
        }
-       if (getConfigVar ('ADDNEW_AT_TOP') != 'yes')
-               printNewItemTR();
+}
+
+function renderIPNewNetForm ()
+{
+       global $pageno;
+       if ($pageno == 'ipv6space')
+       {
+               $realm = 'ipv6net';
+               $regexp = addslashes ('^[a-fA-F0-9:]*:[a-fA-F0-9:\.]*/\d{1,3}$');
+       }
+       else
+       {
+               $realm = 'ipv4net';
+               $regexp = addslashes ('^(\d{1,3}\.){3}\d{1,3}/\d{1,2}$');
+       }
+
+       // IP prefix validator
+       addJs ('js/live_validation.js');
+       $regexp = addslashes ($regexp);
+       addJs (<<<END
+$(document).ready(function () {
+       document.add_new_range.range.setAttribute('match', '$regexp');
+       Validate.init();
+});
+END
+       , TRUE);
+       
+       startPortlet ('Add new');
+       echo '<table border=0 cellpadding=10 align=center>';
+       // This form requires a name, so JavaScript validator can find it.
+       // No printOpFormIntro() hence
+       echo "<form method=post name='add_new_range' action='".makeHrefProcess()."'>\n";
+       echo "<input type=hidden name=op value=add>\n";
+       // tags column
+       echo '<tr><td rowspan=5><h3>assign tags</h3>';
+       renderNewEntityTags ($realm);
+       echo '</td>';
+       // inputs column
+       $prefix_value = empty ($_REQUEST['set-prefix']) ? '' : $_REQUEST['set-prefix'];
+       echo "<th class=tdright>prefix</th><td class=tdleft><input type=text name='range' size=36 class='live-validate' tabindex=1 value='${prefix_value}'></td>";
+       echo '<tr><th class=tdright>VLAN</th><td class=tdleft>';
+       echo getOptionTree ('vlan_ck', getAllVLANOptions(), array ('select_class' => 'vertical', 'tabindex' => 2)) . '</td></tr>';
+       echo "<tr><th class=tdright>name</th><td class=tdleft><input type=text name='name' size='20' tabindex=3></td></tr>";
+       echo '<tr><td class=tdright><input type=checkbox name="is_connected" tabindex=4></td><th class=tdleft>reserve subnet-router anycast address</th></tr>';
+       echo "<tr><td colspan=2>";
+       printImageHREF ('CREATE', 'Add a new network', TRUE, 5);
+       echo '</td></tr>';
+       echo "</form></table><br><br>\n";
+       finishPortlet();
 }
 
 function renderIPv4Network ($id)
@@ -2888,6 +2835,13 @@ function renderIPNetworkProperties ($id)
        echo "<tr><td colspan=2 class=tdcenter>";
        printImageHREF ('SAVE', 'Save changes', TRUE);
        echo "</td></form></tr></table>\n";
+
+       echo '<center>';
+       if (! isIPNetworkEmpty ($netdata))
+               echo getOpLink (NULL, 'delete this prefix', 'nodestroy', 'There are ' . count ($netdata['addrlist']) . ' allocations inside');
+       else
+               echo getOpLink (array('op'=>'del','id'=>$id), 'delete this prefix', 'destroy');
+       echo '</center>';
 }
 
 function renderIPAddress ($dottedquad)
@@ -8685,22 +8639,17 @@ function renderEditVlan ($vlan_ck)
                        '<a href="' . makeHref (array ('page' => 'vlan', 'tab' => 'default', 'vlan_ck' => $vlan_ck)) . '">' .
                        "$portc ports</a>";
        }
-       
+
        $reason = '';
        if ($vlan['vlan_id'] == VLAN_DFL_ID)
                $reason = "You can not delete default VLAN";
        elseif ($portc)
                $reason = "Can not delete: $portc ports configured";
        if (! empty ($reason))
-               $delete_line .= '<a href="#" class="noclick" onclick="return false" ' .
-               'title="' . htmlspecialchars($reason, ENT_QUOTES) . '">' . getImageHREF ('nodestroy');
+               echo getOpLink (NULL, 'delete VLAN', 'nodestroy', $reason);
        else
-               $delete_line .= '<a href="' .
-                       makeHrefProcess (array ('op' => 'del', 'vlan_ck' => $vlan_ck)) .
-                       '" title="delete VLAN">' . getImageHREF ('destroy');
-       $delete_line .= ' delete VLAN</a>';
-       
-       echo $delete_line . $clear_line;
+               echo getOpLink (array ('op' => 'del', 'vlan_ck' => $vlan_ck), 'delete VLAN', 'destroy');
+       echo $clear_line;
        finishPortlet();
 }
 
index 7d5ebbc..323f7bb 100644 (file)
@@ -217,19 +217,23 @@ $delayauth['object-8021qorder-del'] = TRUE;
 
 $page['ipv4space']['parent'] = 'index';
 $tab['ipv4space']['default'] = 'Browse';
-$tab['ipv4space']['newrange'] = 'Manage';
+$tab['ipv4space']['newrange'] = 'Add';
+$tab['ipv4space']['manage'] = 'Delete';
 $tabhandler['ipv4space']['default'] = 'renderIPv4Space';
-$tabhandler['ipv4space']['newrange'] = 'renderIPv4SpaceEditor';
-$ophandler['ipv4space']['newrange']['addIPv4Prefix'] = 'addIPv4Prefix';
-$ophandler['ipv4space']['newrange']['delIPv4Prefix'] = 'delIPv4Prefix';
+$tabhandler['ipv4space']['newrange'] = 'renderIPNewNetForm';
+$tabhandler['ipv4space']['manage'] = 'renderIPv4SpaceEditor';
+$ophandler['ipv4space']['newrange']['add'] = 'addIPv4Prefix';
+$ophandler['ipv4space']['manage']['del'] = 'delIPv4Prefix';
 
 $page['ipv6space']['parent'] = 'index';
 $tab['ipv6space']['default'] = 'Browse';
-$tab['ipv6space']['newrange'] = 'Manage';
+$tab['ipv6space']['newrange'] = 'Add';
+$tab['ipv6space']['manage'] = 'Delete';
 $tabhandler['ipv6space']['default'] = 'renderIPv6Space';
-$tabhandler['ipv6space']['newrange'] = 'renderIPv6SpaceEditor';
-$ophandler['ipv6space']['newrange']['addIPv6Prefix'] = 'addIPv6Prefix';
-$ophandler['ipv6space']['newrange']['delIPv6Prefix'] = 'delIPv6Prefix';
+$tabhandler['ipv6space']['newrange'] = 'renderIPNewNetForm';
+$tabhandler['ipv6space']['manage'] = 'renderIPv6SpaceEditor';
+$ophandler['ipv6space']['newrange']['add'] = 'addIPv6Prefix';
+$ophandler['ipv6space']['manage']['del'] = 'delIPv6Prefix';
 
 $page['ipv4net']['parent'] = 'ipv4space';
 $page['ipv4net']['bypass'] = 'id';
@@ -249,6 +253,7 @@ $tabhandler['ipv4net']['8021q'] = 'renderVLANIPLinks';
 $trigger['ipv4net']['tags'] = 'trigger_tags';
 $trigger['ipv4net']['8021q'] = 'trigger_ipv4net_vlanconfig';
 $ophandler['ipv4net']['properties']['editRange'] = 'tableHandler';
+$ophandler['ipv4net']['properties']['del'] = 'delIPv4Prefix';
 $ophandler['ipv4net']['liveptr']['importPTRData'] = 'importPTRData';
 $ophandler['ipv4net']['tags']['saveTags'] = 'saveEntityTags';
 $ophandler['ipv4net']['files']['addFile'] = 'addFileToEntity';
@@ -273,6 +278,7 @@ $tabhandler['ipv6net']['8021q'] = 'renderVLANIPLinks';
 $trigger['ipv6net']['tags'] = 'trigger_tags';
 $trigger['ipv6net']['8021q'] = 'trigger_ipv6net_vlanconfig';
 $ophandler['ipv6net']['properties']['editRange'] = 'tableHandler';
+$ophandler['ipv6net']['properties']['del'] = 'delIPv6Prefix';
 $ophandler['ipv6net']['tags']['saveTags'] = 'saveEntityTags';
 $ophandler['ipv6net']['files']['addFile'] = 'addFileToEntity';
 $ophandler['ipv6net']['files']['linkFile'] = 'linkFileToEntity';
index 8f92981..3b9ee7c 100644 (file)
@@ -851,40 +851,34 @@ function delIPv4Prefix ()
        assertUIntArg ('id');
        $netinfo = spotEntity ('ipv4net', $_REQUEST['id']);
        loadIPv4AddrList ($netinfo);
-       if
-       (
-               array_key_exists ($netinfo['db_first'], $netinfo['addrlist']) and
-               $netinfo['addrlist'][$netinfo['db_first']]['name'] == 'network' and
-               $netinfo['addrlist'][$netinfo['db_first']]['reserved'] == 'yes' and
-               ! count ($netinfo['addrlist'][$netinfo['db_first']]['outpf']) and
-               ! count ($netinfo['addrlist'][$netinfo['db_first']]['inpf']) and
-               ! count ($netinfo['addrlist'][$netinfo['db_first']]['rslist']) and
-               ! count ($netinfo['addrlist'][$netinfo['db_first']]['allocs']) and
-               ! count ($netinfo['addrlist'][$netinfo['db_first']]['lblist'])
-       )
+       if (! isIPNetworkEmpty ($netinfo))
+               return showError ("There are allocations within prefix, delete forbidden");
+       if (array_key_exists ($netinfo['db_first'], $netinfo['addrlist']))
                updateAddress ($netinfo['addrlist'][$netinfo['db_first']]['ip'], '', 'no');
-       if
-       (
-               array_key_exists ($netinfo['db_last'], $netinfo['addrlist']) and
-               $netinfo['addrlist'][$netinfo['db_last']]['name'] == 'broadcast' and
-               $netinfo['addrlist'][$netinfo['db_last']]['reserved'] == 'yes' and
-               ! count ($netinfo['addrlist'][$netinfo['db_last']]['outpf']) and
-               ! count ($netinfo['addrlist'][$netinfo['db_last']]['inpf']) and
-               ! count ($netinfo['addrlist'][$netinfo['db_last']]['rslist']) and
-               ! count ($netinfo['addrlist'][$netinfo['db_last']]['allocs']) and
-               ! count ($netinfo['addrlist'][$netinfo['db_last']]['lblist'])
-       )
+       if (array_key_exists ($netinfo['db_last'], $netinfo['addrlist']))
                updateAddress ($netinfo['addrlist'][$netinfo['db_last']]['ip'], '', 'no');
        destroyIPv4Prefix ($_REQUEST['id']);
-       return showFuncMessage (__FUNCTION__, 'OK');
+       showFuncMessage (__FUNCTION__, 'OK');
+       global $pageno;
+       if ($pageno == 'ipv4net')
+               return buildRedirectURL ('index', 'default');
 }
 
 $msgcode['delIPv6Prefix']['OK'] = 49;
 function delIPv6Prefix ()
 {
        assertUIntArg ('id');
+       $netinfo = spotEntity ('ipv6net', $_REQUEST['id']);
+       loadIPv6AddrList ($netinfo);
+       if (! isIPNetworkEmpty ($netinfo))
+               return showError ("There are allocations within prefix, delete forbidden");
+       if (array_key_exists ($netinfo['db_first']->getBin(), $netinfo['addrlist']))
+               updateAddress ($netinfo['db_first'], '', 'no');
        destroyIPv6Prefix ($_REQUEST['id']);
-       return showFuncMessage (__FUNCTION__, 'OK');
+       showFuncMessage (__FUNCTION__, 'OK');
+       global $pageno;
+       if ($pageno == 'ipv6net')
+               return buildRedirectURL ('index', 'default');
 }
 
 $msgcode['editAddress']['OK'] = 51;