r1517 + implemented all VS management functions
authorDenis Ovsienko <infrastation@yandex.ru>
Mon, 14 Jan 2008 17:05:42 +0000 (17:05 +0000)
committerDenis Ovsienko <infrastation@yandex.ru>
Mon, 14 Jan 2008 17:05:42 +0000 (17:05 +0000)
+ fixed VS protocol SELECT element

inc/database.php
inc/interface.php
inc/ophandlers.php

index 93d7e28..8485216 100644 (file)
@@ -2121,11 +2121,6 @@ function addRStoRSPool ($pool_id = 0, $rsip = '', $rsport = 0, $rsconfig = '')
                showError ('Invalid arguments', __FUNCTION__);
                die;
        }
-       if (long2ip (ip2long ($rsip)) !== $rsip)
-       {
-               showError ("Invalid IP address '${rsip}'", __FUNCTION__);
-               die;
-       }
        return useInsertBlade
        (
                'IPRealServer',
@@ -2139,6 +2134,28 @@ function addRStoRSPool ($pool_id = 0, $rsip = '', $rsport = 0, $rsconfig = '')
        );
 }
 
+function commitCreateVS ($vip = '', $vport = 0, $proto = '', $name = '', $vsconfig, $rsconfig)
+{
+       if (empty ($vip) or $vport <= 0 or empty ($proto))
+       {
+               showError ('Invalid arguments', __FUNCTION__);
+               die;
+       }
+       return useInsertBlade
+       (
+               'IPVirtualService',
+               array
+               (
+                       'vip' => "inet_aton('${vip}')",
+                       'vport' => $vport,
+                       'proto' => "'${proto}'",
+                       'name' => (empty ($name) ? 'NULL' : "'${name}'"),
+                       'vsconfig' => (empty ($vsconfig) ? 'NULL' : "'${vsconfig}'"),
+                       'rsconfig' => (empty ($rsconfig) ? 'NULL' : "'${rsconfig}'")
+               )
+       );
+}
+
 function addLBtoRSPool ($pool_id = 0, $object_id = 0, $vsconfig = '', $rsconfig = '')
 {
        if ($pool_id <= 0 or $object_id <= 0)
@@ -2166,6 +2183,13 @@ function commitDeleteRS ($id = 0)
        return useDeleteBlade ('IPRealServer', 'id', $id);
 }
 
+function commitDeleteVS ($id = 0)
+{
+       if ($id <= 0)
+               return FALSE;
+       return useDeleteBlade ('IPVirtualService', 'id', $id);
+}
+
 function commitDeleteLB ($object_id = 0, $pool_id = 0)
 {
        global $dbxlink;
@@ -2230,12 +2254,38 @@ function commitUpdateLB ($object_id = 0, $pool_id = 0, $vsconfig = '', $rsconfig
                return TRUE;
 }
 
+function commitUpdateVS ($vsid = 0, $vip = '', $vport = 0, $proto = '', $name = '', $vsconfig = '', $rsconfig = '')
+{
+       if ($vsid <= 0 or empty ($vip) or $vport <= 0 or empty ($proto))
+       {
+               showError ('Invalid args', __FUNCTION__);
+               die;
+       }
+       global $dbxlink;
+       $query = "update IPVirtualService set " .
+               "vip = inet_aton('${vip}'), " .
+               "vport = ${vport}, " .
+               "proto = '${proto}', " .
+               'name = ' . (empty ($name) ? 'NULL,' : "'${name}', ") .
+               'vsconfig = ' . (empty ($vsconfig) ? 'NULL,' : "'${vsconfig}', ") .
+               'rsconfig = ' . (empty ($rsconfig) ? 'NULL,' : "'${rsconfig}' ") .
+               "where id = ${vsid} limit 1";
+       $result = $dbxlink->exec ($query);
+       if ($result === NULL)
+               return FALSE;
+       elseif ($result != 1)
+               return FALSE;
+       else
+               return TRUE;
+}
+
 // Return the list of virtual services, indexed by vs_id.
 function getVSList ()
 {
        global $dbxlink;
-       $query = "select id, inet_ntoa(vip) as vip, vport, proto, name, vsconfig, rsconfig " .
-               "from IPVirtualService order by vip, vport, proto";
+       $query = "select vs.id, inet_ntoa(vip) as vip, vport, proto, vs.name, vs.vsconfig, vs.rsconfig, count(pool.id) as poolcount " .
+               "from IPVirtualService as vs left join IPRSPool as pool on pool.vs_id = vs.id " .
+               "group by vs.id order by vs.vip, proto, vport";
        $result = $dbxlink->query ($query);
        if ($result == NULL)
        {
@@ -2244,7 +2294,7 @@ function getVSList ()
        }
        $vslist = array ();
        while ($row = $result->fetch (PDO::FETCH_ASSOC))
-               foreach (array ('vip', 'vport', 'proto', 'name', 'vsconfig', 'rsconfig') as $cname)
+               foreach (array ('vip', 'vport', 'proto', 'name', 'vsconfig', 'rsconfig', 'poolcount') as $cname)
                        $vslist[$row['id']][$cname] = $row[$cname];
        $result->closeCursor();
        return $vslist;
index 8b401c7..67dd2c9 100644 (file)
@@ -3757,22 +3757,6 @@ function renderRSPoolServerForm ($pool_id = 0)
        showMessageOrError();
        $poolInfo = getRSPoolInfo ($pool_id);
 
-       startPortlet ('Add new');
-       echo "<table cellspacing=0 cellpadding=5 align=center class=widetable>\n";
-       echo "<tr><th>Address</th><th>Port</th><th>&nbsp;</th></tr>\n";
-       echo "<form action='${root}process.php'>";
-       echo "<input type=hidden name=page value='${pageno}'>\n";
-       echo "<input type=hidden name=tab value='${tabno}'>\n";
-       echo "<input type=hidden name=op value=addRS>";
-       echo "<input type=hidden name=id value='${pool_id}'>";
-       echo "<tr><td><input type=text name=rsip tabindex=1></td>";
-       echo "<td><input type=text name=rsport tabindex=2></td>";
-       echo "<td><input type=submit value='OK' tabindex=3></tr>\n";
-       echo "<tr><th colspan=3>configuration</th></tr>";
-       echo "<tr><td colspan=3><textarea name=rsconfig rows=10 cols=80 tabindex=4></textarea></td></tr>";
-       echo "</form></table>\n";
-       finishPortlet();
-
        startPortlet ('Manage existing');
        echo "<table cellspacing=0 cellpadding=5 align=center class=widetable>\n";
        echo "<tr><th>&nbsp;</th><th>Address</th><th>Port</th><th>configuration</th><th>&nbsp;</th></tr>\n";
@@ -3795,34 +3779,28 @@ function renderRSPoolServerForm ($pool_id = 0)
        }
        echo "</table>\n";
        finishPortlet();
-}
 
-function renderRSPoolLBForm ($pool_id = 0)
-{
-       global $root, $pageno, $tabno;
-       showMessageOrError();
        startPortlet ('Add new');
-               echo "<input type=hidden name=id value='${pool_id}'>";
        echo "<table cellspacing=0 cellpadding=5 align=center class=widetable>\n";
-       echo "<tr><th>Object</th><th>VS config</th><th>RS config</th><th>&nbsp;</th></tr>\n";
+       echo "<tr><th>Address</th><th>Port</th><th>&nbsp;</th></tr>\n";
        echo "<form action='${root}process.php'>";
        echo "<input type=hidden name=page value='${pageno}'>\n";
        echo "<input type=hidden name=tab value='${tabno}'>\n";
-       echo "<input type=hidden name=op value=addLB>";
-       echo "<input type=hidden name=pool_id value='${pool_id}'>";
-       echo "<tr valign=top><td><select name='object_id' tabindex=1>";
-       foreach (array(4, 7, 8) as $type)
-       {
-               $objects = getObjectList ($type);
-               foreach ($objects as $object)
-                       echo "<option value='${object['id']}'>${object['dname']}</option>";
-       }
-       echo "</select></td>";
-       echo "<td><textarea name=vsconfig></textarea></td>";
-       echo "<td><textarea name=rsconfig></textarea></td>";
-       echo "<td><input type=submit value=OK tabindex=2></td></tr>\n";
+       echo "<input type=hidden name=op value=addRS>";
+       echo "<input type=hidden name=id value='${pool_id}'>";
+       echo "<tr><td><input type=text name=rsip tabindex=1></td>";
+       echo "<td><input type=text name=rsport tabindex=2></td>";
+       echo "<td><input type=submit value='OK' tabindex=3></tr>\n";
+       echo "<tr><th colspan=3>configuration</th></tr>";
+       echo "<tr><td colspan=3><textarea name=rsconfig rows=10 cols=80 tabindex=4></textarea></td></tr>";
        echo "</form></table>\n";
        finishPortlet();
+}
+
+function renderRSPoolLBForm ($pool_id = 0)
+{
+       global $root, $pageno, $tabno;
+       showMessageOrError();
 
        startPortlet ('Manage existing');
        $poolInfo = getRSPoolInfo ($pool_id);
@@ -3845,6 +3823,27 @@ function renderRSPoolLBForm ($pool_id = 0)
                echo "<td><textarea name=rsconfig>${lbinfo['rsconfig']}</textarea></td>";
                echo "<td><input type=submit value=OK></td></tr></form>\n";
        }
+       echo "</table>\n";
+       finishPortlet();
+
+       startPortlet ('Add new');
+       echo "<table cellspacing=0 cellpadding=5 align=center class=widetable>\n";
+       echo "<form action='${root}process.php'>";
+       echo "<input type=hidden name=page value='${pageno}'>\n";
+       echo "<input type=hidden name=tab value='${tabno}'>\n";
+       echo "<input type=hidden name=op value=addLB>";
+       echo "<input type=hidden name=pool_id value='${pool_id}'>";
+       echo "<tr valign=top><th>Object</th><td><select name='object_id' tabindex=1>";
+       foreach (array(4, 7, 8) as $type)
+       {
+               $objects = getObjectList ($type);
+               foreach ($objects as $object)
+                       echo "<option value='${object['id']}'>${object['dname']}</option>";
+       }
+       echo "</select></td><td rowspan=3 valign=middle><input type=submit value=OK tabindex=2></td></tr>\n";
+       echo "<tr><th>VS config</th><td><textarea name=vsconfig rows=10 cols=80></textarea></td></tr>";
+       echo "<tr><th>RS config</th><td><textarea name=rsconfig rows=10 cols=80></textarea></td></tr>";
+       echo "</form></table>\n";
        finishPortlet();
 }
 
@@ -3937,19 +3936,14 @@ function renderVSList ()
 
 function renderVSListEditForm ()
 {
-       global $root;
-
-       startPortlet ('Add new');
-       echo "<table class=widetable border=0 cellpadding=10 cellspacing=0 align=center>\n";
-       echo "<tr><th>&nbsp;</th><th>VIP</th><th>port</th><th>proto</th><th>name</th>";
-       echo "<th>VS configuration</th><th>RS configuration</th><th></th></tr>";
-       echo "</table>";
-       finishPortlet();
+       global $root, $pageno, $tabno;
+       showMessageOrError();
 
        startPortlet ('Manage existing');
        echo "<table class=widetable border=0 cellpadding=10 cellspacing=0 align=center>\n";
        echo "<tr><th>&nbsp;</th><th>VIP</th><th>port</th><th>proto</th><th>name</th>";
        echo "<th>VS configuration</th><th>RS configuration</th><th></th></tr>";
+       $protocols = array ('TCP' => 'TCP', 'UDP' => 'UDP');
        foreach (getVSList() as $vsid => $vsinfo)
        {
                echo "<form method=post action='${root}process.php'>\n";
@@ -3957,19 +3951,50 @@ function renderVSListEditForm ()
                echo "<input type=hidden name=tab value=${tabno}>\n";
                echo "<input type=hidden name=op value=upd>\n";
                echo "<input type=hidden name=id value=${vsid}>\n";
-               echo "<tr valign=top>["; //<a href='${root}?process.php?page=${pageno}&tab=${tabno}&op=del&id=${vsid}'>";
-               printImageHREF ('delete', 'delete virtual service');
-               echo "</a>]</td><td class=tdleft><input type=text name=vip tabindex=1>${vsinfo['vip']}</td>";
-               echo "<td class=tdleft><input type=text name=vport value='${vsinfo['vport']}' tabindex=2></td>";
-               echo "<td class=tdleft><select name=proto tabindex=3><option value=TCP selected><option value=UDP></select></td>";
+               echo "<tr valign=top><td>";
+               if ($vsinfo['poolcount'])
+                       echo '&nbsp;';
+               else
+               {
+                       echo "<a href='${root}process.php?page=${pageno}&tab=${tabno}&op=del&id=${vsid}'>";
+                       printImageHREF ('delete', 'delete virtual service');
+                       echo '</a>';
+               }
+               echo "</td><td class=tdleft><input type=text name=vip value='${vsinfo['vip']}'></td>";
+               echo "<td class=tdleft><input type=text name=vport value='${vsinfo['vport']}'></td>";
+               echo "<td class=tdleft>";
+               printSelect ($protocols, 'proto', $vsinfo['proto']);
+               echo "</td>";
                echo "<td class=tdleft><input type=text name=name value='${vsinfo['name']}'></td>";
-               echo "<td><textarea cols=80 rows=10>${vsinfo['vsconfig']}</textarea></td>";
-               echo "<td><textarea cols=80 rows=10>${vsinfo['rsconfig']}</textarea></td>";
+               echo "<td><textarea name=vsconfig>${vsinfo['vsconfig']}</textarea></td>";
+               echo "<td><textarea name=rsconfig>${vsinfo['rsconfig']}</textarea></td>";
                echo "<td><input type=submit value=OK></td>";
                echo "</tr></form>\n";
        }
        echo "</table>";
        finishPortlet();
+
+       startPortlet ('Add new');
+       echo "<form method=post action='${root}process.php'>\n";
+       echo "<input type=hidden name=page value=${pageno}>\n";
+       echo "<input type=hidden name=tab value=${tabno}>\n";
+       echo "<input type=hidden name=op value=add>\n";
+       echo "<input type=hidden name=id value=${vsid}>\n";
+       echo "<table class=widetable border=0 cellpadding=10 cellspacing=0 align=center>\n";
+       echo "<tr><th>&nbsp;</th><th>VIP</th><th>port</th><th>proto</th><th>name</th><th>&nbsp;</th></tr>";
+       echo "<tr valign=top><td>&nbsp;</td>";
+       echo "<td><input type=text name=vip tabindex=1></td>";
+       echo "<td><input type=text name=vport tabindex=2></td>";
+       echo "<td>";
+       printSelect ($protocols, 'proto', 'TCP');
+       echo "</td>";
+       echo "<td><input type=text name=name tabindex=4></td>";
+       echo "<td rowspan=3 valign=middle><input type=submit value=OK tabindex=5></td></tr>";
+       echo "<tr><th>VS configuration</th><td colspan=4 class=tdleft><textarea name=vsconfig rows=10 cols=80></textarea></td></tr>";
+       echo "<tr><th>RS configuration</th><td colspan=4 class=tdleft><textarea name=rsconfig rows=10 cols=80></textarea></td></tr>";
+       echo "</table>";
+       echo "</form>\n";
+       finishPortlet();
 }
 
 function renderRSPoolList ()
index 0457bbc..b12baf2 100644 (file)
@@ -964,17 +964,34 @@ function addRealServer ()
        global $root, $pageno, $tabno;
 
        assertUIntArg ('id');
-       assertStringArg ('rsip');
+       assertIPv4Arg ('rsip');
        assertUIntArg ('rsport');
        assertStringArg ('rsconfig', TRUE);
        $pool_id = $_REQUEST['id'];
-       $rsip = $_REQUEST['rsip'];
-       $rsport = $_REQUEST['rsport'];
-       $rsconfig = $_REQUEST['rsconfig'];
-       if (!addRStoRSPool ($pool_id, $rsip, $rsport, $rsconfig))
-               return "${root}?page=${pageno}&tab=${tabno}&id=$pool_id&error=" . urlencode ('addRStoRSPool() failed');
+       if (!addRStoRSPool ($pool_id, $_REQUEST['rsip'], $_REQUEST['rsport'], $_REQUEST['rsconfig']))
+               return "${root}?page=${pageno}&tab=${tabno}&id=${pool_id}&error=" . urlencode ('addRStoRSPool() failed');
+       else
+               return "${root}?page=${pageno}&tab=${tabno}&id=${pool_id}&message=" . urlencode ("Real server was successfully added");
+}
+
+function addVService ()
+{
+       global $root, $pageno, $tabno;
+
+       assertIPv4Arg ('vip');
+       assertUIntArg ('vport');
+       assertStringArg ('proto');
+       $proto = $_REQUEST['proto'];
+       if ($proto != 'TCP' and $proto != 'UDP')
+               return "${root}?page=${pageno}&tab=${tabno}&error=" . urlencode (__FUNCTION__ . ': invalid protocol');
+       assertStringArg ('name', TRUE);
+       assertStringArg ('vsconfig', TRUE);
+       assertStringArg ('rsconfig', TRUE);
+       $pool_id = $_REQUEST['id'];
+       if (!commitCreateVS ($_REQUEST['vip'], $_REQUEST['vport'], $proto, $_REQUEST['name'], $_REQUEST['vsconfig'], $_REQUEST['rsconfig']))
+               return "${root}?page=${pageno}&tab=${tabno}&error=" . urlencode ('commitCreateVS() failed');
        else
-               return "${root}?page=${pageno}&tab=${tabno}&id=$pool_id&message=" . urlencode ("Real server was successfully added");
+               return "${root}?page=${pageno}&tab=${tabno}&message=" . urlencode ("Virtual service was successfully created");
 }
 
 function deleteRealServer ()
@@ -983,12 +1000,11 @@ function deleteRealServer ()
 
        assertUIntArg ('pool_id');
        assertUIntArg ('id');
-       $rsid = $_REQUEST['id'];
        $pool_id = $_REQUEST['pool_id'];
-       if (!commitDeleteRS ($rsid))
-               return "${root}?page=${pageno}&tab=${tabno}&id=$pool_id&error=" . urlencode ('commitDeleteRS() failed');
+       if (!commitDeleteRS ($_REQUEST['id']))
+               return "${root}?page=${pageno}&tab=${tabno}&id=${pool_id}&error=" . urlencode ('commitDeleteRS() failed');
        else
-               return "${root}?page=${pageno}&tab=${tabno}&id=$pool_id&message=" . urlencode ("Real server was successfully deleted");
+               return "${root}?page=${pageno}&tab=${tabno}&id=${pool_id}&message=" . urlencode ("Real server was successfully deleted");
 }
 
 function deleteLoadBalancer ()
@@ -997,12 +1013,22 @@ function deleteLoadBalancer ()
 
        assertUIntArg ('object_id');
        assertUIntArg ('pool_id');
-       $object_id = $_REQUEST['object_id'];
        $pool_id = $_REQUEST['pool_id'];
-       if (!commitDeleteLB ($object_id, $pool_id))
-               return "${root}?page=${pageno}&tab=${tabno}&id=$pool_id&error=" . urlencode ('commitDeleteLB() failed');
+       if (!commitDeleteLB ($_REQUEST['object_id'], $pool_id))
+               return "${root}?page=${pageno}&tab=${tabno}&id=${pool_id}&error=" . urlencode ('commitDeleteLB() failed');
+       else
+               return "${root}?page=${pageno}&tab=${tabno}&id=${pool_id}&message=" . urlencode ("Load balancer was successfully deleted");
+}
+
+function deleteVService ()
+{
+       global $root, $pageno, $tabno;
+
+       assertUIntArg ('id');
+       if (!commitDeleteVS ($_REQUEST['id']))
+               return "${root}?page=${pageno}&tab=${tabno}&error=" . urlencode ('commitDeleteVS() failed');
        else
-               return "${root}?page=${pageno}&tab=${tabno}&id=$pool_id&message=" . urlencode ("Load balancer was successfully deleted");
+               return "${root}?page=${pageno}&tab=${tabno}&message=" . urlencode ("Virtual service was successfully deleted");
 }
 
 function updateRealServer ()
@@ -1011,15 +1037,15 @@ function updateRealServer ()
 
        assertUIntArg ('id');
        assertUIntArg ('pool_id');
-       assertStringArg ('rsip');
+       assertIPv4Arg ('rsip');
        assertUIntArg ('rsport');
        assertStringArg ('rsconfig', TRUE);
        // only necessary for generating next URL
        $pool_id = $_REQUEST['pool_id'];
        if (!commitUpdateRS ($_REQUEST['id'], $_REQUEST['rsip'], $_REQUEST['rsport'], $_REQUEST['rsconfig']))
-               return "${root}?page=${pageno}&tab=${tabno}&id=$pool_id&error=" . urlencode ('commitUpdateRS() failed');
+               return "${root}?page=${pageno}&tab=${tabno}&id=${pool_id}&error=" . urlencode ('commitUpdateRS() failed');
        else
-               return "${root}?page=${pageno}&tab=${tabno}&id=$pool_id&message=" . urlencode ("Real server was successfully updated");
+               return "${root}?page=${pageno}&tab=${tabno}&id=${pool_id}&message=" . urlencode ("Real server was successfully updated");
 }
 
 function updateLoadbalancer ()
@@ -1032,9 +1058,26 @@ function updateLoadbalancer ()
        assertStringArg ('rsconfig', TRUE);
        $pool_id = $_REQUEST['pool_id'];
        if (!commitUpdateLB ($_REQUEST['object_id'], $pool_id, $_REQUEST['vsconfig'], $_REQUEST['rsconfig']))
-               return "${root}?page=${pageno}&tab=${tabno}&id=$pool_id&error=" . urlencode ('commitUpdateLB() failed');
+               return "${root}?page=${pageno}&tab=${tabno}&id=${pool_id}&error=" . urlencode ('commitUpdateLB() failed');
+       else
+               return "${root}?page=${pageno}&tab=${tabno}&id=${pool_id}&message=" . urlencode ("Real server was successfully updated");
+}
+
+function updateVService ()
+{
+       global $root, $pageno, $tabno;
+
+       assertUIntArg ('id');
+       assertIPv4Arg ('vip');
+       assertUIntArg ('vport');
+       assertStringArg ('proto');
+       assertStringArg ('name', TRUE);
+       assertStringArg ('vsconfig', TRUE);
+       assertStringArg ('rsconfig', TRUE);
+       if (!commitUpdateVS ($_REQUEST['id'], $_REQUEST['vip'], $_REQUEST['vport'], $_REQUEST['proto'], $_REQUEST['name'], $_REQUEST['vsconfig'], $_REQUEST['rsconfig']))
+               return "${root}?page=${pageno}&tab=${tabno}&error=" . urlencode ('commitUpdateVS() failed');
        else
-               return "${root}?page=${pageno}&tab=${tabno}&id=$pool_id&message=" . urlencode ("Real server was successfully updated");
+               return "${root}?page=${pageno}&tab=${tabno}&message=" . urlencode ("Virtual service was successfully updated");
 }
 
 function addLoadBalancer ()
@@ -1050,9 +1093,9 @@ function addLoadBalancer ()
        $vsconfig = $_REQUEST['vsconfig'];
        $rsconfig = $_REQUEST['rsconfig'];
        if (!addLBtoRSPool ($pool_id, $object_id, $vsconfig, $rsconfig))
-               return "${root}?page=${pageno}&tab=${tabno}&id=$pool_id&error=" . urlencode ('addLBtoRSPool() failed');
+               return "${root}?page=${pageno}&tab=${tabno}&id=${pool_id}&error=" . urlencode ('addLBtoRSPool() failed');
        else
-               return "${root}?page=${pageno}&tab=${tabno}&id=$pool_id&message=" . urlencode ("Load balancer was successfully added");
+               return "${root}?page=${pageno}&tab=${tabno}&id=${pool_id}&message=" . urlencode ("Load balancer was successfully added");
 }
 
 ?>